Add JSON parse source gen (#9)

This commit is contained in:
Patrick Stevens
2023-12-27 11:46:12 +00:00
committed by GitHub
parent 055aad8c5e
commit 39d603c317
22 changed files with 882 additions and 145 deletions

View File

@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<MyriadSdkGenerator Include="$(MSBuildThisFileDirectory)..\MyriadPlugin\bin\$(Configuration)\net6.0\MyriadPlugin.dll" />
</ItemGroup>
<ItemGroup>
<None Include="myriad.toml" />
<Compile Include="RecordFile.fs" />
<Compile Include="GeneratedRecord.fs"> <!--1-->
<MyriadFile>RecordFile.fs</MyriadFile> <!--2-->
</Compile>
<Compile Include="JsonRecord.fs" />
<Compile Include="GeneratedJson.fs"> <!--1-->
<MyriadFile>JsonRecord.fs</MyriadFile> <!--2-->
</Compile>
<None Include="..\runmyriad.sh">
<Link>runmyriad.sh</Link>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MyriadPlugin\MyriadPlugin.fsproj" />
<PackageReference Include="Myriad.Sdk" Version="0.8.3" />
<PackageReference Include="Myriad.Core" Version="0.8.3" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,28 @@
//------------------------------------------------------------------------------
// This code was generated by myriad.
// Changes to this file will be lost when the code is regenerated.
//------------------------------------------------------------------------------
namespace UsePlugin
/// Module containing an option-truncated version of the RecordType type
[<RequireQualifiedAccess>]
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module RecordType =
/// My whatnot
type Short =
{
/// A thing!
A : int
/// Another thing!
B : string
/// Yet another thing!
C : float list
}
/// Remove the optional members of the input.
let shorten (input : RecordType) : Short =
{
A = input.A |> Option.defaultValue (RecordType.DefaultA ())
B = input.B
C = input.C
}

View File

@@ -0,0 +1,43 @@
//------------------------------------------------------------------------------
// This code was generated by myriad.
// Changes to this file will be lost when the code is regenerated.
//------------------------------------------------------------------------------
namespace ConsumePlugin
/// Module containing JSON parsing methods for the InnerType type
[<RequireQualifiedAccess>]
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module InnerType =
/// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : InnerType =
let Thing = node.[(Literals.something)].AsValue().GetValue<string> ()
{
Thing = Thing
}
namespace ConsumePlugin
/// Module containing JSON parsing methods for the JsonRecordType type
[<RequireQualifiedAccess>]
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module JsonRecordType =
/// Parse from a JSON node.
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : JsonRecordType =
let D = InnerType.jsonParse node.["d"]
let C =
node.["hi"].AsArray ()
|> Seq.map (fun elt -> elt.GetValue<int> ())
|> List.ofSeq
let B2 = node.["another-thing"].AsValue ()
let B = B2.GetValue<string> ()
let A = node.["a"].AsValue().GetValue<int> ()
{
A = A
B = B
C = C
D = D
}

View File

@@ -0,0 +1,28 @@
//------------------------------------------------------------------------------
// This code was generated by myriad.
// Changes to this file will be lost when the code is regenerated.
//------------------------------------------------------------------------------
namespace ConsumePlugin
/// Module containing an option-truncated version of the RecordType type
[<RequireQualifiedAccess>]
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module RecordType =
/// My whatnot
type Short =
{
/// A thing!
A : int
/// Another thing!
B : string
/// Yet another thing!
C : float list
}
/// Remove the optional members of the input.
let shorten (input : RecordType) : Short =
{
A = input.A |> Option.defaultWith RecordType.DefaultA
B = input.B
C = input.C
}

View File

@@ -0,0 +1,28 @@
namespace ConsumePlugin
open System.Text.Json.Serialization
module Literals =
[<Literal>]
let something = "something"
[<MyriadPlugin.JsonParse>]
type InnerType =
{
[<JsonPropertyName(Literals.something)>]
Thing : string
}
/// My whatnot
[<MyriadPlugin.JsonParse>]
type JsonRecordType =
{
/// A thing!
A : int
/// Another thing!
[<JsonPropertyName "another-thing">]
B : string
[<System.Text.Json.Serialization.JsonPropertyName "hi">]
C : int list
D : InnerType
}

View File

@@ -0,0 +1,19 @@
namespace ConsumePlugin
type ParseState =
| AwaitingKey
| AwaitingValue of string
/// My whatnot
[<MyriadPlugin.RemoveOptions>]
type RecordType =
{
/// A thing!
A : int option
/// Another thing!
B : string
/// Yet another thing!
C : float list
}
static member DefaultA () : int = 3

View File