]> glassweightruler.freedombox.rocks Git - xdg-ninja.git/blob - haskell/lib/Program.hs
radian: .radian_history (#484)
[xdg-ninja.git] / haskell / 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 import System.Directory
12
13 instance FromJSON File where
14 parseJSON (Object v) = File
15 <$> v .: "path"
16 <*> v .: "movable"
17 <*> v .: "help"
18
19 data Program = Program
20 { name :: T.Text,
21 files :: [File]
22 }
23 deriving (Generic, Show)
24
25 instance ToJSON Program where
26 toJSON (Program name files) = object [ "name" .= name, "files" .= files ]
27 toEncoding (Program name files) = pairs ("name" .= name <> "files" .= files)
28 instance FromJSON Program
29
30 data File = File
31 { path :: String,
32 supportLevel :: SupportLevel,
33 help :: String
34 }
35 deriving (Generic, Show)
36
37 instance ToJSON File where
38 toJSON (File path supportLevel help) = object [ "path" .= path, "movable" .= supportLevel, "help" .= help ]
39 toEncoding (File path supportLevel help) = pairs ("path" .= path <> "movable" .= supportLevel <> "help" .= help)
40
41 data SupportLevel = Unsupported | Alias | EnvVars | Supported
42 deriving (Generic, Show)
43
44 instance ToJSON SupportLevel where
45 toJSON Unsupported = toJSON (Bool False)
46 toJSON _ = toJSON (Bool True)
47 toEncoding Unsupported = toEncoding ( Bool False )
48 toEncoding _ = toEncoding ( Bool True )
49 instance FromJSON SupportLevel where
50 parseJSON (Bool False) = return Unsupported
51 parseJSON (Bool True) = return EnvVars
52
53 makeFilename :: T.Text -> T.Text
54 makeFilename s = T.pack ( "./programs/" ++ T.unpack s ++ ".json" )
55
56 save :: T.Text -> Program -> IO ()
57 save filename program = do
58 createDirectoryIfMissing False "./programs/"
59 B.writeFile (T.unpack filename) (encodePretty program)
60
61 readProgram :: String -> IO ( Maybe Program )
62 readProgram filename = do
63 json_data <- B.readFile filename
64 return (decode json_data)