diff --git a/crates/epiphany-core/src/ids.rs b/crates/epiphany-core/src/ids.rs index 892f534..102243a 100644 --- a/crates/epiphany-core/src/ids.rs +++ b/crates/epiphany-core/src/ids.rs @@ -244,6 +244,34 @@ macro_rules! graph_id { } // Canonical order *is* byte order for typed identifiers (Appendix D). impl CanonicalByteOrder for $name {} + + impl crate::textvalue::TextValue for $name { + fn project(&self) -> crate::textvalue::Sexp { + crate::textvalue::Sexp::Bytes( + ::to_canonical_bytes(self), + ) + } + + fn parse( + s: &crate::textvalue::Sexp, + ) -> Result { + let crate::textvalue::Sexp::Bytes(bytes) = s else { + return Err(crate::textvalue::TextError::Expected { + expected: stringify!($name), + found: crate::textvalue_impls::class_of(s), + }); + }; + let value = ::decode_canonical(bytes) + .map_err(|_| crate::textvalue::TextError::NotCanonical(stringify!($name)))?; + if value.to_canonical_bytes() != *bytes { + return Err(crate::textvalue::TextError::NotCanonical(concat!( + stringify!($name), + " is not canonically encoded" + ))); + } + Ok(value) + } + } }; } diff --git a/crates/epiphany-core/src/textvalue_impls.rs b/crates/epiphany-core/src/textvalue_impls.rs index 83cc0b8..0ba9edd 100644 --- a/crates/epiphany-core/src/textvalue_impls.rs +++ b/crates/epiphany-core/src/textvalue_impls.rs @@ -77,34 +77,8 @@ pub(crate) fn class_of(s: &Sexp) -> &'static str { bytes_text_value! { crate::ids::ReplicaId => "ReplicaId", crate::ids::OperationId => "OperationId", - crate::ids::EventId => "EventId", - crate::ids::PitchId => "PitchId", - crate::ids::VoiceId => "VoiceId", - crate::ids::StaffId => "StaffId", - crate::ids::StaffInstanceId => "StaffInstanceId", - crate::ids::StaffGroupId => "StaffGroupId", - crate::ids::RegionId => "RegionId", - crate::ids::InstrumentId => "InstrumentId", - crate::ids::PartDefinitionId => "PartDefinitionId", - crate::ids::MeasureId => "MeasureId", - crate::ids::BarlineAlignmentGroupId => "BarlineAlignmentGroupId", - crate::ids::SlurId => "SlurId", - crate::ids::TieId => "TieId", - crate::ids::BeamId => "BeamId", - crate::ids::SpannerId => "SpannerId", - crate::ids::TupletId => "TupletId", - crate::ids::MarkerId => "MarkerId", - crate::ids::AnalyticalAnnotationId => "AnalyticalAnnotationId", - crate::ids::CommentId => "CommentId", - crate::ids::RepeatStructureId => "RepeatStructureId", - crate::ids::LyricLineId => "LyricLineId", - crate::ids::ChordSymbolId => "ChordSymbolId", - crate::ids::GraphicObjectId => "GraphicObjectId", - crate::ids::GraphicGestureId => "GraphicGestureId", - crate::ids::TimeSignatureId => "TimeSignatureId", - crate::ids::AnalysisLayerId => "AnalysisLayerId", - crate::ids::ViewId => "ViewId", ContentHash => "ContentHash", + crate::ids::TypedObjectId => "TypedObjectId", } /// A `CanonicalF64` is its eight canonical little-endian IEEE 754 bytes, never a