#macro-derive #pact #codec #deriving #generate #toml #pacts

pact-derive

用于派生和生成Pacts的宏

3个不稳定版本

0.2.0 2024年3月15日
0.1.1 2024年3月7日
0.1.0 2024年1月2日

#17 in #pact

Download history 32/week @ 2024-04-02 2/week @ 2024-05-21 1/week @ 2024-06-04

每月下载量137次
用于 pact-crypto

仅AGPL-3.0

105KB
2K SLoC

用于从TOML Pacts生成Rust类型,并派生Rust类型的Pact编解码器。

从TOML Pacts生成Rust类型

pact_toml 宏从包含Pact TOML的字符串中生成Rust类型

# use pact_derive::pact_toml;
# use pact::codec::*;

// The string can be an anonymous constant like `_`;
// it will be fully replaced  by the generated code.
#[pact_toml]
const _: &str = r#"
pact = "MyGreeter"

[data.1. Request]
message = 'string'

[data.2. Response]
message = 'string'
"#;

# fn main() {
// A unique struct will be generated for
// each data type in the pact.
let request = Request { message: "Hello!".into() };

// An enum will be generated with variants for
// each data type in the pact. The enum's name
// will be the pact's name, with `Data` appended.
let data = MyGreeterData::from(request);
assert_eq!("Hello!", match data {
    MyGreeterData::Request(Request { message }) => message,
    _ => unimplemented!(),
});

// The structs and enum have auto-generated pact codecs.
# let request = Request { message: "Hello!".into() };
# let data = MyGreeterData::from(request.clone());
let mut request_bytes = vec![];
request_bytes.write_data(&request).unwrap();
let mut data_bytes = vec![];
data_bytes.write_data(&data).unwrap();
assert_eq!(request_bytes, data_bytes);

// The enum can be used to safely decode
// bytes containing arbitrary pact data.
let data = MyGreeterData::decode_from(&mut data_bytes.as_slice()).unwrap();
assert_eq!("Hello!", match data {
    MyGreeterData::Request(Request { message }) => message,
    _ => unimplemented!(),
});
# }

为Rust类型派生Pact条目编解码器

derive(PactCodec) 宏为一个Rust结构派生pact编解码器(编码器和解码器)

# use pact_derive::PactCodec;
# use pact::codec::*;

# #[derive(Debug, Default, PartialEq)]
#[derive(PactCodec)]
struct MyRequest {
    timestamp: u64,
    message: String,
}

# fn main() {
let request = MyRequest {
    message: "Hello!".into(),
    timestamp: 1337,
};

// The struct can encode to and decode
// from pact-encoded data.
let mut request_bytes = vec![];
request_bytes.write_data(&request).unwrap();
let decoded_request = MyRequest::decode_from(&mut request_bytes.as_slice()).unwrap();
assert_eq!(request, decoded_request);
# }

如果结构表示Pact中的数据类型,可以通过在结构中添加 #[pact(ordinal = 96)] 来指定数据类型的顺序,其中 96 是一个示例顺序。

如果一个字段不是Pact可编码的,或者不应在编码或解码时包含,则可以使用 #[pact(ignore = true)] 属性进行标注。

许可证

版权所有 2024 Alicorn Systems, Inc.

根据自由软件基金会发布的GNU Affero通用公共许可证版本3授权。有关更多信息,请参阅许可证文件

如果您有任何问题,请联系[hello@alicorn.systems]。

依赖项

~4.5MB
~90K SLoC