module Bot.Config ( Config (..) , loadConfig ) where import Data.Text (Text) import Data.Text qualified as T import System.Environment (lookupEnv) import System.Exit (exitFailure) import System.IO (hPutStrLn, stderr) data Config = Config { cfgGiteaUrl :: Text , cfgGiteaToken :: Text , cfgRepoOwner :: Text , cfgRepoName :: Text , cfgEventName :: Text , cfgEventPath :: FilePath , cfgRunId :: Text , cfgBotUser :: Text -- filled in later by Gitea.getCurrentUser , cfgTriggerPhrase :: Text } loadConfig :: IO Config loadConfig = do giteaUrl <- requireEnv "GITHUB_SERVER_URL" token <- requireEnv "GITHUB_TOKEN" repository <- requireEnv "GITHUB_REPOSITORY" eventName <- requireEnv "GITHUB_EVENT_NAME" eventPath <- requireEnv "GITHUB_EVENT_PATH" runId <- lookupEnvText "GITHUB_RUN_ID" "" trigger <- lookupEnvText "INPUT_TRIGGER_PHRASE" "@claude" let repoText = T.pack repository (owner, name) <- case T.splitOn "/" repoText of [o, n] -> pure (o, n) _ -> do hPutStrLn stderr $ "Invalid GITHUB_REPOSITORY format: " <> repository exitFailure pure Config { cfgGiteaUrl = T.pack giteaUrl , cfgGiteaToken = T.pack token , cfgRepoOwner = owner , cfgRepoName = name , cfgEventName = T.pack eventName , cfgEventPath = eventPath , cfgRunId = runId , cfgBotUser = "" -- set after getCurrentUser , cfgTriggerPhrase = trigger } requireEnv :: String -> IO String requireEnv name = do val <- lookupEnv name case val of Just v -> pure v Nothing -> do hPutStrLn stderr $ "Missing required environment variable: " <> name exitFailure lookupEnvText :: String -> Text -> IO Text lookupEnvText name def = do val <- lookupEnv name pure $ maybe def T.pack val