Skip to main content

DdsType

Trait DdsType 

Source
pub trait DdsType: Sized {
    const TYPE_NAME: &'static str;
    const EXTENSIBILITY: Extensibility = Extensibility::Final;
    const HAS_KEY: bool = false;
    const IS_KEYED: bool = Self::HAS_KEY;
    const KEY_HOLDER_MAX_SIZE: Option<usize> = None;
    const IS_NESTED: bool = false;
    const TYPE_IDENTIFIER: TypeIdentifier = zerodds_types::TypeIdentifier::None;

    // Required methods
    fn encode(&self, out: &mut Vec<u8>) -> Result<(), EncodeError>;
    fn decode(bytes: &[u8]) -> Result<Self, DecodeError>;

    // Provided methods
    fn encode_be(&self, out: &mut Vec<u8>) -> Result<(), EncodeError> { ... }
    fn decode_be(bytes: &[u8]) -> Result<Self, DecodeError> { ... }
    fn encode_xcdr1(&self, out: &mut Vec<u8>) -> Result<(), EncodeError> { ... }
    fn decode_xcdr1(bytes: &[u8]) -> Result<Self, DecodeError> { ... }
    fn decode_xcdr1_be(bytes: &[u8]) -> Result<Self, DecodeError> { ... }
    fn encode_key_holder_be(&self, _holder: &mut PlainCdr2BeKeyHolder) { ... }
    fn field_value(&self, _path: &str) -> Option<Value> { ... }
    fn compute_key_hash(&self) -> Option<[u8; 16]> { ... }
    fn key_hash(&self) -> Option<[u8; 16]> { ... }
}
Expand description

A type that can be published/subscribed via DDS.

Required Associated Constants§

Source

const TYPE_NAME: &'static str

Fully-qualified topic type name (e.g. "std_msgs::String"). Must match the peer type name exactly (strict matching).

Provided Associated Constants§

Source

const EXTENSIBILITY: Extensibility = Extensibility::Final

XTypes 1.3 §7.4.5 struct extensibility kind. Default Final for backwards compat with pre-EXTENSIBILITY codegen outputs. Spec: zerodds-xcdr2-rust §2.3.

Source

const HAS_KEY: bool = false

true if the topic type is keyed (at least one member with a @key annotation). Default false — the caller (proc-macro) overrides this for keyed types and also implements Self::encode_key_holder_be.

Spec: XTypes 1.3 §7.6.8 (KeyHash requirement for keyed topics).

Note (zerodds-xcdr2-rust §11 errata): the spec references this field as IS_KEYED. We keep HAS_KEY for source compat with pre-1.0 code; the spec-aligned alias Self::IS_KEYED always returns the same value.

Source

const IS_KEYED: bool = Self::HAS_KEY

Spec-aligned alias for Self::HAS_KEY. zerodds-xcdr2-rust §2 references this as IS_KEYED.

Source

const KEY_HOLDER_MAX_SIZE: Option<usize> = None

Maximum size of the PLAIN_CDR2-BE KeyHolder stream in bytes (XTypes 1.3 §7.6.8.4 step 5). None = not keyed or unbounded (MD5 path). Some(n) with n <= 16 = zero-pad path.

Source

const IS_NESTED: bool = false

true if the type is annotated with @nested (XTypes 1.3 §7.4.6.3.5). Nested types are only intended as members of other types and MUST NOT be registered as a DDS topic type. DomainParticipant::create_topic rejects registration of nested types with PreconditionNotMet.

Source

const TYPE_IDENTIFIER: TypeIdentifier = zerodds_types::TypeIdentifier::None

XTypes 1.3 §7.3.4.2 — TypeIdentifier of the type for XTypes-aware discovery + compatibility matching. Default TypeIdentifier::None signals “type-id not provided; reader-writer matching falls back to plain type_name comparison (DDS 1.4 §2.2.3 default path)”.

idl-rust codegen emits the appropriate TypeIdentifier here:

  • Primitive int32TypeIdentifier::Primitive(PrimitiveKind::Int32),
  • String string<N>TypeIdentifier::String8Small{ bound },
  • Composite struct → TypeIdentifier::EquivalenceHash (once the TypeRegistry lookup is live).

Once both sides (writer + reader) provide a TypeIdentifier, the subscriber match path calls zerodds_types::type_matcher::TypeMatcher::match_types (XTypes §7.6.3.7 + DDS 1.4 §2.2.3 TypeConsistencyEnforcement).

Required Methods§

Source

fn encode(&self, out: &mut Vec<u8>) -> Result<(), EncodeError>

Serializes self into the XCDR2 payload sent as the serialized_payload of a DATA submessage. Default endianness: little-endian (RTPS 2.5 §10.5 RepresentationIdentifier = CDR2_LE = 0x0010).

§Errors

CDR encoder error (buffer overflow, etc.).

Source

fn decode(bytes: &[u8]) -> Result<Self, DecodeError>

Deserializes a little-endian XCDR2 payload. The caller ensures that bytes contains the full sample payload (encapsulation header already stripped).

§Errors

CDR decoder error (truncation, unexpected bytes, etc.).

Provided Methods§

Source

fn encode_be(&self, out: &mut Vec<u8>) -> Result<(), EncodeError>

Big-endian variant of Self::encode. The default implementation delegates to Self::encode (no byte swap), since a generic BE re-encode is not possible without type reflection. Codegen overrides this for structures that should genuinely go on the wire as BE. Spec: zerodds-xcdr2-rust §2.4.

§Errors

CDR encoder error.

Source

fn decode_be(bytes: &[u8]) -> Result<Self, DecodeError>

Big-endian variant of Self::decode — for a payload whose encapsulation header declared a big-endian representation identifier (CDR_BE = 0x0000, PL_CDR_BE = 0x0002, CDR2_BE = 0x0006, D_CDR2_BE = 0x0008, PL_CDR2_BE = 0x000a). The default implementation delegates to Self::decode (little-endian) so pre-decode_be codegen keeps working on the canonical wire; idl-rust codegen overrides this to build a big-endian reader. Symmetric to Self::encode_be. Spec: zerodds-xcdr2-rust §2.4; RTPS 2.5 §10.5.

§Errors

CDR decoder error.

Source

fn encode_xcdr1(&self, out: &mut Vec<u8>) -> Result<(), EncodeError>

Serializes as classic CDR / XCDR1 little-endian (representation CDR_LE = 0x0001, max-alignment 8, no DHEADER on @final/@appendable, PL_CDR1 for @mutable). This is the encoding Cyclone DDS carries in an iceoryx PSMX chunk for a serialized sample, so the iceoryx-cyclone bridge uses it for cross-vendor same-host interop. The default delegates to Self::encode (XCDR2) — correct only for types whose XCDR1 and XCDR2 byte streams coincide (no 8-byte members, @final, no @mutable); idl-rust codegen overrides it with a true XCDR1 writer.

§Errors

CDR encoder error.

Source

fn decode_xcdr1(bytes: &[u8]) -> Result<Self, DecodeError>

Deserializes a classic-CDR / XCDR1 little-endian payload. Symmetric to Self::encode_xcdr1; the default delegates to Self::decode and idl-rust codegen overrides it with an XCDR1 reader.

§Errors

CDR decoder error.

Source

fn decode_xcdr1_be(bytes: &[u8]) -> Result<Self, DecodeError>

Deserializes a classic-CDR / XCDR1 big-endian payload (encapsulation CDR_BE = 0x0000 / PL_CDR_BE = 0x0002). The default delegates to Self::decode_xcdr1 (little-endian) — correct for byte-order-agnostic types and the common case (Cyclone/FastDDS/RTI emit XCDR1 little-endian); idl-rust codegen overrides it with a true big-endian XCDR1 reader. Symmetric to Self::decode_be for XCDR2.

§Errors

CDR decoder error.

Source

fn encode_key_holder_be(&self, _holder: &mut PlainCdr2BeKeyHolder)

Serializes the @key member values in PLAIN_CDR2-BE format into the given PlainCdr2BeKeyHolder. Order: ascending by member_id (XTypes 1.3 §7.6.8.3.1.b).

Default implementation: empty write. Keyed types MUST override this.

Called by the DcpsRuntime in the sample-encode path to write PID_KEY_HASH into the inline QoS.

Source

fn field_value(&self, _path: &str) -> Option<Value>

Returns the value of a field path (dotted, e.g. "a.b") as a zerodds_sql_filter::Value for SQL filter evaluation in QueryCondition / ContentFilteredTopic. Default: None (no field reachable — the filter then denies every sample that contains a field access).

Spec: DDS 1.4 §B.2.1 (Filter Expressions) together with §2.2.2.5.9 (QueryCondition) and §2.2.2.3.5 (ContentFilteredTopic). Generated IDL stubs override this per field.

Source

fn compute_key_hash(&self) -> Option<[u8; 16]>

Computes the 16-byte KeyHash of this instance per XTypes 1.3 §7.6.8.4. None if HAS_KEY = false.

The default implementation uses Self::encode_key_holder_be + Self::KEY_HOLDER_MAX_SIZE and delegates to compute_key_hash.

Source

fn key_hash(&self) -> Option<[u8; 16]>

Spec-aligned alias for Self::compute_key_hash. zerodds-xcdr2-rust §2.5 uses the name key_hash; the implementation name keeps compute_key_hash for historical compat. Both return the same value.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§

Source§

impl DdsType for ParticipantBuiltinTopicData

Source§

const TYPE_NAME: &'static str = "DDS::ParticipantBuiltinTopicData"

Source§

const HAS_KEY: bool = true

Source§

const KEY_HOLDER_MAX_SIZE: Option<usize>

Source§

impl DdsType for PublicationBuiltinTopicData

Source§

const TYPE_NAME: &'static str = "DDS::PublicationBuiltinTopicData"

Source§

const HAS_KEY: bool = true

Source§

const KEY_HOLDER_MAX_SIZE: Option<usize>

Source§

impl DdsType for RawBytes

Source§

const TYPE_NAME: &'static str = "zerodds::RawBytes"

Source§

impl DdsType for ShapeExtendedType

Source§

const TYPE_NAME: &'static str = "ShapeExtendedType"

Source§

const HAS_KEY: bool = true

Source§

impl DdsType for ShapeType

Source§

const TYPE_NAME: &'static str = "ShapeType"

Source§

const HAS_KEY: bool = true

Source§

impl DdsType for SubscriptionBuiltinTopicData

Source§

const TYPE_NAME: &'static str = "DDS::SubscriptionBuiltinTopicData"

Source§

const HAS_KEY: bool = true

Source§

const KEY_HOLDER_MAX_SIZE: Option<usize>

Source§

impl DdsType for TopicBuiltinTopicData

Source§

const TYPE_NAME: &'static str = "DDS::TopicBuiltinTopicData"

Source§

const HAS_KEY: bool = true

Source§

const KEY_HOLDER_MAX_SIZE: Option<usize>