Skip to content
6 changes: 3 additions & 3 deletions source/postcard-dyn-ng/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "postcard-dyn-ng"
version = "0.3.0"
authors = ["James Munns <james@onevariable.com>"]
version = "0.4.0"
authors = ["James Munns <me@jamesmunns.com>"]
edition = "2021"
repository = "https://github.com/jamesmunns/postcard"
description = "Dynamic ser/de for postcard"
Expand All @@ -27,6 +27,6 @@ features = ["use-std"]
path = "../postcard"

[dependencies.postcard-schema-ng]
version = "0.3"
version = "0.4"
features = ["use-std", "derive"]
path = "../postcard-schema-ng"
12 changes: 6 additions & 6 deletions source/postcard-dyn-ng/src/de.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::str::from_utf8;
use std::{ops::Deref, str::from_utf8};

use postcard_schema_ng::schema::owned::{OwnedData, OwnedDataModelType};
use serde_json::{Map, Number, Value};
Expand Down Expand Up @@ -139,14 +139,14 @@ fn deserialize<'a>(ty: &OwnedDataModelType, data: &'a [u8]) -> Result<(Value, &'
Ok((val, rest))
}
OwnedDataModelType::Char => todo!(),
OwnedDataModelType::String => {
OwnedDataModelType::String { .. } => {
let (val, rest) = try_take_varint_usize(data)?;
let (bytes, rest) = rest.take_n(val)?;
let s = from_utf8(bytes).map_err(|_| Error::SchemaMismatch)?;
let val = Value::String(s.to_string());
Ok((val, rest))
}
OwnedDataModelType::ByteArray => {
OwnedDataModelType::ByteArray { .. } => {
let (val, rest) = try_take_varint_usize(data)?;
let (bytes, rest) = rest.take_n(val)?;
let vvec = bytes
Expand Down Expand Up @@ -178,7 +178,7 @@ fn deserialize<'a>(ty: &OwnedDataModelType, data: &'a [u8]) -> Result<(Value, &'
name: _,
data: OwnedData::Newtype(ty),
} => deserialize(ty, data),
OwnedDataModelType::Seq(ty) => {
OwnedDataModelType::Seq { element: ty, .. } => {
let (val, mut rest) = try_take_varint_usize(data)?;
let mut vec = vec![];
for _ in 0..val {
Expand Down Expand Up @@ -214,12 +214,12 @@ fn deserialize<'a>(ty: &OwnedDataModelType, data: &'a [u8]) -> Result<(Value, &'
}
}
}
OwnedDataModelType::Map { key, val } => {
OwnedDataModelType::Map { key, val, .. } => {
// TODO: impling blind because we can't test this, oops
//
// TODO: There's also a mismatch here because serde_json::Value requires
// keys to be strings, when postcard doesn't.
if **key != OwnedDataModelType::String {
if !matches!(key.deref(), &OwnedDataModelType::String { max_len: _ }) {
return Err(Error::ShouldSupportButDont);
}

Expand Down
12 changes: 6 additions & 6 deletions source/postcard-dyn-ng/src/ser.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::num::TryFromIntError;
use std::{num::TryFromIntError, ops::Deref};

use postcard_schema_ng::schema::owned::{OwnedData, OwnedDataModelType};
use serde_json::Value;
Expand Down Expand Up @@ -162,7 +162,7 @@ fn ser_named_type(ty: &OwnedDataModelType, value: &Value, out: &mut Vec<u8>) ->
let val = val.to_le_bytes();
out.extend_from_slice(&val);
}
OwnedDataModelType::String | OwnedDataModelType::Char => {
OwnedDataModelType::String { .. } | OwnedDataModelType::Char => {
let val = value.as_str().right()?;

// First add len
Expand All @@ -174,7 +174,7 @@ fn ser_named_type(ty: &OwnedDataModelType, value: &Value, out: &mut Vec<u8>) ->
// Then add payload
out.extend_from_slice(val.as_bytes());
}
OwnedDataModelType::ByteArray => {
OwnedDataModelType::ByteArray { .. } => {
let val = value.as_array().right()?;

// First add len
Expand Down Expand Up @@ -209,7 +209,7 @@ fn ser_named_type(ty: &OwnedDataModelType, value: &Value, out: &mut Vec<u8>) ->
} => {
ser_named_type(ty, value, out)?;
}
OwnedDataModelType::Seq(ty) => {
OwnedDataModelType::Seq { element: ty, .. } => {
let val = value.as_array().right()?;

// First add len
Expand Down Expand Up @@ -243,12 +243,12 @@ fn ser_named_type(ty: &OwnedDataModelType, value: &Value, out: &mut Vec<u8>) ->
ser_named_type(ty, val, out)?;
}
}
OwnedDataModelType::Map { key, val } => {
OwnedDataModelType::Map { key, val, .. } => {
// TODO: impling blind because we can't test this, oops
//
// TODO: There's also a mismatch here because serde_json::Value requires
// keys to be strings, when postcard doesn't.
if **key != OwnedDataModelType::String {
if !matches!(key.deref(), OwnedDataModelType::String { max_len: _ }) {
return Err(Error::ShouldSupportButDont);
}

Expand Down
22 changes: 19 additions & 3 deletions source/postcard-schema-ng/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "postcard-schema-ng"
version = "0.3.2"
authors = ["James Munns <james@onevariable.com>"]
version = "0.4.0"
authors = ["James Munns <me@jamesmunns.com>"]
edition = "2021"
readme = "README.md"
repository = "https://github.com/jamesmunns/postcard"
Expand All @@ -14,14 +14,18 @@ categories = [
keywords = [
"serde",
]
documentation = "https://docs.rs/postcard-schema/"
documentation = "https://docs.rs/postcard-schema-ng/"

[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]

[dependencies]

[dependencies.postcard-core]
version = "0.1.0"
path = "../postcard-core"

[dependencies.serde]
version = "1.0"
default-features = false
Expand Down Expand Up @@ -102,6 +106,18 @@ version = "0.33.0"
default-features = false
features = ["serde-serialize-no-std"]

[dev-dependencies.uuid_v1_0]
package = "uuid"
version = "1.0"
default-features = false
features = ["serde"]

[dev-dependencies.chrono_v0_4]
package = "chrono"
version = "0.4"
default-features = false
features = ["serde", "clock"]

[features]
default = []
use-std = ["serde/std"]
Expand Down
13 changes: 10 additions & 3 deletions source/postcard-schema-ng/src/impls/builtins_alloc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,32 @@ extern crate alloc;

#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "use-std"))))]
impl<T: Schema> Schema for alloc::vec::Vec<T> {
const SCHEMA: &'static DataModelType = &DataModelType::Seq(T::SCHEMA);
const SCHEMA: &'static DataModelType = &DataModelType::Seq {
element: T::SCHEMA,
max_len: None,
};
}

#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "use-std"))))]
impl Schema for alloc::string::String {
const SCHEMA: &'static DataModelType = &DataModelType::String;
const SCHEMA: &'static DataModelType = &DataModelType::String { max_len: None };
}

#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "use-std"))))]
impl<K: Schema, V: Schema> Schema for alloc::collections::BTreeMap<K, V> {
const SCHEMA: &'static DataModelType = &DataModelType::Map {
key: K::SCHEMA,
val: V::SCHEMA,
max_len: None,
};
}

#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "use-std"))))]
impl<K: Schema> Schema for alloc::collections::BTreeSet<K> {
const SCHEMA: &'static DataModelType = &DataModelType::Seq(K::SCHEMA);
const SCHEMA: &'static DataModelType = &DataModelType::Seq {
element: K::SCHEMA,
max_len: None,
};
}

#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "use-std"))))]
Expand Down
Loading
Loading