packages feed

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