use json::JsonValue; use std::ops::Deref; use std::sync::RwLockReadGuard; use std::sync::RwLockWriteGuard; pub trait ToJson { fn to_json(&self) -> Option; } impl ToJson for &str { fn to_json(&self) -> Option { Some(JsonValue::String(String::from(*self))) } } impl ToJson for String { fn to_json(&self) -> Option { Some(JsonValue::String(self.to_string())) } } impl ToJson for JsonValue { fn to_json(&self) -> Option { Some(self.clone()) } } impl ToJson for &T { fn to_json(&self) -> Option { (*self).to_json() } } impl ToJson for Option { fn to_json(&self) -> Option { match self { Some(d) => d.to_json(), None => None, } } } impl ToJson for RwLockReadGuard<'_, T> { fn to_json(&self) -> Option { self.deref().to_json() } } impl ToJson for RwLockWriteGuard<'_, T> { fn to_json(&self) -> Option { self.deref().to_json() } } pub trait FromJson where Self: Sized, { type Err; fn from_json(v: T) -> Result; }