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;