@@ -35,10 +35,10 @@ pub type VesperCommit = TExpr<Pred>;
3535#[ display( lowercase) ]
3636pub enum Pred {
3737 Commitment ,
38- Serialized ,
39- Hashed ,
40- Merklized ,
41- Concealed ,
38+ Serialize ,
39+ Hash ,
40+ Merklize ,
41+ Conceal ,
4242 List ,
4343 Set ,
4444 Element ,
@@ -55,6 +55,7 @@ impl Predicate for Pred {
5555
5656#[ derive( Clone , Eq , PartialEq , Hash , Debug ) ]
5757pub enum Attr {
58+ For ( TypeFqn ) ,
5859 Tagged ( & ' static str ) ,
5960 Concealed ( TypeFqn ) ,
6061 LenRange ( LenRange ) ,
@@ -74,15 +75,17 @@ impl Attribute for Attr {
7475
7576 fn name ( & self ) -> Option < Ident > {
7677 match self {
78+ Attr :: For ( _) => Some ( ident ! ( "for" ) ) ,
7779 Attr :: Tagged ( _) => Some ( ident ! ( "tagged" ) ) ,
78- Attr :: Concealed ( _ ) => Some ( ident ! ( "concealed " ) ) ,
80+ Attr :: Concealed { .. } => Some ( ident ! ( "to " ) ) ,
7981 Attr :: LenRange ( _) => Some ( ident ! ( "len" ) ) ,
8082 Attr :: Hasher => Some ( ident ! ( "hasher" ) ) ,
8183 }
8284 }
8385
8486 fn value ( & self ) -> AttrVal < Self :: Expression > {
8587 match self {
88+ Attr :: For ( fqn) => AttrVal :: Ident ( fqn. name . to_ident ( ) ) ,
8689 Attr :: Tagged ( tag) => AttrVal :: Expr ( AttrExpr :: Tag ( tag) ) ,
8790 Attr :: Concealed ( fqn) => AttrVal :: Ident ( fqn. name . to_ident ( ) ) ,
8891 Attr :: LenRange ( range) => AttrVal :: Expr ( AttrExpr :: LenRange ( range. clone ( ) ) ) ,
@@ -98,28 +101,28 @@ impl CommitStep {
98101 CommitStep :: Collection ( _, _, fqn) => fqn,
99102 CommitStep :: Hashed ( fqn) => fqn,
100103 CommitStep :: Merklized ( fqn) => fqn,
101- CommitStep :: Concealed ( fqn ) => fqn ,
104+ CommitStep :: Concealed { src , dst : _ } => src ,
102105 }
103106 . name
104107 . to_ident ( )
105108 }
106109
107110 fn predicate ( & self ) -> Pred {
108111 match self {
109- CommitStep :: Serialized ( _) => Pred :: Serialized ,
112+ CommitStep :: Serialized ( _) => Pred :: Serialize ,
110113 CommitStep :: Collection ( CommitColType :: List , _, _) => Pred :: List ,
111114 CommitStep :: Collection ( CommitColType :: Set , _, _) => Pred :: Set ,
112115 CommitStep :: Collection ( CommitColType :: Map { .. } , _, _) => Pred :: Map ,
113- CommitStep :: Hashed ( _) => Pred :: Hashed ,
114- CommitStep :: Merklized ( _) => Pred :: Merklized ,
115- CommitStep :: Concealed ( _ ) => Pred :: Concealed ,
116+ CommitStep :: Hashed ( _) => Pred :: Hash ,
117+ CommitStep :: Merklized ( _) => Pred :: Merklize ,
118+ CommitStep :: Concealed { .. } => Pred :: Conceal ,
116119 }
117120 }
118121
119122 fn attributes ( & self ) -> SmallVec < Attr > {
120123 match self {
121124 CommitStep :: Collection ( _, sizing, _) => small_vec ! [ Attr :: LenRange ( ( * sizing) . into( ) ) ] ,
122- CommitStep :: Concealed ( from ) => small_vec ! [ Attr :: Concealed ( from . clone( ) ) ] ,
125+ CommitStep :: Concealed { src : _ , dst } => small_vec ! [ Attr :: Concealed ( dst . clone( ) ) ] ,
123126 CommitStep :: Serialized ( _) | CommitStep :: Hashed ( _) | CommitStep :: Merklized ( _) => none ! ( ) ,
124127 }
125128 }
@@ -154,10 +157,17 @@ impl CommitStep {
154157 } )
155158 ]
156159 }
157- CommitStep :: Serialized ( _) |
158- CommitStep :: Hashed ( _) |
159- CommitStep :: Merklized ( _) |
160- CommitStep :: Concealed ( _) => empty ! ( ) ,
160+ CommitStep :: Serialized ( _) => none ! ( ) ,
161+
162+ CommitStep :: Hashed ( subj) |
163+ CommitStep :: Merklized ( subj) |
164+ CommitStep :: Concealed { src : _, dst : subj } => tiny_vec ! [ Box :: new( VesperCommit {
165+ subject: subj. name. to_ident( ) ,
166+ predicate: Pred :: Serialize ,
167+ attributes: none!( ) ,
168+ content: none!( ) ,
169+ comment: None ,
170+ } ) ] ,
161171 }
162172 }
163173}
@@ -182,9 +192,79 @@ impl CommitLayout {
182192 VesperCommit {
183193 subject,
184194 predicate : Pred :: Commitment ,
185- attributes : small_vec ! [ Attr :: Hasher , Attr :: Tagged ( self . tag( ) ) ] ,
195+ attributes : small_vec ! [
196+ Attr :: For ( self . ty( ) . clone( ) ) ,
197+ Attr :: Hasher ,
198+ Attr :: Tagged ( self . tag( ) )
199+ ] ,
186200 content : Confined :: from_iter_checked ( content) ,
187201 comment : None ,
188202 }
189203 }
190204}
205+
206+ #[ cfg( test) ]
207+ mod tests {
208+ #![ cfg_attr( coverage_nightly, coverage( off) ) ]
209+
210+ use amplify:: confinement:: { LargeString , SmallOrdMap , SmallOrdSet } ;
211+ use strict_encoding:: { StrictDecode , StrictEncode } ;
212+
213+ use super :: * ;
214+ use crate :: id:: tests:: * ;
215+ use crate :: { CommitEncode , CommitEngine , CommitmentLayout , StrictHash } ;
216+
217+ #[ derive( Clone , Ord , PartialOrd , Eq , PartialEq , Hash , Debug , Default ) ]
218+ #[ derive( StrictType , StrictEncode , StrictDecode ) ]
219+ #[ strict_type( lib = "Test" ) ]
220+ struct NamedWrapper < T : Default + StrictEncode + StrictDecode > ( T ) ;
221+
222+ #[ derive( Clone , Ord , PartialOrd , Eq , PartialEq , Hash , Debug , Default ) ]
223+ #[ derive( StrictType , StrictEncode , StrictDecode ) ]
224+ #[ strict_type( lib = "Test" ) ]
225+ struct Test {
226+ serialized : NamedWrapper < LargeString > ,
227+ concealed : DumbConceal ,
228+ hash : DumbHash ,
229+ merkle_list : TinyVec < DumbMerkle > ,
230+ set : SmallOrdSet < DumbHash > ,
231+ map : SmallOrdMap < u8 , u64 > ,
232+ }
233+ impl CommitEncode for Test {
234+ type CommitmentId = StrictHash ;
235+ fn commit_encode ( & self , e : & mut CommitEngine ) {
236+ e. commit_to_serialized ( & self . serialized ) ;
237+ e. commit_to_concealed ( & self . concealed ) ;
238+ e. commit_to_hash ( & self . hash ) ;
239+ e. commit_to_merkle ( & self . merkle_list ) ;
240+ e. commit_to_linear_set ( & self . set ) ;
241+ e. commit_to_linear_map ( & self . map ) ;
242+ }
243+ }
244+
245+ #[ test]
246+ fn display ( ) {
247+ let layout = Test :: commitment_layout ( ) ;
248+ assert_eq ! (
249+ layout
250+ . to_vesper( )
251+ . display( )
252+ . to_string( )
253+ . replace( " \n " , "\n " ) ,
254+ r#"commitment StrictHash: for Test, hasher SHA256, tagged urn:ubideco:strict-types:value-hash#2024-02-10
255+ serialize NamedWrapperConfinedString04294967295
256+ conceal DumbConceal: to DumbHash
257+ serialize DumbHash
258+ hash DumbHash
259+ serialize DumbHash
260+ merklize DumbMerkle
261+ serialize DumbMerkle
262+ set DumbHash: len 0..<2^16
263+ element DumbHash
264+ map U64: len 0..<2^16
265+ mapKey U8
266+ mapValue U64
267+ "#
268+ ) ;
269+ }
270+ }
0 commit comments