@@ -512,6 +512,7 @@ fn time_value(time: &TimeDescriptor) -> Value {
512512/// states when the registry first recorded it.
513513#[ derive( Clone , Debug , Eq , PartialEq ) ]
514514pub struct BRegCreationRevision {
515+ record_type : String ,
515516 record_id : String ,
516517 created_at : String ,
517518}
@@ -520,6 +521,12 @@ impl BRegCreationRevision {
520521 /// Read a Registry Record revision envelope (`{"data": {...}, "meta": {...}}`)
521522 /// and keep only the creation evidence for `record_id`.
522523 pub fn from_document ( record_id : & str , document : & Value ) -> Result < Self , BRegOccurrenceError > {
524+ let record_type = document
525+ . get ( "meta" )
526+ . and_then ( Value :: as_object)
527+ . and_then ( |meta| meta. get ( "entityTypeIdentifier" ) )
528+ . and_then ( Value :: as_str)
529+ . ok_or_else ( || wrong_evidence ( "the revision has no record type" ) ) ?;
523530 let data = document
524531 . get ( "data" )
525532 . and_then ( Value :: as_object)
@@ -545,19 +552,21 @@ impl BRegCreationRevision {
545552 . get ( "createdAt" )
546553 . and_then ( Value :: as_str)
547554 . ok_or_else ( || wrong_evidence ( "the revision has no creation time" ) ) ?;
548- Self :: new ( record_id, created_at)
555+ Self :: new ( record_type , record_id, created_at)
549556 }
550557
551- /// Read the compact `{"recordId", "revision", "createdAt"}` form that
552- /// `Serialize` writes.
558+ /// Read the compact `{"recordType", " recordId", "revision", "createdAt"}`
559+ /// form that `Serialize` writes.
553560 pub fn from_value ( value : & Value ) -> Result < Self , BRegOccurrenceError > {
554561 let object = value
555562 . as_object ( )
556563 . ok_or_else ( || wrong_evidence ( "the creation revision is not an object" ) ) ?;
557- if object
558- . keys ( )
559- . any ( |key| !matches ! ( key. as_str( ) , "recordId" | "revision" | "createdAt" ) )
560- {
564+ if object. keys ( ) . any ( |key| {
565+ !matches ! (
566+ key. as_str( ) ,
567+ "recordType" | "recordId" | "revision" | "createdAt"
568+ )
569+ } ) {
561570 return Err ( wrong_evidence (
562571 "the creation revision has an unknown member" ,
563572 ) ) ;
@@ -569,21 +578,35 @@ impl BRegCreationRevision {
569578 . ok_or_else ( || wrong_evidence ( format ! ( "the creation revision has no {name}" ) ) )
570579 } ;
571580 require_creation_revision ( member ( "revision" ) ?) ?;
572- Self :: new ( member ( "recordId" ) ?, member ( "createdAt" ) ?)
581+ Self :: new (
582+ member ( "recordType" ) ?,
583+ member ( "recordId" ) ?,
584+ member ( "createdAt" ) ?,
585+ )
573586 }
574587
575- fn new ( record_id : & str , created_at : & str ) -> Result < Self , BRegOccurrenceError > {
588+ fn new (
589+ record_type : & str ,
590+ record_id : & str ,
591+ created_at : & str ,
592+ ) -> Result < Self , BRegOccurrenceError > {
576593 if OffsetDateTime :: parse ( created_at, & Rfc3339 ) . is_err ( ) {
577594 return Err ( wrong_evidence (
578595 "the creation time is not an RFC 3339 timestamp" ,
579596 ) ) ;
580597 }
581598 Ok ( Self {
599+ record_type : record_type. to_owned ( ) ,
582600 record_id : record_id. to_owned ( ) ,
583601 created_at : created_at. to_owned ( ) ,
584602 } )
585603 }
586604
605+ #[ must_use]
606+ pub fn record_type_identifier ( & self ) -> & str {
607+ & self . record_type
608+ }
609+
587610 #[ must_use]
588611 pub fn record_identifier ( & self ) -> & str {
589612 & self . record_id
@@ -620,6 +643,7 @@ fn require_creation_revision(revision: &str) -> Result<(), BRegOccurrenceError>
620643impl Serialize for BRegCreationRevision {
621644 fn serialize < S : serde:: Serializer > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error > {
622645 serde_json:: json!( {
646+ "recordType" : self . record_type,
623647 "recordId" : self . record_id,
624648 "revision" : CREATION_REVISION ,
625649 "createdAt" : self . created_at,
@@ -961,7 +985,10 @@ fn build_view(
961985 ) ) ;
962986 }
963987 let recorded_at = match creation_revision {
964- Some ( creation) if creation. record_id != record. record_id => {
988+ Some ( creation)
989+ if creation. record_type != record. record_type
990+ || creation. record_id != record. record_id =>
991+ {
965992 return Err ( wrong_evidence (
966993 "the creation revision belongs to another record" ,
967994 ) ) ;
0 commit comments