@@ -5,17 +5,15 @@ use std::{
55 hash:: { Hash , Hasher } ,
66} ;
77
8- use catalyst_types:: uuid:: { CborContext , Uuid , UuidV4 } ;
8+ use catalyst_types:: uuid:: { CborContext , Uuid , UuidV4 , UUID_CBOR_TAG } ;
9+ use coset:: cbor:: Value ;
910use minicbor:: { Decode , Decoder , Encode } ;
1011use serde:: { Deserialize , Deserializer } ;
1112use tracing:: warn;
1213
1314use crate :: {
1415 decode_context:: { CompatibilityPolicy , DecodeContext } ,
15- doc_types:: {
16- ACTION_UUID_TYPE , COMMENT_UUID_TYPE , PROPOSAL_ACTION_DOC , PROPOSAL_COMMENT_DOC ,
17- PROPOSAL_DOC_TYPE , PROPOSAL_UUID_TYPE ,
18- } ,
16+ doc_types:: { deprecated, PROPOSAL , PROPOSAL_COMMENT , PROPOSAL_SUBMISSION_ACTION } ,
1917} ;
2018
2119/// List of `UUIDv4` document type.
@@ -87,6 +85,18 @@ impl TryFrom<Vec<Uuid>> for DocType {
8785 }
8886}
8987
88+ impl From < DocType > for Vec < Uuid > {
89+ fn from ( value : DocType ) -> Vec < Uuid > {
90+ value. 0 . into_iter ( ) . map ( Uuid :: from) . collect ( )
91+ }
92+ }
93+
94+ impl From < DocType > for Vec < String > {
95+ fn from ( val : DocType ) -> Self {
96+ val. 0 . into_iter ( ) . map ( |uuid| uuid. to_string ( ) ) . collect ( )
97+ }
98+ }
99+
90100impl TryFrom < Vec < UuidV4 > > for DocType {
91101 type Error = DocTypeError ;
92102
@@ -231,9 +241,11 @@ impl Decode<'_, DecodeContext<'_>> for DocType {
231241/// <https://github.com/input-output-hk/catalyst-libs/blob/main/docs/src/architecture/08_concepts/signed_doc/types.md#document-types>
232242fn map_doc_type ( uuid : UuidV4 ) -> DocType {
233243 match uuid {
234- id if Uuid :: from ( id) == PROPOSAL_UUID_TYPE => PROPOSAL_DOC_TYPE . clone ( ) ,
235- id if Uuid :: from ( id) == COMMENT_UUID_TYPE => PROPOSAL_COMMENT_DOC . clone ( ) ,
236- id if Uuid :: from ( id) == ACTION_UUID_TYPE => PROPOSAL_ACTION_DOC . clone ( ) ,
244+ id if Uuid :: from ( id) == deprecated:: PROPOSAL_DOCUMENT_UUID_TYPE => PROPOSAL . clone ( ) ,
245+ id if Uuid :: from ( id) == deprecated:: COMMENT_DOCUMENT_UUID_TYPE => PROPOSAL_COMMENT . clone ( ) ,
246+ id if Uuid :: from ( id) == deprecated:: PROPOSAL_ACTION_DOCUMENT_UUID_TYPE => {
247+ PROPOSAL_SUBMISSION_ACTION . clone ( )
248+ } ,
237249 id => DocType ( vec ! [ id] ) ,
238250 }
239251}
@@ -284,15 +296,35 @@ impl<'de> Deserialize<'de> for DocType {
284296 }
285297}
286298
299+ impl From < DocType > for Value {
300+ fn from ( value : DocType ) -> Self {
301+ Value :: Array (
302+ value
303+ . 0
304+ . iter ( )
305+ . map ( |uuidv4| {
306+ Value :: Tag (
307+ UUID_CBOR_TAG ,
308+ Box :: new ( Value :: Bytes ( uuidv4. uuid ( ) . as_bytes ( ) . to_vec ( ) ) ) ,
309+ )
310+ } )
311+ . collect ( ) ,
312+ )
313+ }
314+ }
315+
287316// This is needed to preserve backward compatibility with the old solution.
288317impl PartialEq for DocType {
289318 fn eq ( & self , other : & Self ) -> bool {
290319 // List of special-case (single UUID) -> new DocType
291320 // The old one should equal to the new one
292321 let special_cases = [
293- ( PROPOSAL_UUID_TYPE , & * PROPOSAL_DOC_TYPE ) ,
294- ( COMMENT_UUID_TYPE , & * PROPOSAL_COMMENT_DOC ) ,
295- ( ACTION_UUID_TYPE , & * PROPOSAL_ACTION_DOC ) ,
322+ ( deprecated:: PROPOSAL_DOCUMENT_UUID_TYPE , & * PROPOSAL ) ,
323+ ( deprecated:: COMMENT_DOCUMENT_UUID_TYPE , & * PROPOSAL_COMMENT ) ,
324+ (
325+ deprecated:: PROPOSAL_ACTION_DOCUMENT_UUID_TYPE ,
326+ & * PROPOSAL_SUBMISSION_ACTION ,
327+ ) ,
296328 ] ;
297329 for ( uuid, expected) in special_cases {
298330 match DocType :: try_from ( uuid) {
@@ -416,21 +448,33 @@ mod tests {
416448 assert ! ( matches!( result, Err ( DocTypeError :: StringConversion ( s) ) if s == "not-a-uuid" ) ) ;
417449 }
418450
451+ #[ test]
452+ fn test_doc_type_to_value ( ) {
453+ let uuid = uuid:: Uuid :: new_v4 ( ) ;
454+ let doc_type: Value = DocType ( vec ! [ UuidV4 :: try_from( uuid) . unwrap( ) ] ) . into ( ) ;
455+
456+ for d in & doc_type. into_array ( ) . unwrap ( ) {
457+ let t = d. clone ( ) . into_tag ( ) . unwrap ( ) ;
458+ assert_eq ! ( t. 0 , UUID_CBOR_TAG ) ;
459+ assert_eq ! ( t. 1 . as_bytes( ) . unwrap( ) . len( ) , 16 ) ;
460+ }
461+ }
462+
419463 #[ test]
420464 fn test_doctype_equal_special_cases ( ) {
421465 // Direct equal
422- let uuid: UuidV4 = PROPOSAL_UUID_TYPE . try_into ( ) . unwrap ( ) ;
466+ let uuid = deprecated :: PROPOSAL_DOCUMENT_UUID_TYPE ;
423467 let dt1 = DocType :: try_from ( vec ! [ uuid] ) . unwrap ( ) ;
424468 let dt2 = DocType :: try_from ( vec ! [ uuid] ) . unwrap ( ) ;
425469 assert_eq ! ( dt1, dt2) ;
426470
427471 // single -> special mapped type
428- let single = DocType :: try_from ( PROPOSAL_UUID_TYPE ) . unwrap ( ) ;
429- assert_eq ! ( single, * PROPOSAL_DOC_TYPE ) ;
430- let single = DocType :: try_from ( COMMENT_UUID_TYPE ) . unwrap ( ) ;
431- assert_eq ! ( single, * PROPOSAL_COMMENT_DOC ) ;
432- let single = DocType :: try_from ( ACTION_UUID_TYPE ) . unwrap ( ) ;
433- assert_eq ! ( single, * PROPOSAL_ACTION_DOC ) ;
472+ let single = DocType :: try_from ( deprecated :: PROPOSAL_DOCUMENT_UUID_TYPE ) . unwrap ( ) ;
473+ assert_eq ! ( single, * PROPOSAL ) ;
474+ let single = DocType :: try_from ( deprecated :: COMMENT_DOCUMENT_UUID_TYPE ) . unwrap ( ) ;
475+ assert_eq ! ( single, * PROPOSAL_COMMENT ) ;
476+ let single = DocType :: try_from ( deprecated :: PROPOSAL_ACTION_DOCUMENT_UUID_TYPE ) . unwrap ( ) ;
477+ assert_eq ! ( single, * PROPOSAL_SUBMISSION_ACTION ) ;
434478 }
435479
436480 #[ test]
@@ -459,10 +503,10 @@ mod tests {
459503
460504 #[ test]
461505 fn test_deserialize_special_case ( ) {
462- let uuid = PROPOSAL_UUID_TYPE . to_string ( ) ;
506+ let uuid = deprecated :: PROPOSAL_DOCUMENT_UUID_TYPE . to_string ( ) ;
463507 let json = json ! ( uuid) ;
464508 let dt: DocType = serde_json:: from_value ( json) . unwrap ( ) ;
465509
466- assert_eq ! ( dt, * PROPOSAL_DOC_TYPE ) ;
510+ assert_eq ! ( dt, * PROPOSAL ) ;
467511 }
468512}
0 commit comments