]> glassweightruler.freedombox.rocks Git - xdg-ninja.git/blob - lib/Program.hs
Explicit checks
[xdg-ninja.git] / lib / Program.hs
1 {-# LANGUAGE DeriveGeneric #-}
2 {-# LANGUAGE OverloadedStrings #-}
3
4 module Program where
5
6 import Data.Aeson
7 import Data.Aeson.Encode.Pretty
8 import qualified Data.ByteString.Lazy as B
9 import qualified Data.Text as T
10 import GHC.Generics
11
12 instance FromJSON File where
13 parseJSON (Object v) = File
14 <$> v .: "path"
15 <*> v .: "movable"
16 <*> v .: "help"
17
18 data Program = Program
19 { name :: T.Text,
20 files :: [File]
21 }
22 deriving (Generic, Show)
23
24 instance ToJSON Program where
25 toJSON (Program name files) = object [ "name" .= name, "files" .= files ]
26 toEncoding (Program name files) = pairs ("name" .= name <> "files" .= files)
27 instance FromJSON Program
28
29 data File = File
30 { path :: String,
31 supportLevel :: SupportLevel,
32 help :: String
33 }
34 deriving (Generic, Show)
35
36 instance ToJSON File where
37 toJSON (File path supportLevel help) = object [ "path" .= path, "movable" .= supportLevel, "help" .= help ]
38 toEncoding (File path supportLevel help) = pairs ("path" .= path <> "movable" .= supportLevel <> "help" .= help)
39
40 data SupportLevel = Unsupported | Alias | EnvVars | Supported
41 deriving (Generic, Show)
42
43 instance ToJSON SupportLevel where
44 toJSON Unsupported = toJSON (Bool False)
45 toJSON _ = toJSON (Bool True)
46 toEncoding Unsupported = toEncoding ( Bool False )
47 toEncoding _ = toEncoding ( Bool True )
48 instance FromJSON SupportLevel where
49 parseJSON (Bool False) = return Unsupported
50 parseJSON (Bool True) = return EnvVars
51
52 makeFilename :: T.Text -> T.Text
53 makeFilename s = T.pack ( "./programs/" ++ T.unpack s ++ ".json" )
54
55 save :: T.Text -> Program -> IO ()
56 save filename program = do
57 B.writeFile (T.unpack filename) (encodePretty program)
58
59 readProgram :: String -> IO ( Maybe Program )
60 readProgram filename = do
61 json_data <- B.readFile filename
62 return (decode json_data)