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}