packages feed

servant-serf-0.3.1.3: source/library/ServantSerf/Module.hs

module ServantSerf.Module where

import qualified Data.List as List
import qualified Data.Maybe as Maybe
import qualified ServantSerf.Type.Config as Config
import qualified ServantSerf.Type.Context as Context
import qualified ServantSerf.Type.ModuleName as ModuleName
import qualified System.FilePath as FilePath

generate :: Context.Context -> [FilePath] -> String
generate context files =
  let source = Context.source context
      config = Context.config context
      apiName = Config.apiName config
      serverName = Config.serverName config
      moduleName = case Config.moduleName config of
        Nothing ->
          maybe "Main" ModuleName.toString
            . ModuleName.fromFilePath
            $ Context.source context
        Just x -> ModuleName.toString x
      suffix = Config.excludeSuffix config
      moduleNames =
        (if null suffix then id else filter $ not . List.isSuffixOf suffix)
          . fmap ModuleName.toString
          . List.sort
          . Maybe.mapMaybe ModuleName.fromFilePath
          $ filter (FilePath.isExtensionOf "hs") files
   in unlines
        [ "{-# LINE 1 " <> show source <> " #-}",
          "{-# OPTIONS_GHC -w #-}",
          "",
          "module " <> moduleName <> " where",
          "",
          "import qualified Servant",
          "",
          List.intercalate "\n" $ fmap ("import qualified " <>) moduleNames,
          "",
          "type " <> apiName,
          "\t= "
            <> if null moduleNames
              then "Servant.EmptyAPI"
              else
                List.intercalate "\n\tServant.:<|> " $
                  fmap (<> "." <> apiName) moduleNames,
          "",
          serverName,
          "\t= "
            <> if null moduleNames
              then "Servant.emptyServer"
              else
                List.intercalate "\n\tServant.:<|> " $
                  fmap (<> "." <> serverName) moduleNames
        ]