#serde #serialization #data-structures

serde-name

从结构体和枚举中提取Serde名称

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编码

Download history 13173/week @ 2024-03-25 9760/week @ 2024-04-01 9661/week @ 2024-04-08 13541/week @ 2024-04-15 14141/week @ 2024-04-22 11606/week @ 2024-04-29 13481/week @ 2024-05-06 14455/week @ 2024-05-13 13863/week @ 2024-05-20 11371/week @ 2024-05-27 12420/week @ 2024-06-03 14785/week @ 2024-06-10 15237/week @ 2024-06-17 16749/week @ 2024-06-24 11505/week @ 2024-07-01 12050/week @ 2024-07-08

56,639 每月下载量
127 个crate中使用了(直接使用6个)

MIT/Apache

20KB
388 代码行

serde-name

serde-name on crates.io Documentation (latest release) License License

这个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名称

SerializeNameAdapterDeserializeNameAdapter 可用于在 #[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