Skip to main content

IDL Annotations

HDDS supports 26 standard annotations from IDL 4.2 plus custom annotation declarations.

Key Annotations

@key

Marks a field as part of the topic key for instance identification.

struct SensorReading {
@key string sensor_id; // Part of key
@key uint32_t region; // Part of key
float temperature; // Not part of key
float humidity;
};

Effect: Key fields are used to compute instance identity via FNV-1a hash. Readers can filter by key values.

@optional

Marks a field as optional (may be omitted during serialization).

struct UserProfile {
@key uint32_t user_id;
string username;
@optional string nickname; // Can be null
@optional string avatar_url; // Can be null
};

Generated Rust: Optional fields become Option<T> types.

@id

Assigns an explicit member ID for serialization (PL_CDR2/XCDR2 encoding).

@mutable
struct Message {
@id(1) int32_t id;
@id(2) string content;
@id(100) @optional string metadata; // Sparse ID allowed
};

Validation: IDs must be unique within a struct.

Extensibility Annotations

@extensibility

Controls type evolution capabilities.

ModeDescription
FINALNo changes allowed after deployment
APPENDABLENew fields can only be appended
MUTABLEFields can be added/removed freely
@extensibility(MUTABLE)
struct Config {
@id(1) int32_t version;
@id(2) string name;
};

Shorthand Forms

@final
struct Point { float x; float y; };

@appendable
struct Message { int32_t id; string text; };

@mutable
struct Config { int32_t version; };

Numeric Constraints

@min / @max

Declare value constraints for numeric fields.

struct Sensor {
@min(0) @max(100) float percentage;
@min(-40) @max(125) int8_t temperature_c;
};

@range

Combined min/max constraint.

struct Battery {
@range(min=0, max=100) uint8_t charge_level;
@range(min=2.7, max=4.2) float voltage;
};

@unit

Documents the unit of measurement.

struct Telemetry {
@unit("meters/second") float velocity;
@unit("milliseconds") uint32_t latency;
@unit("celsius") float temperature;
};

Serialization Annotations

@data_representation

Selects the wire encoding format.

@data_representation(XCDR2)
struct ModernData {
int32_t value;
};
FormatDescription
XCDR1Classic CDR encoding
XCDR2Extended CDR2 (default for HDDS)

@non_serialized

Excludes a field from serialization.

struct CachedData {
int32_t id;
string value;
@non_serialized int64_t cache_timestamp; // Local only
};

@must_understand

Indicates the field must be understood by receivers.

@mutable
struct Critical {
@must_understand @id(1) int32_t critical_flag;
@id(2) string optional_info;
};

Bitset Annotations

@bit_bound

Specifies maximum bit position for a bitset.

@bit_bound(32)
bitmask StatusFlags {
@position(0) FLAG_ACTIVE,
@position(1) FLAG_VALID,
@position(7) FLAG_ERROR,
@position(31) FLAG_CRITICAL
};

@position

Assigns explicit bit position.

@bit_bound(16)
bitmask Permissions {
@position(0) READ,
@position(1) WRITE,
@position(2) EXECUTE,
@position(8) ADMIN
};

Union Annotations

@default

Marks the default union case.

union Value switch(int32_t) {
case 1: int32_t int_val;
case 2: float float_val;
case 3: string string_val;
@default: octet raw_data[64];
};

Type Annotations

@nested

Marks a type for nested composition.

@nested
struct Position {
float x;
float y;
float z;
};

struct Entity {
@key uint32_t id;
Position pos; // Nested struct
};

@external

Indicates a type is defined externally.

struct Message {
@key int32_t id;
@external CustomType payload; // Defined in C++ header
};

Auto ID Generation

@autoid

Controls automatic member ID generation.

@autoid(SEQUENTIAL)
struct OrderedData {
@id(1) int32_t first; // IDs must increase
@id(2) int32_t second;
@id(3) int32_t third;
};

@autoid(HASH)
struct HashedData {
int32_t alpha; // ID = hash("alpha") & 0x0FFFFFFF
int32_t beta; // ID = hash("beta") & 0x0FFFFFFF
};
ModeDescription
SEQUENTIALIDs assigned 0, 1, 2... by field order
HASHIDs computed via MD5 hash of field names (default)

Custom Annotations

Declaration

@annotation MyAnnotation {
int32_t priority;
string category default "general";
};

Usage

@MyAnnotation(priority=10, category="critical")
struct ImportantData {
int32_t value;
};

Validation:

  • Required parameters (no default) must be provided
  • Parameters can be positional or named
  • Duplicate parameters cause errors

Annotation Location Rules

AnnotationType LevelMember Level
@key-
@optional-
@id-
@autoid-
@extensibility-
@final / @appendable / @mutable-
@min / @max / @range-
@unit-
@data_representation-
@non_serialized-
@must_understand-
@bit_bound-
@position-✓ (bitset)
@default-✓ (union)
@nested-
@external

Validation Rules

hdds_gen validates annotation usage:

  • Conflict detection: Cannot combine @final + @appendable + @mutable
  • Duplicate IDs: Error if @id value used twice in same struct
  • Range consistency: Error if @min > @max
  • Type checking: Warning if @min/@max on non-numeric field
  • Location checking: Error if annotation used at wrong level

Next Steps