diff --git a/src/CommonProviderImplementation/Helpers.fs b/src/CommonProviderImplementation/Helpers.fs index 46446fd11..4e6eabe58 100644 --- a/src/CommonProviderImplementation/Helpers.fs +++ b/src/CommonProviderImplementation/Helpers.fs @@ -153,7 +153,7 @@ module internal ProviderHelpers = let private webUrisCache = createInternetFileCache "DesignTimeURIs" cacheDuration // part of the information needed by generateType - type TypeProviderSpec = + type TypeProviderSpec<'RuntimeValue> = { //the generated type GeneratedType : ProvidedTypeDefinition //the representation type (what's returned from the constructors, may or may not be the same as Type) @@ -162,10 +162,13 @@ module internal ProviderHelpers = CreateFromTextReader : Expr -> Expr CreateListFromTextReader : (Expr -> Expr) option // the constructor from a text reader to an array of the representation - CreateFromTextReaderForSampleList : Expr -> Expr } + CreateFromTextReaderForSampleList : Expr -> Expr + /// Runtime representation of underlying data (e.g. JsonValue) * Mapper function + CreateFromValue: (Type * (Expr<'RuntimeValue> -> Expr)) option + } - type private ParseTextResult = - { Spec : TypeProviderSpec + type private ParseTextResult<'RuntimeValue> = + { Spec : TypeProviderSpec<'RuntimeValue> IsUri : bool IsResource : bool } @@ -455,7 +458,19 @@ module internal ProviderHelpers = asyncMap resultType readerAsync spec.CreateFromTextReader) m.AddXmlDoc <| sprintf "Loads %s from the specified uri" formatName yield m :> _ - + + // Generate static Load value method + match spec.CreateFromValue with + | None -> () + | Some (valueType, valueMapper) -> + let args = [ ProvidedParameter("value", valueType) ] + let m = ProvidedMethod("Load", args, resultType, isStatic = true, + invokeCode = fun (Singleton value) -> + let value = value |> Expr.Cast + <@ %value @> |> valueMapper) + m.AddXmlDoc <| sprintf "Loads %s from the specified value" formatName + yield m :> _ + if not parseResult.IsResource then match source with diff --git a/src/Csv/CsvProvider.fs b/src/Csv/CsvProvider.fs index 7ffe56218..82584a7e9 100644 --- a/src/Csv/CsvProvider.fs +++ b/src/Csv/CsvProvider.fs @@ -117,8 +117,10 @@ type public CsvProvider(cfg:TypeProviderConfig) as this = separators, quote, hasHeaders, ignoreErrors, skipRows, cacheRows) Expr.Let(stringArrayToRowVar, stringArrayToRow, Expr.Let(rowToStringArrayVar, rowToStringArray, body)) CreateListFromTextReader = None - CreateFromTextReaderForSampleList = fun _ -> failwith "Not Applicable" } - + CreateFromTextReaderForSampleList = fun _ -> failwith "Not Applicable" + CreateFromValue = None + } + let maxNumberOfRows = if inferRows > 0 then Some inferRows else None // On the CsvProvider the schema might be partial and we will still infer from the sample diff --git a/src/Html/HtmlProvider.fs b/src/Html/HtmlProvider.fs index 3eecee0d7..0fd0bc591 100644 --- a/src/Html/HtmlProvider.fs +++ b/src/Html/HtmlProvider.fs @@ -55,7 +55,9 @@ type public HtmlProvider(cfg:TypeProviderConfig) as this = RepresentationType = htmlType CreateFromTextReader = fun reader -> <@@ HtmlDocument.Create(includeLayoutTables, %reader) @@> CreateListFromTextReader = None - CreateFromTextReaderForSampleList = fun _ -> failwith "Not Applicable" } + CreateFromTextReaderForSampleList = fun _ -> failwith "Not Applicable" + CreateFromValue = None + } generateType "HTML" (Sample sample) getSpec this cfg encodingStr resolutionFolder resource typeName (*maxNumberOfRows*)None diff --git a/src/Json/JsonProvider.fs b/src/Json/JsonProvider.fs index 9cb9420e0..ab8b98bf6 100644 --- a/src/Json/JsonProvider.fs +++ b/src/Json/JsonProvider.fs @@ -67,13 +67,15 @@ type public JsonProvider(cfg:TypeProviderConfig) as this = result.Convert <@@ JsonDocument.Create(%reader) @@> CreateListFromTextReader = Some (fun reader -> result.Convert <@@ JsonDocument.CreateList(%reader) @@>) - CreateFromTextReaderForSampleList = fun reader -> - result.Convert <@@ JsonDocument.CreateList(%reader) @@> } - - let source = - if sampleIsList then - SampleList sample - else + CreateFromTextReaderForSampleList = fun reader -> + result.Convert <@@ JsonDocument.CreateList(%reader) @@> + CreateFromValue = Some (typeof, fun value -> result.Convert <@@ JsonDocument.Create(%value, "") @@>) + } + + let source = + if sampleIsList then + SampleList sample + else Sample sample generateType "JSON" source getSpec this cfg encodingStr resolutionFolder resource typeName (*maxNumberOfRows*)None diff --git a/src/Xml/XmlProvider.fs b/src/Xml/XmlProvider.fs index f8d542b5d..343b7ca62 100644 --- a/src/Xml/XmlProvider.fs +++ b/src/Xml/XmlProvider.fs @@ -71,7 +71,9 @@ type public XmlProvider(cfg:TypeProviderConfig) as this = result.Converter <@@ XmlElement.Create(%reader) @@> CreateListFromTextReader = None CreateFromTextReaderForSampleList = fun reader -> // hack: this will actually parse the schema - <@@ XmlSchema.parseSchemaFromTextReader resolutionFolder %reader @@> } + <@@ XmlSchema.parseSchemaFromTextReader resolutionFolder %reader @@> + CreateFromValue = None + } else @@ -100,10 +102,12 @@ type public XmlProvider(cfg:TypeProviderConfig) as this = CreateFromTextReader = fun reader -> result.Converter <@@ XmlElement.Create(%reader) @@> CreateListFromTextReader = None - CreateFromTextReaderForSampleList = fun reader -> - result.Converter <@@ XmlElement.CreateList(%reader) @@> } - - let source = + CreateFromTextReaderForSampleList = fun reader -> + result.Converter <@@ XmlElement.CreateList(%reader) @@> + CreateFromValue = None + } + + let source = if schema <> "" then Schema schema elif sampleIsList then diff --git a/tests/FSharp.Data.DesignTime.Tests/SignatureTests.fs b/tests/FSharp.Data.DesignTime.Tests/SignatureTests.fs index 28ad62067..9347bd109 100644 --- a/tests/FSharp.Data.DesignTime.Tests/SignatureTests.fs +++ b/tests/FSharp.Data.DesignTime.Tests/SignatureTests.fs @@ -28,7 +28,13 @@ let expectedDirectory = sourceDirectory ++ "expected" let resolutionFolder = sourceDirectory ++ ".." ++ "FSharp.Data.Tests" ++ "Data" let assemblyName = "FSharp.Data.dll" -let netstandard2RuntimeAssembly = sourceDirectory ++ ".." ++ ".." ++ "src" ++ "FSharp.Data" ++ "bin" ++ "Release" ++ "netstandard2.0" ++ assemblyName +let netstandard2RuntimeAssembly = sourceDirectory ++ ".." ++ ".." ++ "src" ++ "FSharp.Data" ++ "bin" ++ + #if DEBUG + "Debug" + #else + "Release" + #endif + ++ "netstandard2.0" ++ assemblyName let getRuntimeRefs platform = TypeProviderInstantiation.GetRuntimeAssemblyRefs platform diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Dates.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Dates.json,False,,,True.expected index 2c4639639..3c334c01c 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Dates.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Dates.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,DoubleNested.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,DoubleNested.json,False,,,True.expected index 2e624efef..d3194e87e 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,DoubleNested.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,DoubleNested.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Empty.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Empty.json,False,,,True.expected index a342d9ad4..4a04b2274 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Empty.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Empty.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,GitHub.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,GitHub.json,False,,,True.expected index 8f697e538..9284c6787 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,GitHub.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,GitHub.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+JsonProvider+Root[] JsonRuntime.ConvertArray(JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))), new Func<_,_>(id))) + static member Load: value:JsonValue -> JsonProvider+JsonProvider+Root[] + JsonRuntime.ConvertArray(JsonDocument.Create(value, ""), new Func<_,_>(id))) + static member Parse: text:string -> JsonProvider+JsonProvider+Root[] JsonRuntime.ConvertArray(JsonDocument.Create(((new StringReader(text)) :> TextReader)), new Func<_,_>(id))) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Nested.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Nested.json,False,,,True.expected index 9bdf50258..ba9682e13 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Nested.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Nested.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,OptionValues.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,OptionValues.json,False,,,True.expected index 0af3edb39..59af19e98 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,OptionValues.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,OptionValues.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Simple.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Simple.json,False,,,True.expected index f6a202736..057e7cc97 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Simple.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Simple.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,SimpleArray.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,SimpleArray.json,False,,,True.expected index 31538f6c7..663d8fd85 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,SimpleArray.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,SimpleArray.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TimeSpans.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TimeSpans.json,False,,,True.expected index 19682edbb..e6634fb14 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TimeSpans.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TimeSpans.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterSample.json,True,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterSample.json,True,,,True.expected index 5f619fbdb..ba4150a8d 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterSample.json,True,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterSample.json,True,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterStream.json,True,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterStream.json,True,,,True.expected index aa0b6be28..ba06eac44 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterStream.json,True,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TwitterStream.json,True,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,False.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,False.expected index 666440a4e..195025d1e 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,False.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,False.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+JsonProvider+Root[] JsonRuntime.ConvertArray(JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))), new Func<_,_>(id))) + static member Load: value:JsonValue -> JsonProvider+JsonProvider+Root[] + JsonRuntime.ConvertArray(JsonDocument.Create(value, ""), new Func<_,_>(id))) + static member Parse: text:string -> JsonProvider+JsonProvider+Root[] JsonRuntime.ConvertArray(JsonDocument.Create(((new StringReader(text)) :> TextReader)), new Func<_,_>(id))) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,True.expected index 7e0e7471f..cd9e99a9f 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,TypeInference.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+JsonProvider+Root[] JsonRuntime.ConvertArray(JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))), new Func<_,_>(id))) + static member Load: value:JsonValue -> JsonProvider+JsonProvider+Root[] + JsonRuntime.ConvertArray(JsonDocument.Create(value, ""), new Func<_,_>(id))) + static member Parse: text:string -> JsonProvider+JsonProvider+Root[] JsonRuntime.ConvertArray(JsonDocument.Create(((new StringReader(text)) :> TextReader)), new Func<_,_>(id))) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Vindinium.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Vindinium.json,False,,,True.expected index cd5848d22..7377926e1 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,Vindinium.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,Vindinium.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,WikiData.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,WikiData.json,False,,,True.expected index 0769c88e5..1947d86ac 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,WikiData.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,WikiData.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,WorldBank.json,False,WorldBank,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,WorldBank.json,False,WorldBank,,True.expected index b090f2f55..12a9ebf3c 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,WorldBank.json,False,WorldBank,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,WorldBank.json,False,WorldBank,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+WorldBank JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+WorldBank + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+WorldBank JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,contacts.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,contacts.json,False,,,True.expected index 1f5243279..2bc3a204d 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,contacts.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,contacts.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,optionals.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,optionals.json,False,,,True.expected index d5a8c1f2a..b14805327 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,optionals.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,optionals.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,projects.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,projects.json,False,,,True.expected index 8b9106302..6575d09b7 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,projects.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,projects.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,reddit.json,False,,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,reddit.json,False,,,True.expected index d2e569671..58761f1d0 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,reddit.json,False,,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,reddit.json,False,,,True.expected @@ -19,6 +19,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+Root JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))) + static member Load: value:JsonValue -> JsonProvider+Root + JsonDocument.Create(value, "") + static member Parse: text:string -> JsonProvider+Root JsonDocument.Create(((new StringReader(text)) :> TextReader)) diff --git a/tests/FSharp.Data.DesignTime.Tests/expected/Json,topics.json,True,Topic,,True.expected b/tests/FSharp.Data.DesignTime.Tests/expected/Json,topics.json,True,Topic,,True.expected index 2e3bb2a32..f6796d5ff 100644 --- a/tests/FSharp.Data.DesignTime.Tests/expected/Json,topics.json,True,Topic,,True.expected +++ b/tests/FSharp.Data.DesignTime.Tests/expected/Json,topics.json,True,Topic,,True.expected @@ -12,6 +12,9 @@ class JsonProvider : obj static member Load: uri:string -> JsonProvider+JsonProvider+Topic[] JsonRuntime.ConvertArray(JsonDocument.Create(FSharpAsync.RunSynchronously((IO.asyncReadTextAtRuntime false "" "" "JSON" "" uri))), new Func<_,_>(id))) + static member Load: value:JsonValue -> JsonProvider+JsonProvider+Topic[] + JsonRuntime.ConvertArray(JsonDocument.Create(value, ""), new Func<_,_>(id))) + static member Parse: text:string -> JsonProvider+JsonProvider+Topic[] JsonRuntime.ConvertArray(JsonDocument.Create(((new StringReader(text)) :> TextReader)), new Func<_,_>(id))) diff --git a/tests/FSharp.Data.Tests/JsonProvider.fs b/tests/FSharp.Data.Tests/JsonProvider.fs index fcf6bccec..96a4fe042 100644 --- a/tests/FSharp.Data.Tests/JsonProvider.fs +++ b/tests/FSharp.Data.Tests/JsonProvider.fs @@ -728,3 +728,32 @@ let ``Getting a large decimal at runtime when an integer was inferred should thr let ``ParseList return result list`` () = let prov = NumericFields.ParseList(""" [{"a":123}, {"a":987}] """) prov |> Array.map (fun v -> v.A) |> Array.sort |> should equal [|123M; 987M|] + + +type ServiceResponse = JsonProvider<"""[ +{ "code": 0, "value": {"generic payload": "yes"}, "message": null}, +{ "code": 1, "value": null, "message": "Warning"}, +{ "code": 2, "value": [], "message": "Exception"} +] +""", SampleIsList = true> + +type FirstPayload = JsonProvider<"""{ "x" : 0.500, "y" : 0.000 }"""> +type SecondPayload = JsonProvider<"""{"user": "alice", "role": "admin", "registeredSince": "2021-11-01"}"""> + +[] +let ``Can re-load JsonValue`` () = + let json = FirstPayload.Parse("""{ "x" : -0.250, "y" : 12345}""") + FirstPayload.Load(json.JsonValue) |> should equal json + +[] +let ``Can load different nested payloads`` () = + let json1 = ServiceResponse.Parse("""{ "code": 0, "value": { "x" : -0.250, "y" : 12345}, "message": null}""") + let json2 = ServiceResponse.Parse("""{ "code": 0, "value": {"user": "alice", "role": "admin", "registeredSince": "2021-11-01"}, "message": null}""") + let payload1 = FirstPayload.Load(json1.Value.JsonValue) + + let payload2 = SecondPayload.Load(json2.Value.JsonValue) + payload1.X |> should equal -0.250 + payload1.Y |> should equal 12345 + payload2.User |> should equal "alice" + payload2.Role |> should equal "admin" + payload2.RegisteredSince |> should equal (DateTime(2021, 11, 1))