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
12 instance FromJSON File where
13 parseJSON (Object v) = File
18 data Program = Program
22 deriving (Generic, Show)
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
31 supportLevel :: SupportLevel,
34 deriving (Generic, Show)
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)
40 data SupportLevel = Unsupported | Alias | EnvVars | Supported
41 deriving (Generic, Show)
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
52 makeFilename :: T.Text -> T.Text
53 makeFilename s = T.pack ( "./programs/" ++ T.unpack s ++ ".json" )
55 save :: T.Text -> Program -> IO ()
56 save filename program = do
57 B.writeFile (T.unpack filename) (encodePretty program)
59 readProgram :: String -> IO ( Maybe Program )
60 readProgram filename = do
61 json_data <- B.readFile filename
62 return (decode json_data)