diff --git a/source/postcard-schema/Cargo.toml b/source/postcard-schema/Cargo.toml index ebb09aa2..117182bc 100644 --- a/source/postcard-schema/Cargo.toml +++ b/source/postcard-schema/Cargo.toml @@ -78,6 +78,13 @@ package = "serde-big-array" version = "0.5.1" optional = true +[dependencies.uom_v0_37] +package = "uom" +version = "0.37.0" +optional = true +default-features = false +features = ["si", "serde"] + [dev-dependencies.postcard] path = "../postcard" version = "1.0" @@ -89,6 +96,12 @@ version = "0.33.0" default-features = false features = ["serde-serialize-no-std"] +[dev-dependencies.uom_v0_37] +package = "uom" +version = "0.37.0" +default-features = false +features = ["si", "serde", "f32", "f64", "u8"] + [features] default = [] use-std = ["serde/std"] @@ -106,3 +119,4 @@ heapless-v0_8 = ["heapless_v0_8"] nalgebra-v0_33 = ["nalgebra_v0_33"] serde-big-array-v0_5 = ["serde-big-array_v0_5"] uuid-v1_0 = ["uuid_v1_0"] +uom-v0_37 = ["uom_v0_37"] diff --git a/source/postcard-schema/src/impls/mod.rs b/source/postcard-schema/src/impls/mod.rs index 327ded64..6b17c029 100644 --- a/source/postcard-schema/src/impls/mod.rs +++ b/source/postcard-schema/src/impls/mod.rs @@ -45,6 +45,10 @@ pub mod serde_big_array_v0_5; #[cfg_attr(docsrs, doc(cfg(feature = "uuid-v1_0")))] pub mod uuid_v1_0; +#[cfg(feature = "uom-v0_37")] +#[cfg_attr(docsrs, doc(cfg(feature = "uom-v0_37")))] +pub mod uom_v0_37; + impl Schema for NamedType { const SCHEMA: &'static NamedType = &NamedType { name: "NamedType", diff --git a/source/postcard-schema/src/impls/uom_v0_37.rs b/source/postcard-schema/src/impls/uom_v0_37.rs new file mode 100644 index 00000000..46c63f54 --- /dev/null +++ b/source/postcard-schema/src/impls/uom_v0_37.rs @@ -0,0 +1,39 @@ +//! Implementations of the [`Schema`] trait for the `uom` crate v0.37 + +use crate::Schema; + +impl Schema for uom_v0_37::si::Quantity +where + D: uom_v0_37::si::Dimension + ?Sized, + U: uom_v0_37::si::Units + ?Sized, + V: uom_v0_37::num::Num + uom_v0_37::Conversion + Schema, +{ + const SCHEMA: &'static crate::schema::NamedType = V::SCHEMA; +} + +#[test] +fn f32_schema_check() { + type T = uom_v0_37::si::f32::Acceleration; + assert_eq!(T::SCHEMA.ty, f32::SCHEMA.ty); +} + +#[test] +fn f64_schema_check() { + type T = uom_v0_37::si::f64::ThermodynamicTemperature; + assert_eq!(T::SCHEMA.ty, f64::SCHEMA.ty); +} + +#[test] +fn u8_schema_check() { + type T = uom_v0_37::si::u8::AngularVelocity; + assert_eq!(T::SCHEMA.ty, u8::SCHEMA.ty); +} + +#[test] +fn u8_conversion() { + let x = uom_v0_37::si::u8::Acceleration::new::< + uom_v0_37::si::acceleration::meter_per_second_squared, + >(4); + let y = postcard::to_stdvec(&x).unwrap(); + assert_eq!(Some(&4), y.first()); +}