--- /dev/null
+{-# 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 ()
module Output where
import qualified Data.Text as T
+import Data.Char (isSpace)
import Data.Text.ANSI
import Data.UUID
import Data.UUID.V4
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 ()
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
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"))
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
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