6个版本
0.2.1 | 2022年5月19日 |
---|---|
0.2.0 | 2021年9月15日 |
0.1.2 | 2021年5月26日 |
0.1.1 | 2020年9月1日 |
0.0.0 | 2020年5月12日 |
#1219 在 编码
56,639 每月下载量
在 127 个crate中使用了(直接使用6个)
20KB
388 代码行
serde-name
这个crate提供了快速可靠的方法来提取和覆盖Rust容器的Serde名称。
提取Serde名称
名称提取依赖于Serde的Deserialize trait
#[derive(Deserialize)]
struct Foo {
bar: Bar,
}
#[derive(Deserialize)]
#[serde(rename = "ABC")]
enum Bar { A, B, C }
assert_eq!(trace_name::<Foo>(), Some("Foo"));
assert_eq!(trace_name::<Bar>(), Some("ABC"));
assert_eq!(trace_name::<Option<Bar>>(), None);
覆盖Serde名称
SerializeNameAdapter
和 DeserializeNameAdapter
可用于在 #[serde(rename = "..")]
不够灵活的情况下覆盖容器的名称。
#[derive(Serialize, Deserialize)]
#[serde(remote = "Foo")] // Generates Foo::(de)serialize instead of implementing Serde traits.
struct Foo<T> {
data: T,
}
impl<'de, T> Deserialize<'de> for Foo<T>
where
T: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::de::Deserializer<'de>,
{
Foo::deserialize(DeserializeNameAdapter::new(
deserializer,
std::any::type_name::<Self>(),
))
}
}
impl<T> Serialize for Foo<T>
where
T: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
Foo::serialize(
self,
SerializeNameAdapter::new(serializer, std::any::type_name::<Self>()),
)
}
}
// Testing the Deserialize implementation
assert!(trace_name::<Foo<u64>>().unwrap().ends_with("Foo<u64>"));
// Testing the Serialize implementation
use serde_reflection::*;
let mut tracer = Tracer::new(TracerConfig::default());
let mut samples = Samples::new();
let (mut ident, _) = tracer.trace_value(&mut samples, &Foo { data: 1u64 }).unwrap();
ident.normalize().unwrap();
assert!(matches!(ident, Format::TypeName(s) if s.ends_with("Foo<u64>")));
贡献
请参阅CONTRIBUTING文件了解如何提供帮助。
许可证
本项目可在Apache 2.0许可证或MIT许可证的条款下使用。
依赖
~0.4–1MB
~23K SLoC