@nfdi4plants/arctrl 1.0.7 → 1.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.
Files changed (335) hide show
  1. package/ARC.js +47 -11
  2. package/Contract/Contract.js +3 -3
  3. package/Contracts/Contracts.ArcTypes.js +30 -18
  4. package/Contracts/Contracts.Git.js +4 -4
  5. package/FileSystem/Commit.js +2 -2
  6. package/FileSystem/FileSystem.js +4 -4
  7. package/FileSystem/FileSystemTree.js +8 -8
  8. package/FileSystem/Path.js +2 -2
  9. package/FileSystemTree.js +1 -1
  10. package/ISA/ISA/ArcTypes/ArcTable.js +23 -31
  11. package/ISA/ISA/ArcTypes/ArcTableAux.js +27 -16
  12. package/ISA/ISA/ArcTypes/ArcTables.js +11 -11
  13. package/ISA/ISA/ArcTypes/ArcTypes.js +118 -83
  14. package/ISA/ISA/ArcTypes/CompositeCell.js +4 -4
  15. package/ISA/ISA/ArcTypes/CompositeColumn.js +8 -7
  16. package/ISA/ISA/ArcTypes/CompositeHeader.js +5 -5
  17. package/ISA/ISA/ArcTypes/CompositeRow.js +1 -1
  18. package/ISA/ISA/Builder/Types.js +5 -5
  19. package/ISA/ISA/Fable.js +6 -6
  20. package/ISA/ISA/Helper.js +15 -13
  21. package/ISA/ISA/Identifier.js +1 -1
  22. package/ISA/ISA/JsonTypes/Assay.js +8 -8
  23. package/ISA/ISA/JsonTypes/AssayMaterials.js +4 -4
  24. package/ISA/ISA/JsonTypes/ColumnIndex.js +5 -5
  25. package/ISA/ISA/JsonTypes/Comment.js +3 -3
  26. package/ISA/ISA/JsonTypes/CommentList.js +4 -4
  27. package/ISA/ISA/JsonTypes/Component.js +4 -4
  28. package/ISA/ISA/JsonTypes/Data.js +4 -4
  29. package/ISA/ISA/JsonTypes/DataFile.js +2 -2
  30. package/ISA/ISA/JsonTypes/Factor.js +6 -6
  31. package/ISA/ISA/JsonTypes/FactorValue.js +5 -5
  32. package/ISA/ISA/JsonTypes/Investigation.js +6 -6
  33. package/ISA/ISA/JsonTypes/Material.js +5 -5
  34. package/ISA/ISA/JsonTypes/MaterialAttribute.js +3 -3
  35. package/ISA/ISA/JsonTypes/MaterialAttributeValue.js +5 -5
  36. package/ISA/ISA/JsonTypes/MaterialType.js +2 -2
  37. package/ISA/ISA/JsonTypes/OntologyAnnotation.js +6 -6
  38. package/ISA/ISA/JsonTypes/OntologySourceReference.js +6 -6
  39. package/ISA/ISA/JsonTypes/Person.js +23 -8
  40. package/ISA/ISA/JsonTypes/Process.js +13 -13
  41. package/ISA/ISA/JsonTypes/ProcessInput.js +5 -5
  42. package/ISA/ISA/JsonTypes/ProcessOutput.js +5 -5
  43. package/ISA/ISA/JsonTypes/ProcessParameterValue.js +5 -5
  44. package/ISA/ISA/JsonTypes/ProcessSequence.js +6 -6
  45. package/ISA/ISA/JsonTypes/Protocol.js +6 -6
  46. package/ISA/ISA/JsonTypes/ProtocolParameter.js +3 -3
  47. package/ISA/ISA/JsonTypes/Publication.js +6 -6
  48. package/ISA/ISA/JsonTypes/Sample.js +5 -5
  49. package/ISA/ISA/JsonTypes/Source.js +5 -5
  50. package/ISA/ISA/JsonTypes/Study.js +8 -8
  51. package/ISA/ISA/JsonTypes/StudyMaterials.js +4 -4
  52. package/ISA/ISA/JsonTypes/Value.js +22 -29
  53. package/ISA/ISA/Regex.js +3 -3
  54. package/ISA/ISA.Json/ArcTypes/ArcAssay.js +157 -65
  55. package/ISA/ISA.Json/ArcTypes/ArcInvestigation.js +78 -49
  56. package/ISA/ISA.Json/ArcTypes/ArcStudy.js +136 -24
  57. package/ISA/ISA.Json/ArcTypes/ArcTable.js +183 -21
  58. package/ISA/ISA.Json/ArcTypes/CellTable.js +40 -0
  59. package/ISA/ISA.Json/ArcTypes/CompositeCell.js +34 -23
  60. package/ISA/ISA.Json/ArcTypes/CompositeHeader.js +18 -46
  61. package/ISA/ISA.Json/ArcTypes/IOType.js +11 -13
  62. package/ISA/ISA.Json/ArcTypes/OATable.js +42 -0
  63. package/ISA/ISA.Json/Assay.js +71 -47
  64. package/ISA/ISA.Json/Comment.js +31 -35
  65. package/ISA/ISA.Json/ConverterOptions.js +19 -1
  66. package/ISA/ISA.Json/Data.js +119 -137
  67. package/ISA/ISA.Json/Decode.js +51 -36
  68. package/ISA/ISA.Json/Factor.js +90 -90
  69. package/ISA/ISA.Json/GEncode.js +31 -6
  70. package/ISA/ISA.Json/Investigation.js +54 -79
  71. package/ISA/ISA.Json/Material.js +103 -104
  72. package/ISA/ISA.Json/Ontology.js +99 -92
  73. package/ISA/ISA.Json/Person.js +47 -65
  74. package/ISA/ISA.Json/Process.js +144 -130
  75. package/ISA/ISA.Json/Protocol.js +144 -105
  76. package/ISA/ISA.Json/Publication.js +34 -40
  77. package/ISA/ISA.Json/StringTable.js +44 -0
  78. package/ISA/ISA.Json/Study.js +70 -96
  79. package/ISA/ISA.Json/context/rocrate/isa_assay_context.js +34 -0
  80. package/ISA/ISA.Json/context/rocrate/isa_comment_context.js +23 -0
  81. package/ISA/ISA.Json/context/rocrate/isa_component_context.js +24 -0
  82. package/ISA/ISA.Json/context/rocrate/isa_data_context.js +25 -0
  83. package/ISA/ISA.Json/context/rocrate/isa_factor_context.js +25 -0
  84. package/ISA/ISA.Json/context/rocrate/isa_factor_value_context.js +25 -0
  85. package/ISA/ISA.Json/context/rocrate/isa_investigation_context.js +33 -0
  86. package/ISA/ISA.Json/context/rocrate/isa_material_attribute_context.js +23 -0
  87. package/ISA/ISA.Json/context/rocrate/isa_material_attribute_value_context.js +25 -0
  88. package/ISA/ISA.Json/context/rocrate/isa_material_context.js +26 -0
  89. package/ISA/ISA.Json/context/rocrate/isa_ontology_annotation_context.js +25 -0
  90. package/ISA/ISA.Json/context/rocrate/isa_ontology_source_reference_context.js +26 -0
  91. package/ISA/ISA.Json/context/rocrate/isa_organization_context.js +22 -0
  92. package/ISA/ISA.Json/context/rocrate/isa_person_context.js +31 -0
  93. package/ISA/ISA.Json/context/rocrate/isa_process_context.js +31 -0
  94. package/ISA/ISA.Json/context/rocrate/isa_process_parameter_value_context.js +25 -0
  95. package/ISA/ISA.Json/context/rocrate/isa_protocol_context.js +30 -0
  96. package/ISA/ISA.Json/context/rocrate/isa_protocol_parameter_context.js +23 -0
  97. package/ISA/ISA.Json/context/rocrate/isa_publication_context.js +27 -0
  98. package/ISA/ISA.Json/context/rocrate/isa_sample_context.js +26 -0
  99. package/ISA/ISA.Json/context/rocrate/isa_source_context.js +25 -0
  100. package/ISA/ISA.Json/context/rocrate/isa_study_context.js +42 -0
  101. package/ISA/ISA.Json/context/rocrate/rocrate_context.js +25 -0
  102. package/ISA/ISA.Spreadsheet/AnnotationTable/ArcTable.js +56 -43
  103. package/ISA/ISA.Spreadsheet/AnnotationTable/CompositeCell.js +3 -3
  104. package/ISA/ISA.Spreadsheet/AnnotationTable/CompositeColumn.js +11 -11
  105. package/ISA/ISA.Spreadsheet/AnnotationTable/CompositeHeader.js +5 -5
  106. package/ISA/ISA.Spreadsheet/ArcAssay.js +100 -88
  107. package/ISA/ISA.Spreadsheet/ArcInvestigation.js +12 -12
  108. package/ISA/ISA.Spreadsheet/ArcStudy.js +36 -24
  109. package/ISA/ISA.Spreadsheet/CollectionAux.js +8 -8
  110. package/ISA/ISA.Spreadsheet/Metadata/Assays.js +5 -5
  111. package/ISA/ISA.Spreadsheet/Metadata/Comment.js +31 -20
  112. package/ISA/ISA.Spreadsheet/Metadata/Contacts.js +5 -5
  113. package/ISA/ISA.Spreadsheet/Metadata/Conversions.js +5 -5
  114. package/ISA/ISA.Spreadsheet/Metadata/DesignDescriptors.js +1 -1
  115. package/ISA/ISA.Spreadsheet/Metadata/Factors.js +5 -5
  116. package/ISA/ISA.Spreadsheet/Metadata/OntologyAnnotation.js +5 -5
  117. package/ISA/ISA.Spreadsheet/Metadata/OntologySourceReference.js +5 -5
  118. package/ISA/ISA.Spreadsheet/Metadata/Protocols.js +5 -5
  119. package/ISA/ISA.Spreadsheet/Metadata/Publication.js +5 -5
  120. package/ISA/ISA.Spreadsheet/Metadata/SparseTable.js +28 -23
  121. package/ISA/ISA.Spreadsheet/Metadata/Study.js +8 -8
  122. package/README.md +20 -3
  123. package/SemVer.js +6 -6
  124. package/Templates/Template.Json.js +43 -36
  125. package/Templates/Template.Spreadsheet.js +12 -12
  126. package/Templates/Template.Web.js +4 -4
  127. package/Templates/Template.js +7 -7
  128. package/Templates/Templates.js +7 -7
  129. package/WebRequest/WebRequest.Node.js +15 -0
  130. package/WebRequest/WebRequest.js +10 -29
  131. package/fable_modules/Fable.Fetch.2.6.0/Fetch.fs.js +7 -7
  132. package/fable_modules/Fable.Promise.2.2.2/Promise.fs.js +3 -3
  133. package/fable_modules/Fable.SimpleHttp.3.5.0/Http.fs.js +8 -8
  134. package/fable_modules/Fable.SimpleHttp.3.5.0/Types.fs.js +2 -2
  135. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Cells/FsCell.fs.js +14 -14
  136. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Cells/FsCellsCollection.fs.js +6 -6
  137. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/CellBuilder.fs.js +4 -4
  138. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/ColumnBuilder.fs.js +3 -3
  139. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/DSL.fs.js +2 -2
  140. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Expression.fs.js +1 -1
  141. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/RowBuilder.fs.js +3 -3
  142. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/SheetBuilder.fs.js +3 -3
  143. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/TableBuilder.fs.js +3 -3
  144. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Transform.fs.js +6 -6
  145. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Types.fs.js +4 -4
  146. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/WorkbookBuilder.fs.js +3 -3
  147. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsAddress.fs +22 -8
  148. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsAddress.fs.js +24 -14
  149. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsColumn.fs.js +3 -3
  150. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsRow.fs.js +3 -3
  151. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsWorkbook.fs.js +6 -6
  152. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsWorksheet.fs +12 -6
  153. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsWorksheet.fs.js +21 -17
  154. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRange.fs.js +3 -3
  155. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeAddress.fs.js +4 -3
  156. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeBase.fs.js +3 -3
  157. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeColumn.fs.js +3 -3
  158. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeRow.fs.js +1 -1
  159. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/SheetBuilder.fs.js +8 -8
  160. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Tables/FsTable.fs.js +7 -7
  161. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Tables/FsTableField.fs.js +4 -4
  162. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Tables/FsTableRow.fs.js +1 -1
  163. package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/obj/Release/netstandard2.0/FsSpreadsheet.AssemblyInfo.fs +3 -3
  164. package/fable_modules/Thoth.Json.Core.0.2.1/Decode.fs +1390 -0
  165. package/fable_modules/Thoth.Json.Core.0.2.1/Decode.fs.js +1230 -0
  166. package/fable_modules/Thoth.Json.Core.0.2.1/Encode.fs +233 -0
  167. package/fable_modules/Thoth.Json.Core.0.2.1/Encode.fs.js +113 -0
  168. package/fable_modules/Thoth.Json.Core.0.2.1/Thoth.Json.Core.fableproj +28 -0
  169. package/fable_modules/Thoth.Json.Core.0.2.1/Types.fs +76 -0
  170. package/fable_modules/Thoth.Json.Core.0.2.1/Types.fs.js +33 -0
  171. package/fable_modules/Thoth.Json.Core.0.2.1/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +3 -0
  172. package/fable_modules/{Thoth.Json.10.1.0/obj/Release/netstandard2.0/Thoth.Json.AssemblyInfo.fs → Thoth.Json.Core.0.2.1/obj/Debug/netstandard2.0/Thoth.Json.Core.AssemblyInfo.fs} +8 -7
  173. package/fable_modules/Thoth.Json.JavaScript.0.1.0/Decode.fs +79 -0
  174. package/fable_modules/Thoth.Json.JavaScript.0.1.0/Decode.fs.js +85 -0
  175. package/fable_modules/Thoth.Json.JavaScript.0.1.0/Encode.fs +32 -0
  176. package/fable_modules/Thoth.Json.JavaScript.0.1.0/Encode.fs.js +45 -0
  177. package/fable_modules/Thoth.Json.JavaScript.0.1.0/Thoth.Json.JavaScript.fableproj +21 -0
  178. package/fable_modules/Thoth.Json.JavaScript.0.1.0/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +3 -0
  179. package/fable_modules/Thoth.Json.JavaScript.0.1.0/obj/Debug/netstandard2.0/Thoth.Json.JavaScript.AssemblyInfo.fs +18 -0
  180. package/fable_modules/Thoth.Json.JavaScript.0.1.0/obj/Release/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +3 -0
  181. package/fable_modules/Thoth.Json.JavaScript.0.1.0/obj/Release/netstandard2.0/Thoth.Json.JavaScript.AssemblyInfo.fs +19 -0
  182. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Array.d.ts +4 -1
  183. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Array.js +124 -86
  184. package/fable_modules/fable-library-js.4.13.0/CHANGELOG.md +29 -0
  185. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Choice.d.ts +0 -17
  186. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Choice.js +0 -43
  187. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Date.js +3 -2
  188. package/fable_modules/fable-library-js.4.13.0/FSharp.Core.CompilerServices.d.ts +12 -0
  189. package/fable_modules/fable-library-js.4.13.0/FSharp.Core.CompilerServices.js +27 -0
  190. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/List.js +3 -3
  191. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Map.js +3 -3
  192. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MutableMap.js +2 -1
  193. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MutableSet.js +2 -1
  194. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Random.js +7 -7
  195. package/fable_modules/fable-library-js.4.13.0/Result.d.ts +37 -0
  196. package/fable_modules/fable-library-js.4.13.0/Result.js +165 -0
  197. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Set.js +2 -2
  198. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/String.d.ts +1 -0
  199. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/String.js +8 -5
  200. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/System.Collections.Generic.d.ts +15 -7
  201. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/System.Collections.Generic.js +46 -36
  202. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/System.Text.d.ts +9 -1
  203. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/System.Text.js +60 -8
  204. package/fable_modules/fable-library-js.4.13.0/big.d.ts +338 -0
  205. package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/package.json +4 -3
  206. package/fable_modules/project_cracked.json +1 -1
  207. package/package.json +1 -1
  208. package/ISA/ISA.Json/Validation/Fable.js +0 -69
  209. package/ISA/ISA.Json/Validation/JsonSchemaValidation.js +0 -88
  210. package/ISA/ISA.Json/Validation/ValidationResult.js +0 -45
  211. package/fable_modules/Thoth.Json.10.1.0/Decode.fs +0 -1366
  212. package/fable_modules/Thoth.Json.10.1.0/Decode.fs.js +0 -1798
  213. package/fable_modules/Thoth.Json.10.1.0/Encode.fs +0 -621
  214. package/fable_modules/Thoth.Json.10.1.0/Encode.fs.js +0 -472
  215. package/fable_modules/Thoth.Json.10.1.0/Extra.fs +0 -31
  216. package/fable_modules/Thoth.Json.10.1.0/Extra.fs.js +0 -8
  217. package/fable_modules/Thoth.Json.10.1.0/Thoth.Json.fableproj +0 -30
  218. package/fable_modules/Thoth.Json.10.1.0/Types.fs +0 -59
  219. package/fable_modules/Thoth.Json.10.1.0/Types.fs.js +0 -98
  220. package/fable_modules/Thoth.Json.10.1.0/package.json +0 -5
  221. package/fable_modules/fable-library.4.5.0/CHANGELOG.md +0 -11
  222. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Cells/FsCell.fs +0 -0
  223. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Cells/FsCellsCollection.fs +0 -0
  224. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/CellBuilder.fs +0 -0
  225. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/ColumnBuilder.fs +0 -0
  226. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/DSL.fs +0 -0
  227. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Expression.fs +0 -0
  228. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Operators.fs +0 -0
  229. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Operators.fs.js +0 -0
  230. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/RowBuilder.fs +0 -0
  231. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/SheetBuilder.fs +0 -0
  232. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/TableBuilder.fs +0 -0
  233. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Transform.fs +0 -0
  234. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/Types.fs +0 -0
  235. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/DSL/WorkbookBuilder.fs +0 -0
  236. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsColumn.fs +0 -0
  237. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsRow.fs +0 -0
  238. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsSpreadsheet.fableproj +0 -0
  239. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/FsWorkbook.fs +0 -0
  240. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRange.fs +0 -0
  241. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeAddress.fs +0 -0
  242. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeBase.fs +0 -0
  243. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeColumn.fs +0 -0
  244. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Ranges/FsRangeRow.fs +0 -0
  245. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/SheetBuilder.fs +0 -0
  246. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Tables/FsTable.fs +0 -0
  247. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Tables/FsTableField.fs +0 -0
  248. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/Tables/FsTableRow.fs +0 -0
  249. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/obj/Debug/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +0 -0
  250. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/obj/Debug/netstandard2.0/FsSpreadsheet.AssemblyInfo.fs +0 -0
  251. /package/fable_modules/{FsSpreadsheet.5.1.2 → FsSpreadsheet.5.1.3}/obj/Release/netstandard2.0/.NETStandard,Version=v2.0.AssemblyAttributes.fs +0 -0
  252. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Async.d.ts +0 -0
  253. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Async.js +0 -0
  254. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/AsyncBuilder.d.ts +0 -0
  255. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/AsyncBuilder.js +0 -0
  256. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/BigInt.d.ts +0 -0
  257. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/BigInt.js +0 -0
  258. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/BitConverter.d.ts +0 -0
  259. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/BitConverter.js +0 -0
  260. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Boolean.d.ts +0 -0
  261. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Boolean.js +0 -0
  262. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Char.d.ts +0 -0
  263. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Char.js +0 -0
  264. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Date.d.ts +0 -0
  265. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/DateOffset.d.ts +0 -0
  266. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/DateOffset.js +0 -0
  267. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/DateOnly.d.ts +0 -0
  268. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/DateOnly.js +0 -0
  269. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Decimal.d.ts +0 -0
  270. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Decimal.js +0 -0
  271. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Double.d.ts +0 -0
  272. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Double.js +0 -0
  273. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Encoding.d.ts +0 -0
  274. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Encoding.js +0 -0
  275. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Event.d.ts +0 -0
  276. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Event.js +0 -0
  277. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/FSharp.Collections.d.ts +0 -0
  278. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/FSharp.Collections.js +0 -0
  279. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/FSharp.Core.d.ts +0 -0
  280. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/FSharp.Core.js +0 -0
  281. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Global.d.ts +0 -0
  282. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Global.js +0 -0
  283. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Guid.d.ts +0 -0
  284. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Guid.js +0 -0
  285. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Int32.d.ts +0 -0
  286. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Int32.js +0 -0
  287. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/List.d.ts +0 -0
  288. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Long.d.ts +0 -0
  289. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Long.js +0 -0
  290. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MailboxProcessor.d.ts +0 -0
  291. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MailboxProcessor.js +0 -0
  292. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Map.d.ts +0 -0
  293. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MapUtil.d.ts +0 -0
  294. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MapUtil.js +0 -0
  295. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MutableMap.d.ts +0 -0
  296. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/MutableSet.d.ts +0 -0
  297. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Native.d.ts +0 -0
  298. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Native.js +0 -0
  299. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Numeric.d.ts +0 -0
  300. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Numeric.js +0 -0
  301. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Observable.d.ts +0 -0
  302. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Observable.js +0 -0
  303. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Option.d.ts +0 -0
  304. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Option.js +0 -0
  305. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/README.md +0 -0
  306. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Random.d.ts +0 -0
  307. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Range.d.ts +0 -0
  308. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Range.js +0 -0
  309. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Reflection.d.ts +0 -0
  310. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Reflection.js +0 -0
  311. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/RegExp.d.ts +0 -0
  312. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/RegExp.js +0 -0
  313. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Seq.d.ts +0 -0
  314. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Seq.js +0 -0
  315. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Seq2.d.ts +0 -0
  316. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Seq2.js +0 -0
  317. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Set.d.ts +0 -0
  318. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/SystemException.d.ts +0 -0
  319. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/SystemException.js +0 -0
  320. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/TimeOnly.d.ts +0 -0
  321. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/TimeOnly.js +0 -0
  322. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/TimeSpan.d.ts +0 -0
  323. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/TimeSpan.js +0 -0
  324. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Timer.d.ts +0 -0
  325. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Timer.js +0 -0
  326. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Types.d.ts +0 -0
  327. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Types.js +0 -0
  328. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Unicode.13.0.0.d.ts +0 -0
  329. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Unicode.13.0.0.js +0 -0
  330. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Uri.d.ts +0 -0
  331. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Uri.js +0 -0
  332. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Util.d.ts +0 -0
  333. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/Util.js +0 -0
  334. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/lib/big.d.ts +0 -0
  335. /package/fable_modules/{fable-library.4.5.0 → fable-library-js.4.13.0}/lib/big.js +0 -0
@@ -0,0 +1,1390 @@
1
+ namespace Thoth.Json.Core
2
+
3
+ open Fable.Core
4
+ open System.Globalization
5
+
6
+ [<RequireQualifiedAccess>]
7
+ module Decode =
8
+
9
+ module Helpers =
10
+
11
+ let prependPath
12
+ (path: string)
13
+ (err: DecoderError<'JsonValue>)
14
+ : DecoderError<'JsonValue>
15
+ =
16
+ let (oldPath, reason) = err
17
+ (path + oldPath, reason)
18
+
19
+ let inline prependPathToResult<'T, 'JsonValue>
20
+ (path: string)
21
+ (res: Result<'T, DecoderError<'JsonValue>>)
22
+ =
23
+ res |> Result.mapError (prependPath path)
24
+
25
+ let private genericMsg
26
+ (helpers: IDecoderHelpers<'JsonValue>)
27
+ msg
28
+ value
29
+ newLine
30
+ =
31
+ try
32
+ "Expecting "
33
+ + msg
34
+ + " but instead got:"
35
+ + (if newLine then
36
+ "\n"
37
+ else
38
+ " ")
39
+ + (helpers.anyToString value)
40
+ with _ ->
41
+ "Expecting "
42
+ + msg
43
+ + " but decoder failed. Couldn't report given value due to circular structure."
44
+ + (if newLine then
45
+ "\n"
46
+ else
47
+ " ")
48
+
49
+ let rec errorToString
50
+ (helpers: IDecoderHelpers<'JsonValue>)
51
+ (path: string, error)
52
+ =
53
+ let reason =
54
+ match error with
55
+ | BadPrimitive(msg, value) -> genericMsg helpers msg value false
56
+ | BadType(msg, value) -> genericMsg helpers msg value true
57
+ | BadPrimitiveExtra(msg, value, reason) ->
58
+ genericMsg helpers msg value false + "\nReason: " + reason
59
+ | BadField(msg, value) -> genericMsg helpers msg value true
60
+ | BadPath(msg, value, fieldName) ->
61
+ genericMsg helpers msg value true
62
+ + ("\nNode `" + fieldName + "` is unkown.")
63
+ | TooSmallArray(msg, value) ->
64
+ "Expecting " + msg + ".\n" + (helpers.anyToString value)
65
+ | BadOneOf(errors) ->
66
+ let messages =
67
+ errors
68
+ |> List.map (fun error ->
69
+ Helpers.prependPath path error |> errorToString helpers
70
+ )
71
+
72
+ "The following errors were found:\n\n"
73
+ + String.concat "\n\n" messages
74
+ | FailMessage msg ->
75
+ "The following `failure` occurred with the decoder: " + msg
76
+
77
+ match error with
78
+ | BadOneOf _ ->
79
+ // Don't need to show the path here because each error case will show it's own path
80
+ reason
81
+ | _ -> "Error at: `" + path + "`\n" + reason
82
+
83
+ /// <summary>
84
+ /// Decode a JSON string into an F# string.
85
+ /// </summary>
86
+ ///
87
+ /// <example>
88
+ /// <code lang="fsharp">
89
+ /// Decode.fromString Decode.string "Hello" == Ok "Hello"
90
+ /// Decode.fromString Decode.string "42" == Error ...
91
+ /// Decode.fromString Decode.string "true" == Error ...
92
+ /// Decode.fromString Decode.string "{ \"foo\": 42 }" == Error ...
93
+ /// </code>
94
+ /// </example>
95
+ let string: Decoder<string> =
96
+ { new Decoder<string> with
97
+ member _.Decode(helpers, value) =
98
+ if helpers.isString value then
99
+ Ok(helpers.asString value)
100
+ else
101
+ Error("", BadPrimitive("a string", value))
102
+ }
103
+
104
+ /// <summary>
105
+ /// Decode a JSON string into an F# char.
106
+ /// </summary>
107
+ ///
108
+ /// <example>
109
+ /// <code lang="fsharp">
110
+ /// Decode.fromString Decode.char "a" == Ok 'a'
111
+ /// Decode.fromString Decode.char "ab" == Error ...
112
+ /// Decode.fromString Decode.char "true" == Error ...
113
+ /// Decode.fromString Decode.char "42" == Error ...
114
+ /// </code>
115
+ /// </example>
116
+ let char: Decoder<char> =
117
+ { new Decoder<char> with
118
+ member _.Decode(helpers, value) =
119
+ if helpers.isString value then
120
+ let str = helpers.asString value
121
+
122
+ if str.Length = 1 then
123
+ Ok(str.[0])
124
+ else
125
+ ("", BadPrimitive("a single character string", value))
126
+ |> Error
127
+ else
128
+ ("", BadPrimitive("a char", value)) |> Error
129
+ }
130
+
131
+ /// <summary>
132
+ /// Decode a JSON string into an F# Guid.
133
+ /// </summary>
134
+ ///
135
+ /// <example>
136
+ /// <code lang="fsharp">
137
+ /// Decode.fromString Decode.guid "58bd4436-7583-40e2-bd3c-aa3c5d0b4286" == Ok (System.Guid "58bd4436-7583-40e2-bd3c-aa3c5d0b4286")
138
+ /// Decode.fromString Decode.guid "58bd4436-aa3c5d0b4286" == Error ...
139
+ /// </code>
140
+ /// </example>
141
+ let guid: Decoder<System.Guid> =
142
+ { new Decoder<System.Guid> with
143
+ member _.Decode(helpers, value) =
144
+ if helpers.isString value then
145
+ match System.Guid.TryParse(helpers.asString value) with
146
+ | true, x -> Ok x
147
+ | _ -> ("", BadPrimitive("a guid", value)) |> Error
148
+ else
149
+ ("", BadPrimitive("a guid", value)) |> Error
150
+ }
151
+
152
+ /// <summary>
153
+ /// Decode a JSON null value into an F# unit.
154
+ /// </summary>
155
+ ///
156
+ /// <example>
157
+ /// <code lang="fsharp">
158
+ /// Decode.fromString Decode.unit "null" == Ok ()
159
+ /// Decode.fromString Decode.unit "42" == Error ...
160
+ /// </code>
161
+ /// </example>
162
+ let unit: Decoder<unit> =
163
+ { new Decoder<unit> with
164
+ member _.Decode(helpers, value) =
165
+ if helpers.isNullValue value then
166
+ Ok()
167
+ else
168
+ ("", BadPrimitive("null", value)) |> Error
169
+ }
170
+
171
+ let inline private integral
172
+ (name: string)
173
+ (tryParse: (string -> bool * 'T))
174
+ (min: unit -> 'T)
175
+ (max: unit -> 'T)
176
+ (conv: float -> 'T)
177
+ : Decoder<'T>
178
+ =
179
+
180
+ { new Decoder<'T> with
181
+ member _.Decode(helpers, value) =
182
+ if helpers.isNumber value then
183
+ if helpers.isIntegralValue value then
184
+ let floatValue: float = helpers.asFloat value
185
+
186
+ if
187
+ (float (min ())) <= floatValue
188
+ && floatValue <= (float (max ()))
189
+ then
190
+ Ok(conv floatValue)
191
+ else
192
+ ("",
193
+ BadPrimitiveExtra(
194
+ name,
195
+ value,
196
+ "Value was either too large or too small for "
197
+ + name
198
+ ))
199
+ |> Error
200
+ else
201
+ ("",
202
+ BadPrimitiveExtra(
203
+ name,
204
+ value,
205
+ "Value is not an integral value"
206
+ ))
207
+ |> Error
208
+ elif helpers.isString value then
209
+ match tryParse (helpers.asString value) with
210
+ | true, x -> Ok x
211
+ | _ -> ("", BadPrimitive(name, value)) |> Error
212
+ else
213
+ ("", BadPrimitive(name, value)) |> Error
214
+ }
215
+
216
+ let sbyte: Decoder<sbyte> =
217
+ integral
218
+ "a sbyte"
219
+ System.SByte.TryParse
220
+ (fun () -> System.SByte.MinValue)
221
+ (fun () -> System.SByte.MaxValue)
222
+ sbyte
223
+
224
+ /// Alias to Decode.uint8
225
+ let byte: Decoder<byte> =
226
+ integral
227
+ "a byte"
228
+ System.Byte.TryParse
229
+ (fun () -> System.Byte.MinValue)
230
+ (fun () -> System.Byte.MaxValue)
231
+ byte
232
+
233
+ let int16: Decoder<int16> =
234
+ integral
235
+ "an int16"
236
+ System.Int16.TryParse
237
+ (fun () -> System.Int16.MinValue)
238
+ (fun () -> System.Int16.MaxValue)
239
+ int16
240
+
241
+ let uint16: Decoder<uint16> =
242
+ integral
243
+ "an uint16"
244
+ System.UInt16.TryParse
245
+ (fun () -> System.UInt16.MinValue)
246
+ (fun () -> System.UInt16.MaxValue)
247
+ uint16
248
+
249
+ let int: Decoder<int> =
250
+ integral
251
+ "an int"
252
+ System.Int32.TryParse
253
+ (fun () -> System.Int32.MinValue)
254
+ (fun () -> System.Int32.MaxValue)
255
+ int
256
+
257
+ let uint32: Decoder<uint32> =
258
+ integral
259
+ "an uint32"
260
+ System.UInt32.TryParse
261
+ (fun () -> System.UInt32.MinValue)
262
+ (fun () -> System.UInt32.MaxValue)
263
+ uint32
264
+
265
+ let int64: Decoder<int64> =
266
+ integral
267
+ "an int64"
268
+ System.Int64.TryParse
269
+ (fun () -> System.Int64.MinValue)
270
+ (fun () -> System.Int64.MaxValue)
271
+ int64
272
+
273
+ let uint64: Decoder<uint64> =
274
+ integral
275
+ "an uint64"
276
+ System.UInt64.TryParse
277
+ (fun () -> System.UInt64.MinValue)
278
+ (fun () -> System.UInt64.MaxValue)
279
+ uint64
280
+
281
+ let bigint: Decoder<bigint> =
282
+ { new Decoder<bigint> with
283
+ member _.Decode(helpers, value) =
284
+ if helpers.isNumber value then
285
+ helpers.asInt value |> bigint |> Ok
286
+ elif helpers.isString value then
287
+ let parseResult =
288
+ #if FABLE_COMPILER
289
+ bigint.TryParse(helpers.asString value)
290
+ #else
291
+ bigint.TryParse(
292
+ helpers.asString value,
293
+ NumberStyles.Any,
294
+ CultureInfo.InvariantCulture
295
+ )
296
+ #endif
297
+
298
+ match parseResult with
299
+ | true, x -> Ok x
300
+ | _ -> ("", BadPrimitive("a bigint", value)) |> Error
301
+ else
302
+ ("", BadPrimitive("a bigint", value)) |> Error
303
+ }
304
+
305
+ let bool: Decoder<bool> =
306
+ { new Decoder<bool> with
307
+ member _.Decode(helpers, value) =
308
+ if helpers.isBoolean value then
309
+ Ok(helpers.asBoolean value)
310
+ else
311
+ ("", BadPrimitive("a boolean", value)) |> Error
312
+ }
313
+
314
+ let float: Decoder<float> =
315
+ { new Decoder<float> with
316
+ member _.Decode(helpers, value) =
317
+ if helpers.isNumber value then
318
+ Ok(helpers.asFloat value)
319
+ else
320
+ ("", BadPrimitive("a float", value)) |> Error
321
+ }
322
+
323
+
324
+ let float32: Decoder<float32> =
325
+ { new Decoder<float32> with
326
+ member _.Decode(helpers, value) =
327
+ if helpers.isNumber value then
328
+ Ok(helpers.asFloat32 value)
329
+ else
330
+ ("", BadPrimitive("a float32", value)) |> Error
331
+ }
332
+
333
+ let decimal: Decoder<decimal> =
334
+ { new Decoder<decimal> with
335
+ member _.Decode(helpers, value) =
336
+ if helpers.isNumber value then
337
+ helpers.asFloat value |> decimal |> Ok
338
+ elif helpers.isString value then
339
+ match System.Decimal.TryParse(helpers.asString value) with
340
+ | true, x -> Ok x
341
+ | _ -> ("", BadPrimitive("a decimal", value)) |> Error
342
+ else
343
+ ("", BadPrimitive("a decimal", value)) |> Error
344
+ }
345
+
346
+ #if !FABLE_COMPILER_PYTHON
347
+ /// Decode a System.DateTime value using Sytem.DateTime.TryParse, then convert it to UTC.
348
+ let datetimeUtc: Decoder<System.DateTime> =
349
+ { new Decoder<System.DateTime> with
350
+ member _.Decode(helpers, value) =
351
+ if helpers.isString value then
352
+ match System.DateTime.TryParse(helpers.asString value) with
353
+ | true, datetime -> datetime.ToUniversalTime() |> Ok
354
+ | _ -> ("", BadPrimitive("a datetime", value)) |> Error
355
+ else
356
+ ("", BadPrimitive("a datetime", value)) |> Error
357
+ }
358
+ #endif
359
+
360
+ /// Decode a System.DateTime with DateTime.TryParse; uses default System.DateTimeStyles.
361
+ let datetimeLocal: Decoder<System.DateTime> =
362
+ { new Decoder<System.DateTime> with
363
+ member _.Decode(helpers, value) =
364
+ if helpers.isString value then
365
+ match System.DateTime.TryParse(helpers.asString value) with
366
+ | true, datetime -> Ok datetime
367
+ | _ -> ("", BadPrimitive("a datetime", value)) |> Error
368
+ else
369
+ ("", BadPrimitive("a datetime", value)) |> Error
370
+ }
371
+
372
+ #if !FABLE_COMPILER_PYTHON
373
+ let datetimeOffset: Decoder<System.DateTimeOffset> =
374
+ { new Decoder<System.DateTimeOffset> with
375
+ member _.Decode(helpers, value) =
376
+ if helpers.isString value then
377
+ match
378
+ System.DateTimeOffset.TryParse(helpers.asString value)
379
+ with
380
+ | true, datetimeOffset -> Ok datetimeOffset
381
+ | _ ->
382
+ ("", BadPrimitive("a datetimeoffset", value)) |> Error
383
+ else
384
+ ("", BadPrimitive("a datetime", value)) |> Error
385
+ }
386
+ #endif
387
+
388
+ let timespan: Decoder<System.TimeSpan> =
389
+ { new Decoder<System.TimeSpan> with
390
+ member _.Decode(helpers, value) =
391
+ if helpers.isString value then
392
+ match System.TimeSpan.TryParse(helpers.asString value) with
393
+ | true, timespan -> Ok timespan
394
+ | _ -> ("", BadPrimitive("a timespan", value)) |> Error
395
+ else
396
+ ("", BadPrimitive("a timespan", value)) |> Error
397
+ }
398
+
399
+ /////////////////////////
400
+ // Object primitives ///
401
+ ///////////////////////
402
+
403
+ let private decodeMaybeNull
404
+ (helpers: IDecoderHelpers<'JsonValue>)
405
+ (path: string)
406
+ (decoder: Decoder<'value>)
407
+ (value: 'JsonValue)
408
+ =
409
+ // The decoder may be an option decoder so give it an opportunity to check null values
410
+
411
+ // We catch the null value case first to avoid executing the decoder logic
412
+ // Indeed, if the decoder logic try to access the value to do something with it,
413
+ // it can throw an exception about the value being null
414
+ if helpers.isNullValue value then
415
+ Ok None
416
+ else
417
+ match decoder.Decode(helpers, value) with
418
+ | Ok v -> Ok(Some v)
419
+ | Error er -> er |> Helpers.prependPath path |> Error
420
+
421
+ let optional
422
+ (fieldName: string)
423
+ (decoder: Decoder<'value>)
424
+ : Decoder<'value option>
425
+ =
426
+ { new Decoder<'value option> with
427
+ member _.Decode(helpers, value) =
428
+ if helpers.isObject value then
429
+
430
+ if helpers.hasProperty fieldName value then
431
+ let fieldValue = helpers.getProperty (fieldName, value)
432
+
433
+ decodeMaybeNull
434
+ helpers
435
+ ("." + fieldName)
436
+ decoder
437
+ fieldValue
438
+ else
439
+ Ok None
440
+ else
441
+ Error("", BadType("an object", value))
442
+ }
443
+
444
+ let private badPathError fieldNames currentPath value =
445
+ let currentPath =
446
+ defaultArg currentPath (fieldNames |> String.concat ".")
447
+
448
+ let msg = "an object with path `" + (String.concat "." fieldNames) + "`"
449
+
450
+ Error(
451
+ "." + currentPath,
452
+ BadPath(
453
+ msg,
454
+ value,
455
+ List.tryLast fieldNames |> Option.defaultValue ""
456
+ )
457
+ )
458
+
459
+ let map2
460
+ (ctor: 'a -> 'b -> 'Output)
461
+ (d1: Decoder<'a>)
462
+ (d2: Decoder<'b>)
463
+ : Decoder<'Output>
464
+ =
465
+ { new Decoder<'Output> with
466
+ member _.Decode(helpers, value) =
467
+ match d1.Decode(helpers, value), d2.Decode(helpers, value) with
468
+ | Ok v1, Ok v2 -> Ok(ctor v1 v2)
469
+ | Error er, _ -> Error er
470
+ | _, Error er -> Error er
471
+ }
472
+
473
+ // let custom =
474
+ // map2 (|>)
475
+
476
+ let optionalAt
477
+ (fieldNames: string list)
478
+ (decoder: Decoder<'value>)
479
+ : Decoder<'value option>
480
+ =
481
+ { new Decoder<'value option> with
482
+ member _.Decode(helpers, firstValue) =
483
+ (("", firstValue, None), fieldNames)
484
+ ||> List.fold (fun (curPath, curValue, res) field ->
485
+ match res with
486
+ | Some _ -> curPath, curValue, res
487
+ | None ->
488
+ if helpers.isNullValue curValue then
489
+ curPath, curValue, Some(Ok None)
490
+ elif helpers.isObject curValue then
491
+ if helpers.hasProperty field curValue then
492
+ let curValue =
493
+ helpers.getProperty (field, curValue)
494
+
495
+ curPath + "." + field, curValue, None
496
+ else
497
+ curPath, curValue, Some(Ok None)
498
+ else
499
+ let res =
500
+ Error(curPath, BadType("an object", curValue))
501
+
502
+ curPath, curValue, Some res
503
+ )
504
+ |> function
505
+ | _, _, Some res -> res
506
+ | lastPath, lastValue, None ->
507
+ if helpers.isNullValue lastValue then
508
+ Ok None
509
+ else
510
+ decodeMaybeNull helpers lastPath decoder lastValue
511
+ }
512
+
513
+ let field (fieldName: string) (decoder: Decoder<'value>) : Decoder<'value> =
514
+ { new Decoder<'value> with
515
+ member _.Decode(helpers, value) =
516
+ if helpers.isObject value then
517
+ if helpers.hasProperty fieldName value then
518
+ let fieldValue = helpers.getProperty (fieldName, value)
519
+
520
+ decoder.Decode(helpers, fieldValue)
521
+ |> Helpers.prependPathToResult ("." + fieldName)
522
+ else
523
+ Error(
524
+ "",
525
+ BadField(
526
+ "an object with a field named `"
527
+ + fieldName
528
+ + "`",
529
+ value
530
+ )
531
+ )
532
+ else
533
+ Error("", BadType("an object", value))
534
+ }
535
+
536
+ let at
537
+ (fieldNames: string list)
538
+ (decoder: Decoder<'value>)
539
+ : Decoder<'value>
540
+ =
541
+ { new Decoder<'value> with
542
+ member _.Decode(helpers, firstValue) =
543
+ (("", firstValue, None), fieldNames)
544
+ ||> List.fold (fun (curPath, curValue, res) field ->
545
+ match res with
546
+ | Some _ -> curPath, curValue, res
547
+ | None ->
548
+ if helpers.isNullValue curValue then
549
+ let res =
550
+ badPathError
551
+ fieldNames
552
+ (Some curPath)
553
+ firstValue
554
+
555
+ curPath, curValue, Some res
556
+ elif helpers.isObject curValue then
557
+ if helpers.hasProperty field curValue then
558
+ let curValue =
559
+ helpers.getProperty (field, curValue)
560
+
561
+ curPath + "." + field, curValue, None
562
+ else
563
+ let res =
564
+ badPathError fieldNames None firstValue
565
+
566
+ curPath, curValue, Some res
567
+ else
568
+ let res =
569
+ Error(curPath, BadType("an object", curValue))
570
+
571
+ curPath, curValue, Some res
572
+ )
573
+ |> function
574
+ | _, _, Some res -> res
575
+ | lastPath, lastValue, None ->
576
+ decoder.Decode(helpers, lastValue)
577
+ |> Helpers.prependPathToResult lastPath
578
+ }
579
+
580
+ let index
581
+ (requestedIndex: int)
582
+ (decoder: Decoder<'value>)
583
+ : Decoder<'value>
584
+ =
585
+ { new Decoder<'value> with
586
+ member _.Decode(helpers, value) =
587
+ if helpers.isArray value then
588
+ let vArray = helpers.asArray value
589
+
590
+ let path = ".[" + (Operators.string requestedIndex) + "]"
591
+
592
+ if requestedIndex < vArray.Length then
593
+ decoder.Decode(helpers, vArray.[requestedIndex])
594
+ |> Helpers.prependPathToResult path
595
+ else
596
+ let msg =
597
+ "a longer array. Need index `"
598
+ + (Operators.string requestedIndex)
599
+ + "` but there are only `"
600
+ + (Operators.string vArray.Length)
601
+ + "` entries"
602
+
603
+ (path, TooSmallArray(msg, value)) |> Error
604
+ else
605
+ ("", BadPrimitive("an array", value)) |> Error
606
+ }
607
+
608
+
609
+ let option (decoder: Decoder<'value>) : Decoder<'value option> =
610
+ { new Decoder<'value option> with
611
+ member _.Decode(helpers, value) =
612
+ if helpers.isNullValue value then
613
+ Ok None
614
+ else
615
+ decoder.Decode(helpers, value) |> Result.map Some
616
+ }
617
+
618
+ /// <summary>
619
+ /// Runs the decoder against the given JSON value.
620
+ ///
621
+ /// If the decoder fails, it reports the error prefixed with the given path.
622
+ ///
623
+ /// </summary>
624
+ /// <example>
625
+ /// <code lang="fsharp">
626
+ /// module Decode =
627
+ /// let fromRootValue (decoder : Decoder&lt;'T&gt;) =
628
+ /// Decode.fromValue "$" decoder
629
+ /// </code>
630
+ /// </example>
631
+ /// <param name="path">Path used to report the error</param>
632
+ /// <param name="decoder">Decoder to apply</param>
633
+ /// <param name="value">JSON value to decoder</param>
634
+ /// <returns>
635
+ /// Returns <c>Ok</c> if the decoder succeeds, otherwise <c>Error</c> with the error message.
636
+ /// </returns>
637
+ let fromValue
638
+ (helpers: IDecoderHelpers<'JsonValue>)
639
+ (decoder: Decoder<'T>)
640
+ =
641
+ fun value ->
642
+ match decoder.Decode(helpers, value) with
643
+ | Ok success -> Ok success
644
+ | Error error -> Error(errorToString helpers error)
645
+
646
+ //////////////////////
647
+ // Data structure ///
648
+ ////////////////////
649
+
650
+ let list (decoder: Decoder<'value>) : Decoder<'value list> =
651
+ { new Decoder<'value list> with
652
+ member _.Decode(helpers, value) =
653
+ if helpers.isArray value then
654
+ let tokens = helpers.asArray value
655
+ let mutable i = 0
656
+ let mutable result = []
657
+ let mutable error: DecoderError<_> option = None
658
+
659
+ while i < tokens.Length && error.IsNone do
660
+ let value = tokens.[i]
661
+
662
+ match decoder.Decode(helpers, value) with
663
+ | Ok value -> result <- result @ [ value ]
664
+ | Error er ->
665
+ let x =
666
+ Some(
667
+ er
668
+ |> Helpers.prependPath (
669
+ ".[" + (i.ToString()) + "]"
670
+ )
671
+ )
672
+
673
+ error <- x
674
+
675
+ i <- i + 1
676
+
677
+ if error.IsNone then
678
+ Ok result
679
+ else
680
+ Error error.Value
681
+ else
682
+ ("", BadPrimitive("a list", value)) |> Error
683
+ }
684
+
685
+
686
+ let seq (decoder: Decoder<'value>) : Decoder<'value seq> =
687
+ { new Decoder<'value seq> with
688
+ member _.Decode(helpers, value) =
689
+ if helpers.isArray value then
690
+ let mutable i = -1
691
+ let tokens = helpers.asArray value
692
+
693
+ (Ok(seq []), tokens)
694
+ ||> Array.fold (fun acc value ->
695
+ i <- i + 1
696
+
697
+ match acc with
698
+ | Error _ -> acc
699
+ | Ok acc ->
700
+ match decoder.Decode(helpers, value) with
701
+ | Error er ->
702
+ Error(
703
+ er
704
+ |> Helpers.prependPath (
705
+ ".[" + (i.ToString()) + "]"
706
+ )
707
+ )
708
+ | Ok value -> Ok(Seq.append [ value ] acc)
709
+ )
710
+ |> Result.map Seq.rev
711
+ else
712
+ ("", BadPrimitive("a seq", value)) |> Error
713
+ }
714
+
715
+ let array (decoder: Decoder<'value>) : Decoder<'value array> =
716
+ { new Decoder<'value array> with
717
+ member _.Decode(helpers, value) =
718
+ if helpers.isArray value then
719
+ let mutable i = -1
720
+ let tokens = helpers.asArray value
721
+ let arr = Array.zeroCreate tokens.Length
722
+
723
+ (Ok arr, tokens)
724
+ ||> Array.fold (fun acc value ->
725
+ i <- i + 1
726
+
727
+ match acc with
728
+ | Error _ -> acc
729
+ | Ok acc ->
730
+ match decoder.Decode(helpers, value) with
731
+ | Error er ->
732
+ Error(
733
+ er
734
+ |> Helpers.prependPath (
735
+ ".[" + (i.ToString()) + "]"
736
+ )
737
+ )
738
+ | Ok value ->
739
+ acc.[i] <- value
740
+ Ok acc
741
+ )
742
+ else
743
+ ("", BadPrimitive("an array", value)) |> Error
744
+ }
745
+
746
+
747
+ let keys: Decoder<string list> =
748
+ { new Decoder<string list> with
749
+ member _.Decode(helpers, value) =
750
+ if helpers.isObject value then
751
+ helpers.getProperties value |> List.ofSeq |> Ok
752
+ else
753
+ ("", BadPrimitive("an object", value)) |> Error
754
+ }
755
+
756
+
757
+ let keyValuePairs
758
+ (decoder: Decoder<'value>)
759
+ : Decoder<(string * 'value) list>
760
+ =
761
+ { new Decoder<(string * 'value) list> with
762
+ member _.Decode(helpers, value) =
763
+ match keys.Decode(helpers, value) with
764
+ | Ok objectKeys ->
765
+ (Ok [], objectKeys)
766
+ ||> List.fold (fun acc prop ->
767
+ match acc with
768
+ | Error _ -> acc
769
+ | Ok acc ->
770
+ let fieldValue = helpers.getProperty (prop, value)
771
+
772
+ match decoder.Decode(helpers, fieldValue) with
773
+ | Error er -> Error er
774
+ | Ok value -> (prop, value) :: acc |> Ok
775
+ )
776
+ |> Result.map List.rev
777
+ | Error e -> Error e
778
+ }
779
+
780
+ //////////////////////////////
781
+ // Inconsistent Structure ///
782
+ ////////////////////////////
783
+
784
+ let oneOf (decoders: Decoder<'value> list) : Decoder<'value> =
785
+ { new Decoder<'value> with
786
+ member _.Decode(helpers, value) =
787
+ let rec runner
788
+ (decoders: Decoder<'value> list)
789
+ (errors: DecoderError<'JsonValue> list)
790
+ =
791
+ match decoders with
792
+ | head :: tail ->
793
+ match head.Decode(helpers, value) with
794
+ | Ok v -> Ok v
795
+ | Error error ->
796
+ runner tail (List.append errors [ error ])
797
+ | [] -> ("", BadOneOf errors) |> Error
798
+
799
+ runner decoders []
800
+ }
801
+
802
+ //////////////////////
803
+ // Fancy decoding ///
804
+ ////////////////////
805
+
806
+ let nil (output: 'a) : Decoder<'a> =
807
+ { new Decoder<'a> with
808
+ member _.Decode(helpers, value) =
809
+ if helpers.isNullValue value then
810
+ Ok output
811
+ else
812
+ ("", BadPrimitive("null", value)) |> Error
813
+ }
814
+
815
+ let value _ v = Ok v
816
+
817
+ let succeed (output: 'a) : Decoder<'a> =
818
+ { new Decoder<'a> with
819
+ member _.Decode(_, _) = Ok output
820
+ }
821
+
822
+ let fail (msg: string) : Decoder<'a> =
823
+ { new Decoder<'a> with
824
+ member _.Decode(_, _) = Error("", FailMessage msg)
825
+ }
826
+
827
+ let andThen (cb: 'a -> Decoder<'b>) (decoder: Decoder<'a>) : Decoder<'b> =
828
+ { new Decoder<'b> with
829
+ member _.Decode(helpers, value) =
830
+ match decoder.Decode(helpers, value) with
831
+ | Error er -> Error er
832
+ | Ok result -> (cb result).Decode(helpers, value)
833
+ }
834
+
835
+ let all (decoders: Decoder<'a> list) : Decoder<'a list> =
836
+ { new Decoder<'a list> with
837
+ member _.Decode(helpers, value) =
838
+ let rec runner (decoders: Decoder<'a> list) (values: 'a list) =
839
+ match decoders with
840
+ | decoder :: tail ->
841
+ match decoder.Decode(helpers, value) with
842
+ | Ok value -> runner tail (List.append values [ value ])
843
+ | Error error -> Error error
844
+ | [] -> Ok values
845
+
846
+ runner decoders []
847
+ }
848
+
849
+ /////////////////////
850
+ // Map functions ///
851
+ ///////////////////
852
+
853
+ let map (ctor: 'a -> 'Output) (d1: Decoder<'a>) : Decoder<'Output> =
854
+ { new Decoder<'Output> with
855
+ member _.Decode(helpers, value) =
856
+ match d1.Decode(helpers, value) with
857
+ | Ok v1 -> Ok(ctor v1)
858
+ | Error er -> Error er
859
+ }
860
+
861
+ let map3
862
+ (ctor: 'a -> 'b -> 'c -> 'Output)
863
+ (d1: Decoder<'a>)
864
+ (d2: Decoder<'b>)
865
+ (d3: Decoder<'c>)
866
+ : Decoder<'Output>
867
+ =
868
+ { new Decoder<'Output> with
869
+ member _.Decode(helpers, value) =
870
+ match
871
+ d1.Decode(helpers, value),
872
+ d2.Decode(helpers, value),
873
+ d3.Decode(helpers, value)
874
+ with
875
+ | Ok v1, Ok v2, Ok v3 -> Ok(ctor v1 v2 v3)
876
+ | Error er, _, _ -> Error er
877
+ | _, Error er, _ -> Error er
878
+ | _, _, Error er -> Error er
879
+ }
880
+
881
+ let map4
882
+ (ctor: 'a -> 'b -> 'c -> 'd -> 'Output)
883
+ (d1: Decoder<'a>)
884
+ (d2: Decoder<'b>)
885
+ (d3: Decoder<'c>)
886
+ (d4: Decoder<'d>)
887
+ : Decoder<'Output>
888
+ =
889
+ { new Decoder<'Output> with
890
+ member _.Decode(helpers, value) =
891
+ match
892
+ d1.Decode(helpers, value),
893
+ d2.Decode(helpers, value),
894
+ d3.Decode(helpers, value),
895
+ d4.Decode(helpers, value)
896
+ with
897
+ | Ok v1, Ok v2, Ok v3, Ok v4 -> Ok(ctor v1 v2 v3 v4)
898
+ | Error er, _, _, _ -> Error er
899
+ | _, Error er, _, _ -> Error er
900
+ | _, _, Error er, _ -> Error er
901
+ | _, _, _, Error er -> Error er
902
+ }
903
+
904
+ let map5
905
+ (ctor: 'a -> 'b -> 'c -> 'd -> 'e -> 'Output)
906
+ (d1: Decoder<'a>)
907
+ (d2: Decoder<'b>)
908
+ (d3: Decoder<'c>)
909
+ (d4: Decoder<'d>)
910
+ (d5: Decoder<'e>)
911
+ : Decoder<'Output>
912
+ =
913
+ { new Decoder<'Output> with
914
+ member _.Decode(helpers, value) =
915
+ match
916
+ d1.Decode(helpers, value),
917
+ d2.Decode(helpers, value),
918
+ d3.Decode(helpers, value),
919
+ d4.Decode(helpers, value),
920
+ d5.Decode(helpers, value)
921
+ with
922
+ | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5 -> Ok(ctor v1 v2 v3 v4 v5)
923
+ | Error er, _, _, _, _ -> Error er
924
+ | _, Error er, _, _, _ -> Error er
925
+ | _, _, Error er, _, _ -> Error er
926
+ | _, _, _, Error er, _ -> Error er
927
+ | _, _, _, _, Error er -> Error er
928
+ }
929
+
930
+ let map6
931
+ (ctor: 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'Output)
932
+ (d1: Decoder<'a>)
933
+ (d2: Decoder<'b>)
934
+ (d3: Decoder<'c>)
935
+ (d4: Decoder<'d>)
936
+ (d5: Decoder<'e>)
937
+ (d6: Decoder<'f>)
938
+ : Decoder<'Output>
939
+ =
940
+ { new Decoder<'Output> with
941
+ member _.Decode(helpers, value) =
942
+ match
943
+ d1.Decode(helpers, value),
944
+ d2.Decode(helpers, value),
945
+ d3.Decode(helpers, value),
946
+ d4.Decode(helpers, value),
947
+ d5.Decode(helpers, value),
948
+ d6.Decode(helpers, value)
949
+ with
950
+ | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5, Ok v6 ->
951
+ Ok(ctor v1 v2 v3 v4 v5 v6)
952
+ | Error er, _, _, _, _, _ -> Error er
953
+ | _, Error er, _, _, _, _ -> Error er
954
+ | _, _, Error er, _, _, _ -> Error er
955
+ | _, _, _, Error er, _, _ -> Error er
956
+ | _, _, _, _, Error er, _ -> Error er
957
+ | _, _, _, _, _, Error er -> Error er
958
+ }
959
+
960
+ let map7
961
+ (ctor: 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'Output)
962
+ (d1: Decoder<'a>)
963
+ (d2: Decoder<'b>)
964
+ (d3: Decoder<'c>)
965
+ (d4: Decoder<'d>)
966
+ (d5: Decoder<'e>)
967
+ (d6: Decoder<'f>)
968
+ (d7: Decoder<'g>)
969
+ : Decoder<'Output>
970
+ =
971
+ { new Decoder<'Output> with
972
+ member _.Decode(helpers, value) =
973
+ match
974
+ d1.Decode(helpers, value),
975
+ d2.Decode(helpers, value),
976
+ d3.Decode(helpers, value),
977
+ d4.Decode(helpers, value),
978
+ d5.Decode(helpers, value),
979
+ d6.Decode(helpers, value),
980
+ d7.Decode(helpers, value)
981
+ with
982
+ | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5, Ok v6, Ok v7 ->
983
+ Ok(ctor v1 v2 v3 v4 v5 v6 v7)
984
+ | Error er, _, _, _, _, _, _ -> Error er
985
+ | _, Error er, _, _, _, _, _ -> Error er
986
+ | _, _, Error er, _, _, _, _ -> Error er
987
+ | _, _, _, Error er, _, _, _ -> Error er
988
+ | _, _, _, _, Error er, _, _ -> Error er
989
+ | _, _, _, _, _, Error er, _ -> Error er
990
+ | _, _, _, _, _, _, Error er -> Error er
991
+ }
992
+
993
+ let map8
994
+ (ctor: 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'h -> 'Output)
995
+ (d1: Decoder<'a>)
996
+ (d2: Decoder<'b>)
997
+ (d3: Decoder<'c>)
998
+ (d4: Decoder<'d>)
999
+ (d5: Decoder<'e>)
1000
+ (d6: Decoder<'f>)
1001
+ (d7: Decoder<'g>)
1002
+ (d8: Decoder<'h>)
1003
+ : Decoder<'Output>
1004
+ =
1005
+ { new Decoder<'Output> with
1006
+ member _.Decode(helpers, value) =
1007
+ match
1008
+ d1.Decode(helpers, value),
1009
+ d2.Decode(helpers, value),
1010
+ d3.Decode(helpers, value),
1011
+ d4.Decode(helpers, value),
1012
+ d5.Decode(helpers, value),
1013
+ d6.Decode(helpers, value),
1014
+ d7.Decode(helpers, value),
1015
+ d8.Decode(helpers, value)
1016
+ with
1017
+ | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5, Ok v6, Ok v7, Ok v8 ->
1018
+ Ok(ctor v1 v2 v3 v4 v5 v6 v7 v8)
1019
+ | Error er, _, _, _, _, _, _, _ -> Error er
1020
+ | _, Error er, _, _, _, _, _, _ -> Error er
1021
+ | _, _, Error er, _, _, _, _, _ -> Error er
1022
+ | _, _, _, Error er, _, _, _, _ -> Error er
1023
+ | _, _, _, _, Error er, _, _, _ -> Error er
1024
+ | _, _, _, _, _, Error er, _, _ -> Error er
1025
+ | _, _, _, _, _, _, Error er, _ -> Error er
1026
+ | _, _, _, _, _, _, _, Error er -> Error er
1027
+ }
1028
+
1029
+ //////////////////////
1030
+ // Object builder ///
1031
+ ////////////////////
1032
+
1033
+ /// <summary>
1034
+ /// Allow to incrementally apply a decoder, for building large objects.
1035
+ /// </summary>
1036
+ /// <example>
1037
+ /// <code lang="fsharp">
1038
+ /// type Point =
1039
+ /// {
1040
+ /// X : float
1041
+ /// Y : float
1042
+ /// }
1043
+ ///
1044
+ /// module Point =
1045
+ /// let create x y = { X = x; Y = y }
1046
+ ///
1047
+ /// let decode =
1048
+ /// Decode.succeed create
1049
+ /// |> Decode.andMap (Decode.field "x" Decode.float)
1050
+ /// |> Decode.andMap (Decode.field "y" Decode.float)
1051
+ /// </code>
1052
+ /// </example>
1053
+ let andMap<'a, 'b> : 'a Decoder -> ('a -> 'b) Decoder -> 'b Decoder =
1054
+ map2 (|>)
1055
+
1056
+ type IRequiredGetter =
1057
+ abstract Field: string -> Decoder<'a> -> 'a
1058
+ abstract At: List<string> -> Decoder<'a> -> 'a
1059
+ abstract Raw: Decoder<'a> -> 'a
1060
+
1061
+ type IOptionalGetter =
1062
+ abstract Field: string -> Decoder<'a> -> 'a option
1063
+ abstract At: List<string> -> Decoder<'a> -> 'a option
1064
+ abstract Raw: Decoder<'a> -> 'a option
1065
+
1066
+ type IGetters =
1067
+ abstract Required: IRequiredGetter
1068
+ abstract Optional: IOptionalGetter
1069
+
1070
+ let private unwrapWith
1071
+ (errors: ResizeArray<DecoderError<'JsonValue>>)
1072
+ (helpers: IDecoderHelpers<'JsonValue>)
1073
+ (decoder: Decoder<'T>)
1074
+ (value: 'JsonValue)
1075
+ : 'T
1076
+ =
1077
+ match decoder.Decode(helpers, value) with
1078
+ | Ok v -> v
1079
+ | Error er ->
1080
+ errors.Add(er)
1081
+ Unchecked.defaultof<'T>
1082
+
1083
+
1084
+ type Getters<'JsonValue, 'T>
1085
+ (helpers: IDecoderHelpers<'JsonValue>, value: 'JsonValue)
1086
+ =
1087
+ let mutable errors = ResizeArray<DecoderError<'JsonValue>>()
1088
+
1089
+ let required =
1090
+ { new IRequiredGetter with
1091
+ member __.Field (fieldName: string) (decoder: Decoder<_>) =
1092
+ unwrapWith errors helpers (field fieldName decoder) value
1093
+
1094
+ member __.At (fieldNames: string list) (decoder: Decoder<_>) =
1095
+ unwrapWith errors helpers (at fieldNames decoder) value
1096
+
1097
+ member __.Raw(decoder: Decoder<_>) =
1098
+ unwrapWith errors helpers decoder value
1099
+ }
1100
+
1101
+ let optional =
1102
+ { new IOptionalGetter with
1103
+ member __.Field (fieldName: string) (decoder: Decoder<_>) =
1104
+ unwrapWith errors helpers (optional fieldName decoder) value
1105
+
1106
+ member __.At (fieldNames: string list) (decoder: Decoder<_>) =
1107
+ unwrapWith
1108
+ errors
1109
+ helpers
1110
+ (optionalAt fieldNames decoder)
1111
+ value
1112
+
1113
+ member __.Raw(decoder: Decoder<_>) =
1114
+ match decoder.Decode(helpers, value) with
1115
+ | Ok v -> Some v
1116
+ | Error((_, reason) as error) ->
1117
+ match reason with
1118
+ | BadPrimitive(_, v)
1119
+ | BadPrimitiveExtra(_, v, _)
1120
+ | BadType(_, v) ->
1121
+ if helpers.isNullValue v then
1122
+ None
1123
+ else
1124
+ errors.Add(error)
1125
+ Unchecked.defaultof<_>
1126
+ | BadField _
1127
+ | BadPath _ -> None
1128
+ | TooSmallArray _
1129
+ | FailMessage _
1130
+ | BadOneOf _ ->
1131
+ errors.Add(error)
1132
+ Unchecked.defaultof<_>
1133
+ }
1134
+
1135
+ member __.Errors: _ list = Seq.toList errors
1136
+
1137
+ interface IGetters with
1138
+ member __.Required = required
1139
+ member __.Optional = optional
1140
+
1141
+ let object (builder: IGetters -> 'value) : Decoder<'value> =
1142
+ { new Decoder<'value> with
1143
+ member _.Decode(helpers, value) =
1144
+ let getters = Getters(helpers, value)
1145
+ let result = builder getters
1146
+
1147
+ match getters.Errors with
1148
+ | [] -> Ok result
1149
+ | fst :: _ as errors ->
1150
+ if errors.Length > 1 then
1151
+ ("", BadOneOf errors) |> Error
1152
+ else
1153
+ Error fst
1154
+ }
1155
+
1156
+ ///////////////////////
1157
+ // Tuples decoders ///
1158
+ ////////////////////
1159
+
1160
+ let tuple2
1161
+ (decoder1: Decoder<'T1>)
1162
+ (decoder2: Decoder<'T2>)
1163
+ : Decoder<'T1 * 'T2>
1164
+ =
1165
+ index 0 decoder1
1166
+ |> andThen (fun v1 ->
1167
+ index 1 decoder2 |> andThen (fun v2 -> succeed (v1, v2))
1168
+ )
1169
+
1170
+ let tuple3
1171
+ (decoder1: Decoder<'T1>)
1172
+ (decoder2: Decoder<'T2>)
1173
+ (decoder3: Decoder<'T3>)
1174
+ : Decoder<'T1 * 'T2 * 'T3>
1175
+ =
1176
+ index 0 decoder1
1177
+ |> andThen (fun v1 ->
1178
+ index 1 decoder2
1179
+ |> andThen (fun v2 ->
1180
+ index 2 decoder3 |> andThen (fun v3 -> succeed (v1, v2, v3))
1181
+ )
1182
+ )
1183
+
1184
+ let tuple4
1185
+ (decoder1: Decoder<'T1>)
1186
+ (decoder2: Decoder<'T2>)
1187
+ (decoder3: Decoder<'T3>)
1188
+ (decoder4: Decoder<'T4>)
1189
+ : Decoder<'T1 * 'T2 * 'T3 * 'T4>
1190
+ =
1191
+ index 0 decoder1
1192
+ |> andThen (fun v1 ->
1193
+ index 1 decoder2
1194
+ |> andThen (fun v2 ->
1195
+ index 2 decoder3
1196
+ |> andThen (fun v3 ->
1197
+ index 3 decoder4
1198
+ |> andThen (fun v4 -> succeed (v1, v2, v3, v4))
1199
+ )
1200
+ )
1201
+ )
1202
+
1203
+ let tuple5
1204
+ (decoder1: Decoder<'T1>)
1205
+ (decoder2: Decoder<'T2>)
1206
+ (decoder3: Decoder<'T3>)
1207
+ (decoder4: Decoder<'T4>)
1208
+ (decoder5: Decoder<'T5>)
1209
+ : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5>
1210
+ =
1211
+ index 0 decoder1
1212
+ |> andThen (fun v1 ->
1213
+ index 1 decoder2
1214
+ |> andThen (fun v2 ->
1215
+ index 2 decoder3
1216
+ |> andThen (fun v3 ->
1217
+ index 3 decoder4
1218
+ |> andThen (fun v4 ->
1219
+ index 4 decoder5
1220
+ |> andThen (fun v5 -> succeed (v1, v2, v3, v4, v5))
1221
+ )
1222
+ )
1223
+ )
1224
+ )
1225
+
1226
+ let tuple6
1227
+ (decoder1: Decoder<'T1>)
1228
+ (decoder2: Decoder<'T2>)
1229
+ (decoder3: Decoder<'T3>)
1230
+ (decoder4: Decoder<'T4>)
1231
+ (decoder5: Decoder<'T5>)
1232
+ (decoder6: Decoder<'T6>)
1233
+ : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5 * 'T6>
1234
+ =
1235
+ index 0 decoder1
1236
+ |> andThen (fun v1 ->
1237
+ index 1 decoder2
1238
+ |> andThen (fun v2 ->
1239
+ index 2 decoder3
1240
+ |> andThen (fun v3 ->
1241
+ index 3 decoder4
1242
+ |> andThen (fun v4 ->
1243
+ index 4 decoder5
1244
+ |> andThen (fun v5 ->
1245
+ index 5 decoder6
1246
+ |> andThen (fun v6 ->
1247
+ succeed (v1, v2, v3, v4, v5, v6)
1248
+ )
1249
+ )
1250
+ )
1251
+ )
1252
+ )
1253
+ )
1254
+
1255
+ let tuple7
1256
+ (decoder1: Decoder<'T1>)
1257
+ (decoder2: Decoder<'T2>)
1258
+ (decoder3: Decoder<'T3>)
1259
+ (decoder4: Decoder<'T4>)
1260
+ (decoder5: Decoder<'T5>)
1261
+ (decoder6: Decoder<'T6>)
1262
+ (decoder7: Decoder<'T7>)
1263
+ : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5 * 'T6 * 'T7>
1264
+ =
1265
+ index 0 decoder1
1266
+ |> andThen (fun v1 ->
1267
+ index 1 decoder2
1268
+ |> andThen (fun v2 ->
1269
+ index 2 decoder3
1270
+ |> andThen (fun v3 ->
1271
+ index 3 decoder4
1272
+ |> andThen (fun v4 ->
1273
+ index 4 decoder5
1274
+ |> andThen (fun v5 ->
1275
+ index 5 decoder6
1276
+ |> andThen (fun v6 ->
1277
+ index 6 decoder7
1278
+ |> andThen (fun v7 ->
1279
+ succeed (v1, v2, v3, v4, v5, v6, v7)
1280
+ )
1281
+ )
1282
+ )
1283
+ )
1284
+ )
1285
+ )
1286
+ )
1287
+
1288
+ let tuple8
1289
+ (decoder1: Decoder<'T1>)
1290
+ (decoder2: Decoder<'T2>)
1291
+ (decoder3: Decoder<'T3>)
1292
+ (decoder4: Decoder<'T4>)
1293
+ (decoder5: Decoder<'T5>)
1294
+ (decoder6: Decoder<'T6>)
1295
+ (decoder7: Decoder<'T7>)
1296
+ (decoder8: Decoder<'T8>)
1297
+ : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5 * 'T6 * 'T7 * 'T8>
1298
+ =
1299
+ index 0 decoder1
1300
+ |> andThen (fun v1 ->
1301
+ index 1 decoder2
1302
+ |> andThen (fun v2 ->
1303
+ index 2 decoder3
1304
+ |> andThen (fun v3 ->
1305
+ index 3 decoder4
1306
+ |> andThen (fun v4 ->
1307
+ index 4 decoder5
1308
+ |> andThen (fun v5 ->
1309
+ index 5 decoder6
1310
+ |> andThen (fun v6 ->
1311
+ index 6 decoder7
1312
+ |> andThen (fun v7 ->
1313
+ index 7 decoder8
1314
+ |> andThen (fun v8 ->
1315
+ succeed (
1316
+ v1,
1317
+ v2,
1318
+ v3,
1319
+ v4,
1320
+ v5,
1321
+ v6,
1322
+ v7,
1323
+ v8
1324
+ )
1325
+ )
1326
+ )
1327
+ )
1328
+ )
1329
+ )
1330
+ )
1331
+ )
1332
+ )
1333
+
1334
+ ///////////
1335
+ // Map ///
1336
+ /////////
1337
+
1338
+ let dict (decoder: Decoder<'value>) : Decoder<Map<string, 'value>> =
1339
+ map Map.ofList (keyValuePairs decoder)
1340
+
1341
+ let map'
1342
+ (keyDecoder: Decoder<'key>)
1343
+ (valueDecoder: Decoder<'value>)
1344
+ : Decoder<Map<'key, 'value>>
1345
+ =
1346
+ map Map.ofSeq (array (tuple2 keyDecoder valueDecoder))
1347
+
1348
+ ////////////
1349
+ // Enum ///
1350
+ /////////
1351
+
1352
+ #if !FABLE_REPL_LIB
1353
+ module Enum =
1354
+
1355
+ let inline byte<'TEnum when 'TEnum: enum<byte>> : Decoder<'TEnum> =
1356
+ byte
1357
+ |> andThen (fun value ->
1358
+ LanguagePrimitives.EnumOfValue<byte, 'TEnum> value |> succeed
1359
+ )
1360
+
1361
+ let inline sbyte<'TEnum when 'TEnum: enum<sbyte>> : Decoder<'TEnum> =
1362
+ sbyte
1363
+ |> andThen (fun value ->
1364
+ LanguagePrimitives.EnumOfValue<sbyte, 'TEnum> value |> succeed
1365
+ )
1366
+
1367
+ let inline int16<'TEnum when 'TEnum: enum<int16>> : Decoder<'TEnum> =
1368
+ int16
1369
+ |> andThen (fun value ->
1370
+ LanguagePrimitives.EnumOfValue<int16, 'TEnum> value |> succeed
1371
+ )
1372
+
1373
+ let inline uint16<'TEnum when 'TEnum: enum<uint16>> : Decoder<'TEnum> =
1374
+ uint16
1375
+ |> andThen (fun value ->
1376
+ LanguagePrimitives.EnumOfValue<uint16, 'TEnum> value |> succeed
1377
+ )
1378
+
1379
+ let inline int<'TEnum when 'TEnum: enum<int>> : Decoder<'TEnum> =
1380
+ int
1381
+ |> andThen (fun value ->
1382
+ LanguagePrimitives.EnumOfValue<int, 'TEnum> value |> succeed
1383
+ )
1384
+
1385
+ let inline uint32<'TEnum when 'TEnum: enum<uint32>> : Decoder<'TEnum> =
1386
+ uint32
1387
+ |> andThen (fun value ->
1388
+ LanguagePrimitives.EnumOfValue<uint32, 'TEnum> value |> succeed
1389
+ )
1390
+ #endif