prettychart-0.3.0.0: app/prettychart-watch.hs
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Watch a file or directory for svg to serve
module Main where
import Box
import Control.Concurrent.Async
import GHC.Generics
import Optics.Core
import Options.Applicative
import Prettychart
import Web.Rep.Socket
import Prelude
data Run = RunWatch deriving (Eq, Show)
data AppConfig = AppConfig
{ appSocketConfig :: SocketConfig,
appRun :: Run,
appFilePath :: FilePath
}
deriving (Eq, Show, Generic)
defaultAppConfig :: AppConfig
defaultAppConfig = AppConfig defaultSocketConfig RunWatch "."
parseRun :: Parser Run
parseRun =
flag' RunWatch (long "watch" <> help "watch for svg chart files")
<|> pure RunWatch
parseSocketConfig :: SocketConfig -> Parser SocketConfig
parseSocketConfig def =
SocketConfig
<$> option auto (value (view #host def) <> long "host" <> help "socket host")
<*> option auto (value (view #port def) <> long "port" <> help "socket port")
<*> option auto (value (view #path def) <> long "path" <> help "socket path")
appParser :: AppConfig -> Parser AppConfig
appParser def =
AppConfig
<$> parseSocketConfig (view #appSocketConfig def)
<*> parseRun
<*> option str (value (view #appFilePath def) <> long "filepath" <> short 'f' <> help "file path to watch")
appConfig :: AppConfig -> ParserInfo AppConfig
appConfig def =
info
(appParser def <**> helper)
(fullDesc <> progDesc "SVG file server")
startWatcher :: IO ()
startWatcher = pure ()
startServer :: IO ()
startServer = pure ()
main :: IO ()
main = do
o <- execParser (appConfig defaultAppConfig)
let sc = appSocketConfig o
let r = appRun o
let fp = appFilePath o
case r of
RunWatch -> do
(c, stop) <- displayFile sc (chartSocketPage Nothing)
a <- async $ glue' c <$|> watchSvg fp
putStrLn ("listening to" <> fp)
print =<< wait a
stop