summaryrefslogtreecommitdiff
path: root/src/SomhairlesDream.Cli/Arguments.fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/SomhairlesDream.Cli/Arguments.fs')
-rw-r--r--src/SomhairlesDream.Cli/Arguments.fs57
1 files changed, 44 insertions, 13 deletions
diff --git a/src/SomhairlesDream.Cli/Arguments.fs b/src/SomhairlesDream.Cli/Arguments.fs
index 2de96be..fa9087b 100644
--- a/src/SomhairlesDream.Cli/Arguments.fs
+++ b/src/SomhairlesDream.Cli/Arguments.fs
@@ -9,7 +9,8 @@ type RunOptions =
OutputRoot: string
StageRoot: string
Python: string
- Render: bool }
+ Render: bool
+ Design: string }
type Command =
| Run of RunOptions
@@ -19,22 +20,32 @@ type Command =
module Arguments =
let usage =
"usage: dotnet run --project src/SomhairlesDream.Cli -- run [options]\n"
- + " dotnet run --project src/SomhairlesDream.Cli -- verify <manifest.json>"
+ + " dotnet run --project src/SomhairlesDream.Cli -- verify <manifest.json>\n"
+ + "options: --project-id --run-id --base-id --target-id --output-root --stage-root --python --render --design heritage|probe"
let private defaultPython () =
let configured = Environment.GetEnvironmentVariable("SOMHAIRLES_BPYTHON")
if String.IsNullOrWhiteSpace(configured) then "python3" else configured
+ let private heritageIds =
+ { ProjectId = "heritage-001"
+ RunId = "run-001"
+ BaseId = "base-000"
+ TargetId = "target-003" }
+
+ let private probeIds =
+ { ProjectId = "probe-001"
+ RunId = "run-001"
+ BaseId = "probe-base-000"
+ TargetId = "probe-target-007" }
+
let private defaults () =
- { Ids =
- { ProjectId = "heritage-001"
- RunId = "run-001"
- BaseId = "base-000"
- TargetId = "target-003" }
+ { Ids = heritageIds
OutputRoot = ".artifacts"
StageRoot = "stage"
Python = defaultPython ()
- Render = false }
+ Render = false
+ Design = "heritage" }
let private requiredValue (args: string array) (index: int) (optionName: string) =
if index + 1 >= args.Length || String.IsNullOrWhiteSpace(args[index + 1]) then
@@ -51,14 +62,34 @@ module Arguments =
| "--output-root" -> Ok { options with OutputRoot = value }
| "--stage-root" -> Ok { options with StageRoot = value }
| "--python" -> Ok { options with Python = value }
+ | "--design" -> Ok { options with Design = value }
| _ -> Error $"unknown option: {optionName}"
+ let private resolveIds (options: RunOptions) =
+ if options.Design = "probe" then
+ let swap heritage probe value = if value = heritage then probe else value
+
+ let ids =
+ { ProjectId = swap heritageIds.ProjectId probeIds.ProjectId options.Ids.ProjectId
+ RunId = swap heritageIds.RunId probeIds.RunId options.Ids.RunId
+ BaseId = swap heritageIds.BaseId probeIds.BaseId options.Ids.BaseId
+ TargetId = swap heritageIds.TargetId probeIds.TargetId options.Ids.TargetId }
+
+ { options with Ids = ids }
+ else
+ options
+
let private validateRunOptions (options: RunOptions) =
- [| options.Ids.ProjectId; options.Ids.RunId; options.Ids.BaseId; options.Ids.TargetId |]
- |> Array.tryFind (Ids.validateResourceId >> Result.isError)
- |> function
- | Some value -> Error $"invalid resource id: {value}"
- | None -> Ok(Run options)
+ if options.Design <> "heritage" && options.Design <> "probe" then
+ Error $"invalid design: {options.Design}"
+ else
+ let resolved = resolveIds options
+
+ [| resolved.Ids.ProjectId; resolved.Ids.RunId; resolved.Ids.BaseId; resolved.Ids.TargetId |]
+ |> Array.tryFind (Ids.validateResourceId >> Result.isError)
+ |> function
+ | Some value -> Error $"invalid resource id: {value}"
+ | None -> Ok(Run resolved)
let private parseRun (args: string array) =
let rec loop (index: int) (options: RunOptions) =