use crate::object::base::OF64; use crate::prelude::*; use ordered_float::OrderedFloat; use serde::de::{self, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt; struct OF64Visitor; impl Visitor<'_> for OF64Visitor { type Value = OF64; fn visit_f64(self, value: f64) -> Result { Ok(OF64::new(OrderedFloat(value))) } fn visit_f32(self, value: f32) -> Result { Ok(OF64::new(OrderedFloat(value as f64))) } fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a float") } } /* impl<'de> Deserialize<'de> for OF64 { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { deserializer.deserialize_f64(OF64Visitor) } } */ /* impl Serialize for Value { fn serialize(&self, serializer: S) -> Result where S: Serializer, { match self { Value::Primitive(p) => p.serialize(serializer), Value::Object(o) => o.serialize(serializer), Value::List(l) => l.serialize(serializer), Value::Block(b) => b.serialize(serializer), Value::Error(e) => e.serialize(serializer), Value::Filesystem => "".serialize(serializer), } } } */ struct ValueVisitor; impl<'de> Visitor<'de> for ValueVisitor { type Value = Value; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a shell value") } fn visit_i32(self, value: i32) -> Result where E: de::Error, { Ok(Value::int(value)) } fn visit_i64(self, value: i64) -> Result where E: de::Error, { Ok(Value::int(value)) } fn visit_u32(self, value: u32) -> Result where E: de::Error, { Ok(Value::int(value)) } fn visit_u64(self, value: u64) -> Result where E: de::Error, { // TODO: Handle overflow better Ok(Value::int(value as i64)) } fn visit_str(self, value: &str) -> Result where E: de::Error, { Ok(Value::string(value)) } fn visit_bool(self, value: bool) -> Result where E: de::Error, { Ok(Value::boolean(value)) } } /* impl<'de> Deserialize<'de> for Value { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { deserializer.deserialize_any(ValueVisitor) } } */