1use super::{
2 ExtensionSettings, SettingsDeserializeExt, SettingsDeserializer, SettingsSerializeExt,
3 SettingsSerializer,
4};
5use compact_str::ToCompactString;
6use serde::{Deserialize, Serialize};
7use utoipa::ToSchema;
8
9#[derive(Clone, ToSchema, Serialize, Deserialize)]
10pub struct AppSettingsUser {
11 pub max_server_group_count: u64,
12 pub max_api_key_count: u64,
13 pub max_command_snippet_count: u64,
14 pub max_security_key_count: u64,
15 pub max_ssh_key_count: u64,
16 pub max_settings_count: u64,
17 pub max_settings_value_bytes: u64,
18
19 pub allow_changing_language: bool,
20
21 pub route_order: Option<Vec<super::RouteOrderItem>>,
22}
23
24#[async_trait::async_trait]
25impl SettingsSerializeExt for AppSettingsUser {
26 async fn serialize(
27 &self,
28 serializer: SettingsSerializer,
29 ) -> Result<SettingsSerializer, anyhow::Error> {
30 Ok(serializer
31 .write_raw_setting(
32 "max_server_group_count",
33 self.max_server_group_count.to_compact_string(),
34 )
35 .write_raw_setting(
36 "max_api_key_count",
37 self.max_api_key_count.to_compact_string(),
38 )
39 .write_raw_setting(
40 "max_command_snippet_count",
41 self.max_command_snippet_count.to_compact_string(),
42 )
43 .write_raw_setting(
44 "max_security_key_count",
45 self.max_security_key_count.to_compact_string(),
46 )
47 .write_raw_setting(
48 "max_ssh_key_count",
49 self.max_ssh_key_count.to_compact_string(),
50 )
51 .write_raw_setting(
52 "max_settings_count",
53 self.max_settings_count.to_compact_string(),
54 )
55 .write_raw_setting(
56 "max_settings_value_bytes",
57 self.max_settings_value_bytes.to_compact_string(),
58 )
59 .write_raw_setting(
60 "allow_changing_language",
61 self.allow_changing_language.to_compact_string(),
62 )
63 .write_serde_setting("route_order", &self.route_order)?)
64 }
65}
66
67pub struct AppSettingsUserDeserializer;
68
69#[async_trait::async_trait]
70impl SettingsDeserializeExt for AppSettingsUserDeserializer {
71 async fn deserialize_boxed(
72 &self,
73 mut deserializer: SettingsDeserializer<'_>,
74 ) -> Result<ExtensionSettings, anyhow::Error> {
75 Ok(Box::new(AppSettingsUser {
76 max_server_group_count: deserializer
77 .take_raw_setting("max_server_group_count")
78 .and_then(|s| s.parse().ok())
79 .unwrap_or(25),
80 max_api_key_count: deserializer
81 .take_raw_setting("max_api_key_count")
82 .and_then(|s| s.parse().ok())
83 .unwrap_or(50),
84 max_command_snippet_count: deserializer
85 .take_raw_setting("max_command_snippet_count")
86 .and_then(|s| s.parse().ok())
87 .unwrap_or(100),
88 max_security_key_count: deserializer
89 .take_raw_setting("max_security_key_count")
90 .and_then(|s| s.parse().ok())
91 .unwrap_or(50),
92 max_ssh_key_count: deserializer
93 .take_raw_setting("max_ssh_key_count")
94 .and_then(|s| s.parse().ok())
95 .unwrap_or(50),
96 max_settings_count: deserializer
97 .take_raw_setting("max_settings_count")
98 .and_then(|s| s.parse().ok())
99 .unwrap_or(512),
100 max_settings_value_bytes: deserializer
101 .take_raw_setting("max_settings_value_bytes")
102 .and_then(|s| s.parse().ok())
103 .unwrap_or(16384),
104 allow_changing_language: deserializer
105 .take_raw_setting("allow_changing_language")
106 .map(|s| s == "true")
107 .unwrap_or(true),
108 route_order: deserializer
109 .read_serde_setting("route_order")
110 .unwrap_or_default(),
111 }))
112 }
113}