Skip to main content

shared/settings/
user.rs

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}