1use std::collections::HashMap;
2
3use deepsize::DeepSizeOf;
4use futures_core::Stream;
5use futures_io::AsyncBufRead;
6use futures_util::{future, AsyncBufReadExt, StreamExt, TryStreamExt};
7use map_ordering_serializer::MapOrderingSerializer;
8use serde::{de::DeserializeOwned, Serialize};
9use serde_json::ser::CompactFormatter;
10use thiserror::Error;
11
12pub use zbase32;
13
14mod map_ordering_serializer;
15pub mod raw_data_serde;
16mod tagged_data;
17
18pub use tagged_data::*;
19
20#[inline]
21pub fn to_writer<W, T>(writer: W, value: &T) -> std::io::Result<()>
22where
23 W: std::io::Write,
24 T: ?Sized + Serialize,
25{
26 let mut ser = serde_json::Serializer::with_formatter(writer, CompactFormatter {});
27 value.serialize(&mut ser)?;
28 Ok(())
29}
30
31#[inline]
32pub fn to_writer_canonical<W, T>(writer: W, value: &T) -> std::io::Result<()>
33where
34 W: std::io::Write,
35 T: ?Sized + Serialize,
36{
37 let mut ser = MapOrderingSerializer::new(writer);
38 value.serialize(&mut ser)?;
39 Ok(())
40}
41
42#[inline]
43pub fn to_vec<T>(value: &T) -> std::io::Result<Vec<u8>>
44where
45 T: ?Sized + Serialize,
46{
47 let mut writer = Vec::new();
48 to_writer(&mut writer, value)?;
49 Ok(writer)
50}
51
52#[inline]
53pub fn to_vec_canonical<T>(value: &T) -> std::io::Result<Vec<u8>>
54where
55 T: ?Sized + Serialize,
56{
57 let mut writer = Vec::new();
58 to_writer_canonical(&mut writer, value)?;
59 Ok(writer)
60}
61
62#[inline]
63pub fn to_string<T>(value: &T) -> std::io::Result<String>
64where
65 T: ?Sized + Serialize,
66{
67 let vec = to_vec(value)?;
68
69 Ok(unsafe {
70 String::from_utf8_unchecked(vec)
72 })
73}
74
75#[inline]
76pub fn to_string_canonical<T>(value: &T) -> std::io::Result<String>
77where
78 T: ?Sized + Serialize,
79{
80 let vec = to_vec_canonical(value)?;
81
82 Ok(unsafe {
83 String::from_utf8_unchecked(vec)
85 })
86}
87
88#[inline]
89pub fn from_slice_owned<T: DeserializeOwned>(sl: &[u8]) -> Result<T, self::Error> {
90 serde_json::from_reader(sl)
91}
92
93#[inline]
94pub fn val_from_str(s: &str) -> Result<litl_val::Val, self::Error> {
95 serde_json::from_str(s)
96}
97
98pub use serde_json::{
99 from_reader, from_slice, from_str, from_value, json, to_string_pretty, to_value, Error, Value,
100};
101
102pub use litl_val::{from_val, to_val, Key, Map, Val, ValDeserializerError, ValE, ValRef};
103
104pub struct MeasureValue(pub Value);
105
106impl DeepSizeOf for MeasureValue {
107 fn deep_size_of_children(&self, context: &mut deepsize::Context) -> usize {
108 match self.0.clone() {
109 Value::Null => std::mem::size_of::<Value>(),
110 Value::Bool(_) => std::mem::size_of::<Value>(),
111 Value::Number(_) => std::mem::size_of::<Value>(),
112 Value::String(s) => {
113 s.deep_size_of_children(context) + std::mem::size_of::<Value>()
114 - std::mem::size_of::<String>()
115 }
116 Value::Array(a) => {
117 a.into_iter()
118 .map(MeasureValue)
119 .collect::<Vec<_>>()
120 .deep_size_of_children(context)
121 + std::mem::size_of::<Value>()
122 - std::mem::size_of::<Vec<Value>>()
123 }
124 Value::Object(o) => {
125 o.into_iter()
126 .map(|(k, v)| (k, MeasureValue(v)))
127 .collect::<HashMap<_, _>>()
128 .deep_size_of_children(context)
129 + std::mem::size_of::<Value>()
130 - std::mem::size_of::<serde_json::map::Map<String, Value>>()
131 }
132 }
133 }
134}
135
136#[macro_export]
137macro_rules! impl_debug_as_litl {
138 ($t:ty) => {
139 impl std::fmt::Debug for $t {
140 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
141 f.write_str(&litl::to_string_pretty(&self).unwrap())
142 }
143 }
144 };
145}
146
147pub fn from_newln_sep_slice<T: DeserializeOwned>(s: &[u8]) -> Result<Vec<T>, Error> {
148 let mut result = Vec::new();
149 for line in s.split(|b| *b == b'\n') {
150 if !line.is_empty() {
151 result.push(from_slice(line)?);
152 }
153 }
154 Ok(result)
155}
156
157pub fn read_newln_sep_stream<R: AsyncBufRead, T: DeserializeOwned>(
158 reader: R,
159) -> impl Stream<Item = Result<T, ReadNewlnSepStreamError>> {
160 reader
161 .lines()
162 .map_err(ReadNewlnSepStreamError::Io)
163 .and_then(|line| {
164 future::ready(from_str(&line).map_err(ReadNewlnSepStreamError::Deserialize))
165 })
166}
167
168#[derive(Error, Debug)]
169pub enum ReadNewlnSepStreamError {
170 #[error(transparent)]
171 Io(#[from] std::io::Error),
172 #[error(transparent)]
173 Deserialize(#[from] crate::Error),
174}
175
176pub fn to_newln_sep_vec<'a, T: Serialize + 'a, I: IntoIterator<Item = &'a T>>(
177 iter: I,
178) -> Result<Vec<u8>, std::io::Error> {
179 let mut buf = Vec::new();
180 for item in iter {
181 let item_str = to_string(item)?;
182 buf.extend_from_slice(item_str.as_bytes());
183 buf.push(b'\n');
184 }
185 Ok(buf)
186}
187
188pub fn to_newln_sep_stream<T: Serialize, S: Stream<Item = T>>(
189 stream: S,
190) -> impl Stream<Item = Result<Vec<u8>, std::io::Error>> {
191 stream.map(|val| {
192 let mut bytes = crate::to_vec(&val)?;
193 bytes.push(b'\n');
194 Ok(bytes)
195 })
196}