#amqp #serde #descriptor #macro #described #field #deserialize

serde_amqp_derive

为serde_amqp提供的自定义衍生宏

9个版本

0.3.0 2024年6月13日
0.2.1 2022年11月20日
0.2.0 2022年10月12日
0.1.2 2022年8月28日
0.0.1 2022年2月21日

#16 in #described

Download history 2339/week @ 2024-04-26 3163/week @ 2024-05-03 4218/week @ 2024-05-10 3496/week @ 2024-05-17 2657/week @ 2024-05-24 2405/week @ 2024-05-31 2458/week @ 2024-06-07 2458/week @ 2024-06-14 3513/week @ 2024-06-21 1969/week @ 2024-06-28 2158/week @ 2024-07-05 1257/week @ 2024-07-12 1329/week @ 2024-07-19 1913/week @ 2024-07-26 2426/week @ 2024-08-02 1912/week @ 2024-08-09

7,755每月下载量
9个crate中使用(通过serde_amqp

MIT/Apache

57KB
1K SLoC

serde_amqp_derive

为AMQP1.0协议中定义的描述类型提供自定义衍生宏SerializeCompositeDeserializeComposite

用法

该宏提供三种类型的编码

  1. "list":结构体将被序列化为描述列表。描述列表是一个带有其描述符前置到列表本身的AMQP1.0列表。反序列化将接受"list""map"编码的值。
  2. "map":结构体将被序列化为描述映射。描述映射是一个带有其描述符前置到映射的AMQP1.0映射。反序列化将接受"list""map"编码的值。
  3. "basic":结构体必须是对另一个可序列化/反序列化类型的薄包装(仅包含一个字段)。内部结构体将被描述符前置到结构体进行序列化/反序列化。

有关"list"编码的详细信息

可选字段

如果字段在规范中没有标记为"强制",则该字段可以是一个Option。在序列化过程中,可选字段可以完全跳过,或者编码为AMQP1.0的null原语(0x40)。在反序列化过程中,AMQP1.0的null原语或空字段将被解码为None

具有默认值的字段

对于在规范中定义了默认值的字段,字段类型必须实现DefaultPartialEq特质。在序列化过程中,如果字段等于字段类型的默认值,则字段将完全忽略,或者编码为AMQP1.0的null原语(0x40)。在反序列化过程中,AMQP1.0的null原语或空字段将被解码为类型的默认值。

示例

"list"编码将把Attach结构体编码为描述列表(一个描述符后跟字段列表)。

/// <type name="attach" class="composite" source="list" provides="frame">
///     <descriptor name="amqp:attach:list" code="0x00000000:0x00000012"/>
#[derive(Debug, DeserializeComposite, SerializeComposite)]
#[amqp_contract(
    name = "amqp:attach:list",
    code = "0x0000_0000:0x0000_0012",
    encoding = "list",
    rename_all = "kebab-case"
)]
pub struct Attach {
    /// <field name="name" type="string" mandatory="true"/>
    pub name: String,

    /// <field name="handle" type="handle" mandatory="true"/>
    pub handle: Handle,

    /// <field name="role" type="role" mandatory="true"/>
    pub role: Role,

    /// <field name="snd-settle-mode" type="sender-settle-mode" default="mixed"/>
    #[amqp_contract(default)]
    pub snd_settle_mode: SenderSettleMode,

    /// <field name="rcv-settle-mode" type="receiver-settle-mode" default="first"/>
    #[amqp_contract(default)]
    pub rcv_settle_mode: ReceiverSettleMode,

    /// <field name="source" type="*" requires="source"/>
    pub source: Option<Source>,

    /// <field name="target" type="*" requires="target"/>
    pub target: Option<Target>,

    /// <field name="unsettled" type="map"/>
    pub unsettled: Option<BTreeMap<DeliveryTag, DeliveryState>>,

    /// <field name="incomplete-unsettled" type="boolean" default="false"/>
    #[amqp_contract(default)]
    pub incomplete_unsettled: Boolean,

    /// <field name="initial-delivery-count" type="sequence-no"/>
    pub initial_delivery_count: Option<SequenceNo>,

    /// <field name="max-message-size" type="ulong"/>
    pub max_message_size: Option<ULong>,

    /// <field name="offered-capabilities" type="symbol" multiple="true"/>
    pub offered_capabilities: Option<Vec<Symbol>>,

    /// <field name="desired-capabilities" type="symbol" multiple="true"/>
    pub desired_capabilities: Option<Vec<Symbol>>,

    /// <field name="properties" type="fields"/>
    pub properties: Option<Fields>,
}

基本编码将把ApplicationProperties编码为一个描述符后跟包装元素,该元素是一个映射。

/// 3.2.5 Application Properties
/// <type name="application-properties" class="restricted" source="map" provides="section">
///     <descriptor name="amqp:application-properties:map" code="0x00000000:0x00000074"/>
/// </type>
#[derive(Debug, Clone, SerializeComposite, DeserializeComposite)]
#[amqp_contract(
    name = "amqp:application-properties:map",
    code = "0x0000_0000:0x0000_0074",
    encoding = "basic"
)]
pub struct ApplicationProperties(pub BTreeMap<String, SimpleValue>);

依赖关系

~1.2–1.7MB
~32K SLoC