1
- import Domain
2
1
import Foundation
3
2
4
- struct JWTCredentialPayload {
5
- struct JWTVerfiableCredential {
6
- let context : Set < String >
7
- let type : Set < String >
8
- let credentialSchema : VerifiableCredentialTypeContainer ?
9
- let credentialSubject : String
10
- let credentialStatus : VerifiableCredentialTypeContainer ?
11
- let refreshService : VerifiableCredentialTypeContainer ?
12
- let evidence : VerifiableCredentialTypeContainer ?
13
- let termsOfUse : VerifiableCredentialTypeContainer ?
14
- }
15
- let iss : DID
16
- let sub : String ?
17
- let verifiableCredential : JWTVerfiableCredential
18
- let nbf : Date
19
- let exp : Date ?
20
- let jti : String ?
21
- let aud : Set < String >
22
- }
23
-
24
- extension JWTCredentialPayload : VerifiableCredential {
25
- var context : Set < String > { verifiableCredential. context }
26
- var type : Set < String > { verifiableCredential. type }
27
- var id : String ? { jti }
28
- var issuer : DID { iss }
29
- var issuanceDate : Date { nbf }
30
- var expirationDate : Date ? { exp }
31
- var credentialSchema : VerifiableCredentialTypeContainer ? { verifiableCredential. credentialSchema }
32
- var credentialSubject : String { verifiableCredential. credentialSubject }
33
- var credentialStatus : VerifiableCredentialTypeContainer ? { verifiableCredential. credentialStatus }
34
- var refreshService : VerifiableCredentialTypeContainer ? { verifiableCredential. refreshService }
35
- var evidence : Domain . VerifiableCredentialTypeContainer ? { verifiableCredential. evidence }
36
- var termsOfUse : Domain . VerifiableCredentialTypeContainer ? { verifiableCredential. termsOfUse }
37
- var validFrom : Domain . VerifiableCredentialTypeContainer ? { nil }
38
- var validUntil : Domain . VerifiableCredentialTypeContainer ? { nil }
39
- var proof : String ? { nil }
40
- }
41
-
42
3
extension JWTCredentialPayload . JWTVerfiableCredential : Codable {
43
4
enum CodingKeys : String , CodingKey {
44
5
case context = " @context "
@@ -54,7 +15,11 @@ extension JWTCredentialPayload.JWTVerfiableCredential: Codable {
54
15
public func encode( to encoder: Encoder ) throws {
55
16
var container = encoder. container ( keyedBy: CodingKeys . self)
56
17
try container. encode ( self . context, forKey: . context)
57
- try container. encode ( self . type, forKey: . type)
18
+ if self . type. count != 1 {
19
+ try container. encode ( self . type, forKey: . type)
20
+ } else if let value = self . type. first {
21
+ try container. encode ( value, forKey: . type)
22
+ }
58
23
try container. encode ( self . credentialSubject, forKey: . credentialSubject)
59
24
try container. encode ( self . credentialStatus, forKey: . credentialStatus)
60
25
try container. encode ( self . credentialSchema, forKey: . credentialSchema)
@@ -65,29 +30,44 @@ extension JWTCredentialPayload.JWTVerfiableCredential: Codable {
65
30
66
31
public init ( from decoder: Decoder ) throws {
67
32
let container = try decoder. container ( keyedBy: CodingKeys . self)
68
- self . context = try container. decode ( Set< String> . self , forKey: . context)
69
- self . type = try container. decode ( Set< String> . self , forKey: . type)
70
- self . credentialSubject = try container. decode ( String . self, forKey: . credentialSubject)
71
- self . credentialStatus = try ? container. decode (
33
+ let context = try container. decode ( Set< String> . self , forKey: . context)
34
+ let type : Set < String >
35
+ if let value = try ? container. decode ( String . self, forKey: . type) {
36
+ type = Set ( [ value] )
37
+ } else {
38
+ type = try container. decode ( Set< String> . self , forKey: . type)
39
+ }
40
+ let credentialSubject = try container. decode ( String . self, forKey: . credentialSubject)
41
+ let credentialStatus = try ? container. decode (
72
42
VerifiableCredentialTypeContainer . self,
73
43
forKey: . credentialStatus
74
44
)
75
- self . credentialSchema = try ? container. decode (
45
+ let credentialSchema = try ? container. decode (
76
46
VerifiableCredentialTypeContainer . self,
77
47
forKey: . credentialSchema
78
48
)
79
- self . refreshService = try ? container. decode (
49
+ let refreshService = try ? container. decode (
80
50
VerifiableCredentialTypeContainer . self,
81
51
forKey: . refreshService
82
52
)
83
- self . evidence = try ? container. decode (
53
+ let evidence = try ? container. decode (
84
54
VerifiableCredentialTypeContainer . self,
85
55
forKey: . evidence
86
56
)
87
- self . termsOfUse = try ? container. decode (
57
+ let termsOfUse = try ? container. decode (
88
58
VerifiableCredentialTypeContainer . self,
89
59
forKey: . termsOfUse
90
60
)
61
+ self . init (
62
+ context: context,
63
+ type: type,
64
+ credentialSchema: credentialSchema,
65
+ credentialSubject: credentialSubject,
66
+ credentialStatus: credentialStatus,
67
+ refreshService: refreshService,
68
+ evidence: evidence,
69
+ termsOfUse: termsOfUse
70
+ )
91
71
}
92
72
}
93
73
@@ -116,24 +96,34 @@ extension JWTCredentialPayload: Codable {
116
96
public init ( from decoder: Decoder ) throws {
117
97
let container = try decoder. container ( keyedBy: CodingKeys . self)
118
98
let didString = try container. decode ( String . self, forKey: . iss)
119
- self . iss = try DID ( string: didString)
120
- self . sub = try ? container. decode ( String . self, forKey: . sub)
121
- self . verifiableCredential = try container. decode ( JWTVerfiableCredential . self, forKey: . verfiableCredential)
122
- self . nbf = try container. decode (
99
+ let iss = try DID ( string: didString)
100
+ let sub = try ? container. decode ( String . self, forKey: . sub)
101
+ let verifiableCredential = try container. decode ( JWTVerfiableCredential . self, forKey: . verfiableCredential)
102
+ let nbf = try container. decode (
123
103
Date . self,
124
104
forKey: . nbf
125
105
)
126
- self . exp = try ? container. decode (
106
+ let exp = try ? container. decode (
127
107
Date . self,
128
108
forKey: . exp
129
109
)
130
- self . jti = try ? container. decode (
110
+ let jti = try container. decode (
131
111
String . self,
132
112
forKey: . jti
133
113
)
134
- self . aud = ( try ? container. decode (
114
+ let aud = ( try ? container. decode (
135
115
Set< String> . self ,
136
116
forKey: . aud
137
117
) ) ?? Set < String > ( )
118
+
119
+ self . init (
120
+ iss: iss,
121
+ sub: sub,
122
+ verifiableCredential: verifiableCredential,
123
+ nbf: nbf,
124
+ exp: exp,
125
+ jti: jti,
126
+ aud: aud
127
+ )
138
128
}
139
129
}
0 commit comments