X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/xdg-ninja.git/blobdiff_plain/423726fc992211893ed74e63a3ccd907b7163280..bea3ec92f3d998eecfd3f46fcd33f90da0aec509:/lib/Program.hs diff --git a/lib/Program.hs b/lib/Program.hs index 06adaa2..9826152 100644 --- a/lib/Program.hs +++ b/lib/Program.hs @@ -8,16 +8,13 @@ import Data.Aeson.Encode.Pretty import qualified Data.ByteString.Lazy as B import qualified Data.Text as T import GHC.Generics +import System.Directory -data File = File - { path :: String, - supportLevel :: SupportLevel, - help :: String - } - deriving (Generic, Show) - -instance ToJSON File where - toEncoding (File path supportLevel help) = pairs ("path" .= path <> "movable" .= supportLevel <> "help" .= help) +instance FromJSON File where + parseJSON (Object v) = File + <$> v .: "path" + <*> v .: "movable" + <*> v .: "help" data Program = Program { name :: T.Text, @@ -26,17 +23,42 @@ data Program = Program deriving (Generic, Show) instance ToJSON Program where - toEncoding = genericToEncoding defaultOptions + toJSON (Program name files) = object [ "name" .= name, "files" .= files ] + toEncoding (Program name files) = pairs ("name" .= name <> "files" .= files) +instance FromJSON Program + +data File = File + { path :: String, + supportLevel :: SupportLevel, + help :: String + } + deriving (Generic, Show) -save :: Program -> IO () -save program = do - let path = ("./programs/" ++ (T.unpack (name program)) ++ ".json") - B.writeFile path (encodePretty program) +instance ToJSON File where + toJSON (File path supportLevel help) = object [ "path" .= path, "movable" .= supportLevel, "help" .= help ] + toEncoding (File path supportLevel help) = pairs ("path" .= path <> "movable" .= supportLevel <> "help" .= help) data SupportLevel = Unsupported | Alias | EnvVars | Supported deriving (Generic, Show) instance ToJSON SupportLevel where + toJSON Unsupported = toJSON (Bool False) + toJSON _ = toJSON (Bool True) toEncoding Unsupported = toEncoding ( Bool False ) toEncoding _ = toEncoding ( Bool True ) +instance FromJSON SupportLevel where + parseJSON (Bool False) = return Unsupported + parseJSON (Bool True) = return EnvVars + +makeFilename :: T.Text -> T.Text +makeFilename s = T.pack ( "./programs/" ++ T.unpack s ++ ".json" ) + +save :: T.Text -> Program -> IO () +save filename program = do + createDirectoryIfMissing False "./programs/" + B.writeFile (T.unpack filename) (encodePretty program) +readProgram :: String -> IO ( Maybe Program ) +readProgram filename = do + json_data <- B.readFile filename + return (decode json_data)