11import Foundation
22import Nodal
33
4+ @TaskLocal internal var requiredExtensions : Set < Namespace > = [ ]
5+
6+ internal extension UUID {
7+ static var uuidIfProduction : UUID ? {
8+ requiredExtensions. contains ( . production) ? UUID ( ) : nil
9+ }
10+ }
11+
412public struct Model : Sendable , XMLElementCodable {
513 public var unit : Unit ?
614 public var xmlLanguageCode : String ?
@@ -12,7 +20,7 @@ public struct Model: Sendable, XMLElementCodable {
1220
1321 public var metadata : [ Metadata ]
1422 public var resources : ResourceContainer
15- public var buildItems : [ Item ]
23+ public var build : Build
1624
1725 public init (
1826 unit: Unit ? = nil ,
@@ -23,7 +31,7 @@ public struct Model: Sendable, XMLElementCodable {
2331 customNamespaces: [ String : String ] = [ : ] , // Prefix: URI
2432 metadata: [ Metadata ] = [ ] ,
2533 resources: [ any Resource ] = [ ] ,
26- buildItems : [ Item ] = [ ]
34+ build : Build
2735 ) {
2836 self . unit = unit
2937 self . xmlLanguageCode = xmlLanguageCode
@@ -34,18 +42,35 @@ public struct Model: Sendable, XMLElementCodable {
3442
3543 self . metadata = metadata
3644 self . resources = ResourceContainer ( resources: resources)
37- self . buildItems = buildItems
45+ self . build = build
46+ }
47+
48+ public init (
49+ unit: Unit ? = nil ,
50+ xmlLanguageCode: String ? = nil ,
51+ languageCode: String ? = nil ,
52+ requiredExtensions: Set < Namespace > = [ ] ,
53+ recommendedExtensions: Set < Namespace > = [ ] ,
54+ customNamespaces: [ String : String ] = [ : ] , // Prefix: URI
55+ metadata: [ Metadata ] = [ ] ,
56+ resources: [ any Resource ] = [ ] ,
57+ buildItems: [ Item ] = [ ]
58+ ) {
59+ let build = Build ( items: buildItems)
60+ self . init ( unit: unit, xmlLanguageCode: xmlLanguageCode, languageCode: languageCode, requiredExtensions: requiredExtensions, recommendedExtensions: recommendedExtensions, customNamespaces: customNamespaces, metadata: metadata, resources: resources, build: build)
3861 }
3962
4063 public func encode( to element: Node ) {
41- element. setValue ( unit, forAttribute: . unit)
42- element. setValue ( xmlLanguageCode, forAttribute: XML . lang)
43- element. setValue ( languageCode, forAttribute: . language)
44- element. setValue ( requiredExtensions. compactMap ( \. outputPrefix) . nonEmpty, forAttribute: . requiredExtensions)
45- element. setValue ( recommendedExtensions. compactMap ( \. outputPrefix) . nonEmpty, forAttribute: . recommendedExtensions)
46- element. encode ( metadata, elementName: Core . metadata)
47- element. encode ( resources, elementName: Core . resources)
48- element. encode ( buildItems, elementName: Core . item, containedIn: Core . build)
64+ $requiredExtensions. withValue ( requiredExtensions) {
65+ element. setValue ( unit, forAttribute: . unit)
66+ element. setValue ( xmlLanguageCode, forAttribute: XML . lang)
67+ element. setValue ( languageCode, forAttribute: . language)
68+ element. setValue ( requiredExtensions. compactMap ( \. outputPrefix) . nonEmpty, forAttribute: . requiredExtensions)
69+ element. setValue ( recommendedExtensions. compactMap ( \. outputPrefix) . nonEmpty, forAttribute: . recommendedExtensions)
70+ element. encode ( metadata, elementName: Core . metadata)
71+ element. encode ( resources, elementName: Core . resources)
72+ element. encode ( build, elementName: Core . build)
73+ }
4974 }
5075
5176 public init ( from element: Node ) throws {
@@ -70,6 +95,6 @@ public struct Model: Sendable, XMLElementCodable {
7095
7196 metadata = try element. decode ( elementName: Core . metadata)
7297 resources = try element. decode ( elementName: Core . resources)
73- buildItems = try element. decode ( elementName: Core . item , containedIn : Core . build)
98+ build = try element. decode ( elementName: Core . build)
7499 }
75100}
0 commit comments