serde_firestore_value/with.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
//! Modules specified in `#[serde(with = "...")]` to support special values
//! such as GeoPoint, Reference, and Timestamp.
//!
//! # Serialize and Deserialize GeoPoint, Reference, and Timestamp
//!
//! ```rust
//! # fn main() -> anyhow::Result<()> {
//! use serde_firestore_value::google::{
//! firestore::v1::{value::ValueType, MapValue, Value},
//! r#type::LatLng,
//! };
//! use serde_firestore_value::{
//! from_value, to_value,
//! with::{lat_lng, string_as_reference, timestamp},
//! };
//!
//! #[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
//! struct T {
//! #[serde(with = "lat_lng")]
//! lat_lng: LatLng,
//! #[serde(with = "string_as_reference")]
//! reference: String,
//! #[serde(with = "timestamp")]
//! timestamp: prost_types::Timestamp,
//! }
//! let t = T {
//! lat_lng: LatLng {
//! latitude: 1_f64,
//! longitude: 2_f64,
//! },
//! reference: "projects/p/databases/d/documents/c".to_string(),
//! timestamp: prost_types::Timestamp {
//! seconds: 3_i64,
//! nanos: 4_i32,
//! },
//! };
//! let v = Value {
//! value_type: Some(ValueType::MapValue(MapValue {
//! fields: std::collections::HashMap::from([
//! (
//! "lat_lng".to_string(),
//! Value {
//! value_type: Some(ValueType::GeoPointValue(LatLng { latitude: 1_f64, longitude: 2_f64 })),
//! },
//! ),
//! (
//! "reference".to_string(),
//! Value {
//! value_type: Some(ValueType::ReferenceValue(
//! "projects/p/databases/d/documents/c".to_string(),
//! )),
//! },
//! ),
//! (
//! "timestamp".to_string(),
//! Value {
//! value_type: Some(ValueType::TimestampValue(prost_types::Timestamp { seconds: 3_i64, nanos: 4_i32 })),
//! },
//! ),
//! ]),
//! })),
//! };
//!
//! let s = to_value(&t)?;
//! let d = from_value::<'_, T>(&s)?;
//! assert_eq!(s, v);
//! assert_eq!(d, t);
//! # Ok(())
//! # }
//! ```
#[cfg(feature = "chrono")]
pub mod chrono_date_time_as_timestamp;
pub mod lat_lng;
#[cfg(feature = "chrono")]
pub mod option_chrono_date_time_as_timestamp;
pub mod option_lat_lng;
pub mod option_string_as_reference;
#[cfg(feature = "time")]
pub mod option_time_offset_date_time_as_timestamp;
pub mod option_timestamp;
pub mod string_as_reference;
#[cfg(feature = "time")]
pub mod time_offset_date_time_as_timestamp;
pub mod timestamp;
pub mod vec_string_as_reference;