use crate::nodes::node::Node;
#[cfg(feature = "alloc")]
pub struct MappingBuilder {
pairs: alloc::vec::Vec<(Node, Node)>,
}
#[cfg(feature = "alloc")]
impl MappingBuilder {
pub fn new() -> Self {
Self {
pairs: alloc::vec::Vec::new(),
}
}
pub fn insert<K: Into<Node>, V: Into<Node>>(mut self, key: K, value: V) -> Self {
self.pairs.push((key.into(), value.into()));
self
}
pub fn insert_if<K: Into<Node>, V: Into<Node>>(
mut self,
condition: bool,
key: K,
value: V,
) -> Self {
if condition {
self.pairs.push((key.into(), value.into()));
}
self
}
pub fn insert_opt<K: Into<Node>, V: Into<Node>>(mut self, key: K, value: Option<V>) -> Self {
if let Some(v) = value {
self.pairs.push((key.into(), v.into()));
}
self
}
pub fn upsert<K: Into<Node>, V: Into<Node>>(mut self, key: K, value: V) -> Self {
let key_node = key.into();
let value_node = value.into();
let mut found = false;
for (k, v) in self.pairs.iter_mut() {
if k == &key_node {
*v = value_node.clone();
found = true;
break;
}
}
if !found {
self.pairs.push((key_node, value_node));
}
self
}
pub fn build(self) -> Node {
Node::Mapping(self.pairs)
}
pub fn len(&self) -> usize {
self.pairs.len()
}
pub fn is_empty(&self) -> bool {
self.pairs.is_empty()
}
pub fn contains_key(&self, key: &str) -> bool {
self.pairs.iter().any(|(k, _)| {
if let Node::Str(s, _, _) = k {
s == key
} else {
false
}
})
}
}
#[cfg(feature = "alloc")]
impl Default for MappingBuilder {
fn default() -> Self {
Self::new()
}
}