Skip to content

Commit

Permalink
Merge pull request #11 from j2inn/fix-issue-10
Browse files Browse the repository at this point in the history
Ignore the "ver" meta entry when decoding from JSON
  • Loading branch information
rracariu authored Oct 1, 2022
2 parents 57ffd43 + 3e3ff2d commit c91f39a
Show file tree
Hide file tree
Showing 8 changed files with 122 additions and 41 deletions.
37 changes: 17 additions & 20 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "libhaystack"
version = "1.0.8"
version = "1.0.9"
description = "Rust implementation of the Haystack 4 data types, defs, filter, units, and encodings"
authors = ["J2 Innovations", "Radu Racariu <[email protected]>"]
edition = "2021"
Expand Down
33 changes: 21 additions & 12 deletions src/haystack/encoding/json/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::haystack::val::{

use crate::haystack::timezone::make_date_time_with_tz;
use crate::units::get_unit;
use crate::val::GRID_FORMAT_VERSION;

use chrono::{Offset, Utc};
use serde::de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
Expand Down Expand Up @@ -300,52 +301,52 @@ impl<'de> Visitor<'de> for HValVisitor {

match kind.as_str() {
"number" => match parse_number(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Number. {err}"))),
},

"ref" => match parse_ref(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Ref. {err}"))),
},

"symbol" => match parse_symbol(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Symbol. {err}"))),
},

"uri" => match parse_uri(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Uri. {err}"))),
},

"date" => match parse_date(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Date. {err}"))),
},

"time" => match parse_time(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Time. {err}"))),
},

"dateTime" => match parse_datetime(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson DateTime. {err}"))),
},

"coord" => match parse_coord(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Coord. {err}"))),
},

"xstr" => match parse_xstr(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson XStr. {err}"))),
},

"grid" => match parse_grid(&dict) {
Ok(num) => Ok(num),
Ok(val) => Ok(val),
Err(err) => Err(A::Error::custom(format!("Invalid Hayson Grid. {err}"))),
},
_ => Ok(HVal::make_dict(dict)),
Expand Down Expand Up @@ -469,9 +470,16 @@ fn parse_grid(dict: &Dict) -> Result<HVal, JsonErr> {
match dict.get_list("rows") {
Some(rows) => match dict.get_list("cols") {
Some(cols) => {
let grid = Grid {
meta: dict.get_dict("meta").cloned(),
let mut grid_ver = GRID_FORMAT_VERSION.to_string();

let grid = Grid {
meta: dict.get_dict("meta").cloned().map(|mut meta| {
if let Some(ver) = meta.get_str("ver") {
grid_ver = ver.value.to_owned();
};
meta.remove("ver");
meta
}),
columns: {
let cols: Result<Vec<Column>, JsonErr> = cols
.iter()
Expand Down Expand Up @@ -508,6 +516,7 @@ fn parse_grid(dict: &Dict) -> Result<HVal, JsonErr> {
.collect();
rows?
},
ver: grid_ver,
};
Ok(grid.into())
}
Expand Down
5 changes: 4 additions & 1 deletion src/haystack/encoding/zinc/decode/complex/grid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ fn parse_grid_content<'a, 'b: 'a, R: Read>(
) -> Result<(Grid, RowParser<'a, 'b, R>), Error> {
let has_nested_grid_start = parse_nested_grid_start(parser)?;

parse_grid_ver(parser)?;
let ver = parse_grid_ver(parser)?;

parser.lexer.read()?;

Expand All @@ -74,6 +74,7 @@ fn parse_grid_content<'a, 'b: 'a, R: Read>(
meta: if meta.is_empty() { None } else { Some(meta) },
columns,
rows: Vec::default(),
ver,
};

Ok((
Expand Down Expand Up @@ -432,6 +433,7 @@ mod test {
}
],
rows: vec![dict! {"id" => Value::make_ref("foo")}],
ver: GRID_FORMAT_VERSION.to_string()
})
)
}
Expand Down Expand Up @@ -472,6 +474,7 @@ mod test {
dict! {"id" => Value::make_ref("foo")},
dict! {"id" => Value::make_ref("bar")}
],
ver: GRID_FORMAT_VERSION.to_string()
})
)
}
Expand Down
7 changes: 2 additions & 5 deletions src/haystack/encoding/zinc/encode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,11 @@
use crate::haystack::val::{
Bool, Column, Coord, Date, DateTime, Dict, Grid, List, Marker, Na, Number, Ref, Remove, Str,
Symbol, Time, Uri, Value, XStr,
Symbol, Time, Uri, Value, XStr, GRID_FORMAT_VERSION,
};
use chrono::SecondsFormat;
use std::fmt::Display;

/// Zinc encoding version
pub const VER: f32 = 3.0;

/// Zinc encoding trait implemented by scalar and collection types
pub trait ToZinc {
fn to_zinc<W: std::io::Write>(&self, writer: &mut W) -> Result<()>;
Expand Down Expand Up @@ -282,7 +279,7 @@ impl ZincEncode for Grid {
writer.write_all(b"<<\n")?;
}

writer.write_fmt(format_args!("ver:\"{:.1}\"\n", VER))?;
writer.write_fmt(format_args!("ver:\"{GRID_FORMAT_VERSION}\"\n"))?;

// Grid meta
if let Some(meta) = &self.meta {
Expand Down
9 changes: 9 additions & 0 deletions src/haystack/val/grid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ pub struct Column {
pub meta: Option<Dict>,
}

/// The version of the grid format supported by this library
pub const GRID_FORMAT_VERSION: &str = "3.0";

/// Haystack Grid
///
/// # Example
Expand Down Expand Up @@ -53,6 +56,8 @@ pub struct Grid {
pub columns: Vec<Column>,
/// List of the row for this `Grid`
pub rows: Vec<Dict>,
/// The version of this grid
pub ver: String,
}

impl Grid {
Expand All @@ -65,6 +70,7 @@ impl Grid {
meta: None,
}],
rows: Vec::default(),
ver: GRID_FORMAT_VERSION.to_string(),
}
}

Expand All @@ -91,6 +97,7 @@ impl Grid {
meta: None,
columns,
rows,
ver: GRID_FORMAT_VERSION.to_string(),
}
}

Expand Down Expand Up @@ -134,6 +141,7 @@ impl Grid {
meta: None,
}],
rows: Vec::default(),
ver: GRID_FORMAT_VERSION.to_string(),
}
}

Expand Down Expand Up @@ -164,6 +172,7 @@ impl Default for Grid {
columns: Vec::default(),
meta: None,
rows: Vec::default(),
ver: GRID_FORMAT_VERSION.to_string(),
}
}
}
Expand Down
Loading

0 comments on commit c91f39a

Please sign in to comment.