packages feed

SQLiteDAV-0.2.0.0: app/Main.hs

{-# LANGUAGE OverloadedRecordDot #-}

module Main where

import Protolude (
  IO,
  Int,
  Maybe (..),
  Text,
  die,
  fromMaybe,
  pure,
  putText,
  show,
  ($),
  (&),
  (<$>),
  (<*>),
  (<>),
 )

import Data.Text qualified as T
import Network.Wai.Handler.Warp (run)
import Network.Wai.Middleware.RequestLogger (logStdoutDev)
import Options.Applicative (
  Parser,
  argument,
  auto,
  execParser,
  fullDesc,
  help,
  helper,
  info,
  long,
  metavar,
  option,
  optional,
  progDesc,
  str,
  strOption,
  (<**>),
 )

import SQLiteDAV.Server (RowNameMode (..), parseRowNameMode, webDavServer)


data Options = Options
  { port :: Maybe Int
  , rowName :: Maybe Text
  , dbPath :: Text
  }


optionsParser :: Parser Options
optionsParser =
  Options
    <$> optional
      ( option
          auto
          ( long "port"
              <> metavar "INT"
              <> help "Port to listen on (default: 1234)"
          )
      )
    <*> optional
      ( strOption
          ( long "rowname"
              <> metavar "TEXT"
              <> help
                "How to name row directories: \
                \rowid (default), pk, or combined"
          )
      )
    <*> argument str (metavar "DB_PATH" <> help "Path to SQLite database file")


main :: IO ()
main = do
  options <-
    execParser $
      info
        (optionsParser <**> helper)
        (fullDesc <> progDesc "SQLiteDAV server")
  let thePort = options.port & fromMaybe 1234
  rowMode <- case options.rowName of
    Nothing -> pure RowIdMode
    Just raw -> case parseRowNameMode raw of
      Just m -> pure m
      Nothing ->
        die $
          "Invalid --rowname value: "
            <> raw
            <> " (expected rowid, pk, or combined)"
  putText $ "Starting server on http://localhost:" <> show thePort
  run thePort $
    logStdoutDev $
      webDavServer rowMode (T.unpack options.dbPath)