-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.fs
More file actions
95 lines (69 loc) · 2.95 KB
/
Program.fs
File metadata and controls
95 lines (69 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
namespace Dhl
open Argu
open System
open System.Reflection
open Resources
open Arguments
open ShipmentHandler
module Program =
let statusCodeToColor (code: string) =
match code with
| "pre-transit" -> "[97;1m" // WHITE
| "transit" -> "[93;1m" // YELLOW
| "delivered" -> "[32;1m" // GREEN
| "failure" -> "[31;1m" // RED
| "unknown"
| _ -> "[90;1m" // GRAY
let buildColoredLine (element: string * string) =
let esc = string (char 0x1B)
$"{esc}{element |> fst |> statusCodeToColor}{element |> snd}{esc}[0m"
let printTrackingNumberLines elements =
elements |> Seq.map buildColoredLine |> String.concat Environment.NewLine
let matchTrackingNumberOrIndex (value: string) (execFunc: TrackingNumber -> string) =
match value with
| l when l.Length < 7 ->
match Int32.TryParse(l) with
| true, i ->
Repository.loadTrackingNumbers ()
|> fun n -> n |> Seq.toArray |> Array.tryItem i
|> function
| Some v -> v |> execFunc
| None -> NoTrackingNumber.ResourceString
| _, _ -> IndexNotParsable.ResourceString
| _ -> TrackingNumber(value) |> execFunc
let runCommands (parser: ArgumentParser<CliArguments>) (args: string array) =
match (parser.Parse args).GetAllResults() with
| [ Number n ] ->
match n.GetAllResults() with
| [ Add a ] -> TrackingNumber(a) |> Repository.add
| [ Remove r ] -> TrackingNumber(r) |> Repository.remove
| _ -> parser.PrintUsage()
| [ Detail d ] -> matchTrackingNumberOrIndex d (loadTrackingNumberDetail >> printTrackingNumberLines)
| [ Package p ] -> matchTrackingNumberOrIndex p loadTrackingNumberPackageDetails
| [ Weblink w ] -> matchTrackingNumberOrIndex w getWeblink
| [ Update ] ->
let countTransits elements : int =
elements
|> Seq.filter (fun (x, _) -> x = "pre-transit" || x = "transit")
|> Seq.length
let statuses = Repository.loadTrackingNumbers () |> loadTrackingNumbers
Environment.SetEnvironmentVariable(
"DhlCount",
$"{statuses |> countTransits}",
EnvironmentVariableTarget.User
)
statuses |> printTrackingNumberLines
| [ SetKey k ] ->
k |> Settings.setSystemKey
Key_Set.ResourceString
| [ GetKey ] -> Settings.getSystemKey ()
| [ Version ] -> Assembly.GetExecutingAssembly().GetName().Version |> string
| [ Help ] -> parser.PrintUsage()
| _ -> parser.PrintUsage()
[<EntryPoint>]
let main ([<ParamArray>] args: string[]) : int =
try
(ArgumentParser.Create<CliArguments>(), args) ||> runCommands |> printfn "%s"
with ex ->
eprintfn $"{ex.Message}"
0