fedi/app/Main.hs
2024-12-17 10:46:59 +02:00

49 lines
1.3 KiB
Haskell

module Main where
import Data.Aeson qualified as A
import Network.Wai.Handler.Warp (run, Port)
import Network.Wai.Middleware.RequestLogger qualified as Logger
import System.Environment (getArgs)
import System.Environment (lookupEnv)
import Web.Twain qualified as Twain
import Fedi qualified as Fedi
import Data.Functor ((<&>))
main :: IO ()
main = do
getArgs >>= \case
[] -> pure ()
_ -> usageError
fediPort <- maybe 3001 read <$> lookupEnv "FEDI_PORT"
runServer fediPort =<< mkFediApp
usageError :: err
usageError =
errorWithoutStackTrace $ unlines
[ "Usage: fedi"
, "Env vars:"
, " - FEDI_PORT=<PORT>"
, " - FEDI_DETAILS=<FILE>"
]
-- | Run server at at specific port.
runServer :: Port -> Twain.Application -> IO ()
runServer port app = do
putStrLn $ unwords
[ "Running fedi at"
, "http://localhost:" <> show port
, "(ctrl-c to quit)"
]
run port (Logger.logStdoutDev app)
-- | Application description.
mkFediApp :: IO Twain.Application
mkFediApp = do
detailsFile <- lookupEnv "FEDI_DETAILS"
<&> maybe (error "missing FEDI_DETAILS") id
details <- A.eitherDecodeFileStrict detailsFile
<&> either (\err -> error $ "could not read file '" <> detailsFile <> "'.\n" <> err) id
pure $ foldr ($)
(Twain.notFound $ Twain.send $ Twain.text "Error: not found.")
(Fedi.routes details)