@nfdi4plants/arctrl 2.0.0-beta.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/ARC.js +55 -18
  2. package/Contract/ArcAssay.js +4 -4
  3. package/Contract/ArcInvestigation.js +4 -4
  4. package/Contract/ArcStudy.js +3 -3
  5. package/Contract/Datamap.js +1 -1
  6. package/Contract/ValidationPackagesConfig.js +96 -0
  7. package/Core/ArcTypes.js +93 -90
  8. package/Core/Conversion.js +13 -13
  9. package/Core/DataContext.js +53 -6
  10. package/Core/{Table/DataMap.js → DataMap.js} +34 -22
  11. package/Core/Process/Component.js +15 -5
  12. package/Core/Process/FactorValue.js +14 -5
  13. package/Core/Process/MaterialAttributeValue.js +14 -5
  14. package/Core/Process/ProcessParameterValue.js +11 -2
  15. package/Core/Table/ArcTable.js +99 -11
  16. package/Core/Table/CompositeCell.js +38 -23
  17. package/Core/Table/CompositeColumn.js +7 -30
  18. package/Core/Table/CompositeHeader.js +5 -215
  19. package/Core/{Process/Value.js → Value.js} +9 -9
  20. package/Json/Assay.js +10 -9
  21. package/Json/{Process/Data.js → Data.js} +17 -17
  22. package/Json/{Process/DataFile.js → DataFile.js} +9 -9
  23. package/Json/DataMap/DataContext.js +30 -0
  24. package/Json/DataMap/DataMap.js +25 -0
  25. package/Json/Encode.js +10 -1
  26. package/Json/Process/Component.js +1 -1
  27. package/Json/Process/FactorValue.js +1 -1
  28. package/Json/Process/MaterialAttributeValue.js +1 -1
  29. package/Json/Process/ProcessInput.js +1 -1
  30. package/Json/Process/ProcessOutput.js +1 -1
  31. package/Json/Process/ProcessParameterValue.js +2 -2
  32. package/Json/Process/Value.js +3 -3
  33. package/Json/{Process/PropertyValue.js → PropertyValue.js} +30 -21
  34. package/Json/Study.js +9 -8
  35. package/Json/Table/CompositeCell.js +1 -1
  36. package/Json/context/rocrate/isa_data_context.js +1 -1
  37. package/Json/context/rocrate/isa_investigation_context.js +1 -1
  38. package/Json/context/rocrate/property_value_context.js +1 -1
  39. package/Spreadsheet/AnnotationTable/ArcTable.js +3 -2
  40. package/Spreadsheet/AnnotationTable/CompositeColumn.js +9 -7
  41. package/Spreadsheet/ArcAssay.js +62 -26
  42. package/Spreadsheet/ArcInvestigation.js +59 -38
  43. package/Spreadsheet/ArcStudy.js +51 -20
  44. package/Spreadsheet/DataMap.js +1 -1
  45. package/Spreadsheet/DataMapTable/DataMapTable.js +3 -3
  46. package/Spreadsheet/Template.js +1 -1
  47. package/ValidationPackages/ValidationPackage.js +61 -0
  48. package/ValidationPackages/ValidationPackagesConfig.js +88 -0
  49. package/Xlsx.js +9 -9
  50. package/Yaml/Encode.js +8 -0
  51. package/Yaml/ValidationPackage.js +47 -0
  52. package/Yaml/ValidationPackagesConfig.js +48 -0
  53. package/fable_modules/YAMLicious.0.0.1/Decode.fs +374 -0
  54. package/fable_modules/YAMLicious.0.0.1/Decode.fs.js +1684 -0
  55. package/fable_modules/YAMLicious.0.0.1/Encode.fs +148 -0
  56. package/fable_modules/YAMLicious.0.0.1/Encode.fs.js +74 -0
  57. package/fable_modules/YAMLicious.0.0.1/Interop/JsInterop.fs +14 -0
  58. package/fable_modules/YAMLicious.0.0.1/Interop/JsInterop.fs.js +11 -0
  59. package/fable_modules/YAMLicious.0.0.1/Interop/PyInterop.fs +9 -0
  60. package/fable_modules/YAMLicious.0.0.1/Library.fs +138 -0
  61. package/fable_modules/YAMLicious.0.0.1/Library.fs.js +7 -0
  62. package/fable_modules/YAMLicious.0.0.1/Persil.fs +86 -0
  63. package/fable_modules/YAMLicious.0.0.1/Persil.fs.js +49 -0
  64. package/fable_modules/YAMLicious.0.0.1/Preprocessing.fs +59 -0
  65. package/fable_modules/YAMLicious.0.0.1/Preprocessing.fs.js +102 -0
  66. package/fable_modules/YAMLicious.0.0.1/Reader.fs +295 -0
  67. package/fable_modules/YAMLicious.0.0.1/Reader.fs.js +530 -0
  68. package/fable_modules/YAMLicious.0.0.1/Regex.fs +108 -0
  69. package/fable_modules/YAMLicious.0.0.1/Regex.fs.js +19 -0
  70. package/fable_modules/YAMLicious.0.0.1/RegexActivePatterns.fs +166 -0
  71. package/fable_modules/YAMLicious.0.0.1/RegexActivePatterns.fs.js +225 -0
  72. package/fable_modules/YAMLicious.0.0.1/Writer.fs +84 -0
  73. package/fable_modules/YAMLicious.0.0.1/Writer.fs.js +161 -0
  74. package/fable_modules/YAMLicious.0.0.1/YAMLicious.fableproj +39 -0
  75. package/fable_modules/YAMLicious.0.0.1/YAMLiciousTypes.fs +82 -0
  76. package/fable_modules/YAMLicious.0.0.1/YAMLiciousTypes.fs.js +130 -0
  77. package/fable_modules/YAMLicious.0.0.1/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +3 -0
  78. package/fable_modules/YAMLicious.0.0.1/obj/Debug/netstandard2.0/YAMLicious.AssemblyInfo.fs +19 -0
  79. package/fable_modules/YAMLicious.0.0.1/obj/Release/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +3 -0
  80. package/fable_modules/YAMLicious.0.0.1/obj/Release/netstandard2.0/YAMLicious.AssemblyInfo.fs +19 -0
  81. package/fable_modules/project_cracked.json +1 -1
  82. package/index.js +1 -0
  83. package/package.json +1 -1
@@ -0,0 +1,48 @@
1
+ import { ofArray, choose } from "../fable_modules/fable-library-js.4.16.0/List.js";
2
+ import { equals } from "../fable_modules/fable-library-js.4.16.0/Util.js";
3
+ import { Config, YAMLElement } from "../fable_modules/YAMLicious.0.0.1/YAMLiciousTypes.fs.js";
4
+ import { resizearray, string, tryInclude } from "../fable_modules/YAMLicious.0.0.1/Encode.fs.js";
5
+ import { ValidationPackage_decoder, ValidationPackage_encoder } from "./ValidationPackage.js";
6
+ import { singleton, collect, delay, toList } from "../fable_modules/fable-library-js.4.16.0/Seq.js";
7
+ import { YAMLContent_create_27AED5E3 } from "../fable_modules/YAMLicious.0.0.1/YAMLiciousTypes.fs.js";
8
+ import { string as string_1, resizearray as resizearray_1, object } from "../fable_modules/YAMLicious.0.0.1/Decode.fs.js";
9
+ import { ValidationPackagesConfig } from "../ValidationPackages/ValidationPackagesConfig.js";
10
+ import { unwrap } from "../fable_modules/fable-library-js.4.16.0/Option.js";
11
+ import { read } from "../fable_modules/YAMLicious.0.0.1/Reader.fs.js";
12
+ import { defaultWhitespace } from "./Encode.js";
13
+ import { write } from "../fable_modules/YAMLicious.0.0.1/Writer.fs.js";
14
+
15
+ export function ValidationPackagesConfig_encoder(validationpackage) {
16
+ const objSeq = choose((tupledArg) => {
17
+ const v = tupledArg[1];
18
+ if (equals(v, new YAMLElement(5, []))) {
19
+ return void 0;
20
+ }
21
+ else {
22
+ return [tupledArg[0], v];
23
+ }
24
+ }, ofArray([tryInclude("arc_specification", string, validationpackage.ARCSpecification), ["validation_packages", resizearray(ValidationPackage_encoder, validationpackage.ValidationPackages)]]));
25
+ return new YAMLElement(3, [toList(delay(() => collect((matchValue) => singleton(new YAMLElement(0, [YAMLContent_create_27AED5E3(matchValue[0]), matchValue[1]])), objSeq)))]);
26
+ }
27
+
28
+ export const ValidationPackagesConfig_decoder = (value_2) => object((get$) => {
29
+ let objectArg, objectArg_1;
30
+ return new ValidationPackagesConfig((objectArg = get$.Required, objectArg.Field("validation_packages", (value) => resizearray_1(ValidationPackage_decoder, value))), unwrap((objectArg_1 = get$.Optional, objectArg_1.Field("arc_specification", string_1))));
31
+ }, value_2);
32
+
33
+ export function ARCtrl_ValidationPackages_ValidationPackagesConfig__ValidationPackagesConfig_fromYamlString_Static_Z721C83C5(s) {
34
+ return ValidationPackagesConfig_decoder(read(s));
35
+ }
36
+
37
+ export function ARCtrl_ValidationPackages_ValidationPackagesConfig__ValidationPackagesConfig_toYamlString_Static_71136F3F(whitespace) {
38
+ return (vp) => {
39
+ const element = ValidationPackagesConfig_encoder(vp);
40
+ const whitespace_1 = defaultWhitespace(whitespace) | 0;
41
+ return write(element, (c) => (new Config(whitespace_1, c.Level)));
42
+ };
43
+ }
44
+
45
+ export function ARCtrl_ValidationPackages_ValidationPackagesConfig__ValidationPackagesConfig_toYamlString_71136F3F(this$, whitespace) {
46
+ return ARCtrl_ValidationPackages_ValidationPackagesConfig__ValidationPackagesConfig_toYamlString_Static_71136F3F(unwrap(whitespace))(this$);
47
+ }
48
+
@@ -0,0 +1,374 @@
1
+ /// From YAML
2
+ [<RequireQualifiedAccessAttribute>]
3
+ module YAMLicious.Decode
4
+
5
+ open System
6
+ open System.Collections.Generic
7
+
8
+ open YAMLicious
9
+ open YAMLicious.YAMLiciousTypes
10
+ open Fable.Core
11
+
12
+ [<AutoOpen>]
13
+ module Interop =
14
+
15
+ [<Erase>]
16
+ type IExports =
17
+ abstract Number: obj
18
+
19
+ [<ImportAll("numbers")>]
20
+ let numbers: IExports = nativeOnly
21
+
22
+ [<Global; Emit("list")>]
23
+ let pyList: obj = nativeOnly
24
+
25
+ [<Global; Emit("dict")>]
26
+ let pyDict: obj = nativeOnly
27
+
28
+ [<Global; Emit("int")>]
29
+ let pyInt: obj = nativeOnly
30
+
31
+ [<Global; Emit("bool")>]
32
+ let pyBool: obj = nativeOnly
33
+
34
+ module Helper =
35
+
36
+ let inline raiseInvalidArg (name: string) (message: string) wrongV =
37
+ invalidArg name (sprintf "%s: %A" message wrongV)
38
+
39
+ //let isInt (value: string) =
40
+ // #if FABLE_COMPILER_JAVASCRIPT || FABLE_COMPILER_TYPESCRIPT
41
+ // JsInterop.isInt value
42
+ // #else
43
+ // match System.Int32.TryParse value with
44
+ // | true, _ -> true
45
+ // | false, _ -> false
46
+ // #endif
47
+
48
+ //let isFloat (value: string) =
49
+ // #if FABLE_COMPILER_JAVASCRIPT || FABLE_COMPILER_TYPESCRIPT
50
+ // JsInterop.isInt value
51
+ // #else
52
+ // match System.Double.TryParse value with
53
+ // | true, _ -> true
54
+ // | false, _ -> false
55
+ // #endif
56
+
57
+ let isString (value: string) =
58
+ #if FABLE_COMPILER_JAVASCRIPT || FABLE_COMPILER_TYPESCRIPT
59
+ JsInterop.isString value
60
+ #endif
61
+ #if FABLE_COMPILER_PYTHON
62
+ YAMLicious.PyInterop.isString value
63
+ #endif
64
+ #if !FABLE_COMPILER
65
+ match System.Char.TryParse value with
66
+ | true, _ -> true
67
+ | false, _ -> false
68
+ #endif
69
+
70
+ open Helper
71
+ let int (value: YAMLElement) : int =
72
+ match value with
73
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] ->
74
+ match System.Int32.TryParse v.Value with
75
+ | true, v -> v
76
+ | false, _ -> raiseInvalidArg "value" "Expected an int" v.Value
77
+ | _ -> raiseInvalidArg "value" "Expected an YAMLElement.Value" value
78
+
79
+ let float (value: YAMLElement) : float =
80
+ let Culture = System.Globalization.CultureInfo.InvariantCulture
81
+ match value with
82
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] ->
83
+ #if FABLE_COMPILER
84
+ match System.Double.TryParse(v.Value) with // numberstyle and culture return not implemented warning
85
+ #else
86
+ match System.Double.TryParse(v.Value, System.Globalization.NumberStyles.Float, Culture) with
87
+ #endif
88
+ | true, v -> float v
89
+ | false, _ -> raiseInvalidArg "value" "Expected an int" v.Value
90
+ | _ -> raiseInvalidArg "value" "Expected an YAMLElement.Value" value
91
+
92
+ let char (value: YAMLElement) : char =
93
+ match value with
94
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] ->
95
+ match isString v.Value with
96
+ | true -> v.Value.[0]
97
+ | _ -> Helper.raiseInvalidArg "value" "Expected a char" v.Value
98
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a char" anyElse
99
+
100
+ let bool (value: YAMLElement) : bool =
101
+ match value with
102
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] ->
103
+ match System.Boolean.TryParse v.Value with
104
+ | true, bool -> bool
105
+ | false, _ -> Helper.raiseInvalidArg "value" "Expected a bool" v.Value
106
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a bool" anyElse
107
+
108
+ let map (keyDecoder: string -> 'a) (valueDecoder: YAMLElement -> 'b) (value: YAMLElement) : Map<'a, 'b> =
109
+ match value with
110
+ | YAMLElement.Object v ->
111
+ v |> List.map (fun x ->
112
+ match x with
113
+ | YAMLElement.Mapping (k, v) -> (keyDecoder k.Value, valueDecoder v)
114
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a mapping" x
115
+ ) |> Map.ofList
116
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a map" anyElse
117
+
118
+ let dict (keyDecoder: string -> 'a) (valueDecoder: YAMLElement -> 'b) (value: YAMLElement) : Dictionary<'a, 'b> =
119
+ match value with
120
+ | YAMLElement.Object v ->
121
+ v |> List.map (fun x ->
122
+ match x with
123
+ | YAMLElement.Mapping (k, v) -> (keyDecoder k.Value, valueDecoder v)
124
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a mapping" anyElse
125
+ ) |> Map |> Dictionary
126
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a dictionary" anyElse
127
+
128
+ let datetime (value: YAMLElement) : DateTime =
129
+ match value with
130
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] ->
131
+ match System.DateTime.TryParse(v.Value) with
132
+ | true, dateTime -> dateTime
133
+ | false, _ -> Helper.raiseInvalidArg "value" "Expected a DateTime" v.Value
134
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a DateTime" anyElse
135
+
136
+ let datetimeOffset (value: YAMLElement) : DateTimeOffset =
137
+ match value with
138
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] ->
139
+ match System.DateTimeOffset.TryParse(v.Value) with
140
+ | true, dateTimeOffset -> dateTimeOffset
141
+ | false, _ -> Helper.raiseInvalidArg "value" "Expected a DateTimeOffset" v.Value
142
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a DateTimeOffset" anyElse
143
+
144
+ let option (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a option =
145
+ match value with
146
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] ->
147
+ match v.Value with
148
+ | YAML_NULL -> None
149
+ | _ -> Some (decoder value)
150
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected an option" anyElse
151
+
152
+ let string (value: YAMLElement) : string =
153
+ match value with
154
+ | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> v.Value
155
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a string" anyElse
156
+
157
+ let tuple2 (decoderA: YAMLElement -> 'a) (decoderB: YAMLElement -> 'b) (value: YAMLElement) : 'a * 'b =
158
+ match value with
159
+ | YAMLElement.Object [YAMLElement.Sequence [a; b]] | YAMLElement.Sequence [a; b] -> (decoderA a, decoderB b)
160
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple2" anyElse
161
+
162
+ let tuple3 (decoderA: YAMLElement -> 'a) (decoderB: YAMLElement -> 'b) (decoderC: YAMLElement -> 'c) (value: YAMLElement) : 'a * 'b * 'c =
163
+ match value with
164
+ | YAMLElement.Object [YAMLElement.Sequence [a; b; c]] | YAMLElement.Sequence [a; b; c] -> (decoderA a, decoderB b, decoderC c)
165
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple3" anyElse
166
+
167
+ let tuple4
168
+ (decoderA: YAMLElement -> 'a)
169
+ (decoderB: YAMLElement -> 'b)
170
+ (decoderC: YAMLElement -> 'c)
171
+ (decoderD: YAMLElement -> 'd)
172
+ (value: YAMLElement)
173
+ : 'a * 'b * 'c * 'd
174
+ =
175
+ match value with
176
+ | YAMLElement.Object [YAMLElement.Sequence [a; b; c; d]] | YAMLElement.Sequence [a; b; c; d] -> (decoderA a, decoderB b, decoderC c, decoderD d)
177
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple4" anyElse
178
+
179
+ let tuple5
180
+ (decoderA: YAMLElement -> 'a)
181
+ (decoderB: YAMLElement -> 'b)
182
+ (decoderC: YAMLElement -> 'c)
183
+ (decoderD: YAMLElement -> 'd)
184
+ (decoderE: YAMLElement -> 'e)
185
+ (value: YAMLElement)
186
+ : 'a * 'b * 'c * 'd * 'e
187
+ =
188
+ match value with
189
+ | YAMLElement.Object [YAMLElement.Sequence [a; b; c; d; e]] | YAMLElement.Sequence [a; b; c; d; e] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e)
190
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple5" anyElse
191
+
192
+ let tuple6
193
+ (decoderA: YAMLElement -> 'a)
194
+ (decoderB: YAMLElement -> 'b)
195
+ (decoderC: YAMLElement -> 'c)
196
+ (decoderD: YAMLElement -> 'd)
197
+ (decoderE: YAMLElement -> 'e)
198
+ (decoderF: YAMLElement -> 'f)
199
+ (value: YAMLElement)
200
+ : 'a * 'b * 'c * 'd * 'e * 'f
201
+ =
202
+ match value with
203
+ | YAMLElement.Object [YAMLElement.Sequence [a; b; c; d; e; f]]
204
+ | YAMLElement.Sequence [a; b; c; d; e; f] ->
205
+ (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f)
206
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple6" anyElse
207
+
208
+ let tuple7
209
+ (decoderA: YAMLElement -> 'a)
210
+ (decoderB: YAMLElement -> 'b)
211
+ (decoderC: YAMLElement -> 'c)
212
+ (decoderD: YAMLElement -> 'd)
213
+ (decoderE: YAMLElement -> 'e)
214
+ (decoderF: YAMLElement -> 'f)
215
+ (decoderG: YAMLElement -> 'g)
216
+ (value: YAMLElement)
217
+ : 'a * 'b * 'c * 'd * 'e * 'f * 'g
218
+ =
219
+ match value with
220
+ | YAMLElement.Object [YAMLElement.Sequence [a; b; c; d; e; f; g]]
221
+ | YAMLElement.Sequence [a; b; c; d; e; f; g] ->
222
+ (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f, decoderG g)
223
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple7" anyElse
224
+
225
+ let tuple8
226
+ (decoderA: YAMLElement -> 'a)
227
+ (decoderB: YAMLElement -> 'b)
228
+ (decoderC: YAMLElement -> 'c)
229
+ (decoderD: YAMLElement -> 'd)
230
+ (decoderE: YAMLElement -> 'e)
231
+ (decoderF: YAMLElement -> 'f)
232
+ (decoderG: YAMLElement -> 'g)
233
+ (decoderH: YAMLElement -> 'h)
234
+ (value: YAMLElement)
235
+ : 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h
236
+ =
237
+ match value with
238
+ | YAMLElement.Object [YAMLElement.Sequence [a; b; c; d; e; f; g; h]]
239
+ | YAMLElement.Sequence [a; b; c; d; e; f; g; h] ->
240
+ (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f, decoderG g, decoderH h)
241
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple8" anyElse
242
+
243
+ let list (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a list =
244
+ match value with
245
+ | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] ->
246
+ v |> List.map decoder
247
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a list" anyElse
248
+
249
+ let array (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a [] =
250
+ match value with
251
+ | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] ->
252
+ v |> List.map decoder |> List.toArray
253
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected an array" anyElse
254
+
255
+ let seq (decoder: YAMLElement -> 'a) (value: YAMLElement) : seq<'a> =
256
+ match value with
257
+ | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] ->
258
+ v |> Seq.map decoder
259
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a seq" anyElse
260
+
261
+ let resizearray (decoder: YAMLElement -> 'a) (value: YAMLElement) : ResizeArray<'a> =
262
+ match value with
263
+ | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] ->
264
+ v |> List.map decoder |> ResizeArray
265
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a resizearray" anyElse
266
+
267
+ let values (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a list =
268
+ match value with
269
+ | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] | YAMLElement.Object v ->
270
+ v
271
+ |> List.map (function
272
+ | YAMLElement.Value _ as v -> decoder v
273
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a values" anyElse
274
+ )
275
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected a values" anyElse
276
+
277
+ module ObjectHelper =
278
+
279
+ type IRequiredGetter =
280
+ abstract Field: string -> (YAMLElement -> 'a) -> 'a
281
+ //abstract At: List<string> -> Decoder<'a> -> 'a
282
+ //abstract Raw: Decoder<'a> -> 'a
283
+
284
+ type IOptionalGetter =
285
+ abstract Field: string -> (YAMLElement -> 'a) -> 'a option
286
+ //abstract At: List<string> -> Decoder<'a> -> 'a option
287
+ //abstract Raw: Decoder<'a> -> 'a option
288
+
289
+ type IOverflowGetter =
290
+ abstract FieldList: string list -> Dictionary<string, YAMLElement>
291
+
292
+
293
+ open ObjectHelper
294
+
295
+ type IGetters =
296
+ abstract Required: IRequiredGetter
297
+ abstract Optional: IOptionalGetter
298
+ abstract Overflow: IOverflowGetter
299
+
300
+ type Getter(ele: YAMLElement) =
301
+ let required =
302
+ { new IRequiredGetter with
303
+ member _.Field fieldName dec =
304
+ match ele with
305
+ | YAMLElement.Object v ->
306
+ //printfn "[GETTER] IsObject"
307
+ v
308
+ |> List.tryFind (function
309
+ | YAMLElement.Mapping (k, _) ->
310
+ //printfn "[GETTER] IsMapping"
311
+ let equals = k.Value = fieldName
312
+ //printfn "[GETTER] Equals: %A" equals
313
+ equals
314
+ | _ -> false
315
+ )
316
+ |> Option.map (function
317
+ | YAMLElement.Mapping (_, v) ->
318
+ //printfn "[GETTER] Mapping: %A" v
319
+ dec v
320
+ | _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele
321
+ )
322
+ |> fun x ->
323
+ if x .IsNone then
324
+ Helper.raiseInvalidArg "value" (sprintf "Field not found: %s" fieldName) ele
325
+ else x.Value
326
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse
327
+ }
328
+ let optional =
329
+ { new IOptionalGetter with
330
+ member this.Field (fieldName: string) (dec: YAMLElement -> 'a) =
331
+ match ele with
332
+ | YAMLElement.Object v ->
333
+ v
334
+ |> List.tryFind (function
335
+ | YAMLElement.Mapping (k, _) -> k.Value = fieldName
336
+ | _ -> false
337
+ )
338
+ |> Option.map (function
339
+ | YAMLElement.Mapping (_, v) -> dec v
340
+ | _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele
341
+ )
342
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse
343
+ }
344
+ let overflow =
345
+ { new IOverflowGetter with
346
+ member this.FieldList (fieldNames: string list) =
347
+ match ele with
348
+ | YAMLElement.Object v ->
349
+ let overflow =
350
+ v
351
+ |> List.filter (function
352
+ | YAMLElement.Mapping (k, _) -> fieldNames |> List.exists (fun x -> x = k.Value)
353
+ | _ -> false
354
+ )
355
+ |> List.map (function
356
+ | YAMLElement.Mapping (k, v) -> (k.Value, v)
357
+ | _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele
358
+ )
359
+ let dict = new Dictionary<string, YAMLElement>()
360
+ overflow |> List.iter (fun (k, v) -> dict.Add(k, v))
361
+ dict
362
+ | anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse
363
+ }
364
+ interface IGetters with
365
+ member __.Required = required
366
+ member __.Optional = optional
367
+ member __.Overflow = overflow
368
+
369
+ let object (getter: IGetters -> 'a) (value: YAMLElement) : 'a =
370
+ let getterObj = Getter(value) :> IGetters
371
+ getter getterObj
372
+
373
+ let read (yaml: string) =
374
+ Reader.read yaml