diff --git a/ci.sh b/ci.sh index 5ff845d..c61e954 100755 --- a/ci.sh +++ b/ci.sh @@ -29,7 +29,7 @@ cargo_test() { cargo test --all "$@" } -cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive,nalgebra-v0_33,heapless-v0_8,heapless-v0_9,embedded-io-v0_7 +cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive,nalgebra-v0_33,heapless-v0_8,heapless-v0_9,embedded-io-v0_7,bytes-v1_0,indexmap-v2_0,log-v0_4 # NOTE: we exclude postcard-dyn for these checks because it is std-only diff --git a/source/postcard-schema-ng/Cargo.toml b/source/postcard-schema-ng/Cargo.toml index 7c781bb..41611cc 100644 --- a/source/postcard-schema-ng/Cargo.toml +++ b/source/postcard-schema-ng/Cargo.toml @@ -85,17 +85,57 @@ package = "serde-big-array" version = "0.5.1" optional = true +[dependencies.bytes_v1_0] +package = "bytes" +version = "1.0" +optional = true +default-features = false + +[dependencies.indexmap_v2_0] +package = "indexmap" +version = "2.0" +optional = true +default-features = false + +[dependencies.log_v0_4] +package = "log" +version = "0.4" +optional = true +default-features = false + [dev-dependencies.postcard] path = "../postcard" version = "1.0" features = ["use-std"] +[dev-dependencies.postcard-dyn-ng] +path = "../postcard-dyn-ng" +version = "0.3" + +[dev-dependencies.serde_json] +version = "1.0" + [dev-dependencies.nalgebra_v0_33] package = "nalgebra" version = "0.33.0" default-features = false features = ["serde-serialize-no-std"] +[dev-dependencies.bytes_v1_0] +package = "bytes" +version = "1.0" +features = ["std", "serde"] + +[dev-dependencies.indexmap_v2_0] +package = "indexmap" +version = "2.0" +features = ["std", "serde"] + +[dev-dependencies.log_v0_4] +package = "log" +version = "0.4" +features = ["serde"] + [features] default = [] use-std = ["serde/std"] @@ -114,3 +154,6 @@ heapless-v0_9 = ["heapless_v0_9"] nalgebra-v0_33 = ["nalgebra_v0_33"] serde-big-array-v0_5 = ["serde-big-array_v0_5"] uuid-v1_0 = ["uuid_v1_0"] +bytes-v1_0 = ["bytes_v1_0"] +indexmap-v2_0 = ["indexmap_v2_0"] +log-v0_4 = ["log_v0_4"] diff --git a/source/postcard-schema-ng/src/impls/bytes_v1_0.rs b/source/postcard-schema-ng/src/impls/bytes_v1_0.rs new file mode 100644 index 0000000..ce4f71a --- /dev/null +++ b/source/postcard-schema-ng/src/impls/bytes_v1_0.rs @@ -0,0 +1,8 @@ +//! Implementations of the [`Schema`] trait for the `bytes` crate v1.0 + +use crate::{schema::DataModelType, Schema}; + +#[cfg_attr(docsrs, doc(cfg(feature = "bytes-v1_0")))] +impl Schema for bytes_v1_0::Bytes { + const SCHEMA: &'static DataModelType = &DataModelType::ByteArray; +} diff --git a/source/postcard-schema-ng/src/impls/indexmap_v2_0.rs b/source/postcard-schema-ng/src/impls/indexmap_v2_0.rs new file mode 100644 index 0000000..630be22 --- /dev/null +++ b/source/postcard-schema-ng/src/impls/indexmap_v2_0.rs @@ -0,0 +1,15 @@ +//! Implementations of the [`Schema`] trait for the `indexmap` crate v2.0 +use crate::{schema::DataModelType, Schema}; + +#[cfg_attr(docsrs, doc(cfg(feature = "indexmap-v2_0")))] +impl Schema for indexmap_v2_0::IndexMap { + const SCHEMA: &'static DataModelType = &DataModelType::Map { + key: K::SCHEMA, + val: V::SCHEMA, + }; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "indexmap-v2_0")))] +impl Schema for indexmap_v2_0::IndexSet { + const SCHEMA: &'static DataModelType = &DataModelType::Seq(T::SCHEMA); +} diff --git a/source/postcard-schema-ng/src/impls/log_v0_4.rs b/source/postcard-schema-ng/src/impls/log_v0_4.rs new file mode 100644 index 0000000..a53d9d4 --- /dev/null +++ b/source/postcard-schema-ng/src/impls/log_v0_4.rs @@ -0,0 +1,66 @@ +//! Implementations of the [`Schema`] trait for the `log` crate v0.4 + +use crate::{ + schema::{Data, DataModelType, Variant}, + Schema, +}; + +impl Schema for log_v0_4::Level { + const SCHEMA: &'static DataModelType = &DataModelType::Enum { + name: "Level", + variants: &[ + &Variant { + name: "ERROR", + data: Data::Unit, + }, + &Variant { + name: "WARN", + data: Data::Unit, + }, + &Variant { + name: "INFO", + data: Data::Unit, + }, + &Variant { + name: "DEBUG", + data: Data::Unit, + }, + &Variant { + name: "TRACE", + data: Data::Unit, + }, + ], + }; +} + +impl Schema for log_v0_4::LevelFilter { + const SCHEMA: &'static DataModelType = &DataModelType::Enum { + name: "Level", + variants: &[ + &Variant { + name: "OFF", + data: Data::Unit, + }, + &Variant { + name: "ERROR", + data: Data::Unit, + }, + &Variant { + name: "WARN", + data: Data::Unit, + }, + &Variant { + name: "INFO", + data: Data::Unit, + }, + &Variant { + name: "DEBUG", + data: Data::Unit, + }, + &Variant { + name: "TRACE", + data: Data::Unit, + }, + ], + }; +} diff --git a/source/postcard-schema-ng/src/impls/mod.rs b/source/postcard-schema-ng/src/impls/mod.rs index 041ce36..c2231e6 100644 --- a/source/postcard-schema-ng/src/impls/mod.rs +++ b/source/postcard-schema-ng/src/impls/mod.rs @@ -46,6 +46,18 @@ pub mod serde_big_array_v0_5; #[cfg_attr(docsrs, doc(cfg(feature = "uuid-v1_0")))] pub mod uuid_v1_0; +#[cfg(feature = "bytes-v1_0")] +#[cfg_attr(docsrs, doc(cfg(feature = "bytes-v1_0")))] +pub mod bytes_v1_0; + +#[cfg(feature = "indexmap-v2_0")] +#[cfg_attr(docsrs, doc(cfg(feature = "indexmap-v2_0")))] +pub mod indexmap_v2_0; + +#[cfg(feature = "log-v0_4")] +#[cfg_attr(docsrs, doc(cfg(feature = "log-v0_4")))] +pub mod log_v0_4; + impl Schema for DataModelType { const SCHEMA: &'static DataModelType = &DataModelType::Schema; } diff --git a/source/postcard-schema-ng/tests/impls/bytes_v1_0.rs b/source/postcard-schema-ng/tests/impls/bytes_v1_0.rs new file mode 100644 index 0000000..aa53a19 --- /dev/null +++ b/source/postcard-schema-ng/tests/impls/bytes_v1_0.rs @@ -0,0 +1,6 @@ +#![cfg(feature = "bytes-v1_0")] + +#[test] +fn bytes_round_trip() { + super::round_trip_test(bytes_v1_0::Bytes::from(vec![1, 2, 3, 4])); +} diff --git a/source/postcard-schema-ng/tests/impls/indexmap_v2_0.rs b/source/postcard-schema-ng/tests/impls/indexmap_v2_0.rs new file mode 100644 index 0000000..8f88131 --- /dev/null +++ b/source/postcard-schema-ng/tests/impls/indexmap_v2_0.rs @@ -0,0 +1,14 @@ +#![cfg(feature = "indexmap-v2_0")] + +#[test] +fn indexmap_round_trip() { + super::round_trip_test(indexmap_v2_0::IndexMap::::from([ + ("a".to_string(), 2), + ("b".to_string(), 3), + ])); +} + +#[test] +fn indexset_round_trip() { + super::round_trip_test(indexmap_v2_0::IndexSet::::from([1, 2, 3, 4])); +} diff --git a/source/postcard-schema-ng/tests/impls/log_v0_4.rs b/source/postcard-schema-ng/tests/impls/log_v0_4.rs new file mode 100644 index 0000000..490c537 --- /dev/null +++ b/source/postcard-schema-ng/tests/impls/log_v0_4.rs @@ -0,0 +1,28 @@ +#![cfg(feature = "log-v0_4")] + +#[test] +fn log_level_smoke() { + for level in [ + log_v0_4::Level::Error, + log_v0_4::Level::Warn, + log_v0_4::Level::Info, + log_v0_4::Level::Debug, + log_v0_4::Level::Trace, + ] { + super::round_trip_test(level); + } +} + +#[test] +fn log_level_filter_smoke() { + for level_filter in [ + log_v0_4::LevelFilter::Off, + log_v0_4::LevelFilter::Error, + log_v0_4::LevelFilter::Warn, + log_v0_4::LevelFilter::Info, + log_v0_4::LevelFilter::Debug, + log_v0_4::LevelFilter::Trace, + ] { + super::round_trip_test(level_filter); + } +} diff --git a/source/postcard-schema-ng/tests/impls/main.rs b/source/postcard-schema-ng/tests/impls/main.rs new file mode 100644 index 0000000..d540042 --- /dev/null +++ b/source/postcard-schema-ng/tests/impls/main.rs @@ -0,0 +1,20 @@ +mod bytes_v1_0; +mod indexmap_v2_0; +mod log_v0_4; + +use std::cmp::PartialEq; +use std::fmt::Debug; + +use postcard_schema_ng::{schema::owned::OwnedDataModelType, Schema}; +use serde::{de::DeserializeOwned, Serialize}; + +fn round_trip_test(val: T) +where + T: Serialize + DeserializeOwned + Schema + PartialEq + Debug, +{ + let schema = OwnedDataModelType::from(T::SCHEMA); + let encoded = postcard::to_allocvec(&val).unwrap(); + let value = postcard_dyn_ng::from_slice_dyn(&schema, &encoded).unwrap(); + let decoded: T = serde_json::from_value(value).unwrap(); + assert_eq!(val, decoded); +} diff --git a/source/postcard-schema/Cargo.toml b/source/postcard-schema/Cargo.toml index 89287fb..84ff4cf 100644 --- a/source/postcard-schema/Cargo.toml +++ b/source/postcard-schema/Cargo.toml @@ -90,11 +90,35 @@ package = "serde-big-array" version = "0.5.1" optional = true +[dependencies.bytes_v1_0] +package = "bytes" +version = "1.0" +optional = true +default-features = false + +[dependencies.indexmap_v2_0] +package = "indexmap" +version = "2.0" +optional = true +default-features = false + +[dependencies.log_v0_4] +package = "log" +version = "0.4" +optional = true +default-features = false + [dev-dependencies.postcard] path = "../postcard" version = "1.0" features = ["use-std"] +[dev-dependencies.postcard-dyn] +path = "../postcard-dyn" + +[dev-dependencies.serde_json] +version = "1.0" + [dev-dependencies.nalgebra_v0_33] package = "nalgebra" version = "0.33.0" @@ -107,6 +131,21 @@ version = "0.34.1" default-features = false features = ["serde-serialize-no-std"] +[dev-dependencies.bytes_v1_0] +package = "bytes" +version = "1.0" +features = ["std", "serde"] + +[dev-dependencies.indexmap_v2_0] +package = "indexmap" +version = "2.0" +features = ["std", "serde"] + +[dev-dependencies.log_v0_4] +package = "log" +version = "0.4" +features = ["serde"] + [features] default = [] use-std = ["serde/std"] @@ -126,3 +165,6 @@ nalgebra-v0_33 = ["nalgebra_v0_33"] nalgebra-v0_34 = ["nalgebra_v0_34"] serde-big-array-v0_5 = ["serde-big-array_v0_5"] uuid-v1_0 = ["uuid_v1_0"] +bytes-v1_0 = ["bytes_v1_0"] +indexmap-v2_0 = ["indexmap_v2_0"] +log-v0_4 = ["log_v0_4"] diff --git a/source/postcard-schema/src/impls/bytes_v1_0.rs b/source/postcard-schema/src/impls/bytes_v1_0.rs new file mode 100644 index 0000000..a0334cd --- /dev/null +++ b/source/postcard-schema/src/impls/bytes_v1_0.rs @@ -0,0 +1,14 @@ +//! Implementations of the [`Schema`] trait for the `bytes` crate v1.0 + +use crate::{ + schema::{DataModelType, NamedType}, + Schema, +}; + +#[cfg_attr(docsrs, doc(cfg(feature = "bytes-v1_0")))] +impl Schema for bytes_v1_0::Bytes { + const SCHEMA: &'static NamedType = &NamedType { + name: "Bytes", + ty: &DataModelType::ByteArray, + }; +} diff --git a/source/postcard-schema/src/impls/indexmap_v2_0.rs b/source/postcard-schema/src/impls/indexmap_v2_0.rs new file mode 100644 index 0000000..9050029 --- /dev/null +++ b/source/postcard-schema/src/impls/indexmap_v2_0.rs @@ -0,0 +1,24 @@ +//! Implementations of the [`Schema`] trait for the `indexmap` crate v2.0 +use crate::{ + schema::{DataModelType, NamedType}, + Schema, +}; + +#[cfg_attr(docsrs, doc(cfg(feature = "indexmap-v2_0")))] +impl Schema for indexmap_v2_0::IndexMap { + const SCHEMA: &'static NamedType = &NamedType { + name: "IndexMap Schema for indexmap_v2_0::IndexSet { + const SCHEMA: &'static NamedType = &NamedType { + name: "IndexSet", + ty: &DataModelType::Seq(T::SCHEMA), + }; +} diff --git a/source/postcard-schema/src/impls/log_v0_4.rs b/source/postcard-schema/src/impls/log_v0_4.rs new file mode 100644 index 0000000..fe8aed7 --- /dev/null +++ b/source/postcard-schema/src/impls/log_v0_4.rs @@ -0,0 +1,66 @@ +//! Implementations of the [`Schema`] trait for the `log` crate v0.4 + +use crate::{ + schema::{DataModelType, DataModelVariant, NamedType, NamedVariant}, + Schema, +}; + +impl Schema for log_v0_4::Level { + const SCHEMA: &'static NamedType = &NamedType { + name: "Level", + ty: &DataModelType::Enum(&[ + &NamedVariant { + name: "ERROR", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "WARN", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "INFO", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "DEBUG", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "TRACE", + ty: &DataModelVariant::UnitVariant, + }, + ]), + }; +} + +impl Schema for log_v0_4::LevelFilter { + const SCHEMA: &'static NamedType = &NamedType { + name: "LevelFilter", + ty: &DataModelType::Enum(&[ + &NamedVariant { + name: "OFF", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "ERROR", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "WARN", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "INFO", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "DEBUG", + ty: &DataModelVariant::UnitVariant, + }, + &NamedVariant { + name: "TRACE", + ty: &DataModelVariant::UnitVariant, + }, + ]), + }; +} diff --git a/source/postcard-schema/src/impls/mod.rs b/source/postcard-schema/src/impls/mod.rs index ade605a..c7c8215 100644 --- a/source/postcard-schema/src/impls/mod.rs +++ b/source/postcard-schema/src/impls/mod.rs @@ -53,6 +53,18 @@ pub mod serde_big_array_v0_5; #[cfg_attr(docsrs, doc(cfg(feature = "uuid-v1_0")))] pub mod uuid_v1_0; +#[cfg(feature = "bytes-v1_0")] +#[cfg_attr(docsrs, doc(cfg(feature = "bytes-v1_0")))] +pub mod bytes_v1_0; + +#[cfg(feature = "indexmap-v2_0")] +#[cfg_attr(docsrs, doc(cfg(feature = "indexmap-v2_0")))] +pub mod indexmap_v2_0; + +#[cfg(feature = "log-v0_4")] +#[cfg_attr(docsrs, doc(cfg(feature = "log-v0_4")))] +pub mod log_v0_4; + impl Schema for NamedType { const SCHEMA: &'static NamedType = &NamedType { name: "NamedType", diff --git a/source/postcard-schema/tests/impls/bytes_v1_0.rs b/source/postcard-schema/tests/impls/bytes_v1_0.rs new file mode 100644 index 0000000..aa53a19 --- /dev/null +++ b/source/postcard-schema/tests/impls/bytes_v1_0.rs @@ -0,0 +1,6 @@ +#![cfg(feature = "bytes-v1_0")] + +#[test] +fn bytes_round_trip() { + super::round_trip_test(bytes_v1_0::Bytes::from(vec![1, 2, 3, 4])); +} diff --git a/source/postcard-schema/tests/impls/indexmap_v2_0.rs b/source/postcard-schema/tests/impls/indexmap_v2_0.rs new file mode 100644 index 0000000..8f88131 --- /dev/null +++ b/source/postcard-schema/tests/impls/indexmap_v2_0.rs @@ -0,0 +1,14 @@ +#![cfg(feature = "indexmap-v2_0")] + +#[test] +fn indexmap_round_trip() { + super::round_trip_test(indexmap_v2_0::IndexMap::::from([ + ("a".to_string(), 2), + ("b".to_string(), 3), + ])); +} + +#[test] +fn indexset_round_trip() { + super::round_trip_test(indexmap_v2_0::IndexSet::::from([1, 2, 3, 4])); +} diff --git a/source/postcard-schema/tests/impls/log_v0_4.rs b/source/postcard-schema/tests/impls/log_v0_4.rs new file mode 100644 index 0000000..490c537 --- /dev/null +++ b/source/postcard-schema/tests/impls/log_v0_4.rs @@ -0,0 +1,28 @@ +#![cfg(feature = "log-v0_4")] + +#[test] +fn log_level_smoke() { + for level in [ + log_v0_4::Level::Error, + log_v0_4::Level::Warn, + log_v0_4::Level::Info, + log_v0_4::Level::Debug, + log_v0_4::Level::Trace, + ] { + super::round_trip_test(level); + } +} + +#[test] +fn log_level_filter_smoke() { + for level_filter in [ + log_v0_4::LevelFilter::Off, + log_v0_4::LevelFilter::Error, + log_v0_4::LevelFilter::Warn, + log_v0_4::LevelFilter::Info, + log_v0_4::LevelFilter::Debug, + log_v0_4::LevelFilter::Trace, + ] { + super::round_trip_test(level_filter); + } +} diff --git a/source/postcard-schema/tests/impls/main.rs b/source/postcard-schema/tests/impls/main.rs new file mode 100644 index 0000000..ee0e607 --- /dev/null +++ b/source/postcard-schema/tests/impls/main.rs @@ -0,0 +1,20 @@ +mod bytes_v1_0; +mod indexmap_v2_0; +mod log_v0_4; + +use std::cmp::PartialEq; +use std::fmt::Debug; + +use postcard_schema::{schema::owned::OwnedNamedType, Schema}; +use serde::{de::DeserializeOwned, Serialize}; + +fn round_trip_test(val: T) +where + T: Serialize + DeserializeOwned + Schema + PartialEq + Debug, +{ + let schema = OwnedNamedType::from(T::SCHEMA); + let encoded = postcard::to_allocvec(&val).unwrap(); + let value = postcard_dyn::from_slice_dyn(&schema, &encoded).unwrap(); + let decoded: T = serde_json::from_value(value).unwrap(); + assert_eq!(val, decoded); +}