#[cfg(feature = "cli")]
use clap::Parser;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "cli", derive(Parser))]
#[cfg_attr(
feature = "cli",
command(
name = "oversync",
about = "Lightweight data sync engine: poll, delta, sink"
)
)]
pub struct OversyncConfig {
#[cfg_attr(
feature = "cli",
arg(long, env = "OVERSYNC_BIND", default_value = "0.0.0.0:4200")
)]
pub bind: String,
#[cfg_attr(
feature = "cli",
arg(long, env = "OVERSYNC_LOG_LEVEL", default_value = "info")
)]
pub log_level: String,
#[cfg_attr(feature = "cli", command(flatten))]
pub surrealdb: SurrealDbConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "cli", derive(Parser))]
pub struct SurrealDbConfig {
#[cfg_attr(
feature = "cli",
arg(
long,
env = "OVERSYNC_SURREALDB_URL",
default_value = "http://127.0.0.1:8000"
)
)]
pub url: String,
#[cfg_attr(
feature = "cli",
arg(long, env = "OVERSYNC_SURREALDB_USER", default_value = "root")
)]
pub user: String,
#[cfg_attr(
feature = "cli",
arg(long, env = "OVERSYNC_SURREALDB_PASS", default_value = "root")
)]
pub pass: String,
#[cfg_attr(
feature = "cli",
arg(long, env = "OVERSYNC_SURREALDB_NS", default_value = "oversync")
)]
pub ns: String,
#[cfg_attr(
feature = "cli",
arg(long, env = "OVERSYNC_SURREALDB_DB", default_value = "sync")
)]
pub db: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn config_defaults() {
let config = OversyncConfig {
bind: "0.0.0.0:4200".into(),
log_level: "info".into(),
surrealdb: SurrealDbConfig {
url: "http://127.0.0.1:8000".into(),
user: "root".into(),
pass: "root".into(),
ns: "oversync".into(),
db: "sync".into(),
},
};
assert_eq!(config.bind, "0.0.0.0:4200");
assert_eq!(config.surrealdb.ns, "oversync");
}
#[test]
fn config_roundtrip_json() {
let config = OversyncConfig {
bind: "127.0.0.1:9999".into(),
log_level: "debug".into(),
surrealdb: SurrealDbConfig {
url: "http://localhost:8000".into(),
user: "admin".into(),
pass: "secret".into(),
ns: "test".into(),
db: "testdb".into(),
},
};
let json = serde_json::to_string(&config).unwrap();
let back: OversyncConfig = serde_json::from_str(&json).unwrap();
assert_eq!(config.bind, back.bind);
assert_eq!(config.surrealdb.url, back.surrealdb.url);
}
}