Skip to content

Commit

Permalink
Update readme and module document
Browse files Browse the repository at this point in the history
  • Loading branch information
bouzuya committed Feb 15, 2024
1 parent 22637d3 commit 0036090
Show file tree
Hide file tree
Showing 3 changed files with 365 additions and 21 deletions.
152 changes: 146 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,153 @@ A serde (de)serializer using Firestore Value as its data format.
[![ci](https://github.com/bouzuya/serde-firestore-value/workflows/ci/badge.svg)](https://github.com/bouzuya/serde-firestore-value/actions)
[![crates.io](https://img.shields.io/crates/v/serde-firestore-value)](https://crates.io/crates/serde-firestore-value)
[![docs.rs](https://img.shields.io/docsrs/serde-firestore-value)](https://docs.rs/serde-firestore-value)
[![license](https://img.shields.io/crates/l/serde-firestore-value)](#license)
![license](https://img.shields.io/crates/l/serde-firestore-value)

## License
```rust
use google_api_proto::google::firestore::v1::{value::ValueType, ArrayValue, MapValue, Value};
use serde_firestore_value::{LatLng, Reference, Timestamp};
use std::collections::BTreeMap;

Licensed under either of
#[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
struct T {
b: bool,
i: i64,
d: f64,
t: Timestamp,
s: String,
r: Reference,
g: LatLng,
a: Vec<Option<i64>>,
m: BTreeMap<String, bool>,
}

- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or <http://www.apache.org/licenses/LICENSE-2.0>)
- MIT license ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)
let t = T {
b: true,
i: 1_i64,
d: 2_f64,
t: Timestamp {
seconds: 3_i64,
nanos: 4_i32,
},
s: "s".to_string(),
r: Reference("projects/p/databases/d/documents/n".to_string()),
g: LatLng {
latitude: 5_f64,
longitude: 6_f64,
},
a: vec![Some(1), Some(2), None],
m: {
let mut m = BTreeMap::new();
m.insert("a".to_string(), false);
m.insert("b".to_string(), true);
m
},
};
let value = Value {
value_type: Some(ValueType::MapValue(MapValue {
fields: {
let mut fields = std::collections::BTreeMap::new();
fields.insert(
"b".to_string(),
Value {
value_type: Some(ValueType::BooleanValue(true)),
},
);
fields.insert(
"i".to_string(),
Value {
value_type: Some(ValueType::IntegerValue(1)),
},
);
fields.insert(
"d".to_string(),
Value {
value_type: Some(ValueType::DoubleValue(2_f64)),
},
);
fields.insert(
"t".to_string(),
Value {
value_type: Some(ValueType::TimestampValue(prost_types::Timestamp {
seconds: 3_i64,
nanos: 4_i32,
})),
},
);
fields.insert(
"s".to_string(),
Value {
value_type: Some(ValueType::StringValue("s".to_string())),
},
);
fields.insert(
"r".to_string(),
Value {
value_type: Some(ValueType::ReferenceValue(
"projects/p/databases/d/documents/n".to_string(),
)),
},
);
fields.insert(
"g".to_string(),
Value {
value_type: Some(ValueType::GeoPointValue(
google_api_proto::google::r#type::LatLng {
latitude: 5_f64,
longitude: 6_f64,
},
)),
},
);
fields.insert(
"a".to_string(),
Value {
value_type: Some(ValueType::ArrayValue(ArrayValue {
values: vec![
Value {
value_type: Some(ValueType::IntegerValue(1)),
},
Value {
value_type: Some(ValueType::IntegerValue(2)),
},
Value {
value_type: Some(ValueType::NullValue(0)),
},
],
})),
},
);
fields.insert(
"m".to_string(),
Value {
value_type: Some(ValueType::MapValue(MapValue {
fields: {
let mut fields = std::collections::BTreeMap::new();
fields.insert(
"a".to_string(),
Value {
value_type: Some(ValueType::BooleanValue(false)),
},
);
fields.insert(
"b".to_string(),
Value {
value_type: Some(ValueType::BooleanValue(true)),
},
);
fields
},
})),
},
);
fields
},
})),
};

at your option.
let serialized = serde_firestore_value::to_value(&t)?;
assert_eq!(serialized, value);

let deserialized = serde_firestore_value::from_value::<T>(&serialized)?;
assert_eq!(deserialized, t);
```
172 changes: 163 additions & 9 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,176 @@
//! A [serde] (de)serializer using [Firestore Value] as its data format.
//!
//! # Examples
//!
//! ```rust
//! # fn main() -> anyhow::Result<()> {
//! use google_api_proto::google::firestore::v1::{value::ValueType, Value};
//! use serde_firestore_value::{from_value, to_value};
//!
//! fn main() -> anyhow::Result<()> {
//! let t = 1_i64; // T: Serialize
//! let t = 1_i64; // T: Serialize
//!
//! let s = to_value(&t)?;
//! assert_eq!(s, Value {
//! value_type: Some(ValueType::IntegerValue(1_i64))
//! });
//!
//! let s = to_value(&t)?;
//! assert_eq!(s, Value {
//! value_type: Some(ValueType::IntegerValue(1_i64))
//! });
//! let d = from_value::<'_, i64>(&s)?;
//! assert_eq!(d, t);
//! # Ok(())
//! # }
//! ```
//!
//! let d = from_value::<'_, i64>(&s)?;
//! assert_eq!(d, t);
//! ```rust
//! # fn test() -> anyhow::Result<()> {
//! use google_api_proto::google::firestore::v1::{value::ValueType, ArrayValue, MapValue, Value};
//! use serde_firestore_value::{LatLng, Reference, Timestamp};
//! use std::collections::BTreeMap;
//!
//! Ok(())
//! #[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
//! struct T {
//! b: bool,
//! i: i64,
//! d: f64,
//! t: Timestamp,
//! s: String,
//! r: Reference,
//! g: LatLng,
//! a: Vec<Option<i64>>,
//! m: BTreeMap<String, bool>,
//! }
//!
//! let t = T {
//! b: true,
//! i: 1_i64,
//! d: 2_f64,
//! t: Timestamp {
//! seconds: 3_i64,
//! nanos: 4_i32,
//! },
//! s: "s".to_string(),
//! r: Reference("projects/p/databases/d/documents/n".to_string()),
//! g: LatLng {
//! latitude: 5_f64,
//! longitude: 6_f64,
//! },
//! a: vec![Some(1), Some(2), None],
//! m: {
//! let mut m = BTreeMap::new();
//! m.insert("a".to_string(), false);
//! m.insert("b".to_string(), true);
//! m
//! },
//! };
//! let value = Value {
//! value_type: Some(ValueType::MapValue(MapValue {
//! fields: {
//! let mut fields = std::collections::BTreeMap::new();
//! fields.insert(
//! "b".to_string(),
//! Value {
//! value_type: Some(ValueType::BooleanValue(true)),
//! },
//! );
//! fields.insert(
//! "i".to_string(),
//! Value {
//! value_type: Some(ValueType::IntegerValue(1)),
//! },
//! );
//! fields.insert(
//! "d".to_string(),
//! Value {
//! value_type: Some(ValueType::DoubleValue(2_f64)),
//! },
//! );
//! fields.insert(
//! "t".to_string(),
//! Value {
//! value_type: Some(ValueType::TimestampValue(prost_types::Timestamp {
//! seconds: 3_i64,
//! nanos: 4_i32,
//! })),
//! },
//! );
//! fields.insert(
//! "s".to_string(),
//! Value {
//! value_type: Some(ValueType::StringValue("s".to_string())),
//! },
//! );
//! fields.insert(
//! "r".to_string(),
//! Value {
//! value_type: Some(ValueType::ReferenceValue(
//! "projects/p/databases/d/documents/n".to_string(),
//! )),
//! },
//! );
//! fields.insert(
//! "g".to_string(),
//! Value {
//! value_type: Some(ValueType::GeoPointValue(
//! google_api_proto::google::r#type::LatLng {
//! latitude: 5_f64,
//! longitude: 6_f64,
//! },
//! )),
//! },
//! );
//! fields.insert(
//! "a".to_string(),
//! Value {
//! value_type: Some(ValueType::ArrayValue(ArrayValue {
//! values: vec![
//! Value {
//! value_type: Some(ValueType::IntegerValue(1)),
//! },
//! Value {
//! value_type: Some(ValueType::IntegerValue(2)),
//! },
//! Value {
//! value_type: Some(ValueType::NullValue(0)),
//! },
//! ],
//! })),
//! },
//! );
//! fields.insert(
//! "m".to_string(),
//! Value {
//! value_type: Some(ValueType::MapValue(MapValue {
//! fields: {
//! let mut fields = std::collections::BTreeMap::new();
//! fields.insert(
//! "a".to_string(),
//! Value {
//! value_type: Some(ValueType::BooleanValue(false)),
//! },
//! );
//! fields.insert(
//! "b".to_string(),
//! Value {
//! value_type: Some(ValueType::BooleanValue(true)),
//! },
//! );
//! fields
//! },
//! })),
//! },
//! );
//! fields
//! },
//! })),
//! };
//!
//! let serialized = serde_firestore_value::to_value(&t)?;
//! assert_eq!(serialized, value);
//!
//! let deserialized = serde_firestore_value::from_value::<T>(&serialized)?;
//! assert_eq!(deserialized, t);
//!
//! # Ok(())
//! # }
//! ```
//!
//! [serde]: https://crates.io/crates/serde
Expand Down

0 comments on commit 0036090

Please sign in to comment.