1个不稳定版本
0.1.0 | 2020年5月1日 |
---|
#2394 in 编码
32KB
540 行
hexutil
实现二进制表示数据的常见特性。
使用impl_hex
宏来实现ToHex
、FromHex
、Display
、FromStr
、Serialize
和Deserialize
特性。
这可以通过返回一些字节的引用来实现
struct Test([u8; 42]);
hexutil::impl_hex!(Test, 42, |&self| &self.0, |data| Ok(Self(data)));
或者通过返回一些字节的值来实现
struct Test(u128);
hexutil::impl_hex!(Test, 16, |self| self.0.to_le_bytes(), |data| Ok(Self(
u128::from_le_bytes(data)
)));
示例
struct Test(u16);
hexutil::impl_hex!(Test, 2, |self| self.0.to_le_bytes(), |data| Ok(Self(
u16::from_le_bytes(data)
)));
let test = Test(0x1234);
// std::fmt::Display
assert_eq!(format!("{}", test), "3412");
// std::string::ToString
let hex = test.to_string();
assert_eq!(hex, "3412");
// std::convert::FromStr
let test: Test = hex.parse().unwrap();
assert_eq!(test, Test(0x1234));
// hexutil::ToHex
let hex = test.to_hex();
assert_eq!(hex, "3412");
// hexutil::FromHex
let test = Test::from_hex(hex.as_bytes()).unwrap();
assert_eq!(test, Test(0x1234));
// hexutil::ParseHex
let test: Test = hex.parse_hex().unwrap();
assert_eq!(test, Test(0x1234));
// serde::Serialize (with serializer.is_human_readable() == true)
let json = serde_json::to_string(&test).unwrap();
assert_eq!(json, r#""3412""#);
// serde::Deserialize (with deserializer.is_human_readable() == true)
let test: Test = serde_json::from_str(&json).unwrap();
assert_eq!(test, Test(0x1234));
// serde::Serialize (with serializer.is_human_readable() == false)
let bin = bincode::serialize(&test).unwrap();
assert_eq!(bin, [0x34, 0x12]);
// serde::Deserialize (with deserializer.is_human_readable() == false)
let test: Test = bincode::deserialize(&bin).unwrap();
assert_eq!(test, Test(0x1234));
预设
您可以附加一个要派生的预设列表
名称 | 描述 |
---|---|
默认 |
convert 和serde |
convert |
Display 和FromStr |
Display |
实现std::fmt::Display 特性(启用to_string() 方法) |
FromStr |
实现std::convert::FromStr 特性(启用str.parse() 方法) |
serde |
Serialize 和Deserialize |
Serialize |
实现serde::Serialize 特性 |
Deserialize |
实现serde::Deserialize 特性 |
仅派生ToHex
、FromHex
、Serialize
和Deserialize
特性
struct Test([u8; 42]);
hexutil::impl_hex!(Test, 42, |self| self.0, |data| Ok(Self(data)), [serde]);
FromHex
错误
第二个函数返回一个Result<Self, FromHexError>
struct Test([u8; 42]);
hexutil::impl_hex!(Test, 42, |self| self.0, |data| {
Err(FromHexError::CustomStr("can't create this from hex"))
});
或者使用FromHexError::InvalidValue
来显示默认消息
struct Test([u8; 42]);
hexutil::impl_hex!(Test, 42, |self| self.0, |data| Err(
FromHexError::InvalidValue
));
单向
您还可以只实现一个方向
struct Test([u8; 42]);
hexutil::impl_to_hex!(Test, 42, |self| self.0);
struct Test([u8; 42]);
hexutil::impl_from_hex!(Test, 42, |data| Ok(Self(data)));
许可证
以下任一许可证下授权
- Apache许可证版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
由您自行选择。
贡献
除非您明确声明,否则您有意提交给作品包含在内的任何贡献,根据Apache-2.0许可证的定义,应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
约2MB
约44K SLoC