Skip to main content

icydb_schema/wire/
metadata.rs

1//! Native metadata for custom scalar Serde implementations owned by this crate.
2//! These describe non-human-readable encoding; browser domain checks remain explicit.
3
4use ic_wire::typescript::{GenerationError, SchemaContext, Wire};
5use serde_json::{Value, json};
6
7use crate::{
8    Date, Decimal, Duration, Float32, Float64, Principal, Subaccount, Timestamp, U256, Ulid,
9};
10
11// Each declaration follows the scalar's serializer, not its private Rust fields.
12macro_rules! scalar_metadata {
13    ($ty:ty, $shape:expr) => {
14        impl Wire for $ty {
15            fn native_schema(_: &mut SchemaContext) -> Result<Value, GenerationError> {
16                Ok($shape)
17            }
18        }
19    };
20}
21
22scalar_metadata!(Principal, json!({"k":"bytes","max":29}));
23scalar_metadata!(Subaccount, json!({"k":"bytes","min":32,"max":32}));
24scalar_metadata!(Ulid, json!({"k":"bytes","min":16,"max":16}));
25scalar_metadata!(U256, json!({"k":"bytes","min":32,"max":32}));
26scalar_metadata!(
27    Date,
28    json!({"k":"i","bits":32,"min":Date::MIN.as_days_since_epoch(),"max":Date::MAX.as_days_since_epoch()})
29);
30scalar_metadata!(Decimal, json!({"k":"text","check":"decimal"}));
31scalar_metadata!(Duration, json!({"k":"u","bits":64}));
32scalar_metadata!(Timestamp, json!({"k":"i","bits":64}));
33scalar_metadata!(Float32, json!({"k":"float","bits":32}));
34scalar_metadata!(Float64, json!({"k":"float","bits":64}));
35scalar_metadata!(crate::EntitySourceKey, json!({"k":"text"}));