api_key.gleam

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: AGPL-3.0-or-later
 4
 5import config
 6import envoy
 7import gleam/option.{None, Some}
 8import gleam/string
 9import providers.{type Provider}
10import shellout
11
12pub fn get(provider: Provider, cfg: config.Config) -> Result(String, String) {
13  // Precedence: api_key_cmd > api_key > environment variable
14  case cfg.api_key_cmd {
15    "" ->
16      case cfg.api_key {
17        "" -> get_from_env(provider)
18        key -> Ok(key)
19      }
20    cmd -> run_cmd(cmd)
21  }
22}
23
24fn run_cmd(cmd: String) -> Result(String, String) {
25  case shellout.command(run: "sh", with: ["-c", cmd], in: ".", opt: []) {
26    Ok(output) -> Ok(string.trim(output))
27    Error(#(_status, msg)) -> Error("api_key_cmd failed: " <> msg)
28  }
29}
30
31fn get_from_env(provider: Provider) -> Result(String, String) {
32  case provider.api_key_env {
33    Some(env_ref) -> {
34      let env_var = resolve_env_var(env_ref)
35      case envoy.get(env_var) {
36        Ok(key) -> Ok(key)
37        Error(_) -> Error("Missing environment variable: " <> env_var)
38      }
39    }
40    None -> Error("No API key configured for provider: " <> provider.id)
41  }
42}
43
44fn resolve_env_var(value: String) -> String {
45  case value {
46    "$" <> rest -> rest
47    other -> other
48  }
49}