From 91b1ef86abe7b0837a7610b73014b6d522766bf2 Mon Sep 17 00:00:00 2001 From: Caroline Ott Date: Sun, 16 Jun 2024 17:34:56 +0200 Subject: [PATCH] start adapting decode for js types :construction: --- src/YAMLicious/Decode.fs | 553 ++++++++++-------- src/YAMLicious/Regex.fs | 2 +- src/YAMLicious/YAMLicious.fsproj | 1 + .../YAMLicious.Tests/Tests.EncoderDecoder.fs | 37 +- 4 files changed, 317 insertions(+), 276 deletions(-) diff --git a/src/YAMLicious/Decode.fs b/src/YAMLicious/Decode.fs index ea329f8..06c1c1f 100644 --- a/src/YAMLicious/Decode.fs +++ b/src/YAMLicious/Decode.fs @@ -7,277 +7,312 @@ open System.Collections.Generic open YAMLicious open YAMLicious.YAMLiciousTypes +open Fable.Core.JsInterop +open Fable.Core.PyInterop +open Fable.Core -module Helper = - - let inline raiseInvalidArg (name: string) (message: string) wrongV = - invalidArg name (sprintf "%s: %A" message wrongV) - -let int (value: YAMLElement) : int = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> - match System.Int32.TryParse v.Value with - | true, int -> int - | false, _ -> Helper.raiseInvalidArg "value" "Expected an int" v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected an int" anyElse - -let float (value: YAMLElement) : float = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> - match System.Double.TryParse v.Value with - | true, float -> float - | false, _ -> Helper.raiseInvalidArg "value" "Expected a float" v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected a float" anyElse - -let char (value: YAMLElement) : char = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> - match System.Char.TryParse v.Value with - | true, _ -> v.Value.[0] - | _ -> Helper.raiseInvalidArg "value" "Expected a char" v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected a char" anyElse - -let bool (value: YAMLElement) : bool = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> - match System.Boolean.TryParse v.Value with - | true, bool -> bool - | false, _ -> Helper.raiseInvalidArg "value" "Expected a bool" v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected a bool" anyElse - -let map (keyDecoder: string -> 'a) (valueDecoder: YAMLElement -> 'b) (value: YAMLElement) : Map<'a, 'b> = - match value with - | YAMLElement.Object v -> - v |> List.map (fun x -> - match x with - | YAMLElement.Mapping (k, v) -> (keyDecoder k.Value, valueDecoder v) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a mapping" x - ) |> Map.ofList - | anyElse -> Helper.raiseInvalidArg "value" "Expected a map" anyElse - -let dict (keyDecoder: string -> 'a) (valueDecoder: YAMLElement -> 'b) (value: YAMLElement) : Dictionary<'a, 'b> = - match value with - | YAMLElement.Object v -> - v |> List.map (fun x -> - match x with - | YAMLElement.Mapping (k, v) -> (keyDecoder k.Value, valueDecoder v) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a mapping" anyElse - ) |> Map |> Dictionary - | anyElse -> Helper.raiseInvalidArg "value" "Expected a dictionary" anyElse - -let datetime (value: YAMLElement) : DateTime = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> - match System.DateTime.TryParse(v.Value) with - | true, dateTime -> dateTime - | false, _ -> Helper.raiseInvalidArg "value" "Expected a DateTime" v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected a DateTime" anyElse +[] +module Interop = -let datetimeOffset (value: YAMLElement) : DateTimeOffset = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> - match System.DateTimeOffset.TryParse(v.Value) with - | true, dateTimeOffset -> dateTimeOffset - | false, _ -> Helper.raiseInvalidArg "value" "Expected a DateTimeOffset" v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected a DateTimeOffset" anyElse + [] + type IExports = + abstract Number: obj -let option (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a option = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> - match v.Value with - | YAML_NULL -> None - | _ -> Some (decoder value) - | anyElse -> Helper.raiseInvalidArg "value" "Expected an option" anyElse + [] + let numbers: IExports = nativeOnly -let tuple2 (decoderA: YAMLElement -> 'a) (decoderB: YAMLElement -> 'b) (value: YAMLElement) : 'a * 'b = - match value with - | YAMLElement.Sequence [a; b] -> (decoderA a, decoderB b) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple2" anyElse + [] + let pyList: obj = nativeOnly -let tuple3 (decoderA: YAMLElement -> 'a) (decoderB: YAMLElement -> 'b) (decoderC: YAMLElement -> 'c) (value: YAMLElement) : 'a * 'b * 'c = - match value with - | YAMLElement.Sequence [a; b; c] -> (decoderA a, decoderB b, decoderC c) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple3" anyElse - -let tuple4 - (decoderA: YAMLElement -> 'a) - (decoderB: YAMLElement -> 'b) - (decoderC: YAMLElement -> 'c) - (decoderD: YAMLElement -> 'd) - (value: YAMLElement) - : 'a * 'b * 'c * 'd - = - match value with - | YAMLElement.Sequence [a; b; c; d] -> (decoderA a, decoderB b, decoderC c, decoderD d) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple4" anyElse - -let tuple5 - (decoderA: YAMLElement -> 'a) - (decoderB: YAMLElement -> 'b) - (decoderC: YAMLElement -> 'c) - (decoderD: YAMLElement -> 'd) - (decoderE: YAMLElement -> 'e) - (value: YAMLElement) - : 'a * 'b * 'c * 'd * 'e - = - match value with - | YAMLElement.Sequence [a; b; c; d; e] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple5" anyElse - -let tuple6 - (decoderA: YAMLElement -> 'a) - (decoderB: YAMLElement -> 'b) - (decoderC: YAMLElement -> 'c) - (decoderD: YAMLElement -> 'd) - (decoderE: YAMLElement -> 'e) - (decoderF: YAMLElement -> 'f) - (value: YAMLElement) - : 'a * 'b * 'c * 'd * 'e * 'f - = - match value with - | YAMLElement.Sequence [a; b; c; d; e; f] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple6" anyElse - -let tuple7 - (decoderA: YAMLElement -> 'a) - (decoderB: YAMLElement -> 'b) - (decoderC: YAMLElement -> 'c) - (decoderD: YAMLElement -> 'd) - (decoderE: YAMLElement -> 'e) - (decoderF: YAMLElement -> 'f) - (decoderG: YAMLElement -> 'g) - (value: YAMLElement) - : 'a * 'b * 'c * 'd * 'e * 'f * 'g - = - match value with - | YAMLElement.Sequence [a; b; c; d; e; f; g] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f, decoderG g) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple7" anyElse - -let tuple8 - (decoderA: YAMLElement -> 'a) - (decoderB: YAMLElement -> 'b) - (decoderC: YAMLElement -> 'c) - (decoderD: YAMLElement -> 'd) - (decoderE: YAMLElement -> 'e) - (decoderF: YAMLElement -> 'f) - (decoderG: YAMLElement -> 'g) - (decoderH: YAMLElement -> 'h) - (value: YAMLElement) - : 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h - = - match value with - | YAMLElement.Sequence [a; b; c; d; e; f; g; h] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f, decoderG g, decoderH h) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple8" anyElse + [] + let pyDict: obj = nativeOnly -let string (value: YAMLElement) : string = - match value with - | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected a string" anyElse + [] + let pyInt: obj = nativeOnly -let list (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a list = - match value with - | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> - v |> List.map decoder - | anyElse -> Helper.raiseInvalidArg "value" "Expected a list" anyElse + [] + let pyBool: obj = nativeOnly -let array (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a [] = - match value with - | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> - v |> List.map decoder |> List.toArray - | anyElse -> Helper.raiseInvalidArg "value" "Expected an array" anyElse +module Helper = -let seq (decoder: YAMLElement -> 'a) (value: YAMLElement) : seq<'a> = - match value with - | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> - v |> Seq.map decoder - | anyElse -> Helper.raiseInvalidArg "value" "Expected a seq" anyElse + let inline raiseInvalidArg (name: string) (message: string) wrongV = + invalidArg name (sprintf "%s: %A" message wrongV) -let resizearray (decoder: YAMLElement -> 'a) (value: YAMLElement) : ResizeArray<'a> = - match value with - | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> - v |> List.map decoder |> ResizeArray - | anyElse -> Helper.raiseInvalidArg "value" "Expected a resizearray" anyElse + let isInt (value: string) = + #if FABLE_COMPILER_JAVASCRIPT || FABLE_COMPILER_TYPESCRIPT + JsInterop.isInt value + #else + match System.Int32.TryParse value with + | true, _ -> true + | false, _ -> false + #endif -let values (decoder: string -> 'a) (value: YAMLElement) : 'a list = +open Helper +let int (value: YAMLElement) : int = match value with - | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> - v - |> List.map (function - | YAMLElement.Value v -> decoder v.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected a values" anyElse - ) - | anyElse -> Helper.raiseInvalidArg "value" "Expected a values" anyElse - -module ObjectHelper = - - type IRequiredGetter = - abstract Field: string -> (YAMLElement -> 'a) -> 'a - //abstract At: List -> Decoder<'a> -> 'a - //abstract Raw: Decoder<'a> -> 'a - - type IOptionalGetter = - abstract Field: string -> (YAMLElement -> 'a) -> 'a option - //abstract At: List -> Decoder<'a> -> 'a option - //abstract Raw: Decoder<'a> -> 'a option - - -open ObjectHelper - -type IGetters = - abstract Required: IRequiredGetter - abstract Optional: IOptionalGetter - -type Getter(ele: YAMLElement) = - let required = - { new IRequiredGetter with - member _.Field fieldName dec = - match ele with - | YAMLElement.Object v -> - //printfn "[GETTER] IsObject" - v - |> List.tryFind (function - | YAMLElement.Mapping (k, _) -> - //printfn "[GETTER] IsMapping" - let equals = k.Value = fieldName - //printfn "[GETTER] Equals: %A" equals - equals - | _ -> false - ) - |> Option.map (function - | YAMLElement.Mapping (_, v) -> - //printfn "[GETTER] Mapping: %A" v - dec v - | _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele - ) - |> fun x -> - if x .IsNone then - Helper.raiseInvalidArg "value" (sprintf "Field not found: %s" fieldName) ele - else x.Value - | anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse - } - let optional = - { new IOptionalGetter with - member this.Field (fieldName: string) (dec: YAMLElement -> 'a) = - match ele with - | YAMLElement.Object v -> - v - |> List.tryFind (function - | YAMLElement.Mapping (k, _) -> k.Value = fieldName - | _ -> false - ) - |> Option.map (function - | YAMLElement.Mapping (_, v) -> dec v - | _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele - ) - | anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse - } - interface IGetters with - member __.Required = required - member __.Optional = optional - -let object (getter: IGetters -> 'a) (value: YAMLElement) : 'a = - let getterObj = Getter(value) :> IGetters - getter getterObj + | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> + match isInt v.Value with + | true -> int v.Value + | false -> raiseInvalidArg "value" "Expected an int" v.Value + | _ -> raiseInvalidArg "value" "Expected an YAMLElement.Value" value + +//let float (value: YAMLElement) : float = +// match value with +// | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> +// match System.Double.TryParse v.Value with +// | true, float -> float +// | false, _ -> Helper.raiseInvalidArg "value" "Expected a float" v.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a float" anyElse + +//let char (value: YAMLElement) : char = +// match value with +// | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> +// match System.Char.TryParse v.Value with +// | true, _ -> v.Value.[0] +// | _ -> Helper.raiseInvalidArg "value" "Expected a char" v.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a char" anyElse + +//let bool (value: YAMLElement) : bool = +// match value with +// | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> +// match System.Boolean.TryParse v.Value with +// | true, bool -> bool +// | false, _ -> Helper.raiseInvalidArg "value" "Expected a bool" v.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a bool" anyElse + +//let map (keyDecoder: string -> 'a) (valueDecoder: YAMLElement -> 'b) (value: YAMLElement) : Map<'a, 'b> = +// match value with +// | YAMLElement.Object v -> +// v |> List.map (fun x -> +// match x with +// | YAMLElement.Mapping (k, v) -> (keyDecoder k.Value, valueDecoder v) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a mapping" x +// ) |> Map.ofList +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a map" anyElse + +//let dict (keyDecoder: string -> 'a) (valueDecoder: YAMLElement -> 'b) (value: YAMLElement) : Dictionary<'a, 'b> = +// match value with +// | YAMLElement.Object v -> +// v |> List.map (fun x -> +// match x with +// | YAMLElement.Mapping (k, v) -> (keyDecoder k.Value, valueDecoder v) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a mapping" anyElse +// ) |> Map |> Dictionary +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a dictionary" anyElse + +//let datetime (value: YAMLElement) : DateTime = +// match value with +// | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> +// match System.DateTime.TryParse(v.Value) with +// | true, dateTime -> dateTime +// | false, _ -> Helper.raiseInvalidArg "value" "Expected a DateTime" v.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a DateTime" anyElse + +//let datetimeOffset (value: YAMLElement) : DateTimeOffset = +// match value with +// | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> +// match System.DateTimeOffset.TryParse(v.Value) with +// | true, dateTimeOffset -> dateTimeOffset +// | false, _ -> Helper.raiseInvalidArg "value" "Expected a DateTimeOffset" v.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a DateTimeOffset" anyElse + +//let option (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a option = +// match value with +// | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> +// match v.Value with +// | YAML_NULL -> None +// | _ -> Some (decoder value) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected an option" anyElse + +//let tuple2 (decoderA: YAMLElement -> 'a) (decoderB: YAMLElement -> 'b) (value: YAMLElement) : 'a * 'b = +// match value with +// | YAMLElement.Sequence [a; b] -> (decoderA a, decoderB b) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple2" anyElse + +//let tuple3 (decoderA: YAMLElement -> 'a) (decoderB: YAMLElement -> 'b) (decoderC: YAMLElement -> 'c) (value: YAMLElement) : 'a * 'b * 'c = +// match value with +// | YAMLElement.Sequence [a; b; c] -> (decoderA a, decoderB b, decoderC c) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple3" anyElse + +//let tuple4 +// (decoderA: YAMLElement -> 'a) +// (decoderB: YAMLElement -> 'b) +// (decoderC: YAMLElement -> 'c) +// (decoderD: YAMLElement -> 'd) +// (value: YAMLElement) +// : 'a * 'b * 'c * 'd +// = +// match value with +// | YAMLElement.Sequence [a; b; c; d] -> (decoderA a, decoderB b, decoderC c, decoderD d) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple4" anyElse + +//let tuple5 +// (decoderA: YAMLElement -> 'a) +// (decoderB: YAMLElement -> 'b) +// (decoderC: YAMLElement -> 'c) +// (decoderD: YAMLElement -> 'd) +// (decoderE: YAMLElement -> 'e) +// (value: YAMLElement) +// : 'a * 'b * 'c * 'd * 'e +// = +// match value with +// | YAMLElement.Sequence [a; b; c; d; e] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple5" anyElse + +//let tuple6 +// (decoderA: YAMLElement -> 'a) +// (decoderB: YAMLElement -> 'b) +// (decoderC: YAMLElement -> 'c) +// (decoderD: YAMLElement -> 'd) +// (decoderE: YAMLElement -> 'e) +// (decoderF: YAMLElement -> 'f) +// (value: YAMLElement) +// : 'a * 'b * 'c * 'd * 'e * 'f +// = +// match value with +// | YAMLElement.Sequence [a; b; c; d; e; f] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple6" anyElse + +//let tuple7 +// (decoderA: YAMLElement -> 'a) +// (decoderB: YAMLElement -> 'b) +// (decoderC: YAMLElement -> 'c) +// (decoderD: YAMLElement -> 'd) +// (decoderE: YAMLElement -> 'e) +// (decoderF: YAMLElement -> 'f) +// (decoderG: YAMLElement -> 'g) +// (value: YAMLElement) +// : 'a * 'b * 'c * 'd * 'e * 'f * 'g +// = +// match value with +// | YAMLElement.Sequence [a; b; c; d; e; f; g] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f, decoderG g) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple7" anyElse + +//let tuple8 +// (decoderA: YAMLElement -> 'a) +// (decoderB: YAMLElement -> 'b) +// (decoderC: YAMLElement -> 'c) +// (decoderD: YAMLElement -> 'd) +// (decoderE: YAMLElement -> 'e) +// (decoderF: YAMLElement -> 'f) +// (decoderG: YAMLElement -> 'g) +// (decoderH: YAMLElement -> 'h) +// (value: YAMLElement) +// : 'a * 'b * 'c * 'd * 'e * 'f * 'g * 'h +// = +// match value with +// | YAMLElement.Sequence [a; b; c; d; e; f; g; h] -> (decoderA a, decoderB b, decoderC c, decoderD d, decoderE e, decoderF f, decoderG g, decoderH h) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a tuple8" anyElse + +//let string (value: YAMLElement) : string = +// match value with +// | YAMLElement.Value v | YAMLElement.Object [YAMLElement.Value v] -> v.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a string" anyElse + +//let list (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a list = +// match value with +// | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> +// v |> List.map decoder +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a list" anyElse + +//let array (decoder: YAMLElement -> 'a) (value: YAMLElement) : 'a [] = +// match value with +// | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> +// v |> List.map decoder |> List.toArray +// | anyElse -> Helper.raiseInvalidArg "value" "Expected an array" anyElse + +//let seq (decoder: YAMLElement -> 'a) (value: YAMLElement) : seq<'a> = +// match value with +// | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> +// v |> Seq.map decoder +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a seq" anyElse + +//let resizearray (decoder: YAMLElement -> 'a) (value: YAMLElement) : ResizeArray<'a> = +// match value with +// | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> +// v |> List.map decoder |> ResizeArray +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a resizearray" anyElse + +//let values (decoder: string -> 'a) (value: YAMLElement) : 'a list = +// match value with +// | YAMLElement.Sequence v | YAMLElement.Object [YAMLElement.Sequence v] -> +// v +// |> List.map (function +// | YAMLElement.Value v -> decoder v.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a values" anyElse +// ) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected a values" anyElse + +//module ObjectHelper = + +// type IRequiredGetter = +// abstract Field: string -> (YAMLElement -> 'a) -> 'a +// //abstract At: List -> Decoder<'a> -> 'a +// //abstract Raw: Decoder<'a> -> 'a + +// type IOptionalGetter = +// abstract Field: string -> (YAMLElement -> 'a) -> 'a option +// //abstract At: List -> Decoder<'a> -> 'a option +// //abstract Raw: Decoder<'a> -> 'a option + + +//open ObjectHelper + +//type IGetters = +// abstract Required: IRequiredGetter +// abstract Optional: IOptionalGetter + +//type Getter(ele: YAMLElement) = +// let required = +// { new IRequiredGetter with +// member _.Field fieldName dec = +// match ele with +// | YAMLElement.Object v -> +// //printfn "[GETTER] IsObject" +// v +// |> List.tryFind (function +// | YAMLElement.Mapping (k, _) -> +// //printfn "[GETTER] IsMapping" +// let equals = k.Value = fieldName +// //printfn "[GETTER] Equals: %A" equals +// equals +// | _ -> false +// ) +// |> Option.map (function +// | YAMLElement.Mapping (_, v) -> +// //printfn "[GETTER] Mapping: %A" v +// dec v +// | _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele +// ) +// |> fun x -> +// if x .IsNone then +// Helper.raiseInvalidArg "value" (sprintf "Field not found: %s" fieldName) ele +// else x.Value +// | anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse +// } +// let optional = +// { new IOptionalGetter with +// member this.Field (fieldName: string) (dec: YAMLElement -> 'a) = +// match ele with +// | YAMLElement.Object v -> +// v +// |> List.tryFind (function +// | YAMLElement.Mapping (k, _) -> k.Value = fieldName +// | _ -> false +// ) +// |> Option.map (function +// | YAMLElement.Mapping (_, v) -> dec v +// | _ -> Helper.raiseInvalidArg "value" "Expected a mapping" ele +// ) +// | anyElse -> Helper.raiseInvalidArg "value" "Expected an object" anyElse +// } +// interface IGetters with +// member __.Required = required +// member __.Optional = optional + +//let object (getter: IGetters -> 'a) (value: YAMLElement) : 'a = +// let getterObj = Getter(value) :> IGetters +// getter getterObj let read (yaml: string) = Reader.read yaml \ No newline at end of file diff --git a/src/YAMLicious/Regex.fs b/src/YAMLicious/Regex.fs index acf2f42..4ac495a 100644 --- a/src/YAMLicious/Regex.fs +++ b/src/YAMLicious/Regex.fs @@ -75,7 +75,7 @@ let SequenceCloserPattern = let JSONOpenerPattern = #if FABLE_COMPILER_PYTHON - $"^(?P[^\{{\[]+):\s+\{{}\s*({CommentPattern})?$" + $"^(?P[^\{{\[]+):\s+\{{}}\s*({CommentPattern})?$" #else $"^(?[^\{{\[]+):\s+\{{\s*({CommentPattern})?$" #endif diff --git a/src/YAMLicious/YAMLicious.fsproj b/src/YAMLicious/YAMLicious.fsproj index 19ccd12..bac8f8f 100644 --- a/src/YAMLicious/YAMLicious.fsproj +++ b/src/YAMLicious/YAMLicious.fsproj @@ -6,6 +6,7 @@ + diff --git a/tests/YAMLicious.Tests/Tests.EncoderDecoder.fs b/tests/YAMLicious.Tests/Tests.EncoderDecoder.fs index 550027a..bae4ca5 100644 --- a/tests/YAMLicious.Tests/Tests.EncoderDecoder.fs +++ b/tests/YAMLicious.Tests/Tests.EncoderDecoder.fs @@ -67,22 +67,27 @@ validation_packages: - name: package3" Expect.trimEqual actual expected "" - testCase "decode" <| fun _ -> - let packageEncoder = Decode.object (fun get -> - { - Name = get.Required.Field "name" Decode.string - Version = get.Optional.Field "version" Decode.string - } - ) - let arcValidationDecoder = - Decode.object (fun get -> - { - ArcSpecificationVersion = get.Required.Field "arc_specification" Decode.string - Packages = get.Required.Field "validation_packages" (Decode.list packageEncoder) - } - ) - let actual = Examples.ValidationPackageTypes.string |> Decode.read |> arcValidationDecoder - let expected = Examples.ValidationPackageTypes.type_ + //testCase "decode" <| fun _ -> + // let packageEncoder = Decode.object (fun get -> + // { + // Name = get.Required.Field "name" Decode.string + // Version = get.Optional.Field "version" Decode.string + // } + // ) + // let arcValidationDecoder = + // Decode.object (fun get -> + // { + // ArcSpecificationVersion = get.Required.Field "arc_specification" Decode.string + // Packages = get.Required.Field "validation_packages" (Decode.list packageEncoder) + // } + // ) + // let actual = Examples.ValidationPackageTypes.string |> Decode.read |> arcValidationDecoder + // let expected = Examples.ValidationPackageTypes.type_ + // Expect.equal actual expected "" + ftestCase "decode integer" <| fun _ -> + let ele = "23" + let actual = ele |> Decode.read |> Decode.int + let expected = 23 Expect.equal actual expected "" ]