packages feed

festung-0.9.1.1: prog/Main.hs

{-# LANGUAGE NamedFieldPuns #-}

module Main where

import Festung.Config
import Festung.Frontend           (App(App))
import Festung.Utils              (getVersion)
import Festung.Vault.VaultManager (newManager)
import System.Console.ArgParser
import Yesod                      (warp)


-- FIXME: We pass config all over the place. It looks like this could be a
--        monad to maintain state.
applicationRunner :: Config -> IO ()
applicationRunner config@Config { port } = do
    vaultManager <- newManager config
    warp port (App config vaultManager)


cmdLineInterface :: IO (CmdLnInterface Config)
cmdLineInterface =
    (`setAppDescr` "Remote SQLCipher server.") .
    (`setAppVersion` getVersion) <$>
    mkApp cmdLineParser
        where setAppVersion app v = app { getAppVersion = Just v }


toMicroSeconds :: Int -> Int
toMicroSeconds = (*) (1000 * 1000)


cmdLineParser :: ParserSpec Config
cmdLineParser = constructor
    `parsedBy` reqPos "data_directory" `Descr` "Location of the vaults"
    `andBy` optFlag 2728 "port"        `Descr` "API port"
    `andBy` optFlag 15   "timeout"     `Descr` "Vault timeout"
        where constructor dir port timeout = Config dir (toMicroSeconds timeout) port


main :: IO ()
main = cmdLineInterface >>= flip runApp applicationRunner