1use serde::{Deserialize, Serialize};
2
3#[cfg(feature = "schema")]
4use schemars::JsonSchema;
5
6use crate::openrouter_oauth::OpenRouterOAuthConfig;
7
8#[derive(Debug, Clone, Default, Serialize, Deserialize)]
9#[cfg_attr(feature = "schema", derive(JsonSchema))]
10pub struct AuthConfig {
11 #[serde(default)]
12 pub openrouter: OpenRouterOAuthConfig,
13 #[serde(default)]
14 pub openai: OpenAIAuthConfig,
15}
16
17#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
18#[cfg_attr(feature = "schema", derive(JsonSchema))]
19#[serde(rename_all = "snake_case")]
20pub enum OpenAIPreferredMethod {
21 #[default]
22 Auto,
23 ApiKey,
24 Chatgpt,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28#[cfg_attr(feature = "schema", derive(JsonSchema))]
29#[serde(default)]
30pub struct OpenAIAuthConfig {
31 pub preferred_method: OpenAIPreferredMethod,
32 pub callback_port: u16,
33 pub auto_refresh: bool,
34 pub flow_timeout_secs: u64,
35}
36
37impl Default for OpenAIAuthConfig {
38 fn default() -> Self {
39 Self {
40 preferred_method: OpenAIPreferredMethod::Auto,
41 callback_port: 1455,
42 auto_refresh: true,
43 flow_timeout_secs: 300,
44 }
45 }
46}
47
48impl OpenAIPreferredMethod {
49 #[must_use]
50 pub fn as_str(self) -> &'static str {
51 match self {
52 Self::Auto => "auto",
53 Self::ApiKey => "api_key",
54 Self::Chatgpt => "chatgpt",
55 }
56 }
57}
58
59impl OpenAIAuthConfig {
60 #[must_use]
61 pub fn callback_url(&self) -> String {
62 format!("http://localhost:{}/callback", self.callback_port)
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69
70 #[test]
71 fn openai_defaults_match_expected_values() {
72 let config = OpenAIAuthConfig::default();
73 assert_eq!(config.preferred_method, OpenAIPreferredMethod::Auto);
74 assert_eq!(config.callback_port, 1455);
75 assert!(config.auto_refresh);
76 assert_eq!(config.flow_timeout_secs, 300);
77 }
78}