mas_config/sections/
matrix.rs1use rand::{
8 Rng,
9 distributions::{Alphanumeric, DistString},
10};
11use schemars::JsonSchema;
12use serde::{Deserialize, Serialize};
13use serde_with::serde_as;
14use url::Url;
15
16use super::ConfigurationSection;
17
18fn default_homeserver() -> String {
19 "localhost:8008".to_owned()
20}
21
22fn default_endpoint() -> Url {
23 Url::parse("http://localhost:8008/").unwrap()
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)]
28#[serde(rename_all = "snake_case")]
29pub enum HomeserverKind {
30 #[default]
34 Synapse,
35
36 SynapseReadOnly,
43
44 SynapseLegacy,
46
47 SynapseModern,
49}
50
51#[serde_as]
53#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
54pub struct MatrixConfig {
55 #[serde(default)]
57 pub kind: HomeserverKind,
58
59 #[serde(default = "default_homeserver")]
61 pub homeserver: String,
62
63 pub secret: String,
65
66 #[serde(default = "default_endpoint")]
68 pub endpoint: Url,
69}
70
71impl ConfigurationSection for MatrixConfig {
72 const PATH: Option<&'static str> = Some("matrix");
73}
74
75impl MatrixConfig {
76 pub(crate) fn generate<R>(mut rng: R) -> Self
77 where
78 R: Rng + Send,
79 {
80 Self {
81 kind: HomeserverKind::default(),
82 homeserver: default_homeserver(),
83 secret: Alphanumeric.sample_string(&mut rng, 32),
84 endpoint: default_endpoint(),
85 }
86 }
87
88 pub(crate) fn test() -> Self {
89 Self {
90 kind: HomeserverKind::default(),
91 homeserver: default_homeserver(),
92 secret: "test".to_owned(),
93 endpoint: default_endpoint(),
94 }
95 }
96}
97
98#[cfg(test)]
99mod tests {
100 use figment::{
101 Figment, Jail,
102 providers::{Format, Yaml},
103 };
104
105 use super::*;
106
107 #[test]
108 fn load_config() {
109 Jail::expect_with(|jail| {
110 jail.create_file(
111 "config.yaml",
112 r"
113 matrix:
114 homeserver: matrix.org
115 secret: test
116 ",
117 )?;
118
119 let config = Figment::new()
120 .merge(Yaml::file("config.yaml"))
121 .extract_inner::<MatrixConfig>("matrix")?;
122
123 assert_eq!(&config.homeserver, "matrix.org");
124 assert_eq!(&config.secret, "test");
125
126 Ok(())
127 });
128 }
129}