@nfdi4plants/arctrl 2.1.0-alpha.3 → 2.2.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.
- package/CWL/CWLTypes.js +135 -0
- package/CWL/Decode.js +585 -0
- package/CWL/Inputs.js +62 -0
- package/CWL/Outputs.js +59 -0
- package/CWL/Requirements.js +72 -0
- package/CWL/ToolDescription.js +81 -0
- package/CWL/WorkflowDescription.js +81 -0
- package/CWL/WorkflowSteps.js +98 -0
- package/Core/ArcTypes.js +76 -87
- package/Core/Helper/Identifier.js +2 -2
- package/Core/OntologyAnnotation.js +8 -5
- package/Core/Table/ArcTable.js +15 -7
- package/Core/Table/CompositeHeader.js +4 -0
- package/Core/Template.js +8 -0
- package/Json/{ROCrateObject.js → LDObject.js} +66 -17
- package/JsonIO/LDObject.js +31 -0
- package/ROCrate/ArcROCrateMetadata.js +35 -0
- package/ROCrate/ISAProfile/Assay.js +30 -2
- package/ROCrate/ISAProfile/Data.js +32 -5
- package/ROCrate/ISAProfile/Dataset.js +3 -3
- package/ROCrate/ISAProfile/Investigation.js +30 -2
- package/ROCrate/ISAProfile/LabProcess.js +113 -5
- package/ROCrate/ISAProfile/LabProtocol.js +4 -4
- package/ROCrate/ISAProfile/Person.js +32 -5
- package/ROCrate/ISAProfile/PropertyValue.js +59 -5
- package/ROCrate/ISAProfile/Sample.js +32 -5
- package/ROCrate/ISAProfile/ScholarlyArticle.js +59 -5
- package/ROCrate/ISAProfile/Study.js +30 -2
- package/ROCrate/LDObject.js +105 -0
- package/Spreadsheet/AnnotationTable/ArcTable.js +8 -5
- package/Spreadsheet/Template.js +29 -11
- package/Yaml/ValidationPackage.js +6 -6
- package/Yaml/ValidationPackagesConfig.js +6 -6
- package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/DynObj.fs +4 -4
- package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/DynObj.fs.js +0 -44
- package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/HashCodes.fs +4 -1
- package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/HashCodes.fs.js +8 -3
- package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/obj/Debug/netstandard2.0/DynamicObj.AssemblyInfo.fs +1 -1
- package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/obj/Release/netstandard2.0/DynamicObj.AssemblyInfo.fs +3 -3
- package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Decode.fs +398 -373
- package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Decode.fs.js +35 -2
- package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/obj/Debug/netstandard2.0/YAMLicious.AssemblyInfo.fs +1 -1
- package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/obj/Release/netstandard2.0/YAMLicious.AssemblyInfo.fs +1 -1
- package/fable_modules/project_cracked.json +1 -1
- package/package.json +1 -1
- package/JsonIO/ROCrateObject.js +0 -146
- package/ROCrate/ROCrateObject.js +0 -61
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/DynamicObj.fableproj +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/DynamicObj.fs +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/DynamicObj.fs.js +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/FableJS.fs +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/FableJS.fs.js +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/FablePy.fs +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/PropertyHelper.fs +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/PropertyHelper.fs.js +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/ReflectionUtils.fs +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/ReflectionUtils.fs.js +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +0 -0
- /package/fable_modules/{DynamicObj.4.0.0 → DynamicObj.4.0.3}/obj/Release/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Encode.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Encode.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Interop/JsInterop.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Interop/JsInterop.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Interop/PyInterop.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Library.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Library.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Persil.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Persil.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Preprocessing.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Preprocessing.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Reader.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Reader.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Regex.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Regex.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/RegexActivePatterns.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/RegexActivePatterns.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Writer.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/Writer.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/YAMLicious.fableproj +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/YAMLiciousTypes.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/YAMLiciousTypes.fs.js +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +0 -0
- /package/fable_modules/{YAMLicious.0.0.1 → YAMLicious.0.0.3}/obj/Release/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +0 -0
|
@@ -1,374 +1,399 @@
|
|
|
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
|
|
290
|
-
abstract FieldList: string list -> Dictionary<string, YAMLElement>
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|>
|
|
339
|
-
| YAMLElement.Mapping (
|
|
340
|
-
| _ ->
|
|
341
|
-
)
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|> List.
|
|
356
|
-
| YAMLElement.Mapping (k,
|
|
357
|
-
| _ ->
|
|
358
|
-
)
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
let
|
|
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 IMultipleOptionalGetter =
|
|
290
|
+
abstract FieldList: string list -> Dictionary<string, YAMLElement>
|
|
291
|
+
|
|
292
|
+
type IOverflowGetter =
|
|
293
|
+
abstract FieldList: string list -> Dictionary<string, YAMLElement>
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
open ObjectHelper
|
|
297
|
+
|
|
298
|
+
type IGetters =
|
|
299
|
+
abstract Required: IRequiredGetter
|
|
300
|
+
abstract Optional: IOptionalGetter
|
|
301
|
+
abstract MultipleOptional: IMultipleOptionalGetter
|
|
302
|
+
abstract Overflow: IOverflowGetter
|
|
303
|
+
|
|
304
|
+
type Getter(ele: YAMLElement) =
|
|
305
|
+
let required =
|
|
306
|
+
{ new IRequiredGetter with
|
|
307
|
+
member _.Field fieldName dec =
|
|
308
|
+
match ele with
|
|
309
|
+
| YAMLElement.Object v ->
|
|
310
|
+
//printfn "[GETTER] IsObject"
|
|
311
|
+
v
|
|
312
|
+
|> List.tryFind (function
|
|
313
|
+
| YAMLElement.Mapping (k, _) ->
|
|
314
|
+
//printfn "[GETTER] IsMapping"
|
|
315
|
+
let equals = k.Value = fieldName
|
|
316
|
+
//printfn "[GETTER] Equals: %A" equals
|
|
317
|
+
equals
|
|
318
|
+
| _ -> false
|
|
319
|
+
)
|
|
320
|
+
|> Option.map (function
|
|
321
|
+
| YAMLElement.Mapping (_, v) ->
|
|
322
|
+
//printfn "[GETTER] Mapping: %A" v
|
|
323
|
+
dec v
|
|
324
|
+
| _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele
|
|
325
|
+
)
|
|
326
|
+
|> fun x ->
|
|
327
|
+
if x .IsNone then
|
|
328
|
+
Helper.raiseInvalidArg "value" (sprintf "Field not found: %s" fieldName) ele
|
|
329
|
+
else x.Value
|
|
330
|
+
| anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse
|
|
331
|
+
}
|
|
332
|
+
let optional =
|
|
333
|
+
{ new IOptionalGetter with
|
|
334
|
+
member this.Field (fieldName: string) (dec: YAMLElement -> 'a) =
|
|
335
|
+
match ele with
|
|
336
|
+
| YAMLElement.Object v ->
|
|
337
|
+
v
|
|
338
|
+
|> List.tryFind (function
|
|
339
|
+
| YAMLElement.Mapping (k, _) -> k.Value = fieldName
|
|
340
|
+
| _ -> false
|
|
341
|
+
)
|
|
342
|
+
|> Option.map (function
|
|
343
|
+
| YAMLElement.Mapping (_, v) -> dec v
|
|
344
|
+
| _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele
|
|
345
|
+
)
|
|
346
|
+
| anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse
|
|
347
|
+
}
|
|
348
|
+
let multipleOptional =
|
|
349
|
+
{ new IMultipleOptionalGetter with
|
|
350
|
+
member this.FieldList (fieldNames: string list) =
|
|
351
|
+
match ele with
|
|
352
|
+
| YAMLElement.Object v ->
|
|
353
|
+
let overflow =
|
|
354
|
+
v
|
|
355
|
+
|> List.filter (function
|
|
356
|
+
| YAMLElement.Mapping (k, _) -> fieldNames |> List.exists (fun x -> x = k.Value)
|
|
357
|
+
| _ -> false
|
|
358
|
+
)
|
|
359
|
+
|> List.map (function
|
|
360
|
+
| YAMLElement.Mapping (k, v) -> (k.Value, v)
|
|
361
|
+
| _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele
|
|
362
|
+
)
|
|
363
|
+
let dict = new Dictionary<string, YAMLElement>()
|
|
364
|
+
overflow |> List.iter (fun (k, v) -> dict.Add(k, v))
|
|
365
|
+
dict
|
|
366
|
+
| anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse
|
|
367
|
+
}
|
|
368
|
+
let overflow =
|
|
369
|
+
{ new IOverflowGetter with
|
|
370
|
+
member this.FieldList (fieldNames: string list) =
|
|
371
|
+
match ele with
|
|
372
|
+
| YAMLElement.Object v ->
|
|
373
|
+
let overflow =
|
|
374
|
+
v
|
|
375
|
+
|> List.filter (function
|
|
376
|
+
| YAMLElement.Mapping (k, _) -> fieldNames |> List.exists (fun x -> x = k.Value) |> not
|
|
377
|
+
| _ -> false
|
|
378
|
+
)
|
|
379
|
+
|> List.map (function
|
|
380
|
+
| YAMLElement.Mapping (k, v) -> (k.Value, v)
|
|
381
|
+
| _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele
|
|
382
|
+
)
|
|
383
|
+
let dict = new Dictionary<string, YAMLElement>()
|
|
384
|
+
overflow |> List.iter (fun (k, v) -> dict.Add(k, v))
|
|
385
|
+
dict
|
|
386
|
+
| anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse
|
|
387
|
+
}
|
|
388
|
+
interface IGetters with
|
|
389
|
+
member __.Required = required
|
|
390
|
+
member __.Optional = optional
|
|
391
|
+
member __.MultipleOptional = multipleOptional
|
|
392
|
+
member __.Overflow = overflow
|
|
393
|
+
|
|
394
|
+
let object (getter: IGetters -> 'a) (value: YAMLElement) : 'a =
|
|
395
|
+
let getterObj = Getter(value) :> IGetters
|
|
396
|
+
getter getterObj
|
|
397
|
+
|
|
398
|
+
let read (yaml: string) =
|
|
374
399
|
Reader.read yaml
|