mirror of
https://github.com/Smaug123/WoofWare.Myriad
synced 2025-10-12 07:28:39 +00:00
Compare commits
6 Commits
WoofWare.M
...
WoofWare.M
Author | SHA1 | Date | |
---|---|---|---|
|
49ecfbf5e5 | ||
|
5748ac3d5b | ||
|
913959a740 | ||
|
93ffc065cd | ||
|
d14efba7e7 | ||
|
f5cf0b79dd |
@@ -3,7 +3,7 @@
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"fantomas": {
|
||||
"version": "6.3.11",
|
||||
"version": "6.3.12",
|
||||
"commands": [
|
||||
"fantomas"
|
||||
]
|
||||
|
4
.github/workflows/dotnet.yaml
vendored
4
.github/workflows/dotnet.yaml
vendored
@@ -241,7 +241,7 @@ jobs:
|
||||
name: nuget-package-attribute
|
||||
path: packed
|
||||
- name: Attest Build Provenance
|
||||
uses: actions/attest-build-provenance@6149ea5740be74af77f260b9db67e633f6b0a9a1 # v1.4.2
|
||||
uses: actions/attest-build-provenance@1c608d11d69870c2092266b3f9a6f3abbf17002c # v1.4.3
|
||||
with:
|
||||
subject-path: "packed/*.nupkg"
|
||||
|
||||
@@ -260,7 +260,7 @@ jobs:
|
||||
name: nuget-package-plugin
|
||||
path: packed
|
||||
- name: Attest Build Provenance
|
||||
uses: actions/attest-build-provenance@6149ea5740be74af77f260b9db67e633f6b0a9a1 # v1.4.2
|
||||
uses: actions/attest-build-provenance@1c608d11d69870c2092266b3f9a6f3abbf17002c # v1.4.3
|
||||
with:
|
||||
subject-path: "packed/*.nupkg"
|
||||
|
||||
|
@@ -195,3 +195,19 @@ type ManyLongForms =
|
||||
type private IrrelevantDu =
|
||||
| Foo
|
||||
| Bar
|
||||
|
||||
[<ArgParser true>]
|
||||
type FlagsIntoPositionalArgs =
|
||||
{
|
||||
A : string
|
||||
[<PositionalArgs true>]
|
||||
GrabEverything : string list
|
||||
}
|
||||
|
||||
[<ArgParser true>]
|
||||
type FlagsIntoPositionalArgs' =
|
||||
{
|
||||
A : string
|
||||
[<PositionalArgs false>]
|
||||
DontGrabEverything : string list
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -19,9 +19,22 @@ type ArgParserAttribute (isExtensionMethod : bool) =
|
||||
|
||||
/// Attribute indicating that this field shall accumulate all unmatched args,
|
||||
/// as well as any that appear after a bare `--`.
|
||||
type PositionalArgsAttribute () =
|
||||
///
|
||||
/// Set `includeFlagLike = true` to include args that begin `--` in the
|
||||
/// positional args.
|
||||
/// (By default, `includeFlagLike = false` and we throw when encountering
|
||||
/// an argument which looks like a flag but which we don't recognise.)
|
||||
/// We will still interpret `--help` as requesting help, unless it comes after
|
||||
/// a standalone `--` separator.
|
||||
type PositionalArgsAttribute (includeFlagLike : bool) =
|
||||
inherit Attribute ()
|
||||
|
||||
/// The default value of `isExtensionMethod`, the optional argument to the ArgParserAttribute constructor.
|
||||
static member DefaultIncludeFlagLike = false
|
||||
|
||||
/// Shorthand for the "includeFlagLike = false" constructor; see documentation there for details.
|
||||
new () = PositionalArgsAttribute PositionalArgsAttribute.DefaultIncludeFlagLike
|
||||
|
||||
/// Attribute indicating that this field shall have a default value derived
|
||||
/// from calling an appropriately named static method on the type.
|
||||
///
|
||||
|
@@ -40,7 +40,10 @@ WoofWare.Myriad.Plugins.JsonSerializeAttribute.get_DefaultIsExtensionMethod [sta
|
||||
WoofWare.Myriad.Plugins.ParseExactAttribute inherit System.Attribute
|
||||
WoofWare.Myriad.Plugins.ParseExactAttribute..ctor [constructor]: string
|
||||
WoofWare.Myriad.Plugins.PositionalArgsAttribute inherit System.Attribute
|
||||
WoofWare.Myriad.Plugins.PositionalArgsAttribute..ctor [constructor]: bool
|
||||
WoofWare.Myriad.Plugins.PositionalArgsAttribute..ctor [constructor]: unit
|
||||
WoofWare.Myriad.Plugins.PositionalArgsAttribute.DefaultIncludeFlagLike [static property]: [read-only] bool
|
||||
WoofWare.Myriad.Plugins.PositionalArgsAttribute.get_DefaultIncludeFlagLike [static method]: unit -> bool
|
||||
WoofWare.Myriad.Plugins.RemoveOptionsAttribute inherit System.Attribute
|
||||
WoofWare.Myriad.Plugins.RemoveOptionsAttribute..ctor [constructor]: unit
|
||||
WoofWare.Myriad.Plugins.RestEase inherit obj
|
||||
|
@@ -18,7 +18,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ApiSurface" Version="4.1.5" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1"/>
|
||||
<PackageReference Include="NUnit" Version="4.2.2"/>
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0"/>
|
||||
</ItemGroup>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "3.4",
|
||||
"version": "3.5",
|
||||
"publicReleaseRefSpec": [
|
||||
"^refs/heads/main$"
|
||||
],
|
||||
|
@@ -618,3 +618,50 @@ Required argument '--exact' received no value"""
|
||||
"""Help text requested.
|
||||
--do-something-else / --anotherarg string
|
||||
--turn-it-on / --dont-turn-it-off bool"""
|
||||
|
||||
[<Test>]
|
||||
let ``Can collect *all* non-help args into positional args with includeFlagLike`` () =
|
||||
let getEnvVar (_ : string) = failwith "do not call"
|
||||
|
||||
FlagsIntoPositionalArgs.parse' getEnvVar [ "--a" ; "foo" ; "--b=false" ; "--c" ; "hi" ; "--" ; "--help" ]
|
||||
|> shouldEqual
|
||||
{
|
||||
A = "foo"
|
||||
GrabEverything = [ "--b=false" ; "--c" ; "hi" ; "--help" ]
|
||||
}
|
||||
|
||||
// Users might consider this eccentric!
|
||||
// But we're only a simple arg parser; we don't look around to see whether this is "almost"
|
||||
// a valid parse.
|
||||
FlagsIntoPositionalArgs.parse' getEnvVar [ "--a" ; "--b=false" ; "--c" ; "hi" ; "--" ; "--help" ]
|
||||
|> shouldEqual
|
||||
{
|
||||
A = "--b=false"
|
||||
GrabEverything = [ "--c" ; "hi" ; "--help" ]
|
||||
}
|
||||
|
||||
[<Test>]
|
||||
let ``Can refuse to collect non-help args with PositionalArgs false`` () =
|
||||
let getEnvVar (_ : string) = failwith "do not call"
|
||||
|
||||
let exc =
|
||||
Assert.Throws<exn> (fun () ->
|
||||
FlagsIntoPositionalArgs'.parse'
|
||||
getEnvVar
|
||||
[ "--a" ; "foo" ; "--b=false" ; "--c" ; "hi" ; "--" ; "--help" ]
|
||||
|> ignore<FlagsIntoPositionalArgs'>
|
||||
)
|
||||
|
||||
exc.Message
|
||||
|> shouldEqual """Unable to process argument --b=false as key --b and value false"""
|
||||
|
||||
let exc =
|
||||
Assert.Throws<exn> (fun () ->
|
||||
FlagsIntoPositionalArgs'.parse' getEnvVar [ "--a" ; "--b=false" ; "--c=hi" ; "--" ; "--help" ]
|
||||
|> ignore<FlagsIntoPositionalArgs'>
|
||||
)
|
||||
|
||||
// Again perhaps eccentric!
|
||||
// Again, we don't try to detect that the user has missed out the desired argument to `--a`.
|
||||
exc.Message
|
||||
|> shouldEqual """Unable to process argument --c=hi as key --c and value hi"""
|
||||
|
@@ -42,7 +42,7 @@
|
||||
<PackageReference Include="ApiSurface" Version="4.1.5"/>
|
||||
<PackageReference Include="FsCheck" Version="2.16.6"/>
|
||||
<PackageReference Include="FsUnit" Version="6.0.0"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1"/>
|
||||
<PackageReference Include="NUnit" Version="4.2.2"/>
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0"/>
|
||||
</ItemGroup>
|
||||
|
@@ -85,8 +85,8 @@ type private ParseFunction<'acc> =
|
||||
|
||||
[<RequireQualifiedAccess>]
|
||||
type private ChoicePositional =
|
||||
| Normal
|
||||
| Choice
|
||||
| Normal of includeFlagLike : SynExpr option
|
||||
| Choice of includeFlagLike : SynExpr option
|
||||
|
||||
type private ParseFunctionPositional = ParseFunction<ChoicePositional>
|
||||
type private ParseFunctionNonPositional = ParseFunction<Accumulation<ArgumentDefaultSpec>>
|
||||
@@ -506,11 +506,14 @@ module internal ArgParserGenerator =
|
||||
|
||||
let positionalArgAttr =
|
||||
attrs
|
||||
|> List.tryFind (fun a ->
|
||||
|> List.tryPick (fun a ->
|
||||
match (List.last a.TypeName.LongIdent).idText with
|
||||
| "PositionalArgsAttribute"
|
||||
| "PositionalArgs" -> true
|
||||
| _ -> false
|
||||
| "PositionalArgs" ->
|
||||
match a.ArgExpr with
|
||||
| SynExpr.Const (SynConst.Unit, _) -> Some None
|
||||
| a -> Some (Some a)
|
||||
| _ -> None
|
||||
)
|
||||
|
||||
let parseExactModifier =
|
||||
@@ -580,7 +583,7 @@ module internal ArgParserGenerator =
|
||||
| None ->
|
||||
|
||||
match positionalArgAttr with
|
||||
| Some _ ->
|
||||
| Some includeFlagLike ->
|
||||
let getChoice (spec : ArgumentDefaultSpec option) : unit =
|
||||
match spec with
|
||||
| Some _ ->
|
||||
@@ -607,7 +610,7 @@ module internal ArgParserGenerator =
|
||||
FieldName = ident
|
||||
Parser = parser
|
||||
TargetVariable = Ident.create $"arg_%i{counter}"
|
||||
Accumulation = ChoicePositional.Choice
|
||||
Accumulation = ChoicePositional.Choice includeFlagLike
|
||||
TargetType = parseTy
|
||||
ArgForm = longForms
|
||||
Help = helpText
|
||||
@@ -619,7 +622,7 @@ module internal ArgParserGenerator =
|
||||
FieldName = ident
|
||||
Parser = parser
|
||||
TargetVariable = Ident.create $"arg_%i{counter}"
|
||||
Accumulation = ChoicePositional.Normal
|
||||
Accumulation = ChoicePositional.Normal includeFlagLike
|
||||
TargetType = parseTy
|
||||
ArgForm = longForms
|
||||
Help = helpText
|
||||
@@ -723,7 +726,10 @@ module internal ArgParserGenerator =
|
||||
]
|
||||
|> SynExpr.createMatch (SynExpr.callMethod var.idText (SynExpr.createIdent' typeName))
|
||||
|> SynExpr.pipeThroughFunction (
|
||||
SynExpr.applyFunction (SynExpr.createIdent "sprintf") (SynExpr.CreateConst " (default value: %O)")
|
||||
SynExpr.createLambda "x" (SynExpr.callMethod "ToString" (SynExpr.createIdent "x"))
|
||||
)
|
||||
|> SynExpr.pipeThroughFunction (
|
||||
SynExpr.applyFunction (SynExpr.createIdent "sprintf") (SynExpr.CreateConst " (default value: %s)")
|
||||
)
|
||||
|> SynExpr.paren
|
||||
| Accumulation.List _ -> SynExpr.CreateConst " (can be repeated)"
|
||||
@@ -786,10 +792,12 @@ module internal ArgParserGenerator =
|
||||
| Accumulation.Optional ->
|
||||
let multipleErrorMessage =
|
||||
SynExpr.createIdent "sprintf"
|
||||
|> SynExpr.applyTo (SynExpr.CreateConst "Argument '%s' was supplied multiple times: %O and %O")
|
||||
|> SynExpr.applyTo (SynExpr.CreateConst "Argument '%s' was supplied multiple times: %s and %s")
|
||||
|> SynExpr.applyTo arg.HumanReadableArgForm
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "x")
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "value")
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "x" |> SynExpr.callMethod "ToString" |> SynExpr.paren)
|
||||
|> SynExpr.applyTo (
|
||||
SynExpr.createIdent "value" |> SynExpr.callMethod "ToString" |> SynExpr.paren
|
||||
)
|
||||
|
||||
let performAssignment =
|
||||
[
|
||||
@@ -850,8 +858,9 @@ module internal ArgParserGenerator =
|
||||
|> SynExpr.pipeThroughFunction pos.Parser
|
||||
|> fun p ->
|
||||
match pos.Accumulation with
|
||||
| ChoicePositional.Choice -> p |> SynExpr.pipeThroughFunction (SynExpr.createIdent "Choice1Of2")
|
||||
| ChoicePositional.Normal -> p
|
||||
| ChoicePositional.Choice _ ->
|
||||
p |> SynExpr.pipeThroughFunction (SynExpr.createIdent "Choice1Of2")
|
||||
| ChoicePositional.Normal _ -> p
|
||||
|> SynExpr.pipeThroughFunction (
|
||||
SynExpr.createLongIdent' [ pos.TargetVariable ; Ident.create "Add" ]
|
||||
)
|
||||
@@ -995,6 +1004,50 @@ module internal ArgParserGenerator =
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "key")
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "value")
|
||||
|
||||
let processAsPositional =
|
||||
SynExpr.sequential
|
||||
[
|
||||
SynExpr.createIdent "arg"
|
||||
|> SynExpr.pipeThroughFunction leftoverArgParser
|
||||
|> fun p ->
|
||||
match leftoverArgAcc with
|
||||
| ChoicePositional.Normal _ -> p
|
||||
| ChoicePositional.Choice _ ->
|
||||
p |> SynExpr.pipeThroughFunction (SynExpr.createIdent "Choice1Of2")
|
||||
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent' [ leftoverArgs ; Ident.create "Add" ])
|
||||
|
||||
recurseKey
|
||||
]
|
||||
|
||||
let posAttr =
|
||||
match leftoverArgAcc with
|
||||
| ChoicePositional.Choice a
|
||||
| ChoicePositional.Normal a -> a
|
||||
|
||||
let notMatched =
|
||||
let handleFailure =
|
||||
[
|
||||
SynMatchClause.create (SynPat.named "None") fail
|
||||
|
||||
SynMatchClause.create
|
||||
(SynPat.nameWithArgs "Some" [ SynPat.named "msg" ])
|
||||
(SynExpr.sequential
|
||||
[
|
||||
SynExpr.createIdent "sprintf"
|
||||
|> SynExpr.applyTo (SynExpr.CreateConst "%s (at arg %s)")
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "msg")
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "arg")
|
||||
|> SynExpr.pipeThroughFunction (SynExpr.dotGet "Add" (SynExpr.createIdent' errorAcc))
|
||||
|
||||
recurseKey
|
||||
])
|
||||
]
|
||||
|> SynExpr.createMatch (SynExpr.createIdent "x")
|
||||
|
||||
match posAttr with
|
||||
| None -> handleFailure
|
||||
| Some posAttr -> SynExpr.ifThenElse posAttr handleFailure processAsPositional
|
||||
|
||||
let argStartsWithDashes =
|
||||
SynExpr.createIdent "arg"
|
||||
|> SynExpr.callMethodArg
|
||||
@@ -1008,19 +1061,7 @@ module internal ArgParserGenerator =
|
||||
let processKey =
|
||||
SynExpr.ifThenElse
|
||||
argStartsWithDashes
|
||||
(SynExpr.sequential
|
||||
[
|
||||
SynExpr.createIdent "arg"
|
||||
|> SynExpr.pipeThroughFunction leftoverArgParser
|
||||
|> fun p ->
|
||||
match leftoverArgAcc with
|
||||
| ChoicePositional.Normal -> p
|
||||
| ChoicePositional.Choice ->
|
||||
p |> SynExpr.pipeThroughFunction (SynExpr.createIdent "Choice1Of2")
|
||||
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent' [ leftoverArgs ; Ident.create "Add" ])
|
||||
|
||||
recurseKey
|
||||
])
|
||||
processAsPositional
|
||||
(SynExpr.ifThenElse
|
||||
(SynExpr.equals (SynExpr.createIdent "arg") (SynExpr.CreateConst "--help"))
|
||||
(SynExpr.createLet
|
||||
@@ -1056,23 +1097,9 @@ module internal ArgParserGenerator =
|
||||
[
|
||||
SynMatchClause.create (SynPat.nameWithArgs "Ok" [ SynPat.unit ]) recurseKey
|
||||
|
||||
SynMatchClause.create (SynPat.nameWithArgs "Error" [ SynPat.named "None" ]) fail
|
||||
SynMatchClause.create
|
||||
(SynPat.nameWithArgs
|
||||
"Error"
|
||||
[ SynPat.nameWithArgs "Some" [ SynPat.named "msg" ] |> SynPat.paren ])
|
||||
(SynExpr.sequential
|
||||
[
|
||||
SynExpr.createIdent "sprintf"
|
||||
|> SynExpr.applyTo (SynExpr.CreateConst "%s (at arg %s)")
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "msg")
|
||||
|> SynExpr.applyTo (SynExpr.createIdent "arg")
|
||||
|> SynExpr.pipeThroughFunction (
|
||||
SynExpr.dotGet "Add" (SynExpr.createIdent' errorAcc)
|
||||
)
|
||||
|
||||
recurseKey
|
||||
])
|
||||
(SynPat.nameWithArgs "Error" [ SynPat.named "x" ])
|
||||
notMatched
|
||||
]))
|
||||
(SynExpr.createIdent "args" |> SynExpr.pipeThroughFunction recurseValue)))
|
||||
(SynExpr.createIdent "helpText"
|
||||
@@ -1086,6 +1113,8 @@ module internal ArgParserGenerator =
|
||||
let processValue =
|
||||
// During failure, we've received an optional exception message that happened when we tried to parse
|
||||
// the value; it's in the variable `exc`.
|
||||
// `fail` is for the case where we're genuinely emitting an error.
|
||||
// If we're in `PositionalArgs true` mode, though, we won't call `fail`.
|
||||
let fail =
|
||||
[
|
||||
SynExpr.createIdent "failwithf"
|
||||
@@ -1105,6 +1134,21 @@ module internal ArgParserGenerator =
|
||||
]
|
||||
|> SynExpr.createMatch (SynExpr.createIdent "exc")
|
||||
|
||||
let onFailure =
|
||||
match posAttr with
|
||||
| None -> fail
|
||||
| Some includeFlagLike ->
|
||||
[
|
||||
SynExpr.createIdent "key"
|
||||
|> SynExpr.pipeThroughFunction (SynExpr.createLongIdent' [ leftoverArgs ; Ident.create "Add" ])
|
||||
|
||||
SynExpr.createIdent "go"
|
||||
|> SynExpr.applyTo (SynExpr.createLongIdent' [ parseState ; Ident.create "AwaitingKey" ])
|
||||
|> SynExpr.applyTo (SynExpr.listCons (SynExpr.createIdent "arg") (SynExpr.createIdent "args"))
|
||||
]
|
||||
|> SynExpr.sequential
|
||||
|> SynExpr.ifThenElse includeFlagLike fail
|
||||
|
||||
[
|
||||
SynMatchClause.create
|
||||
(SynPat.nameWithArgs "Ok" [ SynPat.unit ])
|
||||
@@ -1117,7 +1161,7 @@ module internal ArgParserGenerator =
|
||||
(SynPat.nameWithArgs "Error" [ SynPat.named "exc" ])
|
||||
(SynExpr.ifThenElse
|
||||
(SynExpr.applyFunction (SynExpr.createIdent "setFlagValue") (SynExpr.createIdent "key"))
|
||||
fail
|
||||
onFailure
|
||||
(SynExpr.createIdent "go"
|
||||
|> SynExpr.applyTo (SynExpr.createLongIdent' [ parseState ; Ident.create "AwaitingKey" ])
|
||||
|> SynExpr.applyTo (SynExpr.listCons (SynExpr.createIdent "arg") (SynExpr.createIdent "args"))))
|
||||
@@ -1184,8 +1228,8 @@ module internal ArgParserGenerator =
|
||||
)
|
||||
|> fun p ->
|
||||
match leftoverArgAcc with
|
||||
| ChoicePositional.Normal -> p
|
||||
| ChoicePositional.Choice ->
|
||||
| ChoicePositional.Normal _ -> p
|
||||
| ChoicePositional.Choice _ ->
|
||||
p
|
||||
|> SynExpr.pipeThroughFunction (
|
||||
SynExpr.applyFunction
|
||||
@@ -1257,9 +1301,9 @@ module internal ArgParserGenerator =
|
||||
SynType.string
|
||||
| Some pf ->
|
||||
match pf.Accumulation with
|
||||
| ChoicePositional.Choice ->
|
||||
| ChoicePositional.Choice _ ->
|
||||
pf.TargetVariable, pf.Parser, SynType.app "Choice" [ pf.TargetType ; pf.TargetType ]
|
||||
| ChoicePositional.Normal -> pf.TargetVariable, pf.Parser, pf.TargetType
|
||||
| ChoicePositional.Normal _ -> pf.TargetVariable, pf.Parser, pf.TargetType
|
||||
|
||||
let bindings =
|
||||
SynExpr.createIdent "ResizeArray"
|
||||
@@ -1487,7 +1531,7 @@ module internal ArgParserGenerator =
|
||||
|
||||
let leftoverArgAcc =
|
||||
match pos with
|
||||
| None -> ChoicePositional.Normal
|
||||
| None -> ChoicePositional.Normal None
|
||||
| Some pos -> pos.Accumulation
|
||||
|
||||
[
|
||||
|
@@ -80,6 +80,11 @@ module internal SynExpr =
|
||||
let equals (a : SynExpr) (b : SynExpr) =
|
||||
SynExpr.CreateAppInfix (SynExpr.CreateLongIdent SynLongIdent.eq, a) |> applyTo b
|
||||
|
||||
/// {a} && {b}
|
||||
let booleanAnd (a : SynExpr) (b : SynExpr) =
|
||||
SynExpr.CreateAppInfix (SynExpr.CreateLongIdent SynLongIdent.booleanAnd, a)
|
||||
|> applyTo b
|
||||
|
||||
/// {a} + {b}
|
||||
let plus (a : SynExpr) (b : SynExpr) =
|
||||
SynExpr.CreateAppInfix (
|
||||
|
@@ -33,6 +33,9 @@ module internal SynLongIdent =
|
||||
let eq =
|
||||
SynLongIdent.SynLongIdent ([ Ident.create "op_Equality" ], [], [ Some (IdentTrivia.OriginalNotation "=") ])
|
||||
|
||||
let booleanAnd =
|
||||
SynLongIdent.SynLongIdent ([ Ident.create "op_BooleanAnd" ], [], [ Some (IdentTrivia.OriginalNotation "&&") ])
|
||||
|
||||
let pipe =
|
||||
SynLongIdent.SynLongIdent ([ Ident.create "op_PipeRight" ], [], [ Some (IdentTrivia.OriginalNotation "|>") ])
|
||||
|
||||
|
6
flake.lock
generated
6
flake.lock
generated
@@ -20,11 +20,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1725099143,
|
||||
"narHash": "sha256-CHgumPZaC7z+WYx72WgaLt2XF0yUVzJS60rO4GZ7ytY=",
|
||||
"lastModified": 1725534445,
|
||||
"narHash": "sha256-Yd0FK9SkWy+ZPuNqUgmVPXokxDgMJoGuNpMEtkfcf84=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "5629520edecb69630a3f4d17d3d33fc96c13f6fe",
|
||||
"rev": "9bb1e7571aadf31ddb4af77fc64b2d59580f9a39",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
20
nix/deps.nix
20
nix/deps.nix
@@ -8,8 +8,8 @@
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "fantomas";
|
||||
version = "6.3.11";
|
||||
hash = "sha256-11bHGEAZTNtdp2pTg5zqLrQiyI/j/AT7GGL/2CR4+dw=";
|
||||
version = "6.3.12";
|
||||
hash = "sha256-LFZn2cO72FlsmLI0vTLz52Bn4XBeGILTOr8rz/EuXeg=";
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "Fantomas.Core";
|
||||
@@ -78,13 +78,13 @@
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "Microsoft.CodeCoverage";
|
||||
version = "17.11.0";
|
||||
hash = "sha256-XglInnx5GePUYHG7n2NLX+WfK7kJnornsWOW/5FnOXE=";
|
||||
version = "17.11.1";
|
||||
hash = "sha256-1dLlK3NGh88PuFYZiYpT+izA96etxhU3BSgixDgdtGA=";
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "Microsoft.NET.Test.Sdk";
|
||||
version = "17.11.0";
|
||||
hash = "sha256-WjyA78+PG9ZloWTt9Hf1ek3VVj2FfJ9fAjqklnN+fWw=";
|
||||
version = "17.11.1";
|
||||
hash = "sha256-0JUEucQ2lzaPgkrjm/NFLBTbqU1dfhvhN3Tl3moE6mI=";
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "Microsoft.NETCore.App.Host.linux-arm64";
|
||||
@@ -153,13 +153,13 @@
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "Microsoft.TestPlatform.ObjectModel";
|
||||
version = "17.11.0";
|
||||
hash = "sha256-mCI3MCV6nyrGLrBat5VvK5LrXTEKlsdp9NkpZyJYwVg=";
|
||||
version = "17.11.1";
|
||||
hash = "sha256-5vX+vCzFY3S7xfMVIv8OlMMFtdedW9UIJzc0WEc+vm4=";
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "Microsoft.TestPlatform.TestHost";
|
||||
version = "17.11.0";
|
||||
hash = "sha256-gViDLobza22kuLvB4JdlGtbANqwBHRwf1wLmIHMw9Eo=";
|
||||
version = "17.11.1";
|
||||
hash = "sha256-wSkY0H1fQAq0H3LcKT4u7Y5RzhAAPa6yueVN84g8HxU=";
|
||||
})
|
||||
(fetchNuGet {
|
||||
pname = "Myriad.Core";
|
||||
|
Reference in New Issue
Block a user