Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion source/postcard-schema-ng/src/impls/builtins_nostd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,10 @@ impl<T: Schema> Schema for [T] {
}

impl<T: Schema, const N: usize> Schema for [T; N] {
const SCHEMA: &'static DataModelType = &DataModelType::Tuple(&[T::SCHEMA; N]);
const SCHEMA: &'static DataModelType = &DataModelType::Array {
item: T::SCHEMA,
count: N,
};
}

impl<T: Schema> Schema for Range<T> {
Expand Down
24 changes: 24 additions & 0 deletions source/postcard-schema-ng/src/key/hash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,18 @@ pub mod fnv1a64 {
state
}
DataModelType::Schema => hash_update(state, &[0xE5]),
DataModelType::Array { item, count } => {
let mut state = hash_update(state, &[0x2B]);
let mut idx = 0;

// TODO: Do we want to hash the len or something? I'm not
// sure how to handle this for different sizes of `usize`.
while idx < *count {
state = hash_sdm_type(state, item);
idx += 1;
}
state
}
}
}

Expand Down Expand Up @@ -333,6 +345,18 @@ pub mod fnv1a64_owned {
state
}
OwnedDataModelType::Schema => hash_update(state, &[0xE5]),
OwnedDataModelType::Array { item, count } => {
let mut state = hash_update(state, &[0x2B]);
let mut idx = 0;

// TODO: Do we want to hash the len or something? I'm not
// sure how to handle this for different sizes of `usize`.
while idx < *count {
state = hash_sdm_type_owned(state, item);
idx += 1;
}
state
}
}
}

Expand Down
28 changes: 1 addition & 27 deletions source/postcard-schema-ng/src/key/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ impl core::fmt::Debug for Key {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("Key(")?;
for b in self.0.iter() {
f.write_fmt(format_args!("{} ", b))?;
f.write_fmt(format_args!("{b} "))?;
}
f.write_str(")")
}
Expand Down Expand Up @@ -106,29 +106,3 @@ mod key_owned {
}
}
}

#[cfg(test)]
mod test {
use crate::{key::Key, schema::DataModelType, Schema};

#[test]
fn matches_old_postcard_rpc_defn() {
let old = &DataModelType::Struct {
name: "Key",
data: crate::schema::Data::Newtype(&DataModelType::Tuple(&[
&DataModelType::U8,
&DataModelType::U8,
&DataModelType::U8,
&DataModelType::U8,
&DataModelType::U8,
&DataModelType::U8,
&DataModelType::U8,
&DataModelType::U8,
])),
};

let new = <Key as Schema>::SCHEMA;

assert_eq!(old, new);
}
}
11 changes: 11 additions & 0 deletions source/postcard-schema-ng/src/schema/fmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ pub fn is_prim(osdmty: &OwnedDataModelType) -> bool {
OwnedDataModelType::Unit => true,
OwnedDataModelType::Seq(_) => false,
OwnedDataModelType::Tuple(_) => false,
OwnedDataModelType::Array { item, count: _ } => is_prim(item),
OwnedDataModelType::Map { key, val } => is_prim(key) && is_prim(val),
OwnedDataModelType::Struct { .. } => false,
OwnedDataModelType::Enum { .. } => false,
Expand Down Expand Up @@ -146,6 +147,13 @@ pub fn fmt_owned_dmt_to_buf(dmt: &OwnedDataModelType, buf: &mut String, top_leve
*buf += "()";
}
}
OwnedDataModelType::Array { item, count } => {
*buf += "[";
fmt_owned_dmt_to_buf(item, buf, false);
*buf += "; ";
*buf += &format!("{count}");
*buf += "]";
}
OwnedDataModelType::Map { key, val } => {
*buf += "Map<";
fmt_owned_dmt_to_buf(key, buf, false);
Expand Down Expand Up @@ -244,6 +252,9 @@ pub fn discover_tys(
discover_tys(v, set);
}
}
OwnedDataModelType::Array { item, count: _ } => {
discover_tys(item, set);
}
OwnedDataModelType::Map { key, val } => {
discover_tys(key, set);
discover_tys(val, set);
Expand Down
Loading
Loading