#[cfg(feature = "serde")]
use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize))]
pub enum XmlValue {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
Null,
Array(XmlArray),
Object(XmlObject),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize))]
pub struct XmlArray {
pub list: Vec<XmlValue>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize))]
pub struct XmlObject {
pub dict: HashMap<String, XmlValue>,
}
impl XmlValue {
pub fn as_str(&self) -> Option<&str> {
match self {
XmlValue::String(s) => Some(s),
_ => None,
}
}
pub fn as_integer(&self) -> Option<i64> {
match self {
XmlValue::Integer(i) => Some(*i),
_ => None,
}
}
pub fn as_float(&self) -> Option<f64> {
match self {
XmlValue::Float(f) => Some(*f),
_ => None,
}
}
pub fn as_bool(&self) -> Option<bool> {
match self {
XmlValue::Boolean(b) => Some(*b),
_ => None,
}
}
pub fn is_null(&self) -> bool {
matches!(self, XmlValue::Null)
}
pub fn as_array(&self) -> Option<&Vec<XmlValue>> {
match self {
XmlValue::Array(XmlArray { list: a }) => Some(a),
_ => None,
}
}
pub fn as_object(&self) -> Option<&HashMap<String, XmlValue>> {
match self {
XmlValue::Object(XmlObject { dict: o }) => Some(o),
_ => None,
}
}
pub fn get(&self, key: &str) -> Option<&XmlValue> {
match self {
XmlValue::Object(XmlObject { dict: o }) => o.get(key),
_ => None,
}
}
}
impl std::fmt::Display for XmlValue {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
XmlValue::String(s) => write!(f, "\"{}\"", s),
XmlValue::Integer(i) => write!(f, "{}", i),
XmlValue::Float(fl) => write!(f, "{}", fl),
XmlValue::Boolean(b) => write!(f, "{}", b),
XmlValue::Null => write!(f, "null"),
XmlValue::Array(XmlArray { list: a }) => {
write!(f, "[")?;
for (i, item) in a.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{}", item)?;
}
write!(f, "]")
}
XmlValue::Object(XmlObject { dict: o }) => {
write!(f, "{{")?;
for (i, (key, value)) in o.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "\"{}\": {}", key, value)?;
}
write!(f, "}}")
}
}
}
}