From: b3nj4m1n Date: Sun, 22 May 2022 13:44:51 +0000 (+0200) Subject: Add checks haskell module X-Git-Tag: v0.2.0.0~26 X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/xdg-ninja.git/commitdiff_plain/932a10db39f29909cb93b9afce14928dcc5e8326 Add checks haskell module --- diff --git a/lib/Checks.hs b/lib/Checks.hs new file mode 100644 index 0000000..671389c --- /dev/null +++ b/lib/Checks.hs @@ -0,0 +1,63 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Checks where + +import Program +import Data.List (isSuffixOf) +import Output +import System.FilePath +import qualified Data.Text as T +import qualified Data.Text.Lazy as TL +import Data.Text.ANSI +import System.Directory.Extra +import System.Environment (getEnv) +import Text.Replace + +data Result = Exist | MustExist | NoExist + deriving Show + +expandPath :: String -> IO String +expandPath path = do + home <- getEnv "HOME" + let replacements = [ Replace "$HOME" (T.pack home) ] + let result = replaceWithList replacements (TL.pack path) + return (TL.unpack result) + + +checkFile :: T.Text -> Bool -> File -> IO Result +checkFile programName verbose file = do + path <- expandPath (path file) + existsFile <- doesFileExist path + existsDir <- doesDirectoryExist path + case (existsFile || existsDir) of + False -> case verbose of + False -> return NoExist + True -> do + logFile programName file False + return NoExist + True -> do + logFile programName file True + case (supportLevel file) of + Unsupported -> return MustExist + _ -> return Exist + +checkProgram :: Bool -> Program -> IO [Result] +checkProgram verbose program = sequence (map (checkFile (name program) verbose) (files program)) + +checkProgramFile :: String -> IO [Result] +checkProgramFile filename = do + x <- readProgram filename + case x of + Just program -> do + results <- checkProgram False program + return results + Nothing -> do + putStrLn (T.unpack (red (T.pack "Error."))) + return [] + +checkDir :: FilePath -> IO () +checkDir dirname = do + files <- getDirectoryContents dirname + jsonFiles <- return ( map (\x -> dirname x) (filter (isSuffixOf ".json") files )) + results <- sequence (map checkProgramFile jsonFiles) + return () diff --git a/lib/Output.hs b/lib/Output.hs index d36db9d..ddc486a 100644 --- a/lib/Output.hs +++ b/lib/Output.hs @@ -1,6 +1,7 @@ module Output where import qualified Data.Text as T +import Data.Char (isSpace) import Data.Text.ANSI import Data.UUID import Data.UUID.V4 @@ -42,7 +43,9 @@ log mode name filename help = case mode of Output.log HELP name filename help SUCS -> putStrLn (line green name filename) HELP -> do - md <- renderMarkdown help + md <- case (all isSpace help) of + True -> renderMarkdown "_No help available._" + False -> renderMarkdown help putStr md logFile :: T.Text -> File -> Bool -> IO () diff --git a/src/xdgnj.hs b/src/xdgnj.hs index a379bf4..306c22b 100644 --- a/src/xdgnj.hs +++ b/src/xdgnj.hs @@ -2,12 +2,14 @@ module Main where import qualified AddProgram as PA +import qualified Checks as C import Data.Semigroup ((<>)) import qualified EditProgram as PE import qualified PreviewProgram as PP import Options.Applicative -data Args = AddProgram +data Args = RunChecks + | AddProgram | EditProgram String | PreviewProgram String | LintProgram String @@ -25,7 +27,8 @@ lintProgram = LintProgram <$> argument str (metavar "PROGRAM") argsParser :: Parser Args argsParser = subparser - (command "add" (info (pure AddProgram) (progDesc "Add program")) + (command "run" (info (pure RunChecks) (progDesc "Run checks")) + <> command "add" (info (pure AddProgram) (progDesc "Add program")) <> command "edit" (info editProgram (progDesc "Edit program config")) <> command "prev" (info previewProgram (progDesc "Preview program config")) <> command "lintp" (info lintProgram (progDesc "Lint program config")) @@ -40,6 +43,7 @@ main :: IO () main = do args <- execParser args case args of + RunChecks -> C.checkDir "./programs" AddProgram -> PA.saveProgram EditProgram filename -> PE.editProgram filename PreviewProgram filename -> PP.previewProgramFile filename diff --git a/xdgnj.cabal b/xdgnj.cabal index d15083d..d7d089d 100644 --- a/xdgnj.cabal +++ b/xdgnj.cabal @@ -33,9 +33,11 @@ library text-ansi ^>=0.1.1, extra ^>=1.7.10, aeson-pretty ^>=0.8.9, + text-replace ^>=0.1, + filepath ^>=1.4.2.2, hs-source-dirs: lib default-language: Haskell2010 - exposed-modules: AddProgram, Program, Prompts, EditProgram, Output, PreviewProgram + exposed-modules: AddProgram, Program, Prompts, EditProgram, Output, PreviewProgram, Checks executable add-program main-is: add-program.hs