* WIP * Add debug * Dedupe inserts * Add deterministic ordering * Fix whitespaces * Update insta * Add integration test script * Rename * Add test * Working for non-deletes * omg it mostly works for deletes * Isdeleted fix * remove created dates * update api * Take document id * No max attempt * works * Use string uuids * . * working!!!! (hopefully) * Improve bundling * Add module * lint * . * lint * Fix CI * use toolchain * clean up * Add useSlowFileEvents * Delete fuzz * Fix CI * use docker * fix script * clean up * Clean up * change node version * Build docker image on every commit * fix ci * 1 db per vault * Add scritps folder * Bump versions * Lint * . * Fix tests for real * Style * . * try * Consistent ordering * Fix tests * hmm * . * Clean up diff * Fixes * . * Fix version bump * . * . * .
64 lines
1.8 KiB
Rust
64 lines
1.8 KiB
Rust
use std::path::Path;
|
|
|
|
use anyhow::{Context as _, Result};
|
|
use database_config::DatabaseConfig;
|
|
use log::{info, warn};
|
|
use serde::{Deserialize, Serialize};
|
|
use server_config::ServerConfig;
|
|
use tokio::fs;
|
|
use user_config::UserConfig;
|
|
|
|
pub mod database_config;
|
|
pub mod server_config;
|
|
pub mod user_config;
|
|
|
|
#[derive(Debug, Deserialize, Serialize, Clone, Default)]
|
|
pub struct Config {
|
|
#[serde(default)]
|
|
pub database: DatabaseConfig,
|
|
#[serde(default)]
|
|
pub server: ServerConfig,
|
|
#[serde(default)]
|
|
pub users: UserConfig,
|
|
}
|
|
|
|
impl Config {
|
|
pub async fn read_or_create(path: &Path) -> Result<Self> {
|
|
if path.exists() {
|
|
info!(
|
|
"Loading configuration from {:?}",
|
|
path.canonicalize().unwrap()
|
|
);
|
|
Self::load_from_file(path).await
|
|
} else {
|
|
let config = Self::default();
|
|
config.write(path).await?;
|
|
warn!(
|
|
"Configuration file not found, wrote default configuration to {:?}",
|
|
path.canonicalize().unwrap()
|
|
);
|
|
Ok(config)
|
|
}
|
|
}
|
|
|
|
pub async fn load_from_file(path: &Path) -> Result<Self> {
|
|
let contents = fs::read_to_string(path).await.with_context(|| {
|
|
format!(
|
|
"Cannot load configuration from disk from {}",
|
|
path.display()
|
|
)
|
|
})?;
|
|
|
|
let config = serde_yaml::from_str(&contents).context("Failed to parse configuration")?;
|
|
|
|
Ok(config)
|
|
}
|
|
|
|
pub async fn write(&self, path: &Path) -> Result<()> {
|
|
let contents = serde_yaml::to_string(&self).context("Failed to serialize configuration")?;
|
|
|
|
fs::write(path, contents)
|
|
.await
|
|
.context("Failed to write configuration to disk")
|
|
}
|
|
}
|