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}