Skip to content

Commit

Permalink
Remove ref display name injection + make decoder visitor public
Browse files Browse the repository at this point in the history
  • Loading branch information
garethj2 committed Feb 26, 2024
1 parent 9d9de25 commit 52c65af
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 119 deletions.
65 changes: 0 additions & 65 deletions src/haystack/encoding/decode_ref_dis_factory.rs

This file was deleted.

72 changes: 32 additions & 40 deletions src/haystack/encoding/json/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
//!
//! Implement Hayson decoding
//!
use crate::encoding::decode_ref_dis_factory::get_ref_dis_from_factory;
use crate::haystack::val::{
Column, Coord, Date, DateTime, Dict, Grid, HaystackDict, List, Marker, Na, Number, Ref, Remove,
Str, Symbol, Time, Uri, Value as HVal, XStr,
Expand All @@ -20,7 +19,7 @@ use std::fmt;
/// Hayson Marker deserializer
impl<'de> Deserialize<'de> for Marker {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Marker, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
if val.is_marker() {
Ok(Marker)
} else {
Expand All @@ -34,7 +33,7 @@ type JsonErr = serde_json::Error;
/// Hayson Remove deserializer
impl<'de> Deserialize<'de> for Remove {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Remove, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
if val.is_remove() {
Ok(Remove)
} else {
Expand All @@ -46,7 +45,7 @@ impl<'de> Deserialize<'de> for Remove {
/// Hayson Remove deserializer
impl<'de> Deserialize<'de> for Na {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Na, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
if val.is_na() {
Ok(Na)
} else {
Expand All @@ -58,7 +57,7 @@ impl<'de> Deserialize<'de> for Na {
/// Hayson Number deserializer
impl<'de> Deserialize<'de> for Number {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Number, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Number(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Number")),
Expand All @@ -69,7 +68,7 @@ impl<'de> Deserialize<'de> for Number {
/// Hayson Date deserializer
impl<'de> Deserialize<'de> for Date {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Date, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Date(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Date")),
Expand All @@ -80,7 +79,7 @@ impl<'de> Deserialize<'de> for Date {
/// Hayson Time deserializer
impl<'de> Deserialize<'de> for Time {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Time, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Time(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Time")),
Expand All @@ -91,7 +90,7 @@ impl<'de> Deserialize<'de> for Time {
/// Hayson DateTime deserializer
impl<'de> Deserialize<'de> for DateTime {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<DateTime, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::DateTime(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson DateTime")),
Expand All @@ -102,20 +101,9 @@ impl<'de> Deserialize<'de> for DateTime {
/// Hayson Ref deserializer
impl<'de> Deserialize<'de> for Ref {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Ref, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Ref(val) => {
let dis = get_ref_dis_from_factory(val.value.as_str(), val.dis.as_deref());

Ok(if dis.as_deref() == val.dis.as_deref() {
val
} else {
Ref {
value: val.value,
dis: dis.map(|d| d.into_owned()),
}
})
}
HVal::Ref(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Ref")),
}
}
Expand All @@ -124,7 +112,7 @@ impl<'de> Deserialize<'de> for Ref {
/// Hayson Uri deserializer
impl<'de> Deserialize<'de> for Uri {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Uri, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Uri(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Uri")),
Expand All @@ -135,7 +123,7 @@ impl<'de> Deserialize<'de> for Uri {
/// Hayson Symbol deserializer
impl<'de> Deserialize<'de> for Symbol {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Symbol, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Symbol(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Symbol")),
Expand All @@ -146,7 +134,7 @@ impl<'de> Deserialize<'de> for Symbol {
/// Hayson Str deserializer
impl<'de> Deserialize<'de> for Str {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Str, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Str(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Str")),
Expand All @@ -157,7 +145,7 @@ impl<'de> Deserialize<'de> for Str {
/// Hayson Coord deserializer
impl<'de> Deserialize<'de> for Coord {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Coord, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Coord(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Coord")),
Expand All @@ -168,7 +156,7 @@ impl<'de> Deserialize<'de> for Coord {
/// Hayson XStr deserializer
impl<'de> Deserialize<'de> for XStr {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<XStr, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::XStr(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson XStr")),
Expand All @@ -179,7 +167,7 @@ impl<'de> Deserialize<'de> for XStr {
/// Hayson XStr deserializer
impl<'de> Deserialize<'de> for Dict {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Dict, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Dict(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Dict")),
Expand All @@ -190,7 +178,7 @@ impl<'de> Deserialize<'de> for Dict {
/// Hayson Grid deserializer
impl<'de> Deserialize<'de> for Grid {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Grid, D::Error> {
let val = deserializer.deserialize_any(HValVisitor)?;
let val = deserializer.deserialize_any(JsonValueDecoderVisitor)?;
match val {
HVal::Grid(val) => Ok(val),
_ => Err(D::Error::custom("Invalid Hayson Grid")),
Expand All @@ -201,13 +189,13 @@ impl<'de> Deserialize<'de> for Grid {
/// Hayson deserializer
impl<'de> Deserialize<'de> for HVal {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<HVal, D::Error> {
deserializer.deserialize_any(HValVisitor)
deserializer.deserialize_any(JsonValueDecoderVisitor)
}
}

struct HValVisitor;
pub struct JsonValueDecoderVisitor;
/// Visitor for Hayson elements
impl<'de> Visitor<'de> for HValVisitor {
impl<'de> Visitor<'de> for JsonValueDecoderVisitor {
type Value = HVal;

fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
Expand Down Expand Up @@ -387,17 +375,21 @@ fn parse_number(dict: &Dict) -> Result<HVal, JsonErr> {
}

fn parse_ref(dict: &Dict) -> Result<HVal, JsonErr> {
dict.get_str("val")
.map(|val| {
let dis_str = dict.get_str("dis").map(|d| d.as_str());
let dis = get_ref_dis_from_factory(&val.value, dis_str).map(|val| val.into_owned());
Ref {
match dict.get_str("val") {
Some(val) => match dict.get_str("dis") {
Some(dis) => Ok(Ref {
value: val.value.clone(),
dis,
dis: Some(dis.value.clone()),
}
.into()
})
.ok_or_else(|| JsonErr::custom("Missing or invalid 'val'"))
.into()),
None => Ok(Ref {
value: val.value.clone(),
dis: None,
}
.into()),
},
None => Err(JsonErr::custom("Missing or invalid 'val'")),
}
}

fn parse_symbol(dict: &Dict) -> Result<HVal, JsonErr> {
Expand Down
17 changes: 5 additions & 12 deletions src/haystack/encoding/json/encode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,9 @@
use chrono::SecondsFormat;

use crate::{
encoding::decode_ref_dis_factory::get_ref_dis_from_factory,
haystack::val::{
Column, Coord, Date, DateTime, Dict, Grid, Marker, Na, Number, Ref, Remove, Symbol, Time,
Uri, Value as HVal, XStr,
},
use crate::haystack::val::{
Column, Coord, Date, DateTime, Dict, Grid, Marker, Na, Number, Ref, Remove, Symbol, Time, Uri,
Value as HVal, XStr,
};

use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer};
Expand Down Expand Up @@ -57,12 +54,8 @@ impl Serialize for Ref {
let mut map = serializer.serialize_map(Some(if self.dis.is_none() { 2 } else { 3 }))?;
map.serialize_entry("_kind", "ref")?;
map.serialize_entry("val", &self.value)?;

let dis = get_ref_dis_from_factory(self.value.as_str(), self.dis.as_deref())
.map(|v| v.into_owned())
.or_else(|| self.dis.clone());

if dis.is_some() {
if self.dis.is_some() {
let dis = self.dis.clone();
map.serialize_entry("dis", &dis)?;
}
map.end()
Expand Down
2 changes: 0 additions & 2 deletions src/haystack/encoding/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,3 @@
pub mod json;
#[cfg(feature = "zinc")]
pub mod zinc;

pub mod decode_ref_dis_factory;

0 comments on commit 52c65af

Please sign in to comment.