use serde::{Deserialize, Serialize};
use std::collections::hash_map::Entry;
use std::collections::HashMap;
use std::fmt::Display;
use std::fmt::Formatter;
use std::fmt::Result;
use std::hash::Hash;
use std::iter::FromIterator;
use std::iter::IntoIterator;
use std::iter::Iterator;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct JsonMap<K>
where
K: Eq + Clone + Hash,
{
#[serde(flatten)]
inner: HashMap<K, JsonV<K>>,
}
impl<K> JsonMap<K>
where
K: Eq + Clone + Hash,
{
pub fn new() -> Self {
Self {
inner: HashMap::new(),
}
}
pub fn insert(&mut self, key: K, value: JsonV<K>) {
self.inner.insert(key, value);
}
pub fn get_mut(&mut self, key: &K) -> Option<&mut JsonV<K>> {
self.inner.get_mut(key)
}
pub fn entry(&mut self, key: K) -> Entry<'_, K, JsonV<K>> {
self.inner.entry(key)
}
pub fn keys(&self) -> impl Iterator<Item = &K> {
self.inner.keys()
}
pub fn values(&self) -> impl Iterator<Item = &JsonV<K>> {
self.inner.values()
}
pub fn values_mut(&mut self) -> impl Iterator<Item = &mut JsonV<K>> {
self.inner.values_mut()
}
pub fn get(&self, key: &K) -> Option<&JsonV<K>> {
self.inner.get(key)
}
pub fn remove(&mut self, key: &K) -> Option<JsonV<K>> {
self.inner.remove(key)
}
pub fn contains_key(&self, key: &K) -> bool {
self.inner.contains_key(key)
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn clear(&mut self) {
self.inner.clear();
}
pub fn iter(&self) -> impl Iterator<Item = (&K, &JsonV<K>)> {
self.inner.iter()
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = (&K, &mut JsonV<K>)> {
self.inner.iter_mut()
}
}
impl<K> Default for JsonMap<K>
where
K: Eq + Clone + Hash,
{
fn default() -> Self {
Self {
inner: HashMap::new(),
}
}
}
impl<K> FromIterator<(K, JsonV<K>)> for JsonMap<K>
where
K: Eq + Clone + Hash,
{
fn from_iter<I: IntoIterator<Item = (K, JsonV<K>)>>(iter: I) -> Self {
let inner = iter.into_iter().collect();
Self { inner }
}
}
impl<K> IntoIterator for JsonMap<K>
where
K: Eq + Hash + Clone,
{
type Item = (K, JsonV<K>);
type IntoIter = std::collections::hash_map::IntoIter<K, JsonV<K>>;
fn into_iter(self) -> Self::IntoIter {
self.inner.into_iter()
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum JsonV<K>
where
K: Eq + Hash + Clone,
{
Boolean(bool),
Int64(i64),
Int32(i32),
Float64(f64),
Float32(f32),
String(String),
Array(Vec<JsonV<K>>),
Object(JsonMap<K>),
}
impl<K> From<bool> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: bool) -> Self {
JsonV::Boolean(value)
}
}
impl<K> From<i32> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: i32) -> Self {
JsonV::Int32(value)
}
}
impl<K> From<i64> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: i64) -> Self {
JsonV::Int64(value)
}
}
impl<K> From<f64> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: f64) -> Self {
JsonV::Float64(value)
}
}
impl<K> From<String> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: String) -> Self {
JsonV::String(value)
}
}
impl<K> From<&'static str> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: &'static str) -> Self {
JsonV::String(value.to_owned())
}
}
impl<K> From<Vec<JsonV<K>>> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: Vec<JsonV<K>>) -> Self {
JsonV::Array(value)
}
}
impl<K> From<&[JsonV<K>]> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(slice: &[JsonV<K>]) -> Self {
JsonV::Array((&slice).to_vec())
}
}
impl<K> From<JsonMap<K>> for JsonV<K>
where
K: Eq + Hash + Clone,
{
fn from(value: JsonMap<K>) -> Self {
JsonV::Object(value)
}
}
impl<K> Display for JsonV<K>
where
K: Eq + std::hash::Hash + Display + Clone,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
match self {
JsonV::Boolean(val) => write!(f, "{}", val),
JsonV::Int64(val) => write!(f, "{}", val),
JsonV::Int32(val) => write!(f, "{}", val),
JsonV::Float64(val) => write!(f, "{}", val),
JsonV::Float32(val) => write!(f, "{}", val),
JsonV::String(val) => write!(f, "{}", val),
JsonV::Array(arr) => {
write!(f, "[")?;
for (idx, item) in arr.iter().enumerate() {
if idx > 0 {
write!(f, ", ")?;
}
write!(f, "{}", item)?;
}
write!(f, "]")
}
JsonV::Object(map) => {
write!(f, "{{")?;
for (k, v) in map.iter() {
write!(f, "{}: {} , ", k, v)?;
}
write!(f, "}}")
}
}
}
}