1 {-# LANGUAGE DeriveGeneric #-}
2 {-# LANGUAGE OverloadedStrings #-}
7 import Data.Aeson.Encode.Pretty
8 import qualified Data.ByteString.Lazy as B
9 import qualified Data.Text as T
11 import System.Directory
13 instance FromJSON File where
14 parseJSON (Object v) = File
19 data Program = Program
23 deriving (Generic, Show)
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
32 supportLevel :: SupportLevel,
35 deriving (Generic, Show)
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)
41 data SupportLevel = Unsupported | Alias | EnvVars | Supported
42 deriving (Generic, Show)
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
53 makeFilename :: T.Text -> T.Text
54 makeFilename s = T.pack ( "./programs/" ++ T.unpack s ++ ".json" )
56 save :: T.Text -> Program -> IO ()
57 save filename program = do
58 createDirectoryIfMissing False "./programs/"
59 B.writeFile (T.unpack filename) (encodePretty program)
61 readProgram :: String -> IO ( Maybe Program )
62 readProgram filename = do
63 json_data <- B.readFile filename
64 return (decode json_data)