Compare commits

...

13 Commits

Author SHA1 Message Date
Patrick Stevens
e8571553c4 Fix the incorrect rendering of the Patch attribute (#375) 2025-04-22 22:53:32 +01:00
Patrick Stevens
19761db983 Fix treatment of Patch (#374) 2025-04-21 22:46:01 +00:00
Patrick Stevens
f30a73fd4f Bump WoofWare.Whippet.Fantomas (#373) 2025-04-21 21:36:26 +00:00
Patrick Stevens
b2d64562bf Support octet-stream content type in Swagger gen (#372) 2025-04-21 20:57:51 +00:00
Patrick Stevens
e7e629613e Work around Gitea's malformed responses again (#371) 2025-04-21 20:07:44 +00:00
Patrick Stevens
4560138b59 Work around a strange Gitea behaviour (#370) 2025-04-21 20:49:32 +01:00
Patrick Stevens
425d5313b4 Be compatible with <Nullable>enable</Nullable> (#369) 2025-04-21 18:43:52 +01:00
Patrick Stevens
0fe97da788 Have arg parser take string -> string option (#368) 2025-04-21 09:07:58 +00:00
Patrick Stevens
f944953384 Enforce non-nullability in more cases during JSON parse (#367) 2025-04-20 17:20:22 +00:00
Patrick Stevens
7930039ad1 Revert "Some fixes to nullability (#365)" (#366)
This reverts commit 8d275f0047.
2025-04-20 17:02:40 +00:00
Patrick Stevens
8d275f0047 Some fixes to nullability (#365) 2025-04-20 16:26:45 +00:00
patrick-conscriptus[bot]
682b12fdb2 Automated commit (#363)
Co-authored-by: patrick-conscriptus[bot] <175414948+patrick-conscriptus[bot]@users.noreply.github.com>
2025-04-20 01:31:43 +00:00
dependabot[bot]
325f8634a4 Bump FSharp.Core and WoofWare.Whippet.Fantomas (#361)
* Bump FsCheck and FSharp.Core

Bumps [FsCheck](https://github.com/Fscheck/fscheck) and [FSharp.Core](https://github.com/dotnet/fsharp). These dependencies needed to be updated together.

Updates `FsCheck` from 3.1.0 to 3.2.0
- [Release notes](https://github.com/Fscheck/fscheck/releases)
- [Changelog](https://github.com/fscheck/FsCheck/blob/master/FsCheck%20Release%20Notes.md)
- [Commits](https://github.com/Fscheck/fscheck/compare/3.1.0...3.2.0)

Updates `FSharp.Core` from 4.3.4 to 5.0.2
- [Release notes](https://github.com/dotnet/fsharp/releases)
- [Changelog](https://github.com/dotnet/fsharp/blob/main/release-notes.md)
- [Commits](https://github.com/dotnet/fsharp/commits)

---
updated-dependencies:
- dependency-name: FsCheck
  dependency-version: 3.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: FSharp.Core
  dependency-version: 5.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump FSharp.Core and WoofWare.Whippet.Fantomas

Bumps [FSharp.Core](https://github.com/dotnet/fsharp) and [WoofWare.Whippet.Fantomas](https://github.com/Smaug123/WoofWare.Whippet). These dependencies needed to be updated together.

Updates `FSharp.Core` from 4.3.4 to 6.0.1
- [Release notes](https://github.com/dotnet/fsharp/releases)
- [Changelog](https://github.com/dotnet/fsharp/blob/main/release-notes.md)
- [Commits](https://github.com/dotnet/fsharp/commits)

Updates `WoofWare.Whippet.Fantomas` from 0.3.2 to 0.5.1
- [Commits](https://github.com/Smaug123/WoofWare.Whippet/commits)

---
updated-dependencies:
- dependency-name: FSharp.Core
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
- dependency-name: WoofWare.Whippet.Fantomas
  dependency-version: 0.5.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Smaug123 <3138005+Smaug123@users.noreply.github.com>
2025-04-14 22:05:23 +00:00
26 changed files with 28319 additions and 9432 deletions

View File

@@ -1,5 +1,27 @@
Notable changes are recorded here. Notable changes are recorded here.
# WoofWare.Myriad.Plugins 7.0.1
All generators should now be compatible with `<Nullable>enable</Nullable>`.
**Please test the results and let me know of unexpected failures.**
There are a number of heuristics in this code, because:
* `System.Text.Json.Nodes` is an unfathomably weird API which simply requires us to make educated guesses about whether a user-provided type is supposed to be nullable, despite this being irrelevant to the operation of `System.Text.Json`;
* Some types (like `Uri` and `String`) have `ToString` methods which can't return `null`, but in general `Object.ToString` can of course return `null`, and as far as I can tell there is simply no way to know from the source alone whether a given type will have a nullable `ToString`.
# WoofWare.Myriad.Plugins 6.0.1
The `ArgParser` generator's type signatures have changed.
The `parse'` method no longer takes `getEnvironmentVariable : string -> string`; it's now `getEnvironmentVariable : string -> string option`.
This is to permit satisfying the `<Nullable>enable</Nullable>` compiler setting.
If you're calling `parse'`, give it `Environment.GetEnvironmentVariable >> Option.ofObj` instead.
# WoofWare.Myriad.Plugins 5.0.1
We now enforce non-nullability on more types during JSON parse.
We have always expected you to consume nullable types wrapped in an `option`, but now we enforce this in more cases by throwing `ArgumentNullException`.
# WoofWare.Myriad.Plugins 3.0.1 # WoofWare.Myriad.Plugins 3.0.1
Semantics of `HttpClient`'s URI component composition changed: Semantics of `HttpClient`'s URI component composition changed:

View File

@@ -4,6 +4,7 @@
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<OtherFlags>--reflectionfree $(OtherFlags)</OtherFlags> <OtherFlags>--reflectionfree $(OtherFlags)</OtherFlags>
<Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<MyriadSdkGenerator Include="$(MSBuildThisFileDirectory)..\WoofWare.Myriad.Plugins\bin\$(Configuration)\net6.0\WoofWare.Myriad.Plugins.dll"/> <MyriadSdkGenerator Include="$(MSBuildThisFileDirectory)..\WoofWare.Myriad.Plugins\bin\$(Configuration)\net6.0\WoofWare.Myriad.Plugins.dll"/>

File diff suppressed because it is too large Load Diff

View File

@@ -23,7 +23,7 @@ module BasicNoPositionals =
/// Waiting to receive a value for the key we've already consumed /// Waiting to receive a value for the key we've already consumed
| AwaitingValue of key : string | AwaitingValue of key : string
let parse' (getEnvironmentVariable : string -> string) (args : string list) : BasicNoPositionals = let parse' (getEnvironmentVariable : string -> string option) (args : string list) : BasicNoPositionals =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -223,7 +223,7 @@ module BasicNoPositionals =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
let parse (args : string list) : BasicNoPositionals = let parse (args : string list) : BasicNoPositionals =
parse' System.Environment.GetEnvironmentVariable args parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -239,7 +239,7 @@ module Basic =
/// Waiting to receive a value for the key we've already consumed /// Waiting to receive a value for the key we've already consumed
| AwaitingValue of key : string | AwaitingValue of key : string
let parse' (getEnvironmentVariable : string -> string) (args : string list) : Basic = let parse' (getEnvironmentVariable : string -> string option) (args : string list) : Basic =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -430,7 +430,7 @@ module Basic =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
let parse (args : string list) : Basic = let parse (args : string list) : Basic =
parse' System.Environment.GetEnvironmentVariable args parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -446,7 +446,7 @@ module BasicWithIntPositionals =
/// Waiting to receive a value for the key we've already consumed /// Waiting to receive a value for the key we've already consumed
| AwaitingValue of key : string | AwaitingValue of key : string
let parse' (getEnvironmentVariable : string -> string) (args : string list) : BasicWithIntPositionals = let parse' (getEnvironmentVariable : string -> string option) (args : string list) : BasicWithIntPositionals =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -633,7 +633,7 @@ module BasicWithIntPositionals =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
let parse (args : string list) : BasicWithIntPositionals = let parse (args : string list) : BasicWithIntPositionals =
parse' System.Environment.GetEnvironmentVariable args parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -649,7 +649,7 @@ module LoadsOfTypes =
/// Waiting to receive a value for the key we've already consumed /// Waiting to receive a value for the key we've already consumed
| AwaitingValue of key : string | AwaitingValue of key : string
let parse' (getEnvironmentVariable : string -> string) (args : string list) : LoadsOfTypes = let parse' (getEnvironmentVariable : string -> string option) (args : string list) : LoadsOfTypes =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -1038,7 +1038,7 @@ module LoadsOfTypes =
match arg_10 with match arg_10 with
| None -> | None ->
match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with
| null -> | None ->
sprintf sprintf
"No value was supplied for %s, nor was environment variable %s set" "No value was supplied for %s, nor was environment variable %s set"
(sprintf "--%s" "yet-another-optional-thing") (sprintf "--%s" "yet-another-optional-thing")
@@ -1046,7 +1046,7 @@ module LoadsOfTypes =
|> ArgParser_errors.Add |> ArgParser_errors.Add
Unchecked.defaultof<_> Unchecked.defaultof<_>
| x -> x |> (fun x -> x) | Some x -> x |> (fun x -> x)
|> Choice2Of2 |> Choice2Of2
| Some x -> Choice1Of2 x | Some x -> Choice1Of2 x
@@ -1068,7 +1068,7 @@ module LoadsOfTypes =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
let parse (args : string list) : LoadsOfTypes = let parse (args : string list) : LoadsOfTypes =
parse' System.Environment.GetEnvironmentVariable args parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -1084,7 +1084,7 @@ module LoadsOfTypesNoPositionals =
/// Waiting to receive a value for the key we've already consumed /// Waiting to receive a value for the key we've already consumed
| AwaitingValue of key : string | AwaitingValue of key : string
let parse' (getEnvironmentVariable : string -> string) (args : string list) : LoadsOfTypesNoPositionals = let parse' (getEnvironmentVariable : string -> string option) (args : string list) : LoadsOfTypesNoPositionals =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -1476,7 +1476,7 @@ module LoadsOfTypesNoPositionals =
match arg_9 with match arg_9 with
| None -> | None ->
match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with
| null -> | None ->
sprintf sprintf
"No value was supplied for %s, nor was environment variable %s set" "No value was supplied for %s, nor was environment variable %s set"
(sprintf "--%s" "yet-another-optional-thing") (sprintf "--%s" "yet-another-optional-thing")
@@ -1484,7 +1484,7 @@ module LoadsOfTypesNoPositionals =
|> ArgParser_errors.Add |> ArgParser_errors.Add
Unchecked.defaultof<_> Unchecked.defaultof<_>
| x -> x |> (fun x -> x) | Some x -> x |> (fun x -> x)
|> Choice2Of2 |> Choice2Of2
| Some x -> Choice1Of2 x | Some x -> Choice1Of2 x
@@ -1505,7 +1505,7 @@ module LoadsOfTypesNoPositionals =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
let parse (args : string list) : LoadsOfTypesNoPositionals = let parse (args : string list) : LoadsOfTypesNoPositionals =
parse' System.Environment.GetEnvironmentVariable args parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -1524,7 +1524,7 @@ module DatesAndTimesArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type DatesAndTimes with type DatesAndTimes with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : DatesAndTimes = static member parse' (getEnvironmentVariable : string -> string option) (args : string list) : DatesAndTimes =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -1787,7 +1787,7 @@ module DatesAndTimesArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : DatesAndTimes = static member parse (args : string list) : DatesAndTimes =
DatesAndTimes.parse' System.Environment.GetEnvironmentVariable args DatesAndTimes.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -1806,7 +1806,7 @@ module ParentRecordArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type ParentRecord with type ParentRecord with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : ParentRecord = static member parse' (getEnvironmentVariable : string -> string option) (args : string list) : ParentRecord =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -2016,7 +2016,7 @@ module ParentRecordArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ParentRecord = static member parse (args : string list) : ParentRecord =
ParentRecord.parse' System.Environment.GetEnvironmentVariable args ParentRecord.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -2035,7 +2035,11 @@ module ParentRecordChildPosArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type ParentRecordChildPos with type ParentRecordChildPos with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : ParentRecordChildPos = static member parse'
(getEnvironmentVariable : string -> string option)
(args : string list)
: ParentRecordChildPos
=
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -2209,7 +2213,7 @@ module ParentRecordChildPosArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ParentRecordChildPos = static member parse (args : string list) : ParentRecordChildPos =
ParentRecordChildPos.parse' System.Environment.GetEnvironmentVariable args ParentRecordChildPos.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -2228,7 +2232,11 @@ module ParentRecordSelfPosArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type ParentRecordSelfPos with type ParentRecordSelfPos with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : ParentRecordSelfPos = static member parse'
(getEnvironmentVariable : string -> string option)
(args : string list)
: ParentRecordSelfPos
=
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -2388,7 +2396,7 @@ module ParentRecordSelfPosArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ParentRecordSelfPos = static member parse (args : string list) : ParentRecordSelfPos =
ParentRecordSelfPos.parse' System.Environment.GetEnvironmentVariable args ParentRecordSelfPos.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -2407,7 +2415,11 @@ module ChoicePositionalsArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type ChoicePositionals with type ChoicePositionals with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : ChoicePositionals = static member parse'
(getEnvironmentVariable : string -> string option)
(args : string list)
: ChoicePositionals
=
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -2502,7 +2514,7 @@ module ChoicePositionalsArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ChoicePositionals = static member parse (args : string list) : ChoicePositionals =
ChoicePositionals.parse' System.Environment.GetEnvironmentVariable args ChoicePositionals.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -2521,7 +2533,11 @@ module ContainsBoolEnvVarArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type ContainsBoolEnvVar with type ContainsBoolEnvVar with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : ContainsBoolEnvVar = static member parse'
(getEnvironmentVariable : string -> string option)
(args : string list)
: ContainsBoolEnvVar
=
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -2653,7 +2669,7 @@ module ContainsBoolEnvVarArgParse =
match arg_0 with match arg_0 with
| None -> | None ->
match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with
| null -> | None ->
sprintf sprintf
"No value was supplied for %s, nor was environment variable %s set" "No value was supplied for %s, nor was environment variable %s set"
(sprintf "--%s" "bool-var") (sprintf "--%s" "bool-var")
@@ -2661,7 +2677,7 @@ module ContainsBoolEnvVarArgParse =
|> ArgParser_errors.Add |> ArgParser_errors.Add
Unchecked.defaultof<_> Unchecked.defaultof<_>
| x -> | Some x ->
if System.String.Equals (x, "1", System.StringComparison.OrdinalIgnoreCase) then if System.String.Equals (x, "1", System.StringComparison.OrdinalIgnoreCase) then
true true
else if System.String.Equals (x, "0", System.StringComparison.OrdinalIgnoreCase) then else if System.String.Equals (x, "0", System.StringComparison.OrdinalIgnoreCase) then
@@ -2679,7 +2695,7 @@ module ContainsBoolEnvVarArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ContainsBoolEnvVar = static member parse (args : string list) : ContainsBoolEnvVar =
ContainsBoolEnvVar.parse' System.Environment.GetEnvironmentVariable args ContainsBoolEnvVar.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -2698,7 +2714,7 @@ module WithFlagDuArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type WithFlagDu with type WithFlagDu with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : WithFlagDu = static member parse' (getEnvironmentVariable : string -> string option) (args : string list) : WithFlagDu =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -2852,7 +2868,7 @@ module WithFlagDuArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : WithFlagDu = static member parse (args : string list) : WithFlagDu =
WithFlagDu.parse' System.Environment.GetEnvironmentVariable args WithFlagDu.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -2871,7 +2887,11 @@ module ContainsFlagEnvVarArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type ContainsFlagEnvVar with type ContainsFlagEnvVar with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : ContainsFlagEnvVar = static member parse'
(getEnvironmentVariable : string -> string option)
(args : string list)
: ContainsFlagEnvVar
=
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -3018,7 +3038,7 @@ module ContainsFlagEnvVarArgParse =
match arg_0 with match arg_0 with
| None -> | None ->
match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with match "CONSUMEPLUGIN_THINGS" |> getEnvironmentVariable with
| null -> | None ->
sprintf sprintf
"No value was supplied for %s, nor was environment variable %s set" "No value was supplied for %s, nor was environment variable %s set"
(sprintf "--%s" "dry-run") (sprintf "--%s" "dry-run")
@@ -3026,7 +3046,7 @@ module ContainsFlagEnvVarArgParse =
|> ArgParser_errors.Add |> ArgParser_errors.Add
Unchecked.defaultof<_> Unchecked.defaultof<_>
| x -> | Some x ->
if System.String.Equals (x, "1", System.StringComparison.OrdinalIgnoreCase) then if System.String.Equals (x, "1", System.StringComparison.OrdinalIgnoreCase) then
if true = Consts.FALSE then if true = Consts.FALSE then
DryRunMode.Wet DryRunMode.Wet
@@ -3056,7 +3076,7 @@ module ContainsFlagEnvVarArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ContainsFlagEnvVar = static member parse (args : string list) : ContainsFlagEnvVar =
ContainsFlagEnvVar.parse' System.Environment.GetEnvironmentVariable args ContainsFlagEnvVar.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -3076,7 +3096,7 @@ module ContainsFlagDefaultValueArgParse =
type ContainsFlagDefaultValue with type ContainsFlagDefaultValue with
static member parse' static member parse'
(getEnvironmentVariable : string -> string) (getEnvironmentVariable : string -> string option)
(args : string list) (args : string list)
: ContainsFlagDefaultValue : ContainsFlagDefaultValue
= =
@@ -3239,7 +3259,7 @@ module ContainsFlagDefaultValueArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ContainsFlagDefaultValue = static member parse (args : string list) : ContainsFlagDefaultValue =
ContainsFlagDefaultValue.parse' System.Environment.GetEnvironmentVariable args ContainsFlagDefaultValue.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -3258,7 +3278,7 @@ module ManyLongFormsArgParse =
/// Extension methods for argument parsing /// Extension methods for argument parsing
type ManyLongForms with type ManyLongForms with
static member parse' (getEnvironmentVariable : string -> string) (args : string list) : ManyLongForms = static member parse' (getEnvironmentVariable : string -> string option) (args : string list) : ManyLongForms =
let ArgParser_errors = ResizeArray () let ArgParser_errors = ResizeArray ()
let helpText () = let helpText () =
@@ -3504,7 +3524,7 @@ module ManyLongFormsArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : ManyLongForms = static member parse (args : string list) : ManyLongForms =
ManyLongForms.parse' System.Environment.GetEnvironmentVariable args ManyLongForms.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -3524,7 +3544,7 @@ module FlagsIntoPositionalArgsArgParse =
type FlagsIntoPositionalArgs with type FlagsIntoPositionalArgs with
static member parse' static member parse'
(getEnvironmentVariable : string -> string) (getEnvironmentVariable : string -> string option)
(args : string list) (args : string list)
: FlagsIntoPositionalArgs : FlagsIntoPositionalArgs
= =
@@ -3668,7 +3688,7 @@ module FlagsIntoPositionalArgsArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : FlagsIntoPositionalArgs = static member parse (args : string list) : FlagsIntoPositionalArgs =
FlagsIntoPositionalArgs.parse' System.Environment.GetEnvironmentVariable args FlagsIntoPositionalArgs.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -3688,7 +3708,7 @@ module FlagsIntoPositionalArgsChoiceArgParse =
type FlagsIntoPositionalArgsChoice with type FlagsIntoPositionalArgsChoice with
static member parse' static member parse'
(getEnvironmentVariable : string -> string) (getEnvironmentVariable : string -> string option)
(args : string list) (args : string list)
: FlagsIntoPositionalArgsChoice : FlagsIntoPositionalArgsChoice
= =
@@ -3832,7 +3852,7 @@ module FlagsIntoPositionalArgsChoiceArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : FlagsIntoPositionalArgsChoice = static member parse (args : string list) : FlagsIntoPositionalArgsChoice =
FlagsIntoPositionalArgsChoice.parse' System.Environment.GetEnvironmentVariable args FlagsIntoPositionalArgsChoice.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -3852,7 +3872,7 @@ module FlagsIntoPositionalArgsIntArgParse =
type FlagsIntoPositionalArgsInt with type FlagsIntoPositionalArgsInt with
static member parse' static member parse'
(getEnvironmentVariable : string -> string) (getEnvironmentVariable : string -> string option)
(args : string list) (args : string list)
: FlagsIntoPositionalArgsInt : FlagsIntoPositionalArgsInt
= =
@@ -3996,7 +4016,7 @@ module FlagsIntoPositionalArgsIntArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : FlagsIntoPositionalArgsInt = static member parse (args : string list) : FlagsIntoPositionalArgsInt =
FlagsIntoPositionalArgsInt.parse' System.Environment.GetEnvironmentVariable args FlagsIntoPositionalArgsInt.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -4016,7 +4036,7 @@ module FlagsIntoPositionalArgsIntChoiceArgParse =
type FlagsIntoPositionalArgsIntChoice with type FlagsIntoPositionalArgsIntChoice with
static member parse' static member parse'
(getEnvironmentVariable : string -> string) (getEnvironmentVariable : string -> string option)
(args : string list) (args : string list)
: FlagsIntoPositionalArgsIntChoice : FlagsIntoPositionalArgsIntChoice
= =
@@ -4160,7 +4180,7 @@ module FlagsIntoPositionalArgsIntChoiceArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : FlagsIntoPositionalArgsIntChoice = static member parse (args : string list) : FlagsIntoPositionalArgsIntChoice =
FlagsIntoPositionalArgsIntChoice.parse' System.Environment.GetEnvironmentVariable args FlagsIntoPositionalArgsIntChoice.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args
namespace ConsumePlugin namespace ConsumePlugin
open System open System
@@ -4180,7 +4200,7 @@ module FlagsIntoPositionalArgs'ArgParse =
type FlagsIntoPositionalArgs' with type FlagsIntoPositionalArgs' with
static member parse' static member parse'
(getEnvironmentVariable : string -> string) (getEnvironmentVariable : string -> string option)
(args : string list) (args : string list)
: FlagsIntoPositionalArgs' : FlagsIntoPositionalArgs'
= =
@@ -4324,4 +4344,4 @@ module FlagsIntoPositionalArgs'ArgParse =
ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s" ArgParser_errors |> String.concat "\n" |> failwithf "Errors during parse!\n%s"
static member parse (args : string list) : FlagsIntoPositionalArgs' = static member parse (args : string list) : FlagsIntoPositionalArgs' =
FlagsIntoPositionalArgs'.parse' System.Environment.GetEnvironmentVariable args FlagsIntoPositionalArgs'.parse' (System.Environment.GetEnvironmentVariable >> Option.ofObj) args

View File

@@ -14,7 +14,24 @@ module internal InternalTypeNotExtensionSerial =
/// Serialize to a JSON node /// Serialize to a JSON node
let toJsonNode (input : InternalTypeNotExtensionSerial) : System.Text.Json.Nodes.JsonNode = let toJsonNode (input : InternalTypeNotExtensionSerial) : System.Text.Json.Nodes.JsonNode =
let node = System.Text.Json.Nodes.JsonObject () let node = System.Text.Json.Nodes.JsonObject ()
do node.Add ((Literals.something), (input.InternalThing2 |> System.Text.Json.Nodes.JsonValue.Create<string>))
do
node.Add (
(Literals.something),
(input.InternalThing2
|> (fun field ->
let field = System.Text.Json.Nodes.JsonValue.Create<string> field
(match field with
| null ->
raise (
System.ArgumentNullException
"Expected type string to be non-null, but received a null value when serialising"
)
| field -> field)
))
)
node :> _ node :> _
namespace ConsumePlugin namespace ConsumePlugin
@@ -29,7 +46,24 @@ module internal InternalTypeExtensionJsonSerializeExtension =
/// Serialize to a JSON node /// Serialize to a JSON node
static member toJsonNode (input : InternalTypeExtension) : System.Text.Json.Nodes.JsonNode = static member toJsonNode (input : InternalTypeExtension) : System.Text.Json.Nodes.JsonNode =
let node = System.Text.Json.Nodes.JsonObject () let node = System.Text.Json.Nodes.JsonObject ()
do node.Add ((Literals.something), (input.ExternalThing |> System.Text.Json.Nodes.JsonValue.Create<string>))
do
node.Add (
(Literals.something),
(input.ExternalThing
|> (fun field ->
let field = System.Text.Json.Nodes.JsonValue.Create<string> field
(match field with
| null ->
raise (
System.ArgumentNullException
"Expected type string to be non-null, but received a null value when serialising"
)
| field -> field)
))
)
node :> _ node :> _
namespace ConsumePlugin namespace ConsumePlugin
@@ -40,16 +74,14 @@ module InnerType =
/// Parse from a JSON node. /// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : InnerType = let jsonParse (node : System.Text.Json.Nodes.JsonNode) : InnerType =
let arg_0 = let arg_0 =
(match node.[(Literals.something)] with match node.[(Literals.something)] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ((Literals.something)) sprintf "Required key '%s' not found on JSON object" ((Literals.something))
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
{ {
Thing = arg_0 Thing = arg_0
@@ -62,79 +94,97 @@ module JsonRecordType =
/// Parse from a JSON node. /// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JsonRecordType = let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JsonRecordType =
let arg_5 = let arg_5 =
(match node.["f"] with match node.["f"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("f") sprintf "Required key '%s' not found on JSON object" ("f")
) )
) )
| v -> v) | Some node ->
.AsArray () node.AsArray ()
|> Seq.map (fun elt -> elt.AsValue().GetValue<System.Int32> ()) |> Seq.map (fun elt ->
|> Array.ofSeq (match elt with
| null ->
raise (
System.ArgumentNullException
"Expected element of array (element type int32) to be non-null, but found a null element"
)
| elt -> elt.AsValue().GetValue<System.Int32> ())
)
|> Array.ofSeq
let arg_4 = let arg_4 =
(match node.["e"] with match node.["e"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("e") sprintf "Required key '%s' not found on JSON object" ("e")
) )
) )
| v -> v) | Some node ->
.AsArray () node.AsArray ()
|> Seq.map (fun elt -> elt.AsValue().GetValue<System.String> ()) |> Seq.map (fun elt ->
|> Array.ofSeq (match elt with
| null ->
raise (
System.ArgumentNullException
"Expected element of array (element type string) to be non-null, but found a null element"
)
| elt -> elt.AsValue().GetValue<System.String> ())
)
|> Array.ofSeq
let arg_3 = let arg_3 =
InnerType.jsonParse ( match node.["d"] |> Option.ofObj with
match node.["d"] with | None ->
| null -> raise (
raise ( System.Collections.Generic.KeyNotFoundException (
System.Collections.Generic.KeyNotFoundException ( sprintf "Required key '%s' not found on JSON object" ("d")
sprintf "Required key '%s' not found on JSON object" ("d")
)
) )
| v -> v )
) | Some node -> InnerType.jsonParse node
let arg_2 = let arg_2 =
(match node.["hi"] with match node.["hi"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("hi") sprintf "Required key '%s' not found on JSON object" ("hi")
) )
) )
| v -> v) | Some node ->
.AsArray () node.AsArray ()
|> Seq.map (fun elt -> elt.AsValue().GetValue<System.Int32> ()) |> Seq.map (fun elt ->
|> List.ofSeq (match elt with
| null ->
raise (
System.ArgumentNullException
"Expected element of array (element type int32) to be non-null, but found a null element"
)
| elt -> elt.AsValue().GetValue<System.Int32> ())
)
|> List.ofSeq
let arg_1 = let arg_1 =
(match node.["another-thing"] with match node.["another-thing"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("another-thing") sprintf "Required key '%s' not found on JSON object" ("another-thing")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
let arg_0 = let arg_0 =
(match node.["a"] with match node.["a"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("a") sprintf "Required key '%s' not found on JSON object" ("a")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int32> ()
.AsValue()
.GetValue<System.Int32> ()
{ {
A = arg_0 A = arg_0
@@ -152,16 +202,14 @@ module internal InternalTypeNotExtension =
/// Parse from a JSON node. /// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : InternalTypeNotExtension = let jsonParse (node : System.Text.Json.Nodes.JsonNode) : InternalTypeNotExtension =
let arg_0 = let arg_0 =
(match node.[(Literals.something)] with match node.[(Literals.something)] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ((Literals.something)) sprintf "Required key '%s' not found on JSON object" ((Literals.something))
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
{ {
InternalThing = arg_0 InternalThing = arg_0
@@ -177,16 +225,14 @@ module internal InternalTypeExtensionJsonParseExtension =
/// Parse from a JSON node. /// Parse from a JSON node.
static member jsonParse (node : System.Text.Json.Nodes.JsonNode) : InternalTypeExtension = static member jsonParse (node : System.Text.Json.Nodes.JsonNode) : InternalTypeExtension =
let arg_0 = let arg_0 =
(match node.[(Literals.something)] with match node.[(Literals.something)] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ((Literals.something)) sprintf "Required key '%s' not found on JSON object" ((Literals.something))
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
{ {
ExternalThing = arg_0 ExternalThing = arg_0
@@ -201,248 +247,215 @@ module ToGetExtensionMethodJsonParseExtension =
/// Parse from a JSON node. /// Parse from a JSON node.
static member jsonParse (node : System.Text.Json.Nodes.JsonNode) : ToGetExtensionMethod = static member jsonParse (node : System.Text.Json.Nodes.JsonNode) : ToGetExtensionMethod =
let arg_20 = System.Numerics.BigInteger.Parse (node.["whiskey"].ToJsonString ()) let arg_20 =
match node.["whiskey"] |> Option.ofObj with
| None ->
raise (
System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("whiskey")
)
)
| Some node -> System.Numerics.BigInteger.Parse (node.ToJsonString ())
let arg_19 = let arg_19 =
(match node.["victor"] with match node.["victor"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("victor") sprintf "Required key '%s' not found on JSON object" ("victor")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Char> ()
.AsValue()
.GetValue<System.Char> ()
let arg_18 = let arg_18 =
(match node.["uniform"] with match node.["uniform"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("uniform") sprintf "Required key '%s' not found on JSON object" ("uniform")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Decimal> ()
.AsValue()
.GetValue<System.Decimal> ()
let arg_17 = let arg_17 =
(match node.["tango"] with match node.["tango"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("tango") sprintf "Required key '%s' not found on JSON object" ("tango")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.SByte> ()
.AsValue()
.GetValue<System.SByte> ()
let arg_16 = let arg_16 =
(match node.["quebec"] with match node.["quebec"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("quebec") sprintf "Required key '%s' not found on JSON object" ("quebec")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Byte> ()
.AsValue()
.GetValue<System.Byte> ()
let arg_15 = let arg_15 =
(match node.["papa"] with match node.["papa"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("papa") sprintf "Required key '%s' not found on JSON object" ("papa")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Byte> ()
.AsValue()
.GetValue<System.Byte> ()
let arg_14 = let arg_14 =
(match node.["oscar"] with match node.["oscar"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("oscar") sprintf "Required key '%s' not found on JSON object" ("oscar")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.SByte> ()
.AsValue()
.GetValue<System.SByte> ()
let arg_13 = let arg_13 =
(match node.["november"] with match node.["november"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("november") sprintf "Required key '%s' not found on JSON object" ("november")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.UInt16> ()
.AsValue()
.GetValue<System.UInt16> ()
let arg_12 = let arg_12 =
(match node.["mike"] with match node.["mike"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("mike") sprintf "Required key '%s' not found on JSON object" ("mike")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int16> ()
.AsValue()
.GetValue<System.Int16> ()
let arg_11 = let arg_11 =
(match node.["lima"] with match node.["lima"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("lima") sprintf "Required key '%s' not found on JSON object" ("lima")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.UInt32> ()
.AsValue()
.GetValue<System.UInt32> ()
let arg_10 = let arg_10 =
(match node.["kilo"] with match node.["kilo"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("kilo") sprintf "Required key '%s' not found on JSON object" ("kilo")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int32> ()
.AsValue()
.GetValue<System.Int32> ()
let arg_9 = let arg_9 =
(match node.["juliette"] with match node.["juliette"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("juliette") sprintf "Required key '%s' not found on JSON object" ("juliette")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.UInt32> ()
.AsValue()
.GetValue<System.UInt32> ()
let arg_8 = let arg_8 =
(match node.["india"] with match node.["india"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("india") sprintf "Required key '%s' not found on JSON object" ("india")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int32> ()
.AsValue()
.GetValue<System.Int32> ()
let arg_7 = let arg_7 =
(match node.["hotel"] with match node.["hotel"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("hotel") sprintf "Required key '%s' not found on JSON object" ("hotel")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.UInt64> ()
.AsValue()
.GetValue<System.UInt64> ()
let arg_6 = let arg_6 =
(match node.["golf"] with match node.["golf"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("golf") sprintf "Required key '%s' not found on JSON object" ("golf")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int64> ()
.AsValue()
.GetValue<System.Int64> ()
let arg_5 = let arg_5 =
(match node.["foxtrot"] with match node.["foxtrot"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("foxtrot") sprintf "Required key '%s' not found on JSON object" ("foxtrot")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Double> ()
.AsValue()
.GetValue<System.Double> ()
let arg_4 = let arg_4 =
(match node.["echo"] with match node.["echo"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("echo") sprintf "Required key '%s' not found on JSON object" ("echo")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Single> ()
.AsValue()
.GetValue<System.Single> ()
let arg_3 = let arg_3 =
(match node.["delta"] with match node.["delta"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("delta") sprintf "Required key '%s' not found on JSON object" ("delta")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Single> ()
.AsValue()
.GetValue<System.Single> ()
let arg_2 = let arg_2 =
(match node.["charlie"] with match node.["charlie"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("charlie") sprintf "Required key '%s' not found on JSON object" ("charlie")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Double> ()
.AsValue()
.GetValue<System.Double> ()
let arg_1 = let arg_1 =
(match node.["bravo"] with match node.["bravo"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("bravo") sprintf "Required key '%s' not found on JSON object" ("bravo")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<string> () |> System.Uri
.AsValue()
.GetValue<string> ()
|> System.Uri
let arg_0 = let arg_0 =
(match node.["alpha"] with match node.["alpha"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("alpha") sprintf "Required key '%s' not found on JSON object" ("alpha")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
{ {
Alpha = arg_0 Alpha = arg_0

File diff suppressed because it is too large Load Diff

View File

@@ -48,7 +48,27 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
return jsonNode.AsArray () |> Seq.map (fun elt -> Gym.jsonParse elt) |> List.ofSeq let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type Gym list"
)
| jsonNode -> jsonNode)
return
jsonNode.AsArray ()
|> Seq.map (fun elt ->
(match elt with
| null ->
raise (
System.ArgumentNullException
"Expected element of array (element type Gym) to be non-null, but found a null element"
)
| elt -> Gym.jsonParse elt)
)
|> List.ofSeq
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -82,6 +102,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type GymAttendance"
)
| jsonNode -> jsonNode)
return GymAttendance.jsonParse jsonNode return GymAttendance.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -116,6 +145,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type GymAttendance"
)
| jsonNode -> jsonNode)
return GymAttendance.jsonParse jsonNode return GymAttendance.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -146,6 +184,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type Member"
)
| jsonNode -> jsonNode)
return Member.jsonParse jsonNode return Member.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -179,6 +226,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type Gym"
)
| jsonNode -> jsonNode)
return Gym.jsonParse jsonNode return Gym.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -209,6 +265,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type MemberActivityDto"
)
| jsonNode -> jsonNode)
return MemberActivityDto.jsonParse jsonNode return MemberActivityDto.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -239,6 +304,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type UriThing"
)
| jsonNode -> jsonNode)
return UriThing.jsonParse jsonNode return UriThing.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -266,23 +340,42 @@ module PureGymApi =
foo foo
|> (fun field -> |> (fun field ->
match field with match field with
| None -> null :> System.Text.Json.Nodes.JsonNode | None -> None
| Some field -> | Some field ->
((fun field -> (field
let ret = System.Text.Json.Nodes.JsonObject () |> (fun field ->
let ret = System.Text.Json.Nodes.JsonObject ()
for (KeyValue (key, value)) in field do for (KeyValue (key, value)) in field do
ret.Add ( let key = key.ToString ()
key.ToString (),
System.Text.Json.Nodes.JsonValue.Create<string> value
)
ret ret.Add (
) key,
field) (fun field ->
let field =
System.Text.Json.Nodes.JsonValue.Create<string> field
(match field with
| null ->
raise (
System.ArgumentNullException
"Expected type string to be non-null, but received a null value when serialising"
)
| field -> field)
)
value
)
ret
))
:> System.Text.Json.Nodes.JsonNode :> System.Text.Json.Nodes.JsonNode
|> Some
)
|> (fun node ->
match node with
| None -> "null"
| Some node -> node.ToJsonString ()
) )
|> (fun node -> if isNull node then "null" else node.ToJsonString ())
) )
do httpMessage.Content <- queryParams do httpMessage.Content <- queryParams
@@ -294,15 +387,25 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode = jsonNode |> Option.ofObj
return return
match jsonNode with match jsonNode with
| null -> None | None -> None
| v -> | Some v ->
v.AsObject () v.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) let key = (kvp.Key)
let value = (kvp.Value).AsValue().GetValue<System.String> () let value = kvp.Value
key, value
key,
(match value with
| null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type string to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.String> ())
) )
|> Map.ofSeq |> Map.ofSeq
|> Some |> Some
@@ -346,6 +449,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type Sessions"
)
| jsonNode -> jsonNode)
return Sessions.jsonParse jsonNode return Sessions.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -387,6 +499,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type Sessions"
)
| jsonNode -> jsonNode)
return Sessions.jsonParse jsonNode return Sessions.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -546,9 +667,7 @@ module PureGymApi =
let queryParams = let queryParams =
new System.Net.Http.StringContent ( new System.Net.Http.StringContent (
user user |> PureGym.Member.toJsonNode |> (fun node -> node.ToJsonString ())
|> PureGym.Member.toJsonNode
|> (fun node -> if isNull node then "null" else node.ToJsonString ())
) )
do httpMessage.Content <- queryParams do httpMessage.Content <- queryParams
@@ -580,8 +699,18 @@ module PureGymApi =
let queryParams = let queryParams =
new System.Net.Http.StringContent ( new System.Net.Http.StringContent (
user user
|> System.Text.Json.Nodes.JsonValue.Create<Uri> |> (fun field ->
|> (fun node -> if isNull node then "null" else node.ToJsonString ()) let field = System.Text.Json.Nodes.JsonValue.Create<Uri> field
(match field with
| null ->
raise (
System.ArgumentNullException
"Expected type URI to be non-null, but received a null value when serialising"
)
| field -> field)
)
|> (fun node -> node.ToJsonString ())
) )
do httpMessage.Content <- queryParams do httpMessage.Content <- queryParams
@@ -613,8 +742,18 @@ module PureGymApi =
let queryParams = let queryParams =
new System.Net.Http.StringContent ( new System.Net.Http.StringContent (
user user
|> System.Text.Json.Nodes.JsonValue.Create<int> |> (fun field ->
|> (fun node -> if isNull node then "null" else node.ToJsonString ()) let field = System.Text.Json.Nodes.JsonValue.Create<int> field
(match field with
| null ->
raise (
System.ArgumentNullException
"Expected type int32 to be non-null, but received a null value when serialising"
)
| field -> field)
)
|> (fun node -> node.ToJsonString ())
) )
do httpMessage.Content <- queryParams do httpMessage.Content <- queryParams
@@ -878,6 +1017,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type Response<MemberActivityDto>"
)
| jsonNode -> jsonNode)
return return
new RestEase.Response<_> ( new RestEase.Response<_> (
responseString, responseString,
@@ -914,6 +1062,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type RestEase.Response<MemberActivityDto>"
)
| jsonNode -> jsonNode)
return return
new RestEase.Response<_> ( new RestEase.Response<_> (
responseString, responseString,
@@ -950,6 +1107,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type Response<MemberActivityDto>"
)
| jsonNode -> jsonNode)
return return
new RestEase.Response<_> ( new RestEase.Response<_> (
responseString, responseString,
@@ -986,6 +1152,15 @@ module PureGymApi =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type RestEase.Response<MemberActivityDto>"
)
| jsonNode -> jsonNode)
return return
new RestEase.Response<_> ( new RestEase.Response<_> (
responseString, responseString,

File diff suppressed because it is too large Load Diff

View File

@@ -3423,7 +3423,7 @@ type IGitea =
[<RestEase.Path "id">] id : int * ?ct : System.Threading.CancellationToken -> Hook System.Threading.Tasks.Task [<RestEase.Path "id">] id : int * ?ct : System.Threading.CancellationToken -> Hook System.Threading.Tasks.Task
/// Update a hook /// Update a hook
[<RestEase.Post "admin/hooks/{id}">] [<RestEase.Patch "admin/hooks/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract AdminEditHook : abstract AdminEditHook :
[<RestEase.Path "id">] id : int * [<RestEase.Path "id">] id : int *
@@ -3494,7 +3494,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit an existing user /// Edit an existing user
[<RestEase.Post "admin/users/{username}">] [<RestEase.Patch "admin/users/{username}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract AdminEditUser : abstract AdminEditUser :
[<RestEase.Path "username">] username : string * [<RestEase.Path "username">] username : string *
@@ -3601,7 +3601,7 @@ type IGitea =
NotificationThread System.Threading.Tasks.Task NotificationThread System.Threading.Tasks.Task
/// Mark notification thread as read by ID /// Mark notification thread as read by ID
[<RestEase.Post "notifications/threads/{id}">] [<RestEase.Patch "notifications/threads/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract NotifyReadThread : abstract NotifyReadThread :
[<RestEase.Path "id">] id : string * [<RestEase.Path "id">] id : string *
@@ -3649,7 +3649,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit an organization /// Edit an organization
[<RestEase.Post "orgs/{org}">] [<RestEase.Patch "orgs/{org}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract OrgEdit : abstract OrgEdit :
[<RestEase.Path "org">] org : string * [<RestEase.Path "org">] org : string *
@@ -3695,7 +3695,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Update a hook /// Update a hook
[<RestEase.Post "orgs/{org}/hooks/{id}">] [<RestEase.Patch "orgs/{org}/hooks/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract OrgEditHook : abstract OrgEditHook :
[<RestEase.Path "org">] org : string * [<RestEase.Path "org">] org : string *
@@ -3742,7 +3742,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Update a label /// Update a label
[<RestEase.Post "orgs/{org}/labels/{id}">] [<RestEase.Patch "orgs/{org}/labels/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract OrgEditLabel : abstract OrgEditLabel :
[<RestEase.Path "org">] org : string * [<RestEase.Path "org">] org : string *
@@ -3984,7 +3984,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit a repository's properties. Only fields that are set will be changed. /// Edit a repository's properties. Only fields that are set will be changed.
[<RestEase.Post "repos/{owner}/{repo}">] [<RestEase.Patch "repos/{owner}/{repo}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEdit : abstract RepoEdit :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -4052,7 +4052,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit a branch protections for a repository. Only fields that are set will be changed /// Edit a branch protections for a repository. Only fields that are set will be changed
[<RestEase.Post "repos/{owner}/{repo}/branch_protections/{name}">] [<RestEase.Patch "repos/{owner}/{repo}/branch_protections/{name}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEditBranchProtection : abstract RepoEditBranchProtection :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -4425,7 +4425,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit a Git hook in a repository /// Edit a Git hook in a repository
[<RestEase.Post "repos/{owner}/{repo}/hooks/git/{id}">] [<RestEase.Patch "repos/{owner}/{repo}/hooks/git/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEditGitHook : abstract RepoEditGitHook :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -4456,7 +4456,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit a hook in a repository /// Edit a hook in a repository
[<RestEase.Post "repos/{owner}/{repo}/hooks/{id}">] [<RestEase.Patch "repos/{owner}/{repo}/hooks/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEditHook : abstract RepoEditHook :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -4573,7 +4573,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit a comment attachment /// Edit a comment attachment
[<RestEase.Post "repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}">] [<RestEase.Patch "repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract IssueEditIssueCommentAttachment : abstract IssueEditIssueCommentAttachment :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -4626,7 +4626,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit an issue. If using deadline only the date will be taken into account, and time of day ignored. /// Edit an issue. If using deadline only the date will be taken into account, and time of day ignored.
[<RestEase.Post "repos/{owner}/{repo}/issues/{index}">] [<RestEase.Patch "repos/{owner}/{repo}/issues/{index}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract IssueEditIssue : abstract IssueEditIssue :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -4669,7 +4669,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit an issue attachment /// Edit an issue attachment
[<RestEase.Post "repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}">] [<RestEase.Patch "repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract IssueEditIssueAttachment : abstract IssueEditIssueAttachment :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -4999,7 +4999,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Update a label /// Update a label
[<RestEase.Post "repos/{owner}/{repo}/labels/{id}">] [<RestEase.Patch "repos/{owner}/{repo}/labels/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract IssueEditLabel : abstract IssueEditLabel :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -5073,7 +5073,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Update a milestone /// Update a milestone
[<RestEase.Post "repos/{owner}/{repo}/milestones/{id}">] [<RestEase.Patch "repos/{owner}/{repo}/milestones/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract IssueEditMilestone : abstract IssueEditMilestone :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -5157,7 +5157,7 @@ type IGitea =
PullRequest System.Threading.Tasks.Task PullRequest System.Threading.Tasks.Task
/// Update a pull request. If using deadline only the date will be taken into account, and time of day ignored. /// Update a pull request. If using deadline only the date will be taken into account, and time of day ignored.
[<RestEase.Post "repos/{owner}/{repo}/pulls/{index}">] [<RestEase.Patch "repos/{owner}/{repo}/pulls/{index}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEditPullRequest : abstract RepoEditPullRequest :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -5495,7 +5495,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Update a release /// Update a release
[<RestEase.Post "repos/{owner}/{repo}/releases/{id}">] [<RestEase.Patch "repos/{owner}/{repo}/releases/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEditRelease : abstract RepoEditRelease :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -5538,7 +5538,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit a release attachment /// Edit a release attachment
[<RestEase.Post "repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}">] [<RestEase.Patch "repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEditReleaseAttachment : abstract RepoEditReleaseAttachment :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -5845,7 +5845,7 @@ type IGitea =
unit System.Threading.Tasks.Task unit System.Threading.Tasks.Task
/// Edit a wiki page /// Edit a wiki page
[<RestEase.Post "repos/{owner}/{repo}/wiki/page/{pageName}">] [<RestEase.Patch "repos/{owner}/{repo}/wiki/page/{pageName}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract RepoEditWikiPage : abstract RepoEditWikiPage :
[<RestEase.Path "owner">] owner : string * [<RestEase.Path "owner">] owner : string *
@@ -5936,7 +5936,7 @@ type IGitea =
[<RestEase.Path "id">] id : int * ?ct : System.Threading.CancellationToken -> unit System.Threading.Tasks.Task [<RestEase.Path "id">] id : int * ?ct : System.Threading.CancellationToken -> unit System.Threading.Tasks.Task
/// Edit a team /// Edit a team
[<RestEase.Post "teams/{id}">] [<RestEase.Patch "teams/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract OrgEditTeam : abstract OrgEditTeam :
[<RestEase.Path "id">] id : int * [<RestEase.Path "id">] id : int *
@@ -6066,7 +6066,7 @@ type IGitea =
[<RestEase.Path "id">] id : int * ?ct : System.Threading.CancellationToken -> unit System.Threading.Tasks.Task [<RestEase.Path "id">] id : int * ?ct : System.Threading.CancellationToken -> unit System.Threading.Tasks.Task
/// update an OAuth2 Application, this includes regenerating the client secret /// update an OAuth2 Application, this includes regenerating the client secret
[<RestEase.Post "user/applications/oauth2/{id}">] [<RestEase.Patch "user/applications/oauth2/{id}">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract UserUpdateOAuth2Application : abstract UserUpdateOAuth2Application :
[<RestEase.Path "id">] id : int * [<RestEase.Path "id">] id : int *
@@ -6204,7 +6204,7 @@ type IGitea =
abstract GetUserSettings : ?ct : System.Threading.CancellationToken -> UserSettings list System.Threading.Tasks.Task abstract GetUserSettings : ?ct : System.Threading.CancellationToken -> UserSettings list System.Threading.Tasks.Task
/// Update user settings /// Update user settings
[<RestEase.Post "user/settings">] [<RestEase.Patch "user/settings">]
[<RestEase.Header("Content-Type", "json")>] [<RestEase.Header("Content-Type", "json")>]
abstract UpdateUserSettings : abstract UpdateUserSettings :
[<RestEase.Body>] body : UserSettingsOptions * ?ct : System.Threading.CancellationToken -> [<RestEase.Body>] body : UserSettingsOptions * ?ct : System.Threading.CancellationToken ->

View File

@@ -13,139 +13,147 @@ module JwtVaultAuthResponse =
/// Parse from a JSON node. /// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JwtVaultAuthResponse = let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JwtVaultAuthResponse =
let arg_10 = let arg_10 =
(match node.["num_uses"] with match node.["num_uses"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("num_uses") sprintf "Required key '%s' not found on JSON object" ("num_uses")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int32> ()
.AsValue()
.GetValue<System.Int32> ()
let arg_9 = let arg_9 =
(match node.["orphan"] with match node.["orphan"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("orphan") sprintf "Required key '%s' not found on JSON object" ("orphan")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Boolean> ()
.AsValue()
.GetValue<System.Boolean> ()
let arg_8 = let arg_8 =
(match node.["entity_id"] with match node.["entity_id"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("entity_id") sprintf "Required key '%s' not found on JSON object" ("entity_id")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
let arg_7 = let arg_7 =
(match node.["token_type"] with match node.["token_type"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("token_type") sprintf "Required key '%s' not found on JSON object" ("token_type")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
let arg_6 = let arg_6 =
(match node.["renewable"] with match node.["renewable"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("renewable") sprintf "Required key '%s' not found on JSON object" ("renewable")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Boolean> ()
.AsValue()
.GetValue<System.Boolean> ()
let arg_5 = let arg_5 =
(match node.["lease_duration"] with match node.["lease_duration"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("lease_duration") sprintf "Required key '%s' not found on JSON object" ("lease_duration")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int32> ()
.AsValue()
.GetValue<System.Int32> ()
let arg_4 = let arg_4 =
(match node.["identity_policies"] with match node.["identity_policies"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("identity_policies") sprintf "Required key '%s' not found on JSON object" ("identity_policies")
) )
) )
| v -> v) | Some node ->
.AsArray () node.AsArray ()
|> Seq.map (fun elt -> elt.AsValue().GetValue<System.String> ()) |> Seq.map (fun elt ->
|> List.ofSeq (match elt with
| null ->
raise (
System.ArgumentNullException
"Expected element of array (element type string) to be non-null, but found a null element"
)
| elt -> elt.AsValue().GetValue<System.String> ())
)
|> List.ofSeq
let arg_3 = let arg_3 =
(match node.["token_policies"] with match node.["token_policies"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("token_policies") sprintf "Required key '%s' not found on JSON object" ("token_policies")
) )
) )
| v -> v) | Some node ->
.AsArray () node.AsArray ()
|> Seq.map (fun elt -> elt.AsValue().GetValue<System.String> ()) |> Seq.map (fun elt ->
|> List.ofSeq (match elt with
| null ->
raise (
System.ArgumentNullException
"Expected element of array (element type string) to be non-null, but found a null element"
)
| elt -> elt.AsValue().GetValue<System.String> ())
)
|> List.ofSeq
let arg_2 = let arg_2 =
(match node.["policies"] with match node.["policies"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("policies") sprintf "Required key '%s' not found on JSON object" ("policies")
) )
) )
| v -> v) | Some node ->
.AsArray () node.AsArray ()
|> Seq.map (fun elt -> elt.AsValue().GetValue<System.String> ()) |> Seq.map (fun elt ->
|> List.ofSeq (match elt with
| null ->
raise (
System.ArgumentNullException
"Expected element of array (element type string) to be non-null, but found a null element"
)
| elt -> elt.AsValue().GetValue<System.String> ())
)
|> List.ofSeq
let arg_1 = let arg_1 =
(match node.["accessor"] with match node.["accessor"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("accessor") sprintf "Required key '%s' not found on JSON object" ("accessor")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
let arg_0 = let arg_0 =
(match node.["client_token"] with match node.["client_token"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("client_token") sprintf "Required key '%s' not found on JSON object" ("client_token")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
{ {
ClientToken = arg_0 ClientToken = arg_0
@@ -168,64 +176,54 @@ module JwtVaultResponse =
/// Parse from a JSON node. /// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JwtVaultResponse = let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JwtVaultResponse =
let arg_4 = let arg_4 =
JwtVaultAuthResponse.jsonParse ( match node.["auth"] |> Option.ofObj with
match node.["auth"] with | None ->
| null -> raise (
raise ( System.Collections.Generic.KeyNotFoundException (
System.Collections.Generic.KeyNotFoundException ( sprintf "Required key '%s' not found on JSON object" ("auth")
sprintf "Required key '%s' not found on JSON object" ("auth")
)
) )
| v -> v )
) | Some node -> JwtVaultAuthResponse.jsonParse node
let arg_3 = let arg_3 =
(match node.["lease_duration"] with match node.["lease_duration"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("lease_duration") sprintf "Required key '%s' not found on JSON object" ("lease_duration")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int32> ()
.AsValue()
.GetValue<System.Int32> ()
let arg_2 = let arg_2 =
(match node.["renewable"] with match node.["renewable"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("renewable") sprintf "Required key '%s' not found on JSON object" ("renewable")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Boolean> ()
.AsValue()
.GetValue<System.Boolean> ()
let arg_1 = let arg_1 =
(match node.["lease_id"] with match node.["lease_id"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("lease_id") sprintf "Required key '%s' not found on JSON object" ("lease_id")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
let arg_0 = let arg_0 =
(match node.["request_id"] with match node.["request_id"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("request_id") sprintf "Required key '%s' not found on JSON object" ("request_id")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
{ {
RequestId = arg_0 RequestId = arg_0
@@ -242,190 +240,246 @@ module JwtSecretResponse =
/// Parse from a JSON node. /// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JwtSecretResponse = let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JwtSecretResponse =
let arg_11 = let arg_11 =
(match node.["data8"] with match node.["data8"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data8") sprintf "Required key '%s' not found on JSON object" ("data8")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) let key = (kvp.Key)
let value = (kvp.Value).AsValue().GetValue<string> () |> System.Uri let value = kvp.Value
key, value
) key,
|> Seq.map System.Collections.Generic.KeyValuePair (match value with
|> System.Collections.Generic.Dictionary | null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type URI to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<string> () |> System.Uri)
)
|> Seq.map System.Collections.Generic.KeyValuePair
|> System.Collections.Generic.Dictionary
let arg_10 = let arg_10 =
(match node.["data7"] with match node.["data7"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data7") sprintf "Required key '%s' not found on JSON object" ("data7")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) let key = (kvp.Key)
let value = (kvp.Value).AsValue().GetValue<System.Int32> () let value = kvp.Value
key, value
) key,
|> Map.ofSeq (match value with
| null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type int32 to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.Int32> ())
)
|> Map.ofSeq
let arg_9 = let arg_9 =
(match node.["data6"] with match node.["data6"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data6") sprintf "Required key '%s' not found on JSON object" ("data6")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) |> System.Uri let key = (kvp.Key) |> System.Uri
let value = (kvp.Value).AsValue().GetValue<System.String> () let value = kvp.Value
key, value
) key,
|> dict (match value with
| null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type string to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.String> ())
)
|> dict
let arg_8 = let arg_8 =
(match node.["data5"] with match node.["data5"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data5") sprintf "Required key '%s' not found on JSON object" ("data5")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) |> System.Uri let key = (kvp.Key) |> System.Uri
let value = (kvp.Value).AsValue().GetValue<System.String> () let value = kvp.Value
key, value
) key,
|> readOnlyDict (match value with
| null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type string to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.String> ())
)
|> readOnlyDict
let arg_7 = let arg_7 =
(match node.["data4"] with match node.["data4"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data4") sprintf "Required key '%s' not found on JSON object" ("data4")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) let key = (kvp.Key)
let value = (kvp.Value).AsValue().GetValue<System.String> () let value = kvp.Value
key, value
) key,
|> Map.ofSeq (match value with
| null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type string to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.String> ())
)
|> Map.ofSeq
let arg_6 = let arg_6 =
(match node.["data3"] with match node.["data3"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data3") sprintf "Required key '%s' not found on JSON object" ("data3")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) let key = (kvp.Key)
let value = (kvp.Value).AsValue().GetValue<System.String> () let value = kvp.Value
key, value
) key,
|> Seq.map System.Collections.Generic.KeyValuePair (match value with
|> System.Collections.Generic.Dictionary | null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type string to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.String> ())
)
|> Seq.map System.Collections.Generic.KeyValuePair
|> System.Collections.Generic.Dictionary
let arg_5 = let arg_5 =
(match node.["data2"] with match node.["data2"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data2") sprintf "Required key '%s' not found on JSON object" ("data2")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) let key = (kvp.Key)
let value = (kvp.Value).AsValue().GetValue<System.String> () let value = kvp.Value
key, value
) key,
|> dict (match value with
| null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type string to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.String> ())
)
|> dict
let arg_4 = let arg_4 =
(match node.["data"] with match node.["data"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("data") sprintf "Required key '%s' not found on JSON object" ("data")
) )
) )
| v -> v) | Some node ->
.AsObject () node.AsObject ()
|> Seq.map (fun kvp -> |> Seq.map (fun kvp ->
let key = (kvp.Key) let key = (kvp.Key)
let value = (kvp.Value).AsValue().GetValue<System.String> () let value = kvp.Value
key, value
) key,
|> readOnlyDict (match value with
| null ->
raise (
System.ArgumentNullException
"Expected dictionary value of type string to be non-null, but it was null"
)
| value -> value.AsValue().GetValue<System.String> ())
)
|> readOnlyDict
let arg_3 = let arg_3 =
(match node.["lease_duration"] with match node.["lease_duration"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("lease_duration") sprintf "Required key '%s' not found on JSON object" ("lease_duration")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Int32> ()
.AsValue()
.GetValue<System.Int32> ()
let arg_2 = let arg_2 =
(match node.["renewable"] with match node.["renewable"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("renewable") sprintf "Required key '%s' not found on JSON object" ("renewable")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.Boolean> ()
.AsValue()
.GetValue<System.Boolean> ()
let arg_1 = let arg_1 =
(match node.["lease_id"] with match node.["lease_id"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("lease_id") sprintf "Required key '%s' not found on JSON object" ("lease_id")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
let arg_0 = let arg_0 =
(match node.["request_id"] with match node.["request_id"] |> Option.ofObj with
| null -> | None ->
raise ( raise (
System.Collections.Generic.KeyNotFoundException ( System.Collections.Generic.KeyNotFoundException (
sprintf "Required key '%s' not found on JSON object" ("request_id") sprintf "Required key '%s' not found on JSON object" ("request_id")
) )
) )
| v -> v) | Some node -> node.AsValue().GetValue<System.String> ()
.AsValue()
.GetValue<System.String> ()
{ {
RequestId = arg_0 RequestId = arg_0
@@ -496,6 +550,15 @@ module VaultClient =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type JwtSecretResponse"
)
| jsonNode -> jsonNode)
return JwtSecretResponse.jsonParse jsonNode return JwtSecretResponse.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -532,6 +595,15 @@ module VaultClient =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type JwtVaultResponse"
)
| jsonNode -> jsonNode)
return JwtVaultResponse.jsonParse jsonNode return JwtVaultResponse.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -590,6 +662,15 @@ module VaultClientNonExtensionMethod =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type JwtSecretResponse"
)
| jsonNode -> jsonNode)
return JwtSecretResponse.jsonParse jsonNode return JwtSecretResponse.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -626,6 +707,15 @@ module VaultClientNonExtensionMethod =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type JwtVaultResponse"
)
| jsonNode -> jsonNode)
return JwtVaultResponse.jsonParse jsonNode return JwtVaultResponse.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -687,6 +777,15 @@ module VaultClientExtensionMethodHttpClientExtension =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type JwtSecretResponse"
)
| jsonNode -> jsonNode)
return JwtSecretResponse.jsonParse jsonNode return JwtSecretResponse.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
@@ -723,6 +822,15 @@ module VaultClientExtensionMethodHttpClientExtension =
System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct) System.Text.Json.Nodes.JsonNode.ParseAsync (responseStream, cancellationToken = ct)
|> Async.AwaitTask |> Async.AwaitTask
let jsonNode =
(match jsonNode with
| null ->
raise (
System.ArgumentNullException
"Response from server was the JSON null object; expected a non-nullable type JwtVaultResponse"
)
| jsonNode -> jsonNode)
return JwtVaultResponse.jsonParse jsonNode return JwtVaultResponse.jsonParse jsonNode
} }
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct)) |> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))

View File

@@ -136,7 +136,7 @@ module InnerTypeWithBoth =
ret.Add (key.ToString (), System.Text.Json.Nodes.JsonValue.Create<Uri> value) ret.Add (key.ToString (), System.Text.Json.Nodes.JsonValue.Create<Uri> value)
ret ret
) input.Map ) input.ReadOnlyDict
) )
node node

View File

@@ -68,7 +68,7 @@ module TestArgParser =
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment envCalls |> ignore<int> Interlocked.Increment envCalls |> ignore<int>
"" None
let args = [ "--foo=3" ; "--non-existent" ; "--bar=4" ; "--baz=true" ] let args = [ "--foo=3" ; "--non-existent" ; "--bar=4" ; "--baz=true" ]
@@ -91,7 +91,7 @@ module TestArgParser =
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment envCalls |> ignore<int> Interlocked.Increment envCalls |> ignore<int>
"" None
let property (args : (int * bool) list) (afterDoubleDash : int list option) = let property (args : (int * bool) list) (afterDoubleDash : int list option) =
let flatArgs = let flatArgs =
@@ -127,7 +127,7 @@ module TestArgParser =
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment envCalls |> ignore<int> Interlocked.Increment envCalls |> ignore<int>
"" None
let args = [ "--foo=3" ; "--rest" ; "7" ; "--bar=4" ; "--baz=true" ; "--rest=8" ] let args = [ "--foo=3" ; "--rest" ; "7" ; "--bar=4" ; "--baz=true" ; "--rest=8" ]
@@ -150,7 +150,7 @@ module TestArgParser =
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment envCalls |> ignore<int> Interlocked.Increment envCalls |> ignore<int>
"" None
let args = [ "--foo=3" ; "--foo" ; "9" ; "--bar=4" ; "--baz=true" ; "--baz=false" ] let args = [ "--foo=3" ; "--foo" ; "9" ; "--bar=4" ; "--baz=true" ; "--baz=false" ]
@@ -171,7 +171,7 @@ Argument '--baz' was supplied multiple times: True and false"""
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment envCalls |> ignore<int> Interlocked.Increment envCalls |> ignore<int>
"" None
let args = [ "--" ; "--foo=3" ; "--bar=4" ; "--baz=true" ] let args = [ "--" ; "--foo=3" ; "--bar=4" ; "--baz=true" ]
@@ -191,7 +191,7 @@ Required argument '--baz' received no value"""
let ``Help text`` () = let ``Help text`` () =
let getEnvVar (s : string) = let getEnvVar (s : string) =
s |> shouldEqual "CONSUMEPLUGIN_THINGS" s |> shouldEqual "CONSUMEPLUGIN_THINGS"
"hi!" Some "hi!"
let exc = let exc =
Assert.Throws<exn> (fun () -> Basic.parse' getEnvVar [ "--help" ] |> ignore<Basic>) Assert.Throws<exn> (fun () -> Basic.parse' getEnvVar [ "--help" ] |> ignore<Basic>)
@@ -210,7 +210,7 @@ Required argument '--baz' received no value"""
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment envVars |> ignore<int> Interlocked.Increment envVars |> ignore<int>
"" None
let exc = let exc =
Assert.Throws<exn> (fun () -> LoadsOfTypes.parse' getEnvVar [ "--help" ] |> ignore<LoadsOfTypes>) Assert.Throws<exn> (fun () -> LoadsOfTypes.parse' getEnvVar [ "--help" ] |> ignore<LoadsOfTypes>)
@@ -236,7 +236,7 @@ Required argument '--baz' received no value"""
let ``Default values`` () = let ``Default values`` () =
let getEnvVar (s : string) = let getEnvVar (s : string) =
s |> shouldEqual "CONSUMEPLUGIN_THINGS" s |> shouldEqual "CONSUMEPLUGIN_THINGS"
"hi!" Some "hi!"
let args = let args =
[ [
@@ -264,7 +264,7 @@ Required argument '--baz' received no value"""
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment count |> ignore<int> Interlocked.Increment count |> ignore<int>
"" None
let exc = let exc =
Assert.Throws<exn> (fun () -> DatesAndTimes.parse' getEnvVar [ "--help" ] |> ignore<DatesAndTimes>) Assert.Throws<exn> (fun () -> DatesAndTimes.parse' getEnvVar [ "--help" ] |> ignore<DatesAndTimes>)
@@ -285,7 +285,7 @@ Required argument '--baz' received no value"""
let getEnvVar (_ : string) = let getEnvVar (_ : string) =
Interlocked.Increment count |> ignore<int> Interlocked.Increment count |> ignore<int>
"" None
let parsed = let parsed =
DatesAndTimes.parse' DatesAndTimes.parse'
@@ -448,7 +448,7 @@ Required argument '--exact' received no value"""
let ``Bool env vars can be populated`` (envValue : string, boolValue : bool) = let ``Bool env vars can be populated`` (envValue : string, boolValue : bool) =
let getEnvVar (s : string) = let getEnvVar (s : string) =
s |> shouldEqual "CONSUMEPLUGIN_THINGS" s |> shouldEqual "CONSUMEPLUGIN_THINGS"
envValue Some envValue
ContainsBoolEnvVar.parse' getEnvVar [] ContainsBoolEnvVar.parse' getEnvVar []
|> shouldEqual |> shouldEqual
@@ -470,7 +470,7 @@ Required argument '--exact' received no value"""
let ``Flag DUs can be parsed from env var`` (envValue : string, boolValue : bool) = let ``Flag DUs can be parsed from env var`` (envValue : string, boolValue : bool) =
let getEnvVar (s : string) = let getEnvVar (s : string) =
s |> shouldEqual "CONSUMEPLUGIN_THINGS" s |> shouldEqual "CONSUMEPLUGIN_THINGS"
envValue Some envValue
let boolValue = if boolValue then DryRunMode.Dry else DryRunMode.Wet let boolValue = if boolValue then DryRunMode.Dry else DryRunMode.Wet

View File

@@ -43,7 +43,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="ApiSurface" Version="4.1.20"/> <PackageReference Include="ApiSurface" Version="4.1.20"/>
<PackageReference Include="FsCheck" Version="3.1.0"/> <PackageReference Include="FsCheck" Version="3.2.0"/>
<PackageReference Include="FsUnit" Version="7.0.1"/> <PackageReference Include="FsUnit" Version="7.0.1"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0"/> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0"/>
<PackageReference Include="NUnit" Version="4.3.2"/> <PackageReference Include="NUnit" Version="4.3.2"/>

View File

@@ -673,7 +673,7 @@ module internal ArgParserGenerator =
args args
|> Map.toList |> Map.toList
|> List.map (fun (ident, expr) -> SynLongIdent.create [ Ident.create ident ], expr) |> List.map (fun (ident, expr) -> SynLongIdent.create [ Ident.create ident ], expr)
|> AstHelper.instantiateRecord |> SynExpr.createRecord None
) )
tree, counter tree, counter
@@ -1396,7 +1396,7 @@ module internal ArgParserGenerator =
[ [
SynMatchClause.create SynMatchClause.create
SynPat.createNull (SynPat.named "None")
(SynExpr.sequential (SynExpr.sequential
[ [
errorMessage errorMessage
@@ -1406,7 +1406,7 @@ module internal ArgParserGenerator =
unchecked unchecked
]) ])
SynMatchClause.create (SynPat.named "x") parser SynMatchClause.create (SynPat.nameWithArgs "Some" [ SynPat.named "x" ]) parser
] ]
|> SynExpr.createMatch result |> SynExpr.createMatch result
| ArgumentDefaultSpec.FunctionCall name -> | ArgumentDefaultSpec.FunctionCall name ->
@@ -1694,7 +1694,7 @@ module internal ArgParserGenerator =
[ Ident.create "parse'" ] [ Ident.create "parse'" ]
[ [
SynPat.named "getEnvironmentVariable" SynPat.named "getEnvironmentVariable"
|> SynPat.annotateType (SynType.funFromDomain SynType.string SynType.string) |> SynPat.annotateType (SynType.funFromDomain SynType.string (SynType.option SynType.string))
argsParam argsParam
] ]
|> SynBinding.withReturnAnnotation (SynType.createLongIdent [ taggedType.Name ]) |> SynBinding.withReturnAnnotation (SynType.createLongIdent [ taggedType.Name ])
@@ -1708,7 +1708,12 @@ module internal ArgParserGenerator =
let parse = let parse =
SynExpr.createLongIdent' parsePrimeCall SynExpr.createLongIdent' parsePrimeCall
|> SynExpr.applyTo (SynExpr.createLongIdent [ "System" ; "Environment" ; "GetEnvironmentVariable" ]) |> SynExpr.applyTo (
SynExpr.paren (
SynExpr.createLongIdent [ "System" ; "Environment" ; "GetEnvironmentVariable" ]
|> SynExpr.composeWith (SynExpr.createLongIdent [ "Option" ; "ofObj" ])
)
)
|> SynExpr.applyTo (SynExpr.createIdent "args") |> SynExpr.applyTo (SynExpr.createIdent "args")
|> SynBinding.basic [ Ident.create "parse" ] [ argsParam ] |> SynBinding.basic [ Ident.create "parse" ] [ argsParam ]
|> SynBinding.withReturnAnnotation (SynType.createLongIdent [ taggedType.Name ]) |> SynBinding.withReturnAnnotation (SynType.createLongIdent [ taggedType.Name ])

View File

@@ -36,13 +36,6 @@ module internal AstHelper =
| SynTypeDefnRepr.Simple (SynTypeDefnSimpleRepr.Enum _, _) -> true | SynTypeDefnRepr.Simple (SynTypeDefnSimpleRepr.Enum _, _) -> true
| _ -> false | _ -> false
let instantiateRecord (fields : (SynLongIdent * SynExpr) list) : SynExpr =
let fields =
fields
|> List.map (fun (rfn, synExpr) -> SynExprRecordField ((rfn, true), Some range0, Some synExpr, None))
SynExpr.Record (None, None, fields, range0)
let defineRecordType (record : RecordType) : SynTypeDefn = let defineRecordType (record : RecordType) : SynTypeDefn =
let name = let name =
SynComponentInfo.create record.Name SynComponentInfo.create record.Name

View File

@@ -1,6 +1,5 @@
namespace WoofWare.Myriad.Plugins namespace WoofWare.Myriad.Plugins
open System.IO
open System.Net.Http open System.Net.Http
open Fantomas.FCS.Syntax open Fantomas.FCS.Syntax
open WoofWare.Whippet.Fantomas open WoofWare.Whippet.Fantomas
@@ -14,17 +13,6 @@ type internal HttpClientGeneratorOutputSpec =
module internal HttpClientGenerator = module internal HttpClientGenerator =
open Fantomas.FCS.Text.Range open Fantomas.FCS.Text.Range
let outputFile = FileInfo "/tmp/output.txt"
// do
// use _ = File.Create outputFile.FullName
// ()
let log (line : string) =
// use w = outputFile.AppendText ()
// w.WriteLine line
()
[<RequireQualifiedAccess>] [<RequireQualifiedAccess>]
type PathSpec = type PathSpec =
| Verbatim of string | Verbatim of string
@@ -82,7 +70,7 @@ module internal HttpClientGenerator =
if m = HttpMethod.Get then "Get" if m = HttpMethod.Get then "Get"
elif m = HttpMethod.Post then "Post" elif m = HttpMethod.Post then "Post"
elif m = HttpMethod.Delete then "Delete" elif m = HttpMethod.Delete then "Delete"
elif m = HttpMethod.Patch then "Post" elif m = HttpMethod.Patch then "Patch"
elif m = HttpMethod.Options then "Options" elif m = HttpMethod.Options then "Options"
elif m = HttpMethod.Head then "Head" elif m = HttpMethod.Head then "Head"
elif m = HttpMethod.Put then "Put" elif m = HttpMethod.Put then "Put"
@@ -409,30 +397,59 @@ module internal HttpClientGenerator =
| String -> SynExpr.createIdent "responseString" | String -> SynExpr.createIdent "responseString"
| Stream -> SynExpr.createIdent "responseStream" | Stream -> SynExpr.createIdent "responseStream"
| RestEaseResponseType contents -> | RestEaseResponseType contents ->
let deserialiser = match JsonNodeWithNullability.Identify contents with
JsonParseGenerator.parseNode | CannotBeNull ->
let deserialiser =
JsonParseGenerator.parseNonNullableNode
None
JsonParseGenerator.JsonParseOption.None
contents
(SynExpr.createIdent "jsonNode")
|> SynExpr.paren
|> SynExpr.createThunk
// new RestEase.Response (content : string, response : HttpResponseMessage, deserialiser : unit -> 'T)
SynExpr.createNew
(SynType.app' (SynType.createLongIdent' [ "RestEase" ; "Response" ]) [ SynType.Anon range0 ])
(SynExpr.tupleNoParen
[
SynExpr.createIdent "responseString"
SynExpr.createIdent "response"
deserialiser
])
| Nullable ->
let deserialiser =
JsonParseGenerator.parseNullableNode
None
JsonParseGenerator.JsonParseOption.None
contents
(SynExpr.createIdent "jsonNode")
|> SynExpr.paren
|> SynExpr.createThunk
// new RestEase.Response (content : string, response : HttpResponseMessage, deserialiser : unit -> 'T)
SynExpr.createNew
(SynType.app' (SynType.createLongIdent' [ "RestEase" ; "Response" ]) [ SynType.Anon range0 ])
(SynExpr.tupleNoParen
[
SynExpr.createIdent "responseString"
SynExpr.createIdent "response"
deserialiser
])
| retType ->
match JsonNodeWithNullability.Identify retType with
| Nullable ->
JsonParseGenerator.parseNullableNode
None None
JsonParseGenerator.JsonParseOption.None JsonParseGenerator.JsonParseOption.None
contents retType
(SynExpr.createIdent "jsonNode")
| CannotBeNull ->
JsonParseGenerator.parseNonNullableNode
None
JsonParseGenerator.JsonParseOption.None
retType
(SynExpr.createIdent "jsonNode") (SynExpr.createIdent "jsonNode")
|> SynExpr.paren
|> SynExpr.createThunk
// new RestEase.Response (content : string, response : HttpResponseMessage, deserialiser : unit -> 'T)
SynExpr.createNew
(SynType.app' (SynType.createLongIdent' [ "RestEase" ; "Response" ]) [ SynType.Anon range0 ])
(SynExpr.tupleNoParen
[
SynExpr.createIdent "responseString"
SynExpr.createIdent "response"
deserialiser
])
| retType ->
JsonParseGenerator.parseNode
None
JsonParseGenerator.JsonParseOption.None
retType
(SynExpr.createIdent "jsonNode")
let contentTypeHeader, memberHeaders = let contentTypeHeader, memberHeaders =
info.Headers info.Headers
@@ -505,23 +522,45 @@ module internal HttpClientGenerator =
) )
] ]
| BodyParamMethods.Serialise ty -> | BodyParamMethods.Serialise ty ->
let isNullable =
match JsonNodeWithNullability.Identify ty with
| CannotBeNull -> false
| Nullable -> true
[ [
Let ( Let (
"queryParams", "queryParams",
createStringContent ( createStringContent (
SynExpr.createIdent' bodyParamName SynExpr.createIdent' bodyParamName
|> SynExpr.pipeThroughFunction (fst (JsonSerializeGenerator.serializeNode ty)) |> SynExpr.pipeThroughFunction (
fst (
(if isNullable then
JsonSerializeGenerator.serializeNodeNullable
else
JsonSerializeGenerator.serializeNodeNonNullable)
ty
)
)
|> SynExpr.pipeThroughFunction ( |> SynExpr.pipeThroughFunction (
SynExpr.createLambda SynExpr.createLambda
"node" "node"
(SynExpr.ifThenElse (if isNullable then
(SynExpr.applyFunction SynExpr.createMatch
(SynExpr.createIdent "isNull") (SynExpr.createIdent "node")
(SynExpr.createIdent "node")) [
(SynExpr.applyFunction SynMatchClause.create
(SynExpr.createLongIdent [ "node" ; "ToJsonString" ]) (SynPat.named "None")
(SynExpr.CreateConst ())) (SynExpr.CreateConst "null")
(SynExpr.CreateConst "null")) SynMatchClause.create
(SynPat.nameWithArgs "Some" [ SynPat.named "node" ])
(SynExpr.applyFunction
(SynExpr.createLongIdent [ "node" ; "ToJsonString" ])
(SynExpr.CreateConst ()))
]
else
(SynExpr.applyFunction
(SynExpr.createLongIdent [ "node" ; "ToJsonString" ])
(SynExpr.CreateConst ())))
) )
) )
) )
@@ -568,6 +607,24 @@ module internal HttpClientGenerator =
) )
) )
let jsonNodeWithoutNull =
match JsonNodeWithNullability.Identify info.TaskReturnType with
| Nullable ->
Let (
"jsonNode",
SynExpr.createIdent "jsonNode"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Option" ; "ofObj" ])
)
| CannotBeNull ->
Let (
"jsonNode",
JsonSerializeGenerator.assertNotNull
(Ident.create "jsonNode")
(SynExpr.CreateConst
$"Response from server was the JSON null object; expected a non-nullable type %s{SynType.toHumanReadableString info.TaskReturnType}")
(SynExpr.createIdent "jsonNode")
)
let setVariableHeaders = let setVariableHeaders =
variableHeaders variableHeaders
|> List.map (fun (headerName, callToGetValue) -> |> List.map (fun (headerName, callToGetValue) ->
@@ -642,6 +699,7 @@ module internal HttpClientGenerator =
yield responseString yield responseString
yield responseStream yield responseStream
yield jsonNode yield jsonNode
yield jsonNodeWithoutNull
| String -> yield responseString | String -> yield responseString
| Stream -> yield responseStream | Stream -> yield responseStream
| UnitType -> | UnitType ->
@@ -650,6 +708,7 @@ module internal HttpClientGenerator =
| _ -> | _ ->
yield responseStream yield responseStream
yield jsonNode yield jsonNode
yield jsonNodeWithoutNull
] ]
|> SynExpr.createCompExpr "async" returnExpr |> SynExpr.createCompExpr "async" returnExpr
|> SynExpr.startAsTask cancellationTokenArg |> SynExpr.startAsTask cancellationTokenArg

View File

@@ -89,7 +89,7 @@ module internal InterfaceMockGenerator =
[] []
else else
[ SynPat.unit ]) [ SynPat.unit ])
(AstHelper.instantiateRecord constructorFields) (SynExpr.createRecord None constructorFields)
|> SynBinding.withXmlDoc (PreXmlDoc.create "An implementation where every method throws.") |> SynBinding.withXmlDoc (PreXmlDoc.create "An implementation where every method throws.")
|> SynBinding.withReturnAnnotation constructorReturnType |> SynBinding.withReturnAnnotation constructorReturnType
|> SynMemberDefn.staticMember |> SynMemberDefn.staticMember

View File

@@ -26,7 +26,7 @@ module internal JsonParseGenerator =
} }
/// (match {indexed} with | null -> raise (System.Collections.Generic.KeyNotFoundException ({propertyName} not found)) | v -> v) /// (match {indexed} with | null -> raise (System.Collections.Generic.KeyNotFoundException ({propertyName} not found)) | v -> v)
let assertNotNull (propertyName : SynExpr) (indexed : SynExpr) = let assertPropertyExists (propertyName : SynExpr) (indexed : SynExpr) =
let raiseExpr = let raiseExpr =
SynExpr.applyFunction SynExpr.applyFunction
(SynExpr.createIdent "sprintf") (SynExpr.createIdent "sprintf")
@@ -40,34 +40,34 @@ module internal JsonParseGenerator =
|> SynExpr.applyFunction (SynExpr.createIdent "raise") |> SynExpr.applyFunction (SynExpr.createIdent "raise")
[ [
SynMatchClause.create SynPat.createNull raiseExpr SynMatchClause.create (SynPat.named "None") raiseExpr
SynMatchClause.create (SynPat.named "v") (SynExpr.createIdent "v") SynMatchClause.create (SynPat.nameWithArgs "Some" [ SynPat.named "v" ]) (SynExpr.createIdent "v")
] ]
|> SynExpr.createMatch indexed |> SynExpr.createMatch indexed
|> SynExpr.paren |> SynExpr.paren
/// {node}.AsValue().GetValue<{typeName}> () /// {node}.AsValue().GetValue<{typeName}> ()
/// If `propertyName` is Some, uses `assertNotNull {node}` instead of `{node}`. /// If `propertyName` is Some, uses `assertPropertyExists {node}` instead of `{node}`.
let asValueGetValue (propertyName : SynExpr option) (typeName : string) (node : SynExpr) : SynExpr = let asValueGetValue (propertyName : SynExpr option) (typeName : string) (node : SynExpr) : SynExpr =
match propertyName with match propertyName with
| None -> node | None -> node
| Some propertyName -> assertNotNull propertyName node | Some propertyName -> assertPropertyExists propertyName node
|> SynExpr.callMethod "AsValue" |> SynExpr.callMethod "AsValue"
|> SynExpr.callGenericMethod' "GetValue" typeName |> SynExpr.callGenericMethod' "GetValue" typeName
let asValueGetValueIdent (propertyName : SynExpr option) (typeName : LongIdent) (node : SynExpr) : SynExpr = let asValueGetValueIdent (propertyName : SynExpr option) (typeName : LongIdent) (node : SynExpr) : SynExpr =
match propertyName with match propertyName with
| None -> node | None -> node
| Some propertyName -> assertNotNull propertyName node | Some propertyName -> assertPropertyExists propertyName node
|> SynExpr.callMethod "AsValue" |> SynExpr.callMethod "AsValue"
|> SynExpr.callGenericMethod (SynLongIdent.createS "GetValue") [ SynType.createLongIdent typeName ] |> SynExpr.callGenericMethod (SynLongIdent.createS "GetValue") [ SynType.createLongIdent typeName ]
/// {node}.AsObject() /// {node}.AsObject()
/// If `propertyName` is Some, uses `assertNotNull {node}` instead of `{node}`. /// If `propertyName` is Some, uses `assertPropertyExists {node}` instead of `{node}`.
let asObject (propertyName : SynExpr option) (node : SynExpr) : SynExpr = let asObject (propertyName : SynExpr option) (node : SynExpr) : SynExpr =
match propertyName with match propertyName with
| None -> node | None -> node
| Some propertyName -> assertNotNull propertyName node | Some propertyName -> assertPropertyExists propertyName node
|> SynExpr.callMethod "AsObject" |> SynExpr.callMethod "AsObject"
/// {type}.jsonParse {node} /// {type}.jsonParse {node}
@@ -77,11 +77,12 @@ module internal JsonParseGenerator =
/// collectionType is e.g. "List"; we'll be calling `ofSeq` on it. /// collectionType is e.g. "List"; we'll be calling `ofSeq` on it.
/// body is the body of a lambda which takes a parameter `elt`. /// body is the body of a lambda which takes a parameter `elt`.
/// {assertNotNull node}.AsArray() /// {assertPropertyExists node}.AsArray()
/// |> Seq.map (fun elt -> {body}) /// |> Seq.map (fun elt -> {assertNotNull} {body})
/// |> {collectionType}.ofSeq /// |> {collectionType}.ofSeq
let asArrayMapped let asArrayMapped
(propertyName : SynExpr option) (propertyName : SynExpr option)
(elementType : SynType)
(collectionType : string) (collectionType : string)
(node : SynExpr) (node : SynExpr)
(body : SynExpr) (body : SynExpr)
@@ -89,10 +90,23 @@ module internal JsonParseGenerator =
= =
match propertyName with match propertyName with
| None -> node | None -> node
| Some propertyName -> assertNotNull propertyName node | Some propertyName -> assertPropertyExists propertyName node
|> SynExpr.callMethod "AsArray" |> SynExpr.callMethod "AsArray"
|> SynExpr.pipeThroughFunction ( |> SynExpr.pipeThroughFunction (
SynExpr.applyFunction (SynExpr.createLongIdent [ "Seq" ; "map" ]) (SynExpr.createLambda "elt" body) body
|> JsonSerializeGenerator.assertNotNull
(Ident.create "elt")
(match propertyName with
| None ->
SynExpr.CreateConst
$"Expected element of array (element type %s{SynType.toHumanReadableString elementType}) to be non-null, but found a null element"
| Some propertyName ->
SynExpr.CreateConst
$"Expected element of array (element type %s{SynType.toHumanReadableString elementType}) to be non-null, but found a null element, at %%s"
|> SynExpr.applyFunction (SynExpr.createIdent "sprintf")
|> SynExpr.applyTo propertyName)
|> SynExpr.createLambda "elt"
|> SynExpr.applyFunction (SynExpr.createLongIdent [ "Seq" ; "map" ])
) )
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ collectionType ; "ofSeq" ]) |> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ collectionType ; "ofSeq" ])
@@ -101,14 +115,41 @@ module internal JsonParseGenerator =
/// fun kvp -> let key = {key(kvp)} in let value = {value(kvp)} in (key, value)) /// fun kvp -> let key = {key(kvp)} in let value = {value(kvp)} in (key, value))
/// The inputs will be fed with appropriate SynExprs to apply them to the `kvp.Key` and `kvp.Value` args. /// The inputs will be fed with appropriate SynExprs to apply them to the `kvp.Key` and `kvp.Value` args.
let dictionaryMapper (key : SynExpr -> SynExpr) (value : SynExpr -> SynExpr) : SynExpr = let dictionaryMapper
(propertyName : SynExpr option)
(valueTypeIsNullable : bool)
(key : SynExpr -> SynExpr)
(valueType : SynType)
(value : SynExpr -> SynExpr)
: SynExpr
=
let keyArg = SynExpr.createLongIdent [ "kvp" ; "Key" ] |> SynExpr.paren let keyArg = SynExpr.createLongIdent [ "kvp" ; "Key" ] |> SynExpr.paren
let valueArg = SynExpr.createLongIdent [ "kvp" ; "Value" ] |> SynExpr.paren let valueArg = SynExpr.createLongIdent [ "kvp" ; "Value" ]
let value =
if valueTypeIsNullable then
(value (SynExpr.createIdent "value"))
else
let errorMessage =
match propertyName with
| None ->
SynExpr.CreateConst
$"Expected dictionary value of type %s{SynType.toHumanReadableString valueType} to be non-null, but it was null"
| Some propertyName ->
SynExpr.CreateConst
$"Expected dictionary value of type %s{SynType.toHumanReadableString valueType} to be non-null, but it was null, at key %%s"
|> SynExpr.applyFunction (SynExpr.createIdent "sprintf")
|> SynExpr.applyTo propertyName
JsonSerializeGenerator.assertNotNull
(Ident.create "value")
errorMessage
(value (SynExpr.createIdent "value"))
// No need to paren here, we're on the LHS of a `let` // No need to paren here, we're on the LHS of a `let`
SynExpr.tupleNoParen [ SynExpr.createIdent "key" ; SynExpr.createIdent "value" ] SynExpr.tupleNoParen [ SynExpr.createIdent "key" ; value ]
|> SynExpr.createLet [ SynBinding.basic [ Ident.create "value" ] [] (value valueArg) ] |> SynExpr.createLet [ SynBinding.basic [ Ident.create "value" ] [] valueArg ]
|> SynExpr.createLet [ SynBinding.basic [ Ident.create "key" ] [] (key keyArg) ] |> SynExpr.createLet [ SynBinding.basic [ Ident.create "key" ] [] (key keyArg) ]
|> SynExpr.createLambda "kvp" |> SynExpr.createLambda "kvp"
@@ -165,10 +206,61 @@ module internal JsonParseGenerator =
)) ))
handler handler
let rec parseNullableNode
// TODO: unused?!
(propertyName : SynExpr option)
(options : JsonParseOption)
(fieldType : SynType)
(node : SynExpr)
: SynExpr
=
match fieldType with
| OptionType ty ->
match ty with
| OptionType _
| NullableType _ ->
failwith
$"Nested nullable types are not supported, because we can't distinguish between None and Some None. %s{SynType.toHumanReadableString ty}"
| _ ->
let someClause =
parseNonNullableNode None options ty (SynExpr.createIdent "v")
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "Some")
|> SynMatchClause.create (SynPat.nameWithArgs "Some" [ SynPat.named "v" ])
[
SynMatchClause.create (SynPat.named "None") (SynExpr.createIdent "None")
someClause
]
|> SynExpr.createMatch node
| NullableType ty ->
match ty with
| OptionType _
| NullableType _ ->
failwith
$"Nested nullable types are not supported, because we can't distinguish between None and Some None. %s{SynType.toHumanReadableString ty}"
| _ ->
let someClause =
parseNonNullableNode None options ty (SynExpr.createIdent "v")
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "Nullable" ])
|> SynMatchClause.create (SynPat.nameWithArgs "Some" [ SynPat.named "v" ])
[
SynMatchClause.create
(SynPat.named "None")
(SynExpr.applyFunction (SynExpr.createLongIdent [ "System" ; "Nullable" ]) (SynExpr.CreateConst ()))
someClause
]
|> SynExpr.createMatch node
| _ ->
failwith
$"Encountered type %s{SynType.toHumanReadableString fieldType} which is expected to be nullable, but couldn't identify it"
/// Given `node.["town"]`, for example, choose how to obtain a JSON value from it. /// Given `node.["town"]`, for example, choose how to obtain a JSON value from it.
/// The property name is used in error messages at runtime to show where a JSON /// The property name is used in error messages at runtime to show where a JSON
/// parse error occurred; supply `None` to indicate "don't validate". /// parse error occurred; supply `None` to indicate "don't validate".
let rec parseNode and parseNonNullableNode
(propertyName : SynExpr option) (propertyName : SynExpr option)
(options : JsonParseOption) (options : JsonParseOption)
(fieldType : SynType) (fieldType : SynType)
@@ -177,101 +269,184 @@ module internal JsonParseGenerator =
= =
// TODO: parsing format for DateTime etc // TODO: parsing format for DateTime etc
match fieldType with match fieldType with
| OptionType _
| NullableType _ ->
failwith
$"Unexpectedly parsing nullable type %s{SynType.toHumanReadableString fieldType} as if it were non-nullable."
// Struct types
| DateOnly -> | DateOnly ->
node node
|> asValueGetValue propertyName "string" |> asValueGetValue propertyName "string"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "DateOnly" ; "Parse" ]) |> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "DateOnly" ; "Parse" ])
| Uri ->
node
|> asValueGetValue propertyName "string"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "Uri" ])
| Guid ->
node
|> asValueGetValue propertyName "string"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "Guid" ; "Parse" ])
| DateTime -> | DateTime ->
node node
|> asValueGetValue propertyName "string" |> asValueGetValue propertyName "string"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "DateTime" ; "Parse" ]) |> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "DateTime" ; "Parse" ])
| NumberType typeName -> parseNumberType options propertyName node typeName
| Guid ->
node
|> asValueGetValue propertyName "string"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "Guid" ; "Parse" ])
// Reference types
| Uri ->
node
|> asValueGetValue propertyName "string"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "Uri" ])
| DateTimeOffset -> | DateTimeOffset ->
node node
|> asValueGetValue propertyName "string" |> asValueGetValue propertyName "string"
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "DateTimeOffset" ; "Parse" ]) |> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "DateTimeOffset" ; "Parse" ])
| NumberType typeName -> parseNumberType options propertyName node typeName
| PrimitiveType typeName -> asValueGetValueIdent propertyName typeName node | PrimitiveType typeName -> asValueGetValueIdent propertyName typeName node
| OptionType ty ->
let someClause =
parseNode None options ty (SynExpr.createIdent "v")
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "Some")
|> SynMatchClause.create (SynPat.named "v")
[
SynMatchClause.create SynPat.createNull (SynExpr.createIdent "None")
someClause
]
|> SynExpr.createMatch node
| NullableType ty ->
let someClause =
parseNode None options ty (SynExpr.createIdent "v")
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "System" ; "Nullable" ])
|> SynMatchClause.create (SynPat.named "v")
[
SynMatchClause.create
SynPat.createNull
(SynExpr.applyFunction (SynExpr.createLongIdent [ "System" ; "Nullable" ]) (SynExpr.CreateConst ()))
someClause
]
|> SynExpr.createMatch node
| ListType ty -> | ListType ty ->
parseNode None options ty (SynExpr.createIdent "elt") match JsonNodeWithNullability.Identify ty with
|> asArrayMapped propertyName "List" node | CannotBeNull ->
parseNonNullableNode None options ty (SynExpr.createIdent "elt")
|> asArrayMapped propertyName ty "List" node
| Nullable ->
parseNullableNode None options ty (SynExpr.createIdent "elt")
|> asArrayMapped propertyName ty "List" node
| ArrayType ty -> | ArrayType ty ->
parseNode None options ty (SynExpr.createIdent "elt") match JsonNodeWithNullability.Identify ty with
|> asArrayMapped propertyName "Array" node | CannotBeNull ->
parseNonNullableNode None options ty (SynExpr.createIdent "elt")
|> asArrayMapped propertyName ty "Array" node
| Nullable ->
parseNullableNode None options ty (SynExpr.createIdent "elt")
|> asArrayMapped propertyName ty "Array" node
| IDictionaryType (keyType, valueType) -> | IDictionaryType (keyType, valueType) ->
node match JsonNodeWithNullability.Identify valueType with
|> asObject propertyName | CannotBeNull ->
|> SynExpr.pipeThroughFunction ( node
SynExpr.applyFunction |> asObject propertyName
(SynExpr.createLongIdent [ "Seq" ; "map" ]) |> SynExpr.pipeThroughFunction (
(dictionaryMapper (parseKeyString keyType) (parseNode None options valueType)) SynExpr.applyFunction
) (SynExpr.createLongIdent [ "Seq" ; "map" ])
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "dict") (dictionaryMapper
propertyName
false
(parseKeyString keyType)
valueType
(parseNonNullableNode None options valueType))
)
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "dict")
| Nullable ->
node
|> asObject propertyName
|> SynExpr.pipeThroughFunction (
SynExpr.applyFunction
(SynExpr.createLongIdent [ "Seq" ; "map" ])
(dictionaryMapper
propertyName
true
(parseKeyString keyType)
valueType
(parseNullableNode None options valueType))
)
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "dict")
| DictionaryType (keyType, valueType) -> | DictionaryType (keyType, valueType) ->
node match JsonNodeWithNullability.Identify valueType with
|> asObject propertyName | CannotBeNull ->
|> SynExpr.pipeThroughFunction ( node
SynExpr.applyFunction |> asObject propertyName
(SynExpr.createLongIdent [ "Seq" ; "map" ]) |> SynExpr.pipeThroughFunction (
(dictionaryMapper (parseKeyString keyType) (parseNode None options valueType)) SynExpr.applyFunction
) (SynExpr.createLongIdent [ "Seq" ; "map" ])
|> SynExpr.pipeThroughFunction ( (dictionaryMapper
SynExpr.applyFunction propertyName
(SynExpr.createLongIdent [ "Seq" ; "map" ]) false
(SynExpr.createLongIdent [ "System" ; "Collections" ; "Generic" ; "KeyValuePair" ]) (parseKeyString keyType)
) valueType
|> SynExpr.pipeThroughFunction ( (parseNonNullableNode None options valueType))
SynExpr.createLongIdent [ "System" ; "Collections" ; "Generic" ; "Dictionary" ] )
) |> SynExpr.pipeThroughFunction (
SynExpr.applyFunction
(SynExpr.createLongIdent [ "Seq" ; "map" ])
(SynExpr.createLongIdent [ "System" ; "Collections" ; "Generic" ; "KeyValuePair" ])
)
|> SynExpr.pipeThroughFunction (
SynExpr.createLongIdent [ "System" ; "Collections" ; "Generic" ; "Dictionary" ]
)
| Nullable ->
node
|> asObject propertyName
|> SynExpr.pipeThroughFunction (
SynExpr.applyFunction
(SynExpr.createLongIdent [ "Seq" ; "map" ])
(dictionaryMapper
propertyName
true
(parseKeyString keyType)
valueType
(parseNullableNode None options valueType))
)
|> SynExpr.pipeThroughFunction (
SynExpr.applyFunction
(SynExpr.createLongIdent [ "Seq" ; "map" ])
(SynExpr.createLongIdent [ "System" ; "Collections" ; "Generic" ; "KeyValuePair" ])
)
|> SynExpr.pipeThroughFunction (
SynExpr.createLongIdent [ "System" ; "Collections" ; "Generic" ; "Dictionary" ]
)
| IReadOnlyDictionaryType (keyType, valueType) -> | IReadOnlyDictionaryType (keyType, valueType) ->
node match JsonNodeWithNullability.Identify valueType with
|> asObject propertyName | CannotBeNull ->
|> SynExpr.pipeThroughFunction ( node
SynExpr.applyFunction |> asObject propertyName
(SynExpr.createLongIdent [ "Seq" ; "map" ]) |> SynExpr.pipeThroughFunction (
(dictionaryMapper (parseKeyString keyType) (parseNode None options valueType)) SynExpr.applyFunction
) (SynExpr.createLongIdent [ "Seq" ; "map" ])
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "readOnlyDict") (dictionaryMapper
propertyName
false
(parseKeyString keyType)
valueType
(parseNonNullableNode None options valueType))
)
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "readOnlyDict")
| Nullable ->
node
|> asObject propertyName
|> SynExpr.pipeThroughFunction (
SynExpr.applyFunction
(SynExpr.createLongIdent [ "Seq" ; "map" ])
(dictionaryMapper
propertyName
true
(parseKeyString keyType)
valueType
(parseNullableNode None options valueType))
)
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "readOnlyDict")
| MapType (keyType, valueType) -> | MapType (keyType, valueType) ->
node match JsonNodeWithNullability.Identify valueType with
|> asObject propertyName | CannotBeNull ->
|> SynExpr.pipeThroughFunction ( node
SynExpr.applyFunction |> asObject propertyName
(SynExpr.createLongIdent [ "Seq" ; "map" ]) |> SynExpr.pipeThroughFunction (
(dictionaryMapper (parseKeyString keyType) (parseNode None options valueType)) SynExpr.applyFunction
) (SynExpr.createLongIdent [ "Seq" ; "map" ])
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Map" ; "ofSeq" ]) (dictionaryMapper
propertyName
false
(parseKeyString keyType)
valueType
(parseNonNullableNode None options valueType))
)
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Map" ; "ofSeq" ])
| Nullable ->
node
|> asObject propertyName
|> SynExpr.pipeThroughFunction (
SynExpr.applyFunction
(SynExpr.createLongIdent [ "Seq" ; "map" ])
(dictionaryMapper
propertyName
true
(parseKeyString keyType)
valueType
(parseNullableNode None options valueType))
)
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Map" ; "ofSeq" ])
| BigInt -> | BigInt ->
node node
|> SynExpr.callMethod "ToJsonString" |> SynExpr.callMethod "ToJsonString"
@@ -282,7 +457,7 @@ module internal JsonParseGenerator =
|> SynExpr.pipeThroughFunction (Measure.getLanguagePrimitivesMeasure primType) |> SynExpr.pipeThroughFunction (Measure.getLanguagePrimitivesMeasure primType)
| JsonNode -> node | JsonNode -> node
| UnitType -> SynExpr.CreateConst () | UnitType -> SynExpr.CreateConst ()
| _ -> | fieldType ->
// Let's just hope that we've also got our own type annotation! // Let's just hope that we've also got our own type annotation!
let typeName = let typeName =
match fieldType with match fieldType with
@@ -291,14 +466,45 @@ module internal JsonParseGenerator =
match propertyName with match propertyName with
| None -> node | None -> node
| Some propertyName -> assertNotNull propertyName node | Some propertyName -> assertPropertyExists propertyName node
|> typeJsonParse typeName |> typeJsonParse typeName
/// propertyName is probably a string literal, but it could be a [<Literal>] variable /// propertyName is probably a string literal, but it could be a [<Literal>] variable
/// The result of this function is the body of a let-binding (not including the LHS of that let-binding). /// The result of this function is the body of a let-binding (not including the LHS of that let-binding).
let createParseRhs (options : JsonParseOption) (propertyName : SynExpr) (fieldType : SynType) : SynExpr = let createParseRhs (options : JsonParseOption) (propertyName : SynExpr) (fieldType : SynType) : SynExpr =
let objectToParse = SynExpr.createIdent "node" |> SynExpr.index propertyName match JsonNodeWithNullability.Identify fieldType with
parseNode (Some propertyName) options fieldType objectToParse | Nullable ->
let objectToParse =
SynExpr.createIdent "node"
|> SynExpr.index propertyName
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Option" ; "ofObj" ])
parseNullableNode (Some propertyName) options fieldType objectToParse
| CannotBeNull ->
[
SynMatchClause.create
(SynPat.named "None")
(SynExpr.applyFunction
(SynExpr.createIdent "raise")
(SynExpr.paren (
SynExpr.applyFunction
(SynExpr.createLongIdent
[ "System" ; "Collections" ; "Generic" ; "KeyNotFoundException" ])
(SynExpr.applyFunction
(SynExpr.createIdent "sprintf")
(SynExpr.CreateConst "Required key '%s' not found on JSON object")
|> SynExpr.applyTo (SynExpr.paren propertyName)
|> SynExpr.paren)
)))
SynMatchClause.create
(SynPat.nameWithArgs "Some" [ SynPat.named "node" ])
(parseNonNullableNode None options fieldType (SynExpr.createIdent "node"))
]
|> SynExpr.createMatch (
SynExpr.createIdent "node"
|> SynExpr.index propertyName
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Option" ; "ofObj" ])
)
let isJsonNumberHandling (literal : LongIdent) : bool = let isJsonNumberHandling (literal : LongIdent) : bool =
match List.rev literal |> List.map (fun ident -> ident.idText) with match List.rev literal |> List.map (fun ident -> ident.idText) with
@@ -480,7 +686,7 @@ module internal JsonParseGenerator =
let finalConstruction = let finalConstruction =
fields fields
|> List.mapi (fun i fieldData -> SynLongIdent.createI fieldData.Ident, SynExpr.createIdent $"arg_%i{i}") |> List.mapi (fun i fieldData -> SynLongIdent.createI fieldData.Ident, SynExpr.createIdent $"arg_%i{i}")
|> AstHelper.instantiateRecord |> SynExpr.createRecord None
(finalConstruction, assignments) (finalConstruction, assignments)
||> List.fold (fun final assignment -> SynExpr.createLet [ assignment ] final) ||> List.fold (fun final assignment -> SynExpr.createLet [ assignment ] final)
@@ -505,7 +711,8 @@ module internal JsonParseGenerator =
|> SynExpr.createLet |> SynExpr.createLet
[ [
SynExpr.index (SynExpr.CreateConst "data") (SynExpr.createIdent "node") SynExpr.index (SynExpr.CreateConst "data") (SynExpr.createIdent "node")
|> assertNotNull (SynExpr.CreateConst "data") |> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Option" ; "ofObj" ])
|> assertPropertyExists (SynExpr.CreateConst "data")
|> SynBinding.basic [ Ident.create "node" ] [] |> SynBinding.basic [ Ident.create "node" ] []
] ]
@@ -553,7 +760,8 @@ module internal JsonParseGenerator =
SynExpr.createIdent "node" SynExpr.createIdent "node"
|> SynExpr.index property |> SynExpr.index property
|> assertNotNull property |> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Option" ; "ofObj" ])
|> assertPropertyExists property
|> SynExpr.pipeThroughFunction ( |> SynExpr.pipeThroughFunction (
SynExpr.createLambda "v" (SynExpr.callGenericMethod' "GetValue" "string" (SynExpr.createIdent "v")) SynExpr.createLambda "v" (SynExpr.callGenericMethod' "GetValue" "string" (SynExpr.createIdent "v"))
) )

View File

@@ -10,24 +10,100 @@ type internal JsonSerializeOutputSpec =
ExtensionMethods : bool ExtensionMethods : bool
} }
/// https://github.com/Smaug123/WoofWare.Myriad/issues/364
/// The insane design of System.Text.Json is finally causing us to
/// do vast amounts of coding rather than merely being very annoying.
type internal JsonNodeWithNullability =
| CannotBeNull
| Nullable
static member Identify (ty : SynType) : JsonNodeWithNullability =
match ty with
| OptionType _
| NullableType _ -> JsonNodeWithNullability.Nullable
| _ -> JsonNodeWithNullability.CannotBeNull
[<RequireQualifiedAccess>] [<RequireQualifiedAccess>]
module internal JsonSerializeGenerator = module internal JsonSerializeGenerator =
open Fantomas.FCS.Text.Range open Fantomas.FCS.Text.Range
// The absolutely galaxy-brained implementation of JsonValue has `JsonValue.Parse "null"` // The absolutely galaxy-brained implementation of JsonValue has `JsonValue.Parse "null"`
// identically equal to null. We have to work around this later, but we might as well just // identically equal to null, so it's hard to use that type. We use `None` instead to represent
// be efficient here and whip up the null directly. // the JSON null value.
let private jsonNull () = let private jsonNull () = SynExpr.createIdent "None"
SynExpr.createNull ()
|> SynExpr.upcast' (SynType.createLongIdent' [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonNode" ]) let assertNotNull (boundIdent : Ident) (message : SynExpr) (body : SynExpr) : SynExpr =
let raiseExpr =
message
|> SynExpr.applyFunction (SynExpr.createLongIdent [ "System" ; "ArgumentNullException" ])
|> SynExpr.paren
|> SynExpr.applyFunction (SynExpr.createIdent "raise")
[
SynMatchClause.create SynPat.createNull raiseExpr
SynMatchClause.create (SynPat.namedI boundIdent) body
]
|> SynExpr.createMatch (SynExpr.createIdent' boundIdent)
|> SynExpr.paren
/// The output of this will be an *optional* JsonNode.
let rec serializeNodeNullable (fieldType : SynType) : SynExpr * bool =
match fieldType with
| NullableType ty ->
// fun field -> if field.HasValue then {serializeNode ty} field.Value else JsonValue.Create null
match JsonNodeWithNullability.Identify ty with
| JsonNodeWithNullability.Nullable ->
failwith
$"We don't support nested nullable types, because we can't tell the difference between None and Some None: %s{SynType.toHumanReadableString ty}"
| JsonNodeWithNullability.CannotBeNull ->
let inner, innerIsJsonNode = serializeNodeNonNullable ty
SynExpr.applyFunction inner (SynExpr.createLongIdent [ "field" ; "Value" ])
|> SynExpr.upcast' (SynType.createLongIdent' [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonNode" ])
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "Some")
|> SynExpr.ifThenElse (SynExpr.createLongIdent [ "field" ; "HasValue" ]) (jsonNull ())
|> SynExpr.createLambda "field"
|> fun e -> e, innerIsJsonNode
| OptionType ty ->
// fun field -> match field with | None -> None | Some v -> {serializeNode ty} field |> Some
match JsonNodeWithNullability.Identify ty with
| JsonNodeWithNullability.Nullable ->
failwith
$"We don't support nested nullable types, because we can't tell the difference between None and Some None: %s{SynType.toHumanReadableString ty}"
| JsonNodeWithNullability.CannotBeNull ->
let noneClause = jsonNull () |> SynMatchClause.create (SynPat.named "None")
let someClause =
let inner, innerIsJsonNode = serializeNodeNonNullable ty
let target = SynExpr.pipeThroughFunction inner (SynExpr.createIdent "field")
if innerIsJsonNode then
target
else
target
|> SynExpr.paren
|> SynExpr.upcast' (SynType.createLongIdent' [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonNode" ])
|> SynExpr.pipeThroughFunction (SynExpr.createIdent "Some")
|> SynMatchClause.create (SynPat.nameWithArgs "Some" [ SynPat.named "field" ])
[ noneClause ; someClause ]
|> SynExpr.createMatch (SynExpr.createIdent "field")
|> SynExpr.createLambda "field"
|> fun e -> e, true
| _ -> failwith $"Did not recognise type %s{SynType.toHumanReadableString fieldType} as nullable"
/// Given `input.Ident`, for example, choose how to add it to the ambient `node`. /// Given `input.Ident`, for example, choose how to add it to the ambient `node`.
/// The result is a line like `(fun ident -> InnerType.toJsonNode ident)` or `(fun ident -> JsonValue.Create ident)`. /// The result is a line like `(fun ident -> InnerType.toJsonNode ident)` or `(fun ident -> JsonValue.Create ident)`.
/// Returns also a bool which is true if the resulting SynExpr represents something of type JsonNode. /// Returns also a bool which is true if the resulting SynExpr represents something of type JsonNode.
let rec serializeNode (fieldType : SynType) : SynExpr * bool = and serializeNodeNonNullable (fieldType : SynType) : SynExpr * bool =
// TODO: serialization format for DateTime etc // TODO: serialization format for DateTime etc
match fieldType with match fieldType with
| OptionType _
| NullableType _ ->
failwith $"Tried to treat the type %s{SynType.toHumanReadableString fieldType} as non-nullable"
| DateOnly | DateOnly
| DateTime | DateTime
| NumberType _ | NumberType _
@@ -36,8 +112,21 @@ module internal JsonSerializeGenerator =
| Guid | Guid
| Uri -> | Uri ->
// JsonValue.Create<type> // JsonValue.Create<type>
SynExpr.createLongIdent [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonValue" ; "Create" ] (SynExpr.createIdent "field")
|> SynExpr.typeApp [ fieldType ] |> assertNotNull
(Ident.create "field")
(SynExpr.CreateConst
$"Expected type %s{SynType.toHumanReadableString fieldType} to be non-null, but received a null value when serialising")
|> SynExpr.createLet
[
SynBinding.basic
[ Ident.create "field" ]
[]
(SynExpr.createLongIdent [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonValue" ; "Create" ]
|> SynExpr.typeApp [ fieldType ]
|> SynExpr.applyTo (SynExpr.createIdent "field"))
]
|> SynExpr.createLambda "field"
|> fun e -> e, false |> fun e -> e, false
| DateTimeOffset -> | DateTimeOffset ->
// fun field -> field.ToString("o") |> JsonValue.Create<string> // fun field -> field.ToString("o") |> JsonValue.Create<string>
@@ -50,41 +139,17 @@ module internal JsonSerializeGenerator =
|> SynExpr.pipeThroughFunction create |> SynExpr.pipeThroughFunction create
|> SynExpr.createLambda "field" |> SynExpr.createLambda "field"
|> fun e -> e, false |> fun e -> e, false
| NullableType ty ->
// fun field -> if field.HasValue then {serializeNode ty} field.Value else JsonValue.Create null
let inner, innerIsJsonNode = serializeNode ty
SynExpr.applyFunction inner (SynExpr.createLongIdent [ "field" ; "Value" ])
|> SynExpr.upcast' (SynType.createLongIdent' [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonNode" ])
|> SynExpr.ifThenElse (SynExpr.createLongIdent [ "field" ; "HasValue" ]) (jsonNull ())
|> SynExpr.createLambda "field"
|> fun e -> e, innerIsJsonNode
| OptionType ty ->
// fun field -> match field with | None -> JsonValue.Create null | Some v -> {serializeNode ty} field
let noneClause = jsonNull () |> SynMatchClause.create (SynPat.named "None")
let someClause =
let inner, innerIsJsonNode = serializeNode ty
let target = SynExpr.applyFunction inner (SynExpr.createIdent "field")
if innerIsJsonNode then
target
else
target
|> SynExpr.paren
|> SynExpr.upcast' (SynType.createLongIdent' [ "System" ; "Text" ; "Json" ; "Nodes" ; "JsonNode" ])
|> SynMatchClause.create (SynPat.nameWithArgs "Some" [ SynPat.named "field" ])
[ noneClause ; someClause ]
|> SynExpr.createMatch (SynExpr.createIdent "field")
|> SynExpr.createLambda "field"
|> fun e -> e, true
| ArrayType ty | ArrayType ty
| ListType ty -> | ListType ty ->
// fun field -> // fun field ->
// let arr = JsonArray () // let arr = JsonArray ()
// for mem in field do arr.Add ({serializeNode} mem) // for mem in field do arr.Add ({serializeNode} mem)
// arr // arr
let isNullableChild =
match JsonNodeWithNullability.Identify ty with
| CannotBeNull -> false
| Nullable -> true
[ [
SynExpr.ForEach ( SynExpr.ForEach (
DebugPointAtFor.Yes range0, DebugPointAtFor.Yes range0,
@@ -95,7 +160,17 @@ module internal JsonSerializeGenerator =
SynExpr.createIdent "field", SynExpr.createIdent "field",
SynExpr.applyFunction SynExpr.applyFunction
(SynExpr.createLongIdent [ "arr" ; "Add" ]) (SynExpr.createLongIdent [ "arr" ; "Add" ])
(SynExpr.paren (SynExpr.applyFunction (fst (serializeNode ty)) (SynExpr.createIdent "mem"))), (SynExpr.paren (
SynExpr.applyFunction
(fst (
(if isNullableChild then
serializeNodeNullable
else
serializeNodeNonNullable)
ty
))
(SynExpr.createIdent "mem")
)),
range0 range0
) )
SynExpr.createIdent "arr" SynExpr.createIdent "arr"
@@ -109,15 +184,28 @@ module internal JsonSerializeGenerator =
] ]
|> SynExpr.createLambda "field" |> SynExpr.createLambda "field"
|> fun e -> e, false |> fun e -> e, false
| IDictionaryType (_keyType, valueType) | IDictionaryType (keyType, valueType)
| DictionaryType (_keyType, valueType) | DictionaryType (keyType, valueType)
| IReadOnlyDictionaryType (_keyType, valueType) | IReadOnlyDictionaryType (keyType, valueType)
| MapType (_keyType, valueType) -> | MapType (keyType, valueType) ->
// fun field -> // fun field ->
// let ret = JsonObject () // let ret = JsonObject ()
// for (KeyValue(key, value)) in field do // for (KeyValue(key, value)) in field do
// ret.Add (key.ToString (), {serializeNode} value) // ret.Add (key.ToString (), {serializeNode} value)
// ret // ret
let isNullableValueField =
match JsonNodeWithNullability.Identify valueType with
| CannotBeNull -> false
| Nullable -> true
// TODO: this is a bit dubious, because user-defined types will
// by default have non-null ToString
let keyTypeHasNonNullToString =
match keyType with
| String
| Uri -> true
| _ -> false
[ [
SynExpr.ForEach ( SynExpr.ForEach (
DebugPointAtFor.Yes range0, DebugPointAtFor.Yes range0,
@@ -130,10 +218,33 @@ module internal JsonSerializeGenerator =
(SynExpr.createLongIdent [ "ret" ; "Add" ]) (SynExpr.createLongIdent [ "ret" ; "Add" ])
(SynExpr.tuple (SynExpr.tuple
[ [
SynExpr.createLongIdent [ "key" ; "ToString" ] SynExpr.createIdent "key"
|> SynExpr.applyTo (SynExpr.CreateConst ()) |> if keyTypeHasNonNullToString then
SynExpr.applyFunction (fst (serializeNode valueType)) (SynExpr.createIdent "value") id
]), else
assertNotNull
(Ident.create "key")
(SynExpr.CreateConst
"A map key unexpectedly yielded null when we `ToString`'ed it. Map keys must yield non-null strings on `ToString`.")
SynExpr.applyFunction
(fst (
(if isNullableValueField then
serializeNodeNullable
else
serializeNodeNonNullable)
valueType
))
(SynExpr.createIdent "value")
])
|> SynExpr.createLet
[
SynBinding.basic
[ Ident.create "key" ]
[]
(SynExpr.createLongIdent [ "key" ; "ToString" ]
|> SynExpr.applyTo (SynExpr.CreateConst ()))
],
range0 range0
) )
SynExpr.createIdent "ret" SynExpr.createIdent "ret"
@@ -166,13 +277,24 @@ module internal JsonSerializeGenerator =
/// propertyName is probably a string literal, but it could be a [<Literal>] variable /// propertyName is probably a string literal, but it could be a [<Literal>] variable
/// `node.Add ({propertyName}, {toJsonNode})` /// `node.Add ({propertyName}, {toJsonNode})`
let createSerializeRhsRecord (propertyName : SynExpr) (fieldId : Ident) (fieldType : SynType) : SynExpr = let createSerializeRhsRecord (propertyName : SynExpr) (fieldId : Ident) (fieldType : SynType) : SynExpr =
[ let isNullableField =
propertyName match JsonNodeWithNullability.Identify fieldType with
SynExpr.pipeThroughFunction | CannotBeNull -> false
(fst (serializeNode fieldType)) | Nullable -> true
(SynExpr.createLongIdent' [ Ident.create "input" ; fieldId ])
|> SynExpr.paren let serialised =
] if isNullableField then
let value =
serializeNodeNullable fieldType
|> fst
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent [ "Option" ; "toObj" ])
SynExpr.pipeThroughFunction value (SynExpr.createLongIdent' [ Ident.create "input" ; fieldId ])
else
let value = serializeNodeNonNullable fieldType |> fst
SynExpr.pipeThroughFunction value (SynExpr.createLongIdent' [ Ident.create "input" ; fieldId ])
[ propertyName ; SynExpr.paren serialised ]
|> SynExpr.tuple |> SynExpr.tuple
|> SynExpr.applyFunction (SynExpr.createLongIdent [ "node" ; "Add" ]) |> SynExpr.applyFunction (SynExpr.createLongIdent [ "node" ; "Add" ])
@@ -278,7 +400,10 @@ module internal JsonSerializeGenerator =
| DictionaryType (String, v) -> v | DictionaryType (String, v) -> v
| _ -> failwith "Expected JsonExtensionData to be a Dictionary<string, something>" | _ -> failwith "Expected JsonExtensionData to be a Dictionary<string, something>"
let serialise = fst (serializeNode valType) let serialise =
match JsonNodeWithNullability.Identify valType with
| CannotBeNull -> fst (serializeNodeNonNullable valType)
| Nullable -> fst (serializeNodeNullable valType)
SynExpr.createIdent "node" SynExpr.createIdent "node"
|> SynExpr.callMethodArg |> SynExpr.callMethodArg
@@ -343,7 +468,15 @@ module internal JsonSerializeGenerator =
let propertyName = getPropertyName (Option.get fieldData.Ident) fieldData.Attrs let propertyName = getPropertyName (Option.get fieldData.Ident) fieldData.Attrs
let node = let node =
SynExpr.applyFunction (fst (serializeNode fieldData.Type)) (SynExpr.createIdent caseName) match JsonNodeWithNullability.Identify fieldData.Type with
| CannotBeNull ->
SynExpr.applyFunction
(fst (serializeNodeNonNullable fieldData.Type))
(SynExpr.createIdent caseName)
| Nullable ->
SynExpr.applyFunction
(fst (serializeNodeNullable fieldData.Type))
(SynExpr.createIdent caseName)
[ propertyName ; node ] [ propertyName ; node ]
|> SynExpr.tuple |> SynExpr.tuple

View File

@@ -97,7 +97,7 @@ module internal RemoveOptionsGenerator =
SynLongIdent.createI fieldData.Ident, body SynLongIdent.createI fieldData.Ident, body
) )
|> AstHelper.instantiateRecord |> SynExpr.createRecord None
SynBinding.basic SynBinding.basic
[ functionName ] [ functionName ]

View File

@@ -198,7 +198,14 @@ and ObjectTypeDefinition =
|> Map.ofSeq |> Map.ofSeq
|> Some |> Some
let example = asObjOpt node "example" let example =
match node.["example"] with
| null -> None
| :? JsonObject as o -> Some o
| _ ->
// Gitea returns a stringified and malformed JSON object here.
// Don't throw; just omit.
None
let required = asArrOpt'<string> node "required" let required = asArrOpt'<string> node "required"
@@ -465,7 +472,7 @@ type HttpMethod =
| HttpMethod.Get -> "Get" | HttpMethod.Get -> "Get"
| HttpMethod.Post -> "Post" | HttpMethod.Post -> "Post"
| HttpMethod.Delete -> "Delete" | HttpMethod.Delete -> "Delete"
| HttpMethod.Patch -> "Post" | HttpMethod.Patch -> "Patch"
| HttpMethod.Options -> "Options" | HttpMethod.Options -> "Options"
| HttpMethod.Head -> "Head" | HttpMethod.Head -> "Head"
| HttpMethod.Put -> "Put" | HttpMethod.Put -> "Put"

View File

@@ -1,7 +1,6 @@
namespace WoofWare.Myriad.Plugins namespace WoofWare.Myriad.Plugins
open System.Collections.Generic open System.Collections.Generic
open System.IO
open System.Threading open System.Threading
open Fantomas.FCS.Syntax open Fantomas.FCS.Syntax
open Fantomas.FCS.Xml open Fantomas.FCS.Xml
@@ -19,6 +18,7 @@ type internal SwaggerClientConfig =
type internal Produces = type internal Produces =
// TODO: this will cope with decoding JSON, plain text, etc // TODO: this will cope with decoding JSON, plain text, etc
| Produces of string | Produces of string
| OctetStream
type internal Endpoint = type internal Endpoint =
{ {
@@ -47,16 +47,8 @@ type internal Types =
[<RequireQualifiedAccess>] [<RequireQualifiedAccess>]
module internal SwaggerClientGenerator = module internal SwaggerClientGenerator =
let outputFile = FileInfo "/tmp/output.txt"
// do let internal log (_ : string) = ()
// use _ = File.Create outputFile.FullName
// ()
let log (line : string) =
// use w = outputFile.AppendText ()
// w.WriteLine line
()
let renderType (types : Types) (defn : Definition) : SynType option = let renderType (types : Types) (defn : Definition) : SynType option =
match types.ByDefinition.TryGetValue defn with match types.ByDefinition.TryGetValue defn with
@@ -477,6 +469,15 @@ module internal SwaggerClientGenerator =
(SynLongIdent.createS' [ "RestEase" ; "Header" ]) (SynLongIdent.createS' [ "RestEase" ; "Header" ])
// Gitea, at least, starts with a `/`, which `Uri` then takes to indicate an absolute path. // Gitea, at least, starts with a `/`, which `Uri` then takes to indicate an absolute path.
(SynExpr.tuple [ SynExpr.CreateConst "Content-Type" ; SynExpr.CreateConst contentType ]) (SynExpr.tuple [ SynExpr.CreateConst "Content-Type" ; SynExpr.CreateConst contentType ])
| Produces.OctetStream ->
SynAttribute.create
(SynLongIdent.createS' [ "RestEase" ; "Header" ])
// Gitea, at least, starts with a `/`, which `Uri` then takes to indicate an absolute path.
(SynExpr.tuple
[
SynExpr.CreateConst "Content-Type"
SynExpr.CreateConst "application/octet-stream"
])
] ]
returnType returnType
@@ -512,6 +513,7 @@ module internal SwaggerClientGenerator =
|> List.singleton |> List.singleton
open Myriad.Core open Myriad.Core
open System.IO
/// Myriad generator that stamps out an interface and class to access a Swagger-specified API. /// Myriad generator that stamps out an interface and class to access a Swagger-specified API.
[<MyriadGenerator("swagger-client")>] [<MyriadGenerator("swagger-client")>]
@@ -622,10 +624,11 @@ type SwaggerClientGenerator () =
let produces = let produces =
match endpoint.Produces with match endpoint.Produces with
| None -> Produces "json" | None -> Produces.Produces "json"
| Some [] -> failwith $"API specified empty Produces: %s{path} (%O{method})" | Some [] -> failwith $"API specified empty Produces: %s{path} (%O{method})"
| Some [ MimeType "application/json" ] -> Produces "json" | Some [ MimeType "application/octet-stream" ] -> Produces.OctetStream
| Some [ MimeType (StartsWith "text/" t) ] -> Produces t | Some [ MimeType "application/json" ] -> Produces.Produces "json"
| Some [ MimeType (StartsWith "text/" t) ] -> Produces.Produces t
| Some [ MimeType s ] -> | Some [ MimeType s ] ->
failwithf failwithf
$"we don't support non-JSON Produces right now, got: %s{s} (%s{path} %O{method})" $"we don't support non-JSON Produces right now, got: %s{s} (%s{path} %O{method})"

View File

@@ -22,7 +22,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Myriad.Core" Version="0.8.3" /> <PackageReference Include="Myriad.Core" Version="0.8.3" />
<PackageReference Include="TypeEquality" Version="0.3.0" /> <PackageReference Include="TypeEquality" Version="0.3.0" />
<PackageReference Include="WoofWare.Whippet.Fantomas" Version="0.3.2" /> <PackageReference Include="WoofWare.Whippet.Fantomas" Version="0.6.3" />
<!-- the lowest version allowed by Myriad.Core --> <!-- the lowest version allowed by Myriad.Core -->
<PackageReference Update="FSharp.Core" Version="6.0.1" PrivateAssets="all"/> <PackageReference Update="FSharp.Core" Version="6.0.1" PrivateAssets="all"/>
</ItemGroup> </ItemGroup>

View File

@@ -1,5 +1,5 @@
{ {
"version": "4.0", "version": "7.0",
"publicReleaseRefSpec": [ "publicReleaseRefSpec": [
"^refs/heads/main$" "^refs/heads/main$"
], ],
@@ -11,4 +11,4 @@
":/README.md", ":/README.md",
":/Directory.Build.props" ":/Directory.Build.props"
] ]
} }

6
flake.lock generated
View File

@@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1744502386, "lastModified": 1744868846,
"narHash": "sha256-QAd1L37eU7ktL2WeLLLTmI6P9moz9+a/ONO8qNBYJgM=", "narHash": "sha256-5RJTdUHDmj12Qsv7XOhuospjAjATNiTMElplWnJE9Hs=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "f6db44a8daa59c40ae41ba6e5823ec77fe0d2124", "rev": "ebe4301cbd8f81c4f8d3244b3632338bbeb6d49c",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -21,8 +21,8 @@
}, },
{ {
"pname": "FsCheck", "pname": "FsCheck",
"version": "3.1.0", "version": "3.2.0",
"hash": "sha256-u0Ha94EjClJ8evNSHu8d6+Dx9qYM3kV3sl1PEq9gF8s=" "hash": "sha256-ksZ4vLgWwyQOzFuK2BczdtDtWWYmedG7UBAg4pYuI8g="
}, },
{ {
"pname": "fsharp-analyzers", "pname": "fsharp-analyzers",
@@ -381,7 +381,7 @@
}, },
{ {
"pname": "WoofWare.Whippet.Fantomas", "pname": "WoofWare.Whippet.Fantomas",
"version": "0.3.2", "version": "0.6.3",
"hash": "sha256-dhzp/ASz1dlROJAfLYRKOCRlmjLBoS00KYeWEkSVtMA=" "hash": "sha256-FkW/HtVp8/HE2k6d7yFpnJcnP3FNNe9kGlkoIWmNgDw="
} }
] ]