blob: 4a64e0bf2f9cd8ea3e32583e1cb2dfdc2196b47e (
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
|
{-# LANGUAGE OverloadedStrings #-}
module Reaktor.Plugins.System.Internal where
import Data.Aeson
import qualified Data.ByteString.Char8.Extended as BS
import qualified Data.Map as M
import Reaktor.Internal ()
-- TODO this needs better names :)
data CaptureOr a = Capture Integer | CaptureOr a
deriving Show -- TODO killme
instance FromJSON a => FromJSON (CaptureOr a) where
parseJSON o@(Number _) = Capture <$> parseJSON o -- TODO don't parse twice
parseJSON o = CaptureOr <$> parseJSON o
-- TODO query means via direct privmsg and <nick>:
data Activate = Always | Match | Query
instance FromJSON Activate where
parseJSON (String "always") = pure Always
parseJSON (String "match") = pure Match
parseJSON (String "query") = pure Query
parseJSON _ = undefined
data SystemConfig = SystemConfig {
defaultWorkDir :: Maybe FilePath,
-- TODO IrcCommand as key for map
hooks :: M.Map BS.ByteString [SystemParams]
}
instance FromJSON SystemConfig where
parseJSON (Object v) =
SystemConfig
<$> v .:? "workdir"
<*> v .:? "hooks" .!= M.empty
parseJSON _ = pure undefined
data SystemParams = SystemParams {
activate :: Activate,
pattern :: Maybe BS.ByteString, -- TODO RE
command :: CaptureOr SystemCommand,
arguments :: [CaptureOr BS.ByteString],
workDir :: Maybe FilePath,
commands :: M.Map BS.ByteString SystemCommand
}
instance FromJSON SystemParams where
parseJSON (Object v) =
SystemParams
<$> v .:? "activate" .!= Query
<*> v .:? "pattern"
<*> v .: "command"
<*> v .:? "arguments" .!= []
<*> v .:? "workdir"
<*> v .:? "commands" .!= M.empty
parseJSON _ = pure undefined
data SystemCommand = SystemCommand {
commandPath :: FilePath,
commandWorkDir :: Maybe FilePath,
commandEnv :: Maybe (M.Map String String)
}
deriving Show -- TODO killme
instance FromJSON SystemCommand where
parseJSON (Object v) =
SystemCommand
<$> v .: "filename"
<*> v .:? "workdir"
<*> v .:? "env"
parseJSON _ = pure undefined
|