3个不稳定版本
0.2.0 | 2024年3月15日 |
---|---|
0.1.1 | 2024年3月7日 |
0.1.0 | 2024年1月2日 |
#17 in #pact
每月下载量137次
用于 pact-crypto
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