use crate::model::values::{Number, Value};
use std::collections::HashMap;
#[derive(Debug)]
pub struct ArrayBuilder {
inner: Vec<Value>,
}
#[derive(Debug)]
pub struct ObjectBuilder {
inner: HashMap<String, Value>,
}
#[derive(Debug)]
pub struct ValueBuilder {
inner: Value,
}
impl Default for ArrayBuilder {
fn default() -> Self {
Self {
inner: Default::default(),
}
}
}
impl From<&mut ArrayBuilder> for Value {
fn from(builder: &mut ArrayBuilder) -> Self {
Value::Array(builder.inner.clone())
}
}
impl From<ArrayBuilder> for Value {
fn from(builder: ArrayBuilder) -> Self {
Value::Array(builder.inner)
}
}
impl ArrayBuilder {
pub fn push(&mut self, v: Value) -> &mut Self {
self.inner.push(v);
self
}
pub fn number(&mut self, v: Number) -> &mut Self {
let _ = self.push(Value::Number(v));
self
}
pub fn integer(&mut self, v: i64) -> &mut Self {
let _ = self.push(Value::Number(v.into()));
self
}
pub fn float(&mut self, v: f64) -> &mut Self {
let _ = self.push(Value::Number(v.into()));
self
}
pub fn boolean(&mut self, v: bool) -> &mut Self {
let _ = self.push(Value::Boolean(v));
self
}
pub fn string(&mut self, v: &str) -> &mut Self {
let _ = self.push(Value::String(v.to_string()));
self
}
}
impl Default for ObjectBuilder {
fn default() -> Self {
Self {
inner: Default::default(),
}
}
}
impl From<&mut ObjectBuilder> for Value {
fn from(builder: &mut ObjectBuilder) -> Self {
Value::Object(builder.inner.clone())
}
}
impl From<ObjectBuilder> for Value {
fn from(builder: ObjectBuilder) -> Self {
Value::Object(builder.inner)
}
}
impl ObjectBuilder {
pub fn insert(&mut self, k: &str, v: Value) -> &mut Self {
let _ = self.inner.insert(k.to_string(), v);
self
}
pub fn number(&mut self, k: &str, v: Number) -> &mut Self {
let _ = self.insert(k, Value::Number(v));
self
}
pub fn integer(&mut self, k: &str, v: i64) -> &mut Self {
let _ = self.insert(k, Value::Number(v.into()));
self
}
pub fn float(&mut self, k: &str, v: f64) -> &mut Self {
let _ = self.insert(k, Value::Number(v.into()));
self
}
pub fn boolean(&mut self, k: &str, v: bool) -> &mut Self {
let _ = self.insert(k, Value::Boolean(v));
self
}
pub fn string(&mut self, k: &str, v: &str) -> &mut Self {
let _ = self.insert(k, Value::String(v.to_string()));
self
}
pub fn reference(&mut self, k: &str, v: &str) -> &mut Self {
let _ = self.insert(k, Value::String(v.to_string()));
self
}
}
impl From<&mut ValueBuilder> for Value {
fn from(builder: &mut ValueBuilder) -> Self {
builder.inner.clone()
}
}
impl From<ValueBuilder> for Value {
fn from(builder: ValueBuilder) -> Self {
builder.inner
}
}
impl ValueBuilder {
pub fn array() -> ArrayBuilder {
Default::default()
}
pub fn object() -> ObjectBuilder {
Default::default()
}
pub fn number(n: Number) -> Self {
Self {
inner: Value::Number(n),
}
}
pub fn integer(n: i64) -> Self {
Self {
inner: Value::Number(n.into()),
}
}
pub fn float(n: f64) -> Self {
Self {
inner: Value::Number(n.into()),
}
}
pub fn boolean(v: bool) -> Self {
Self {
inner: Value::Boolean(v),
}
}
pub fn string(v: &str) -> Self {
Self {
inner: Value::String(v.to_string()),
}
}
}