cc_switch/config/
types.rs1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2use std::collections::BTreeMap;
3
4type ConfigMap = BTreeMap<String, Configuration>;
6type EnvMap = BTreeMap<String, String>;
8type JsonMap = BTreeMap<String, serde_json::Value>;
10
11#[derive(Serialize, Deserialize, Default, Clone)]
20pub struct Configuration {
21 pub alias_name: String,
23 pub token: String,
25 pub url: String,
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub model: Option<String>,
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub small_fast_model: Option<String>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub max_thinking_tokens: Option<u32>,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub api_timeout_ms: Option<u32>,
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub claude_code_disable_nonessential_traffic: Option<u32>,
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub anthropic_default_sonnet_model: Option<String>,
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub anthropic_default_opus_model: Option<String>,
48 #[serde(skip_serializing_if = "Option::is_none")]
50 pub anthropic_default_haiku_model: Option<String>,
51}
52
53#[derive(Serialize, Deserialize, Default)]
58pub struct ConfigStorage {
59 pub configurations: ConfigMap,
61 pub claude_settings_dir: Option<String>,
63}
64
65#[derive(Default, Clone)]
70#[allow(dead_code)]
71pub struct ClaudeSettings {
72 pub env: EnvMap,
74 pub other: JsonMap,
76}
77
78impl Serialize for ClaudeSettings {
79 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
80 where
81 S: Serializer,
82 {
83 use serde::ser::SerializeMap;
84
85 let mut map = serializer.serialize_map(Some(
86 self.other.len() + if self.env.is_empty() { 0 } else { 1 },
87 ))?;
88
89 if !self.env.is_empty() {
91 map.serialize_entry("env", &self.env)?;
92 }
93
94 for (key, value) in &self.other {
96 map.serialize_entry(key, value)?;
97 }
98
99 map.end()
100 }
101}
102
103impl<'de> Deserialize<'de> for ClaudeSettings {
104 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
105 where
106 D: Deserializer<'de>,
107 {
108 #[derive(Deserialize)]
109 struct ClaudeSettingsHelper {
110 #[serde(default)]
111 env: EnvMap,
112 #[serde(flatten)]
113 other: JsonMap,
114 }
115
116 let helper = ClaudeSettingsHelper::deserialize(deserializer)?;
117 Ok(ClaudeSettings {
118 env: helper.env,
119 other: helper.other,
120 })
121 }
122}
123
124#[allow(dead_code)]
126pub struct AddCommandParams {
127 pub alias_name: String,
128 pub token: Option<String>,
129 pub url: Option<String>,
130 pub model: Option<String>,
131 pub small_fast_model: Option<String>,
132 pub max_thinking_tokens: Option<u32>,
133 pub api_timeout_ms: Option<u32>,
134 pub claude_code_disable_nonessential_traffic: Option<u32>,
135 pub anthropic_default_sonnet_model: Option<String>,
136 pub anthropic_default_opus_model: Option<String>,
137 pub anthropic_default_haiku_model: Option<String>,
138 pub force: bool,
139 pub interactive: bool,
140 pub token_arg: Option<String>,
141 pub url_arg: Option<String>,
142 pub from_file: Option<String>,
143}