serde_firestore_value/
lib.rs

1//! A [serde] (de)serializer using [Firestore Value] as its data format.
2//!
3//! # Examples
4//!
5//! ```rust
6//! # fn main() -> anyhow::Result<()> {
7//! use serde_firestore_value::google::firestore::v1::{value::ValueType, Value};
8//! use serde_firestore_value::{from_value, to_value};
9//!
10//! let t = 1_i64; // T: Serialize
11//!
12//! let s = to_value(&t)?;
13//! assert_eq!(s, Value {
14//!     value_type: Some(ValueType::IntegerValue(1_i64))
15//! });
16//!
17//! let d = from_value::<'_, i64>(&s)?;
18//! assert_eq!(d, t);
19//! #     Ok(())
20//! # }
21//! ```
22//!
23//! ```rust
24//! # fn test() -> anyhow::Result<()> {
25//! use serde_firestore_value::google::{firestore::v1::{value::ValueType, ArrayValue, MapValue, Value}, self};
26//! use serde_firestore_value::{LatLng, Reference, Timestamp};
27//!
28//! #[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
29//! struct T {
30//!     b: bool,
31//!     i: i64,
32//!     d: f64,
33//!     t: Timestamp,
34//!     s: String,
35//!     r: Reference,
36//!     g: LatLng,
37//!     a: Vec<Option<i64>>,
38//!     m: std::collections::HashMap<String, bool>,
39//! }
40//!
41//! let t = T {
42//!     b: true,
43//!     i: 1_i64,
44//!     d: 2_f64,
45//!     t: Timestamp {
46//!         seconds: 3_i64,
47//!         nanos: 4_i32,
48//!     },
49//!     s: "s".to_string(),
50//!     r: Reference("projects/p/databases/d/documents/n".to_string()),
51//!     g: LatLng {
52//!         latitude: 5_f64,
53//!         longitude: 6_f64,
54//!     },
55//!     a: vec![Some(1), Some(2), None],
56//!     m: {
57//!         let mut m = std::collections::HashMap::new();
58//!         m.insert("a".to_string(), false);
59//!         m.insert("b".to_string(), true);
60//!         m
61//!     },
62//! };
63//! let value = Value {
64//!     value_type: Some(ValueType::MapValue(MapValue {
65//!         fields: {
66//!             let mut fields = std::collections::HashMap::new();
67//!             fields.insert(
68//!                 "b".to_string(),
69//!                 Value {
70//!                     value_type: Some(ValueType::BooleanValue(true)),
71//!                 },
72//!             );
73//!             fields.insert(
74//!                 "i".to_string(),
75//!                 Value {
76//!                     value_type: Some(ValueType::IntegerValue(1)),
77//!                 },
78//!             );
79//!             fields.insert(
80//!                 "d".to_string(),
81//!                 Value {
82//!                     value_type: Some(ValueType::DoubleValue(2_f64)),
83//!                 },
84//!             );
85//!             fields.insert(
86//!                 "t".to_string(),
87//!                 Value {
88//!                     value_type: Some(ValueType::TimestampValue(prost_types::Timestamp {
89//!                         seconds: 3_i64,
90//!                         nanos: 4_i32,
91//!                     })),
92//!                 },
93//!             );
94//!             fields.insert(
95//!                 "s".to_string(),
96//!                 Value {
97//!                     value_type: Some(ValueType::StringValue("s".to_string())),
98//!                 },
99//!             );
100//!             fields.insert(
101//!                 "r".to_string(),
102//!                 Value {
103//!                     value_type: Some(ValueType::ReferenceValue(
104//!                         "projects/p/databases/d/documents/n".to_string(),
105//!                     )),
106//!                 },
107//!             );
108//!             fields.insert(
109//!                 "g".to_string(),
110//!                 Value {
111//!                     value_type: Some(ValueType::GeoPointValue(
112//!                         google::r#type::LatLng {
113//!                             latitude: 5_f64,
114//!                             longitude: 6_f64,
115//!                         },
116//!                     )),
117//!                 },
118//!             );
119//!             fields.insert(
120//!                 "a".to_string(),
121//!                 Value {
122//!                     value_type: Some(ValueType::ArrayValue(ArrayValue {
123//!                         values: vec![
124//!                             Value {
125//!                                 value_type: Some(ValueType::IntegerValue(1)),
126//!                             },
127//!                             Value {
128//!                                 value_type: Some(ValueType::IntegerValue(2)),
129//!                             },
130//!                             Value {
131//!                                 value_type: Some(ValueType::NullValue(0)),
132//!                             },
133//!                         ],
134//!                     })),
135//!                 },
136//!             );
137//!             fields.insert(
138//!                 "m".to_string(),
139//!                 Value {
140//!                     value_type: Some(ValueType::MapValue(MapValue {
141//!                         fields: {
142//!                             let mut fields = std::collections::HashMap::new();
143//!                             fields.insert(
144//!                                 "a".to_string(),
145//!                                 Value {
146//!                                     value_type: Some(ValueType::BooleanValue(false)),
147//!                                 },
148//!                             );
149//!                             fields.insert(
150//!                                 "b".to_string(),
151//!                                 Value {
152//!                                     value_type: Some(ValueType::BooleanValue(true)),
153//!                                 },
154//!                             );
155//!                             fields
156//!                         },
157//!                     })),
158//!                 },
159//!             );
160//!             fields
161//!         },
162//!     })),
163//! };
164//!
165//! let serialized = serde_firestore_value::to_value(&t)?;
166//! assert_eq!(serialized, value);
167//!
168//! let deserialized = serde_firestore_value::from_value::<T>(&serialized)?;
169//! assert_eq!(deserialized, t);
170//!
171//! #     Ok(())
172//! # }
173//! ```
174//!
175//! [serde]: https://crates.io/crates/serde
176//! [Firestore Value]: https://firebase.google.com/docs/firestore/reference/rest/v1/Value
177mod de;
178mod error;
179mod ser;
180mod serde_json;
181mod typ;
182mod value_ext;
183mod value_type_ext;
184mod value_type_name;
185pub mod with;
186
187pub use self::de::{from_value, Deserializer};
188pub use self::error::{Error, Result};
189pub use self::ser::{to_value, Serializer};
190pub use self::typ::{LatLng, Reference, Timestamp};
191
192pub use googleapis_tonic_google_firestore_v1::google;