Skip to main content

oversync_core/
config.rs

1#[cfg(feature = "cli")]
2use clap::Parser;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[cfg_attr(feature = "cli", derive(Parser))]
7#[cfg_attr(
8	feature = "cli",
9	command(
10		name = "oversync",
11		about = "Lightweight data sync engine: poll, delta, sink"
12	)
13)]
14pub struct OversyncConfig {
15	#[cfg_attr(
16		feature = "cli",
17		arg(long, env = "OVERSYNC_BIND", default_value = "0.0.0.0:4200")
18	)]
19	pub bind: String,
20
21	#[cfg_attr(
22		feature = "cli",
23		arg(long, env = "OVERSYNC_LOG_LEVEL", default_value = "info")
24	)]
25	pub log_level: String,
26
27	#[cfg_attr(feature = "cli", command(flatten))]
28	pub surrealdb: SurrealDbConfig,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[cfg_attr(feature = "cli", derive(Parser))]
33pub struct SurrealDbConfig {
34	#[cfg_attr(
35		feature = "cli",
36		arg(
37			long,
38			env = "OVERSYNC_SURREALDB_URL",
39			default_value = "http://127.0.0.1:8000"
40		)
41	)]
42	pub url: String,
43
44	#[cfg_attr(
45		feature = "cli",
46		arg(long, env = "OVERSYNC_SURREALDB_USER", default_value = "root")
47	)]
48	pub user: String,
49
50	#[cfg_attr(
51		feature = "cli",
52		arg(long, env = "OVERSYNC_SURREALDB_PASS", default_value = "root")
53	)]
54	pub pass: String,
55
56	#[cfg_attr(
57		feature = "cli",
58		arg(long, env = "OVERSYNC_SURREALDB_NS", default_value = "oversync")
59	)]
60	pub ns: String,
61
62	#[cfg_attr(
63		feature = "cli",
64		arg(long, env = "OVERSYNC_SURREALDB_DB", default_value = "sync")
65	)]
66	pub db: String,
67}
68
69#[cfg(test)]
70mod tests {
71	use super::*;
72
73	#[test]
74	fn config_defaults() {
75		let config = OversyncConfig {
76			bind: "0.0.0.0:4200".into(),
77			log_level: "info".into(),
78			surrealdb: SurrealDbConfig {
79				url: "http://127.0.0.1:8000".into(),
80				user: "root".into(),
81				pass: "root".into(),
82				ns: "oversync".into(),
83				db: "sync".into(),
84			},
85		};
86		assert_eq!(config.bind, "0.0.0.0:4200");
87		assert_eq!(config.surrealdb.ns, "oversync");
88	}
89
90	#[test]
91	fn config_roundtrip_json() {
92		let config = OversyncConfig {
93			bind: "127.0.0.1:9999".into(),
94			log_level: "debug".into(),
95			surrealdb: SurrealDbConfig {
96				url: "http://localhost:8000".into(),
97				user: "admin".into(),
98				pass: "secret".into(),
99				ns: "test".into(),
100				db: "testdb".into(),
101			},
102		};
103		let json = serde_json::to_string(&config).unwrap();
104		let back: OversyncConfig = serde_json::from_str(&json).unwrap();
105		assert_eq!(config.bind, back.bind);
106		assert_eq!(config.surrealdb.url, back.surrealdb.url);
107	}
108}