#![doc = include_str!("../README.md")]
pub use serde_json::json;
pub use de::{Deserializer, StreamDeserializer};
#[doc(inline)]
pub use de::{from_reader, from_slice, from_str};
pub mod de {
pub use serde_json::de::{Deserializer, StreamDeserializer};
use crate::Result;
use std::io;
pub use serde_json::de::{IoRead, Read, SliceRead, StrRead};
use serde::{de::DeserializeOwned, Deserialize};
pub fn from_str<'a, T>(s: &'a str) -> Result<T>
where
T: Deserialize<'a>,
{
let jd = &mut serde_json::Deserializer::from_str(s);
serde_path_to_error::deserialize(jd)
}
pub fn from_reader<R, T>(rdr: R) -> Result<T>
where
R: io::Read,
T: DeserializeOwned,
{
let jd = &mut serde_json::Deserializer::from_reader(rdr);
serde_path_to_error::deserialize(jd)
}
pub fn from_slice<'a, T>(v: &'a [u8]) -> Result<T>
where
T: Deserialize<'a>,
{
let jd = &mut serde_json::Deserializer::from_slice(v);
serde_path_to_error::deserialize(jd)
}
}
#[doc(inline)]
pub use error::{Error, Result};
pub mod error {
pub use serde_json::error::Category;
pub type Error = serde_path_to_error::Error<serde_json::Error>;
pub type Result<T> = std::result::Result<T, Error>;
}
#[doc(inline)]
pub use ser::{
to_string, to_string_pretty, to_vec, to_vec_pretty, to_writer, to_writer_pretty, Formatter,
Serializer,
};
pub mod ser {
use crate::Result;
use serde::Serialize;
static UTF8_ERROR: &str =
"`serde_json` internally guarantees UTF8 and uses `String::from_utf8_unchecked`. \
If this error throws, `serde_json` must have broken this guarantee";
pub use serde_json::ser::{CharEscape, CompactFormatter, Formatter, PrettyFormatter};
pub use serde_json::ser::Serializer;
pub fn to_writer<W, T>(writer: W, value: &T) -> Result<()>
where
W: std::io::Write,
T: ?Sized + Serialize,
{
let mut ser = Serializer::new(writer);
serde_path_to_error::serialize(&value, &mut ser)
}
pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
where
T: ?Sized + Serialize,
{
let mut bytes = Vec::new();
to_writer(&mut bytes, value)?;
Ok(bytes)
}
pub fn to_string<T>(value: &T) -> Result<String>
where
T: ?Sized + Serialize,
{
let vec = to_vec(value)?;
Ok(String::from_utf8(vec).expect(UTF8_ERROR))
}
pub fn to_writer_pretty<W, T>(writer: W, value: &T) -> Result<()>
where
W: std::io::Write,
T: ?Sized + Serialize,
{
let mut ser = Serializer::pretty(writer);
serde_path_to_error::serialize(&value, &mut ser)
}
pub fn to_vec_pretty<T>(value: &T) -> Result<Vec<u8>>
where
T: ?Sized + Serialize,
{
let mut bytes = Vec::new();
to_writer_pretty(&mut bytes, value)?;
Ok(bytes)
}
pub fn to_string_pretty<T>(value: &T) -> Result<String>
where
T: ?Sized + Serialize,
{
let vec = to_vec_pretty(value)?;
Ok(String::from_utf8(vec).expect(UTF8_ERROR))
}
}
#[doc(inline)]
pub use map::Map;
pub mod map {
pub use serde_json::map::{
Entry, IntoIter, Iter, IterMut, Keys, Map, OccupiedEntry, VacantEntry, Values, ValuesMut,
};
}
#[doc(inline)]
pub use value::{from_value, to_value, Number, Value};
pub mod value {
use serde::{de::DeserializeOwned, Serialize};
pub use serde_json::value::{Index, Map, Number, Value};
pub use serde_json::value::Serializer;
#[cfg(feature = "raw_value")]
pub use serde_json::value::{to_raw_value, RawValue};
use crate::{Error, Result};
pub fn to_value<T>(value: T) -> Result<Value>
where
T: Serialize,
{
let mut track = serde_path_to_error::Track::new();
let ps = serde_path_to_error::Serializer::new(Serializer, &mut track);
value.serialize(ps).map_err(|e| Error::new(track.path(), e))
}
pub fn from_value<T>(value: Value) -> Result<T>
where
T: DeserializeOwned,
{
serde_path_to_error::deserialize(value)
}
}