{-# LANGUAGE OverloadedStrings #-}

module Terraform.HttpBackend.Pass.Run where

import Data.Function ((&))
import qualified Network.Wai.Handler.Warp as Warp
import Options.Generic
import qualified Servant.Server as Servant
import qualified Terraform.HttpBackend.Pass.Api as Api
import Terraform.HttpBackend.Pass.App (runAppT)
import Terraform.HttpBackend.Pass.Env (Env, mkEnv)
import qualified Terraform.HttpBackend.Pass.Options as Options

run :: IO ()
run :: IO ()
run = do
  Options
opts <- forall (io :: * -> *) a.
(MonadIO io, ParseRecord a) =>
Text -> io a
getRecord Text
"Terraform HTTP Backend using Pass and Git"
  let env :: Env
env = Options -> Env
mkEnv Options
opts
  Port -> Application -> IO ()
Warp.run (Options -> Port
Options.port Options
opts) (forall api.
HasServer api '[] =>
Proxy api -> Server api -> Application
Servant.serve Proxy Api
Api.api (Env -> ServerT Api Handler
hoistServer Env
env))

hoistServer :: Env -> Servant.ServerT Api.Api Servant.Handler
hoistServer :: Env -> ServerT Api Handler
hoistServer Env
env = forall api (m :: * -> *) (n :: * -> *).
HasServer api '[] =>
Proxy api
-> (forall x. m x -> n x) -> ServerT api m -> ServerT api n
Servant.hoistServer Proxy Api
Api.api (forall (m :: * -> *) a. Env -> AppT m a -> m a
runAppT Env
env) forall (m :: * -> *).
(Monad m, MonadPass m, MonadGit m) =>
ServerT Api m
Api.server