blob: db22fdc7314f3fea2bf92138bcffb6ce0a01404c (
plain)
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
|
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE NoImplicitPrelude #-}
-- : out jr
-- : dep sqlite-simple
module Omni.Jr where
import Alpha
import qualified Data.Text as Text
import qualified Omni.Agent.Core as AgentCore
import qualified Omni.Agent.Worker as AgentWorker
import qualified Omni.Cli as Cli
import qualified Omni.Task as Task
import qualified Omni.Test as Test
import qualified System.Console.Docopt as Docopt
import qualified System.Directory as Directory
import System.Environment (withArgs)
import System.FilePath (takeFileName)
main :: IO ()
main = Cli.main plan
plan :: Cli.Plan ()
plan =
Cli.Plan
{ Cli.help = help,
Cli.move = move,
Cli.test = test,
Cli.tidy = \_ -> pure ()
}
help :: Cli.Docopt
help =
[Cli.docopt|
jr
Usage:
jr task [<args>...]
jr work [<task-id>]
jr test
jr (-h | --help)
Commands:
task Manage tasks
work Track work
Options:
-h --help Show this help
|]
move :: Cli.Arguments -> IO ()
move args
| args `Cli.has` Cli.command "task" = do
let extraArgs = Cli.getAllArgs args (Cli.argument "args")
withArgs extraArgs Task.main
| args `Cli.has` Cli.command "work" = do
-- Always run in current directory
let path = "."
-- Infer name from current directory
absPath <- Directory.getCurrentDirectory
let name = Text.pack (takeFileName absPath)
let worker =
AgentCore.Worker
{ AgentCore.workerName = name,
AgentCore.workerPid = Nothing,
AgentCore.workerStatus = AgentCore.Idle,
AgentCore.workerPath = path
}
let taskId = fmap Text.pack (Cli.getArg args (Cli.argument "task-id"))
AgentWorker.start worker taskId
| otherwise = putText (str <| Docopt.usage help)
test :: Test.Tree
test =
Test.group
"Omni.Jr"
[ Test.unit "can run tests" <| True Test.@?= True,
Test.unit "can parse work command" <| do
let result = Docopt.parseArgs help ["work"]
case result of
Left err -> Test.assertFailure <| "Failed to parse 'work': " <> show err
Right args -> args `Cli.has` Cli.command "work" Test.@?= True,
Test.unit "can parse work command with task id" <| do
let result = Docopt.parseArgs help ["work", "t-123"]
case result of
Left err -> Test.assertFailure <| "Failed to parse 'work t-123': " <> show err
Right args -> do
args `Cli.has` Cli.command "work" Test.@?= True
Cli.getArg args (Cli.argument "task-id") Test.@?= Just "t-123"
]
|