@@ -89,11 +89,74 @@ impl TryFrom<&CredentialDefinitionId> for ParsedCredentialDefinitionId {
89
89
}
90
90
let issuer_id = DID :: from ( parts[ 0 ] ) ;
91
91
let parsed_issuer_id = ParsedDid :: try_from ( & issuer_id) ?;
92
+ let parsed_schema_id = ParsedCredentialDefinitionSchemaId :: try_from ( parts[ 4 ] ) ?;
92
93
Ok ( ParsedCredentialDefinitionId {
93
94
issuer_id : DID :: from ( parts[ 0 ] ) ,
94
- schema_id : parts [ 3 ] . to_string ( ) ,
95
- tag : parts[ 4 ] . to_string ( ) ,
95
+ schema_id : parsed_schema_id . as_short_id ( ) ? ,
96
+ tag : parts[ 5 ] . to_string ( ) ,
96
97
network : parsed_issuer_id. network ,
97
98
} )
98
99
}
99
100
}
101
+
102
+ #[ derive( Debug , Default , Clone , PartialEq , Deserialize , Serialize ) ]
103
+ pub ( crate ) struct ParsedCredentialDefinitionSchemaId {
104
+ pub ( crate ) issuer_id : DID ,
105
+ pub ( crate ) name : String ,
106
+ pub ( crate ) version : String ,
107
+ pub ( crate ) network : Option < String > ,
108
+ }
109
+
110
+ impl ParsedCredentialDefinitionSchemaId {
111
+ pub ( crate ) fn as_short_id ( & self ) -> VdrResult < String > {
112
+ Ok (
113
+ format ! (
114
+ "{}:{}:{}" ,
115
+ self . issuer_id. without_network( ) ?. as_ref( ) ,
116
+ self . name,
117
+ self . version
118
+ )
119
+ )
120
+ }
121
+ }
122
+
123
+ impl TryFrom < & str > for ParsedCredentialDefinitionSchemaId {
124
+ type Error = VdrError ;
125
+
126
+ fn try_from ( schema_id : & str ) -> Result < Self , Self :: Error > {
127
+ let parts = schema_id. split ( ':' ) . collect :: < Vec < & str > > ( ) ;
128
+ if parts. len ( ) == 6 {
129
+ return Ok ( ParsedCredentialDefinitionSchemaId {
130
+ issuer_id : DID :: build ( parts[ 1 ] , None , parts[ 3 ] ) ,
131
+ name : parts[ 4 ] . to_string ( ) ,
132
+ version : parts[ 5 ] . to_string ( ) ,
133
+ network : Some ( parts[ 2 ] . to_string ( ) ) ,
134
+ } )
135
+ }
136
+ if parts. len ( ) == 5 {
137
+ return Ok ( ParsedCredentialDefinitionSchemaId {
138
+ issuer_id : DID :: build ( parts[ 1 ] , None , parts[ 2 ] ) ,
139
+ name : parts[ 3 ] . to_string ( ) ,
140
+ version : parts[ 4 ] . to_string ( ) ,
141
+ network : None ,
142
+ } )
143
+ }
144
+ return Err ( VdrError :: CommonInvalidData (
145
+ "Invalid credential definition id provided" . to_string ( ) ,
146
+ ) ) ;
147
+ }
148
+ }
149
+
150
+ #[ cfg( test) ]
151
+ pub mod test {
152
+ use crate :: contracts:: anoncreds:: types:: credential_definition:: test:: { CREDENTIAL_DEFINITION_ID , CREDENTIAL_DEFINITION_ID_WITHOUT_NETWORK } ;
153
+ use super :: * ;
154
+
155
+ #[ test]
156
+ fn cred_def_id_id_without_network ( ) {
157
+ assert_eq ! (
158
+ CredentialDefinitionId :: from( CREDENTIAL_DEFINITION_ID_WITHOUT_NETWORK ) ,
159
+ CredentialDefinitionId :: from( CREDENTIAL_DEFINITION_ID ) . without_network( ) . unwrap( )
160
+ )
161
+ }
162
+ }
0 commit comments