-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Expand file tree
/
Copy pathserde.rs
More file actions
130 lines (114 loc) · 3.62 KB
/
serde.rs
File metadata and controls
130 lines (114 loc) · 3.62 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#![allow(missing_docs)]
use indexmap::map::IndexMap;
use serde::{Deserialize, Serialize};
pub use vector_lib::serde::{bool_or_struct, is_default};
use vector_lib::{
codecs::{
BytesDecoderConfig, BytesDeserializerConfig,
decoding::{DeserializerConfig, FramingConfig},
},
configurable::configurable_component,
};
pub const fn default_true() -> bool {
true
}
pub const fn default_false() -> bool {
false
}
/// The default max length of the input buffer.
///
/// Any input exceeding this limit will be discarded.
pub fn default_max_length() -> usize {
bytesize::kib(100u64) as usize
}
pub fn default_framing_message_based() -> FramingConfig {
BytesDecoderConfig::new().into()
}
pub fn default_decoding() -> DeserializerConfig {
BytesDeserializerConfig::new().into()
}
/// Utilities for the `serde_json` crate.
pub mod json {
use bytes::{BufMut, BytesMut};
use serde::Serialize;
/// Serialize the given data structure as JSON to `String`.
///
/// # Panics
///
/// Serialization can panic if `T`'s implementation of `Serialize` decides
/// to fail, or if `T` contains a map with non-string keys.
pub fn to_string(value: impl Serialize) -> String {
let value = serde_json::to_value(value).unwrap();
value.as_str().unwrap().into()
}
/// Serialize the given data structure as JSON to `BytesMut`.
///
/// # Errors
///
/// Serialization can fail if `T`'s implementation of `Serialize` decides to
/// fail, or if `T` contains a map with non-string keys.
pub fn to_bytes<T>(value: &T) -> serde_json::Result<BytesMut>
where
T: ?Sized + Serialize,
{
// Allocate same capacity as `serde_json::to_vec`:
// https://github.com/serde-rs/json/blob/5fe9bdd3562bf29d02d1ab798bbcff069173306b/src/ser.rs#L2195.
let mut bytes = BytesMut::with_capacity(128);
serde_json::to_writer((&mut bytes).writer(), value)?;
Ok(bytes)
}
}
/// A field reference or value.
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)]
pub enum FieldsOrValue<V> {
/// A set of fields mapped by to either another field or a value.
Fields(Fields<V>),
/// A value.
Value(V),
}
/// Mapping of field names to either a value or another field.
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Fields<V>(IndexMap<String, FieldsOrValue<V>>);
impl<V: 'static> Fields<V> {
pub fn all_fields(self) -> impl Iterator<Item = (String, V)> {
self.0
.into_iter()
.flat_map(|(k, v)| -> Box<dyn Iterator<Item = (String, V)>> {
match v {
// boxing is used as a way to avoid incompatible types of the match arms
FieldsOrValue::Value(v) => Box::new(std::iter::once((k, v))),
FieldsOrValue::Fields(f) => Box::new(
f.all_fields()
.map(move |(nested_k, v)| (format!("{k}.{nested_k}"), v)),
),
}
})
}
}
/// A value which can be (de)serialized from one or many instances of `T`.
#[configurable_component]
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
#[serde(untagged)]
pub enum OneOrMany<T: 'static> {
One(T),
Many(Vec<T>),
}
impl<T> OneOrMany<T> {
pub fn to_vec(self) -> Vec<T> {
match self {
Self::One(value) => vec![value],
Self::Many(list) => list,
}
}
}
impl<T> From<T> for OneOrMany<T> {
fn from(value: T) -> Self {
Self::One(value)
}
}
impl<T> From<Vec<T>> for OneOrMany<T> {
fn from(value: Vec<T>) -> Self {
Self::Many(value)
}
}