use crate::CodeMessage;
use crate::from_body::ToCodeMessage;
use serde::Deserialize;
use serde::Serialize;
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
#[derive(Default)]
pub enum Value {
#[default]
Null,
Bool(bool),
Integer(i64),
Float(f64),
String(String),
Array(Vec<Value>),
Object(HashMap<String, Value>),
}
impl From<bool> for Value {
fn from(v: bool) -> Self {
Value::Bool(v)
}
}
impl From<i32> for Value {
fn from(v: i32) -> Self {
Value::Integer(v as i64)
}
}
impl From<i64> for Value {
fn from(v: i64) -> Self {
Value::Integer(v)
}
}
impl From<f32> for Value {
fn from(v: f32) -> Self {
Value::Float(v as f64)
}
}
impl From<f64> for Value {
fn from(v: f64) -> Self {
Value::Float(v)
}
}
impl From<String> for Value {
fn from(v: String) -> Self {
Value::String(v)
}
}
impl From<&str> for Value {
fn from(v: &str) -> Self {
Value::String(v.to_string())
}
}
impl<T: Into<Value>> From<Vec<T>> for Value {
fn from(v: Vec<T>) -> Self {
Value::Array(v.into_iter().map(Into::into).collect())
}
}
impl<T: Into<Value>> From<HashMap<String, T>> for Value {
fn from(v: HashMap<String, T>) -> Self {
Value::Object(v.into_iter().map(|(k, v)| (k, v.into())).collect())
}
}
pub type OpenObject = HashMap<String, Value>;
#[derive(Debug, Default, Deserialize)]
#[serde(default)]
pub struct OpenObjectResponse {
#[serde(flatten)]
pub code_message: CodeMessage,
pub open_object: OpenObject,
}
impl ToCodeMessage for OpenObjectResponse {
fn to_code_message(&self) -> &CodeMessage {
&self.code_message
}
}