mirror of
https://github.com/Smaug123/WoofWare.Myriad
synced 2025-10-10 06:28:40 +00:00
Compare commits
4 Commits
add-bit-of
...
WoofWare.M
Author | SHA1 | Date | |
---|---|---|---|
|
aece186424 | ||
|
827e9aa3ec | ||
|
d59ebdfccb | ||
|
5319a33b7b |
22
.github/workflows/dotnet.yaml
vendored
22
.github/workflows/dotnet.yaml
vendored
@@ -29,7 +29,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -50,7 +50,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -67,7 +67,7 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -82,7 +82,7 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -97,7 +97,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -116,7 +116,7 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -129,7 +129,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -142,7 +142,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -156,7 +156,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -276,7 +276,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -309,7 +309,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install Nix
|
- name: Install Nix
|
||||||
uses: cachix/install-nix-action@v29
|
uses: cachix/install-nix-action@v30
|
||||||
with:
|
with:
|
||||||
extra_nix_config: |
|
extra_nix_config: |
|
||||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@@ -1758,10 +1758,7 @@ type ArgParserGenerator () =
|
|||||||
let ast, _ =
|
let ast, _ =
|
||||||
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
||||||
|
|
||||||
let types =
|
let types = Ast.getTypes ast
|
||||||
Ast.extractTypeDefn ast
|
|
||||||
|> List.groupBy (fst >> List.map _.idText >> String.concat ".")
|
|
||||||
|> List.map (fun (_, v) -> fst (List.head v), List.collect snd v)
|
|
||||||
|
|
||||||
let opens = AstHelper.extractOpens ast
|
let opens = AstHelper.extractOpens ast
|
||||||
|
|
||||||
|
@@ -996,7 +996,7 @@ type HttpClientGenerator () =
|
|||||||
let ast, _ =
|
let ast, _ =
|
||||||
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
||||||
|
|
||||||
let types = Ast.extractTypeDefn ast
|
let types = Ast.getTypes ast
|
||||||
|
|
||||||
let opens = AstHelper.extractOpens ast
|
let opens = AstHelper.extractOpens ast
|
||||||
|
|
||||||
|
@@ -291,14 +291,14 @@ type InterfaceMockGenerator () =
|
|||||||
let ast, _ =
|
let ast, _ =
|
||||||
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
||||||
|
|
||||||
let types = Ast.extractTypeDefn ast
|
let types = Ast.getTypes ast
|
||||||
|
|
||||||
let namespaceAndInterfaces =
|
let namespaceAndInterfaces =
|
||||||
types
|
types
|
||||||
|> List.choose (fun (ns, types) ->
|
|> List.choose (fun (ns, types) ->
|
||||||
types
|
types
|
||||||
|> List.choose (fun typeDef ->
|
|> List.choose (fun typeDef ->
|
||||||
match Ast.getAttribute<GenerateMockAttribute> typeDef with
|
match SynTypeDefn.getAttribute typeof<GenerateMockAttribute>.Name typeDef with
|
||||||
| None ->
|
| None ->
|
||||||
let name = SynTypeDefn.getName typeDef |> List.map _.idText |> String.concat "."
|
let name = SynTypeDefn.getName typeDef |> List.map _.idText |> String.concat "."
|
||||||
|
|
||||||
|
@@ -711,13 +711,13 @@ type JsonParseGenerator () =
|
|||||||
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
||||||
|
|
||||||
let relevantTypes =
|
let relevantTypes =
|
||||||
Ast.extractTypeDefn ast
|
Ast.getTypes ast
|
||||||
|> List.map (fun (name, defns) ->
|
|> List.map (fun (name, defns) ->
|
||||||
defns
|
defns
|
||||||
|> List.choose (fun defn ->
|
|> List.choose (fun defn ->
|
||||||
if Ast.isRecord defn then Some defn
|
if SynTypeDefn.isRecord defn then Some defn
|
||||||
elif Ast.isDu defn then Some defn
|
elif SynTypeDefn.isDu defn then Some defn
|
||||||
elif AstHelper.isEnum defn then Some defn
|
elif SynTypeDefn.isEnum defn then Some defn
|
||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
|> fun defns -> name, defns
|
|> fun defns -> name, defns
|
||||||
|
@@ -528,13 +528,13 @@ type JsonSerializeGenerator () =
|
|||||||
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
||||||
|
|
||||||
let relevantTypes =
|
let relevantTypes =
|
||||||
Ast.extractTypeDefn ast
|
Ast.getTypes ast
|
||||||
|> List.map (fun (name, defns) ->
|
|> List.map (fun (name, defns) ->
|
||||||
defns
|
defns
|
||||||
|> List.choose (fun defn ->
|
|> List.choose (fun defn ->
|
||||||
if Ast.isRecord defn then Some defn
|
if SynTypeDefn.isRecord defn then Some defn
|
||||||
elif Ast.isDu defn then Some defn
|
elif SynTypeDefn.isDu defn then Some defn
|
||||||
elif AstHelper.isEnum defn then Some defn
|
elif SynTypeDefn.isEnum defn then Some defn
|
||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
|> fun defns -> name, defns
|
|> fun defns -> name, defns
|
||||||
|
@@ -2,28 +2,6 @@ namespace WoofWare.Myriad.Plugins
|
|||||||
|
|
||||||
open System.Collections.Generic
|
open System.Collections.Generic
|
||||||
|
|
||||||
type internal DesiredGenerator =
|
|
||||||
| InterfaceMock of isInternal : bool option
|
|
||||||
| JsonParse of extensionMethod : bool option
|
|
||||||
| JsonSerialize of extensionMethod : bool option
|
|
||||||
| HttpClient of extensionMethod : bool option
|
|
||||||
|
|
||||||
static member Parse (s : string) =
|
|
||||||
match s with
|
|
||||||
| "GenerateMock" -> DesiredGenerator.InterfaceMock None
|
|
||||||
| "GenerateMock(true)" -> DesiredGenerator.InterfaceMock (Some true)
|
|
||||||
| "GenerateMock(false)" -> DesiredGenerator.InterfaceMock (Some false)
|
|
||||||
| "JsonParse" -> DesiredGenerator.JsonParse None
|
|
||||||
| "JsonParse(true)" -> DesiredGenerator.JsonParse (Some true)
|
|
||||||
| "JsonParse(false)" -> DesiredGenerator.JsonParse (Some false)
|
|
||||||
| "JsonSerialize" -> DesiredGenerator.JsonSerialize None
|
|
||||||
| "JsonSerialize(true)" -> DesiredGenerator.JsonSerialize (Some true)
|
|
||||||
| "JsonSerialize(false)" -> DesiredGenerator.JsonSerialize (Some false)
|
|
||||||
| "HttpClient" -> DesiredGenerator.HttpClient None
|
|
||||||
| "HttpClient(true)" -> DesiredGenerator.HttpClient (Some true)
|
|
||||||
| "HttpClient(false)" -> DesiredGenerator.HttpClient (Some false)
|
|
||||||
| _ -> failwith $"Failed to parse as a generator specification: %s{s}"
|
|
||||||
|
|
||||||
[<RequireQualifiedAccess>]
|
[<RequireQualifiedAccess>]
|
||||||
module internal MyriadParamParser =
|
module internal MyriadParamParser =
|
||||||
(*
|
(*
|
||||||
|
23
WoofWare.Myriad.Plugins/Parameters.fs
Normal file
23
WoofWare.Myriad.Plugins/Parameters.fs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
namespace WoofWare.Myriad.Plugins
|
||||||
|
|
||||||
|
type internal DesiredGenerator =
|
||||||
|
| InterfaceMock of isInternal : bool option
|
||||||
|
| JsonParse of extensionMethod : bool option
|
||||||
|
| JsonSerialize of extensionMethod : bool option
|
||||||
|
| HttpClient of extensionMethod : bool option
|
||||||
|
|
||||||
|
static member Parse (s : string) =
|
||||||
|
match s with
|
||||||
|
| "GenerateMock" -> DesiredGenerator.InterfaceMock None
|
||||||
|
| "GenerateMock(true)" -> DesiredGenerator.InterfaceMock (Some true)
|
||||||
|
| "GenerateMock(false)" -> DesiredGenerator.InterfaceMock (Some false)
|
||||||
|
| "JsonParse" -> DesiredGenerator.JsonParse None
|
||||||
|
| "JsonParse(true)" -> DesiredGenerator.JsonParse (Some true)
|
||||||
|
| "JsonParse(false)" -> DesiredGenerator.JsonParse (Some false)
|
||||||
|
| "JsonSerialize" -> DesiredGenerator.JsonSerialize None
|
||||||
|
| "JsonSerialize(true)" -> DesiredGenerator.JsonSerialize (Some true)
|
||||||
|
| "JsonSerialize(false)" -> DesiredGenerator.JsonSerialize (Some false)
|
||||||
|
| "HttpClient" -> DesiredGenerator.HttpClient None
|
||||||
|
| "HttpClient(true)" -> DesiredGenerator.HttpClient (Some true)
|
||||||
|
| "HttpClient(false)" -> DesiredGenerator.HttpClient (Some false)
|
||||||
|
| _ -> failwith $"Failed to parse as a generator specification: %s{s}"
|
@@ -1,5 +1,6 @@
|
|||||||
namespace WoofWare.Myriad.Plugins
|
namespace WoofWare.Myriad.Plugins
|
||||||
|
|
||||||
|
open System
|
||||||
open Fantomas.FCS.Syntax
|
open Fantomas.FCS.Syntax
|
||||||
open Fantomas.FCS.Xml
|
open Fantomas.FCS.Xml
|
||||||
open WoofWare.Whippet.Fantomas
|
open WoofWare.Whippet.Fantomas
|
||||||
@@ -59,7 +60,7 @@ module internal RemoveOptionsGenerator =
|
|||||||
Attributes = []
|
Attributes = []
|
||||||
}
|
}
|
||||||
|
|
||||||
let typeDecl = AstHelper.defineRecordType record
|
let typeDecl = RecordType.ToAst record
|
||||||
|
|
||||||
SynModuleDecl.Types ([ typeDecl ], range0)
|
SynModuleDecl.Types ([ typeDecl ], range0)
|
||||||
|
|
||||||
@@ -146,44 +147,31 @@ type RemoveOptionsGenerator () =
|
|||||||
let ast, _ =
|
let ast, _ =
|
||||||
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
Ast.fromFilename context.InputFilename |> Async.RunSynchronously |> Array.head
|
||||||
|
|
||||||
let records = Ast.extractRecords ast
|
let records = Ast.getRecords ast
|
||||||
|
|
||||||
let namespaceAndRecords =
|
let namespaceAndRecords =
|
||||||
records
|
records
|
||||||
|> List.choose (fun (ns, types) ->
|
|> List.collect (fun (ns, ty) ->
|
||||||
match
|
ty
|
||||||
types
|
|> List.filter (fun record ->
|
||||||
|> List.filter (SynTypeDefn.hasAttribute typeof<RemoveOptionsAttribute>.Name)
|
record.Attributes
|
||||||
with
|
|> List.exists (fun attr ->
|
||||||
| [] -> None
|
attr.TypeName.LongIdent
|
||||||
| types ->
|
|> List.last
|
||||||
let types =
|
|> _.idText
|
||||||
types
|
|> fun s ->
|
||||||
|> List.map (fun ty ->
|
if s.EndsWith ("Attribute", StringComparison.Ordinal) then
|
||||||
match ty with
|
s
|
||||||
| SynTypeDefn.SynTypeDefn (sci,
|
else
|
||||||
SynTypeDefnRepr.Simple (SynTypeDefnSimpleRepr.Record (access,
|
$"%s{s}Attribute"
|
||||||
fields,
|
|> (=) typeof<RemoveOptionsAttribute>.Name
|
||||||
_),
|
|
||||||
_),
|
|
||||||
smd,
|
|
||||||
smdo,
|
|
||||||
_,
|
|
||||||
_) -> RecordType.OfRecord sci smd access fields
|
|
||||||
| _ -> failwith "unexpectedly not a record"
|
|
||||||
)
|
)
|
||||||
|
)
|
||||||
Some (ns, types)
|
|> List.map (fun ty -> ns, ty)
|
||||||
)
|
)
|
||||||
|
|
||||||
let modules =
|
let modules =
|
||||||
namespaceAndRecords
|
namespaceAndRecords
|
||||||
|> List.collect (fun (ns, records) ->
|
|> List.map (fun (ns, record) -> RemoveOptionsGenerator.createRecordModule ns record)
|
||||||
records
|
|
||||||
|> List.map (fun record ->
|
|
||||||
let recordModule = RemoveOptionsGenerator.createRecordModule ns record
|
|
||||||
recordModule
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
Output.Ast modules
|
Output.Ast modules
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
<WarnOn>FS3559</WarnOn>
|
<WarnOn>FS3559</WarnOn>
|
||||||
<PackageId>WoofWare.Myriad.Plugins</PackageId>
|
<PackageId>WoofWare.Myriad.Plugins</PackageId>
|
||||||
<PackageIcon>logo.png</PackageIcon>
|
<PackageIcon>logo.png</PackageIcon>
|
||||||
|
<NoWarn>NU5118</NoWarn>
|
||||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
@@ -31,6 +32,7 @@
|
|||||||
<Compile Include="Text.fs" />
|
<Compile Include="Text.fs" />
|
||||||
<Compile Include="Measure.fs" />
|
<Compile Include="Measure.fs" />
|
||||||
<Compile Include="AstHelper.fs" />
|
<Compile Include="AstHelper.fs" />
|
||||||
|
<Compile Include="Parameters.fs" />
|
||||||
<Compile Include="RemoveOptionsGenerator.fs"/>
|
<Compile Include="RemoveOptionsGenerator.fs"/>
|
||||||
<Compile Include="MyriadParamParser.fs" />
|
<Compile Include="MyriadParamParser.fs" />
|
||||||
<Compile Include="InterfaceMockGenerator.fs"/>
|
<Compile Include="InterfaceMockGenerator.fs"/>
|
||||||
@@ -58,7 +60,7 @@
|
|||||||
<ProjectReference Include="..\WoofWare.Myriad.Plugins.Attributes\WoofWare.Myriad.Plugins.Attributes.fsproj"/>
|
<ProjectReference Include="..\WoofWare.Myriad.Plugins.Attributes\WoofWare.Myriad.Plugins.Attributes.fsproj"/>
|
||||||
<!-- NuGet is such a clown package manager! Get the DLLs into the Nupkg artefact, I have no idea why this is needed,
|
<!-- NuGet is such a clown package manager! Get the DLLs into the Nupkg artefact, I have no idea why this is needed,
|
||||||
but without this line, we don't get any dependency at all packaged into the resulting artefact. -->
|
but without this line, we don't get any dependency at all packaged into the resulting artefact. -->
|
||||||
<None Include="$(OutputPath)\WoofWare.Myriad.Plugins.Attributes.dll" Pack="true" PackagePath="lib\$(TargetFramework)"/>
|
<None Include="$(OutputPath)\*.dll" Pack="true" PackagePath="lib\$(TargetFramework)"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
Reference in New Issue
Block a user