json-node 0.1.1

A way to work with JSON as a node tree.
Documentation
use std::error::Error;
use std::collections::{VecDeque, LinkedList, HashSet, BTreeSet, BinaryHeap, HashMap, BTreeMap};

use crate::{JsonNode, JsonValueType};

pub trait ToJsonNode {
    fn to_json_node(&self) -> JsonNode;
}

impl ToJsonNode for String {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::String(self.clone()))
    }
}

impl ToJsonNode for &str {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::String(self.to_string()))
    }
}

impl ToJsonNode for i32 {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::Integer(i64::from(*self)))
    }
}

impl ToJsonNode for i64 {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::Integer(*self))
    }
}

impl ToJsonNode for f32 {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::Float(f64::from(*self)))
    }
}

impl ToJsonNode for f64 {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::Float(*self))
    }
}

impl ToJsonNode for u32 {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::Integer(i64::from(*self)))
    }
}

impl ToJsonNode for bool {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Value(JsonValueType::Boolean(*self))
    }
}

impl ToJsonNode for Option<String> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::String(value.clone())),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl ToJsonNode for Option<&str> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::String(value.to_string())),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl ToJsonNode for Option<i32> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::Integer(i64::from(*value))),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl ToJsonNode for Option<i64> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::Integer(*value)),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl ToJsonNode for Option<f32> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::Float(f64::from(*value))),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl ToJsonNode for Option<f64> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::Float(*value)),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl ToJsonNode for Option<u32> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::Integer(i64::from(*value))),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl ToJsonNode for Option<bool> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Some(value) => JsonNode::Value(JsonValueType::Boolean(*value)),
            None => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<String, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::String(value.clone())),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<&str, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::String(value.to_string())),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<i32, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::Integer(i64::from(*value))),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<i64, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::Integer(*value)),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<f32, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::Float(f64::from(*value))),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<f64, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::Float(*value)),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<u32, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::Integer(i64::from(*value))),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<E: Error> ToJsonNode for Result<bool, E> {
    fn to_json_node(&self) -> JsonNode {
        match self {
            Ok(value) => JsonNode::Value(JsonValueType::Boolean(*value)),
            Err(_) => JsonNode::Value(JsonValueType::Null),
        }
    }
}

impl<T: ToJsonNode, const COUNT: usize> ToJsonNode for [T; COUNT] {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for [T] {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for Vec<T> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for VecDeque<T> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for LinkedList<T> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for HashSet<T> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for BTreeSet<T> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for BinaryHeap<T> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Array(self.iter().map(|value| value.to_json_node()).collect())
    }
}

impl<T: ToJsonNode> ToJsonNode for Vec<(String, T)> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect(),
        )
    }
}

impl<T: ToJsonNode> ToJsonNode for VecDeque<(String, T)> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect(),
        )
    }
}

impl<T: ToJsonNode> ToJsonNode for LinkedList<(String, T)> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect(),
        )
    }
}

impl<T: ToJsonNode> ToJsonNode for HashSet<(String, T)> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect(),
        )
    }
}

impl<T: ToJsonNode> ToJsonNode for BTreeSet<(String, T)> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect(),
        )
    }
}

impl<T: ToJsonNode> ToJsonNode for BinaryHeap<(String, T)> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect(),
        )
    }
}

impl<V: ToJsonNode> ToJsonNode for HashMap<String, V> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect::<Vec<(String, JsonNode)>>(),
        )
    }
}

impl<V: ToJsonNode> ToJsonNode for BTreeMap<String, V> {
    fn to_json_node(&self) -> JsonNode {
        JsonNode::Object(
            self.iter()
                .map(|(key, value)| (key.clone(), value.to_json_node()))
                .collect::<Vec<(String, JsonNode)>>(),
        )
    }
}