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
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
//! [`Encoder`] and [`Decoder`] for converting between data structures and [`Kserd`].
//!
//! Requires the _encode_ feature.
//!
//! [`Kserd`] leverages [`serde`] to encode a data object into a `Kserd` data format and back again.
//! Any type that implements [`Serialize`] can be _encoded_ to a `Kserd`, and any type that implements
//! [`Deserialize`] can be _decoded_ back to that type from a `Kserd` object.
//!
//! It is important to understand lifetime subtleties between encoding and decoding, the api
//! documentation on [`Encoder`] and [`Decoder`] have explanations. There is an alternate encoding
//! method which uses the trait [`ToKserd`] that can _consume_ the implementor object.
//!
//! # Examples
//! Encoding can be done for any type that implements [`Serialize`].
//!
//! ```rust
//! # use kserd::*;
//! let data = (
//!     100,
//!     "Hello, world!",
//!     3.14
//! );
//!
//! let expected = Kserd::new(Value::Tuple(
//!     vec![
//!         Kserd::new_num(100),
//!         Kserd::new_str("Hello, world!"),
//!         Kserd::new_num(3.14)
//!     ]
//! ));
//!
//! let kserd = Kserd::enc(&data);
//! assert_eq!(kserd, Ok(expected));
//! ```
//!
//! Decoding can be done for any type that implements [`Deserialize`].
//! ```rust
//! # use kserd::*;
//! let kserd = Kserd::new(Value::Tuple(
//!     vec![
//!         Kserd::new_num(100),
//!         Kserd::new_str("Hello, world!"),
//!         Kserd::new_num(3.14)
//!     ]
//! ));
//!
//! let expected = (
//!     100,
//!     "Hello, world!",
//!     3.14
//! );
//!
//! let r = kserd.decode::<(u32, &str, f32)>();
//! assert_eq!(r, Ok(expected));
//! ```
//!
//! An example of a round trip.
//! ```rust
//! # use kserd::*;
//! let data = (
//!     100,
//!     "Hello, world!".to_string(), // see Decoder docs for lifetime subtleties
//!     3.14
//! );
//!
//! let kserd = Kserd::enc(&data).unwrap();
//! let r = kserd.decode::<(u32, String, f32)>();
//! assert_eq!(r, Ok(data));
//! ```
//!
//! [`Decoder`]: crate::encode::Decoder
//! [`Deserialize`]: crate::encode::Deserialize
//! [`Encoder`]: crate::encode::Encoder
//! [`Kserd`]: crate::ds::Kserd
//! [`serde`]: serde
//! [`Serialize`]: crate::encode::Serialize
//! [`ToKserd`]: crate::ToKserd
use crate::*;
use std::collections::BTreeMap;

mod decoder;
mod encoder;

pub use self::decoder::Decoder;
pub use self::encoder::Encoder;
pub use serde::{Deserialize, Serialize};

impl Kserd<'static> {
    /// Encode `T` into a `Kserd`.
    ///
    /// Requires the _encode_ feature.
    ///
    /// Convenience function for `data.serialize(Encoder)`.
    ///
    /// See [`Encoder`](encode::Encoder) for usage.
    pub fn enc<T: Serialize>(data: &T) -> Result<Self, encoder::Error> {
        data.serialize(Encoder)
    }
}

impl<'a> Kserd<'a> {
    /// Attempt to decode a `Kserd` into type `T`.
    ///
    /// Requires the _encode_ feature.
    ///
    /// Convenience function for `<T as Deserialize>::deserialize(Decoder(self))`.
    ///
    /// See [`Decoder`](encode::Decoder) for usage.
    pub fn decode<T: Deserialize<'a>>(self) -> Result<T, decoder::Error> {
        <T as Deserialize>::deserialize(Decoder(self))
    }
}