]> glassweightruler.freedombox.rocks Git - xdg-ninja.git/commitdiff
Add checks haskell module
authorb3nj4m1n <b3nj4m1n@gmx.net>
Sun, 22 May 2022 13:44:51 +0000 (15:44 +0200)
committerb3nj4m1n <b3nj4m1n@gmx.net>
Sun, 22 May 2022 13:44:51 +0000 (15:44 +0200)
lib/Checks.hs [new file with mode: 0644]
lib/Output.hs
src/xdgnj.hs
xdgnj.cabal

diff --git a/lib/Checks.hs b/lib/Checks.hs
new file mode 100644 (file)
index 0000000..671389c
--- /dev/null
@@ -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 ()
index d36db9ddc55797c192e899174aca16d7aa790041..ddc486af255ac878212f807bf3f09e2e7ae11691 100644 (file)
@@ -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 ()
index a379bf4f29b5ce92ff1dc9488cd88f45b0b26854..306c22ba8747e294f34f31fba75b99fa54f3c17a 100644 (file)
@@ -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
index d15083d81dbd2d8e4a6ea88dfbfe6f4549778fad..d7d089d6a5eeaf25bde57960867cd00944d10484 100644 (file)
@@ -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