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
7,755每月下载量
在9个crate中使用(通过serde_amqp)
57KB
1K SLoC
serde_amqp_derive
为AMQP1.0协议中定义的描述类型提供自定义衍生宏SerializeComposite
和DeserializeComposite
。
用法
该宏提供三种类型的编码
"list"
:结构体将被序列化为描述列表。描述列表是一个带有其描述符前置到列表本身的AMQP1.0列表。反序列化将接受"list"
或"map"
编码的值。"map"
:结构体将被序列化为描述映射。描述映射是一个带有其描述符前置到映射的AMQP1.0映射。反序列化将接受"list"
或"map"
编码的值。"basic"
:结构体必须是对另一个可序列化/反序列化类型的薄包装(仅包含一个字段)。内部结构体将被描述符前置到结构体进行序列化/反序列化。
有关"list"
编码的详细信息
可选字段
如果字段在规范中没有标记为"强制"
,则该字段可以是一个Option
。在序列化过程中,可选字段可以完全跳过,或者编码为AMQP1.0的null
原语(0x40
)。在反序列化过程中,AMQP1.0的null
原语或空字段将被解码为None
。
具有默认值的字段
对于在规范中定义了默认值的字段,字段类型必须实现Default
和PartialEq
特质。在序列化过程中,如果字段等于字段类型的默认值,则字段将完全忽略,或者编码为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