arma-rs 1.12.1

Arma 3 Extensions in Rust
Documentation
use crate::{FromArma, FromArmaError, IntoArma, Value};

impl IntoArma for serde_json::Value {
    fn to_arma(&self) -> Value {
        match self {
            serde_json::Value::Null => Value::Null,
            serde_json::Value::Bool(b) => Value::Boolean(*b),
            serde_json::Value::Number(n) => Value::Number(if n.is_f64() {
                n.as_f64().unwrap()
            } else if n.is_i64() {
                n.as_i64().unwrap() as f64
            } else if n.is_u64() {
                n.as_u64().unwrap() as f64
            } else {
                unreachable!()
            }),
            serde_json::Value::String(s) => Value::String(s.to_owned()),
            serde_json::Value::Array(v) => {
                Value::Array(v.iter().map(|v| v.to_arma()).collect::<Vec<Value>>())
            }
            serde_json::Value::Object(o) => o
                .iter()
                .map(|(k, v)| vec![Value::String(k.to_owned()), v.to_arma()])
                .collect::<Vec<Vec<Value>>>()
                .to_arma(),
        }
    }
}

impl FromArma for serde_json::Value {
    fn from_arma(s: String) -> Result<Self, FromArmaError> {
        let value = Value::from_arma(s)?;
        Ok(value.to_json())
    }
}

impl Value {
    /// Convert a Value to a serde_json::Value
    pub fn to_json(&self) -> serde_json::Value {
        match self {
            Value::Null => serde_json::Value::Null,
            Value::Boolean(b) => serde_json::Value::Bool(*b),
            Value::Number(n) => {
                serde_json::Value::Number(serde_json::Number::from_f64(*n).unwrap())
            }
            Value::String(s) => serde_json::Value::String(s.to_owned()),
            Value::Array(v) => serde_json::Value::Array(v.iter().map(|v| v.to_json()).collect()),
            Value::Unknown(s) => serde_json::Value::String(s.to_owned()),
        }
    }
}