Skip to content

Commit

Permalink
Merge pull request #55 from niscy-eudiw/main
Browse files Browse the repository at this point in the history
Add DisplayMetadata and LogoMetadata structures for document display properties
  • Loading branch information
phisakel authored Jan 15, 2025
2 parents ef353c4 + 5239385 commit a718b66
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 9 deletions.
36 changes: 36 additions & 0 deletions Sources/MdocDataModel18013/DocumentClaims/DisplayMetadata.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
Copyright (c) 2023 European Commission

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import Foundation

public struct DisplayMetadata: Codable, Equatable, Sendable {
public let name: String?
public let localeIdentifier: String?
public let logo: LogoMetadata?
public let description: String?
public let backgroundColor: String?
public let textColor: String?
public var locale: Locale? { Locale(identifier: localeIdentifier ?? "en_US") }

public init(name: String? = nil, localeIdentifier: String? = nil, logo: LogoMetadata? = nil, description: String? = nil, backgroundColor: String? = nil, textColor: String? = nil) {
self.name = name
self.localeIdentifier = localeIdentifier
self.logo = logo
self.description = description
self.backgroundColor = backgroundColor
self.textColor = textColor
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ limitations under the License.

import Foundation
import SwiftCBOR
import OpenID4VCI

/// A conforming type represents claims data.
///
Expand All @@ -29,8 +30,12 @@ public protocol DocClaimsDecodable: Sendable, AgeAttesting {
var createdAt: Date { get }
/// The date and time the document was last modified.
var modifiedAt: Date? { get }
/// The display name of the document.
/// The display name of the document (derived from `display`).
var displayName: String? { get }
/// The display properties of the document
var display: [DisplayMetadata]? { get }
/// The display properties of the issuer
var issuerDisplay: [DisplayMetadata]? { get }
// The document type. For CBOR (mso_mdoc) documents is native, for SD-JWT (vc+sd-jwt) documents is the type of the document.
var docType: String? { get }
// document claims in a format agnostic way
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@ import Foundation

/// A protocol to create a ``DocClaimsDecodable`` from a cbor encoded ``IssuerSigned`` struct
public protocol DocClaimsDecodableFactory: Sendable {
func makeClaimsDecodableFromCbor(id: String, createdAt: Date, issuerSigned: IssuerSigned, displayName: String?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) -> (any DocClaimsDecodable)?
func makeClaimsDecodableFromCbor(id: String, createdAt: Date, issuerSigned: IssuerSigned, displayName: String?, display: [DisplayMetadata]?, issuerDisplay: [DisplayMetadata]?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) -> (
any DocClaimsDecodable
)?
}
28 changes: 28 additions & 0 deletions Sources/MdocDataModel18013/DocumentClaims/LogoMetadata.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
Copyright (c) 2023 European Commission

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import Foundation

public struct LogoMetadata: Codable, Equatable, Sendable {
public let urlString: String?
public let alternativeText: String?
public var uri: URL? { urlString.flatMap(URL.init(string:)) }

public init(urlString: String? = nil, alternativeText: String? = nil) {
self.urlString = urlString
self.alternativeText = alternativeText
}
}
6 changes: 4 additions & 2 deletions Sources/MdocDataModel18013/MdocKnownDocTypes/EuPidModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ limitations under the License.
import Foundation

public struct EuPidModel: Decodable, DocClaimsDecodable, Sendable {
public var display: [DisplayMetadata]?
public var issuerDisplay: [DisplayMetadata]?
public static let euPidDocType: String = "eu.europa.ec.eudi.pid.1"
public var id: String = UUID().uuidString
public var createdAt: Date = Date()
Expand Down Expand Up @@ -95,9 +97,9 @@ public struct EuPidModel: Decodable, DocClaimsDecodable, Sendable {
}

extension EuPidModel {
public init?(id: String, createdAt: Date, issuerSigned: IssuerSigned, displayName: String?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) {
public init?(id: String, createdAt: Date, issuerSigned: IssuerSigned, displayName: String?, display: [DisplayMetadata]?, issuerDisplay: [DisplayMetadata]?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) {
self.id = id
self.createdAt = createdAt; self.displayName = displayName
self.createdAt = createdAt; self.displayName = displayName; self.display = display; self.issuerDisplay = issuerDisplay
guard let nameSpaces = Self.getCborSignedItems(issuerSigned) else { return nil }
Self.extractCborClaims(nameSpaces, &docClaims, claimDisplayNames, mandatoryClaims, claimValueTypes)
Self.extractAgeOverValues(nameSpaces, &ageOverXX)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import Foundation

public struct GenericMdocModel: DocClaimsDecodable, Sendable {
public var display: [DisplayMetadata]?
public var issuerDisplay: [DisplayMetadata]?
public var id: String = UUID().uuidString
public var createdAt: Date = Date()
public var docType: String?
Expand All @@ -12,12 +14,14 @@ public struct GenericMdocModel: DocClaimsDecodable, Sendable {
public var ageOverXX = [Int: Bool]()
public var docClaims = [DocClaim]()
public var docDataFormat: DocDataFormat
public var hashingAlg: String?

public init(id: String = UUID().uuidString, createdAt: Date = Date(), docType: String? = nil, displayName: String? = nil, modifiedAt: Date? = nil, ageOverXX: [Int : Bool] = [Int: Bool](), docClaims: [DocClaim] = [DocClaim](), docDataFormat: DocDataFormat = .cbor) {
public init(id: String = UUID().uuidString, createdAt: Date = Date(), docType: String? = nil, displayName: String? = nil, display: [DisplayMetadata]? = nil, issuerDisplay: [DisplayMetadata]? = nil, modifiedAt: Date? = nil, ageOverXX: [Int : Bool] = [Int: Bool](), docClaims: [DocClaim] = [DocClaim](), docDataFormat: DocDataFormat = .cbor, hashingAlg: String? = nil) {
self.id = id
self.createdAt = createdAt
self.docType = docType
self.displayName = displayName
self.display = display; self.issuerDisplay = issuerDisplay
self.modifiedAt = modifiedAt
self.ageOverXX = ageOverXX
self.docClaims = docClaims
Expand All @@ -27,8 +31,10 @@ public struct GenericMdocModel: DocClaimsDecodable, Sendable {

extension GenericMdocModel {

public init?(id: String, createdAt: Date, issuerSigned: IssuerSigned, docType: String, displayName: String?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) {
self.id = id; self.createdAt = createdAt; self.displayName = displayName; self.docType = docType; self.docDataFormat = .cbor
public init?(id: String, createdAt: Date, issuerSigned: IssuerSigned, docType: String, displayName: String?, display: [DisplayMetadata]?, issuerDisplay: [DisplayMetadata]?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) {
self.id = id; self.createdAt = createdAt; self.displayName = displayName
self.display = display; self.issuerDisplay = issuerDisplay
self.docType = docType; self.docDataFormat = .cbor
if let nameSpaces = Self.getCborSignedItems(issuerSigned) {
Self.extractCborClaims(nameSpaces, &docClaims, claimDisplayNames, mandatoryClaims, claimValueTypes)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ limitations under the License.
import Foundation

public struct IsoMdlModel: Decodable, DocClaimsDecodable, Sendable {
public var display: [DisplayMetadata]?
public var issuerDisplay: [DisplayMetadata]?
public var id: String = UUID().uuidString
public var createdAt: Date = Date()
public var docType: String? = Self.isoDocType
Expand Down Expand Up @@ -119,8 +121,8 @@ public struct IsoMdlModel: Decodable, DocClaimsDecodable, Sendable {


extension IsoMdlModel {
public init?(id: String, createdAt: Date, issuerSigned: IssuerSigned, displayName: String?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) {
self.id = id; self.createdAt = createdAt; self.displayName = displayName
public init?(id: String, createdAt: Date, issuerSigned: IssuerSigned, displayName: String?, display: [DisplayMetadata]?, issuerDisplay: [DisplayMetadata]?, claimDisplayNames: [NameSpace: [String: String]]?, mandatoryClaims: [NameSpace: [String: Bool]]?, claimValueTypes: [NameSpace: [String: String]]?) {
self.id = id; self.createdAt = createdAt; self.displayName = displayName; self.display = display; self.issuerDisplay = issuerDisplay
guard let nameSpaceItems = Self.getCborSignedItems(issuerSigned, nameSpaces) else { return nil }
Self.extractCborClaims(nameSpaceItems, &docClaims, claimDisplayNames, mandatoryClaims, claimValueTypes)
func getValue<T>(key: IsoMdlModel.CodingKeys) -> T? { Self.getCborItemValue(nameSpaceItems, string: key.rawValue) }
Expand Down

0 comments on commit a718b66

Please sign in to comment.