{-# LANGUAGE OverloadedStrings #-} module Main where import Config import License import Paths_toodles import Server import Types import Control.Monad (when) import Data.IORef (newIORef) import Data.Maybe (fromMaybe) import qualified Data.Text as T (unpack) import Network.Wai.Handler.Warp (run) import System.Directory import System.Environment import System.FilePath.Posix import Text.Printf (printf) main :: IO () main = do dataDirLocal <- (return . takeDirectory) =<< getExecutablePath dataDirBuilt <- getDataDir useBinaryLocalDataDir <- doesDirectoryExist $ dataDirLocal <> "/web" useBuiltDataDir <- doesDirectoryExist $ dataDirBuilt <> "/web" when ((not useBinaryLocalDataDir) && (not useBuiltDataDir)) (fail $ "Couldn't initialize toodles, no valid data directory found. Please file a bug on Github. Directories tried: \n" ++ dataDirLocal ++ "\n" ++ dataDirBuilt) let dataDir = if useBinaryLocalDataDir then dataDirLocal else dataDirBuilt licenseRead <- readLicense (dataDir ++ "/toodles-license-public-key.pem") "/etc/toodles/license.json" let license = (either (BadLicense) (id) licenseRead) userArgs <- toodlesArgs >>= setAbsolutePath case userArgs of (ToodlesArgs _ _ _ _ True _) -> do sResults <- runFullSearch userArgs mapM_ (putStrLn . prettyFormat) $ todos sResults _ -> do let webPort = fromMaybe 9001 $ port userArgs ref <- newIORef Nothing putStrLn $ "serving on " ++ show webPort tierRef <- newIORef license run webPort $ app $ ToodlesState ref (dataDir ++ "/web") tierRef prettyFormat :: TodoEntry -> String prettyFormat (TodoEntryHead _ l a p n entryPriority f _ _ _ _ _ _) = printf "Assignee: %s\n%s%s:%d\n%s - %s" (fromMaybe "None" a) (maybe "" (\x -> "Priority: " ++ show x ++ "\n") entryPriority) p n (show f) (unlines $ map T.unpack l) prettyFormat a = error "Invalid type for prettyFormat: " ++ show a