serde_name/
lib.rs

1// Copyright (c) Facebook, Inc. and its affiliates
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4#![forbid(unsafe_code)]
5
6//! This crate provides fast and reliable ways to extract and to override the Serde name
7//! of a Rust container.
8//!
9//! # Extracting Serde names
10//!
11//! Name extraction relies on the Deserialize trait of Serde:
12//!
13//! ```rust
14//! # use serde::Deserialize;
15//! # use serde_name::trace_name;
16//! #[derive(Deserialize)]
17//! struct Foo {
18//!   bar: Bar,
19//! }
20//!
21//! #[derive(Deserialize)]
22//! #[serde(rename = "ABC")]
23//! enum Bar { A, B, C }
24//!
25//! assert_eq!(trace_name::<Foo>(), Some("Foo"));
26//! assert_eq!(trace_name::<Bar>(), Some("ABC"));
27//! assert_eq!(trace_name::<Option<Bar>>(), None);
28//! ```
29//!
30//! # Overriding Serde names
31//!
32//! `SerializeNameAdapter` and `DeserializeNameAdapter` may be used to override the name
33//! of a container in the cases where `#[serde(rename = "..")]` is not flexible enough.
34//!
35//! ```rust
36//! # use serde_name::{SerializeNameAdapter, DeserializeNameAdapter, trace_name};
37//! # use serde::{Deserialize, Serialize};
38//! #[derive(Serialize, Deserialize)]
39//! #[serde(remote = "Foo")] // Generates Foo::(de)serialize instead of implementing Serde traits.
40//! struct Foo<T> {
41//!     data: T,
42//! }
43//!
44//! impl<'de, T> Deserialize<'de> for Foo<T>
45//! where
46//!     T: Deserialize<'de>,
47//! {
48//!     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
49//!     where
50//!         D: serde::de::Deserializer<'de>,
51//!     {
52//!         Foo::deserialize(DeserializeNameAdapter::new(
53//!             deserializer,
54//!             std::any::type_name::<Self>(),
55//!         ))
56//!     }
57//! }
58//!
59//! impl<T> Serialize for Foo<T>
60//! where
61//!     T: Serialize,
62//! {
63//!     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
64//!     where
65//!         S: serde::ser::Serializer,
66//!     {
67//!         Foo::serialize(
68//!             self,
69//!             SerializeNameAdapter::new(serializer, std::any::type_name::<Self>()),
70//!         )
71//!     }
72//! }
73//!
74//! // Testing the Deserialize implementation
75//! assert!(trace_name::<Foo<u64>>().unwrap().ends_with("Foo<u64>"));
76//!
77//! // Testing the Serialize implementation
78//! use serde_reflection::*;
79//! let mut tracer = Tracer::new(TracerConfig::default());
80//! let mut samples = Samples::new();
81//! let (mut ident, _) = tracer.trace_value(&mut samples, &Foo { data: 1u64 }).unwrap();
82//! ident.normalize().unwrap();
83//! assert!(matches!(ident, Format::TypeName(s) if s.ends_with("Foo<u64>")));
84//! ```
85
86mod de_adapter;
87mod ser_adapter;
88mod trace;
89
90pub use de_adapter::DeserializeNameAdapter;
91pub use ser_adapter::SerializeNameAdapter;
92pub use trace::trace_name;