use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use serde_with::{base64::Base64, serde_as};
use url::Url;
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DittoConfig {
pub database_id: String,
pub connect: DittoConfigConnect,
#[serde(skip_serializing_if = "Option::is_none")]
pub persistence_directory: Option<PathBuf>,
#[doc(hidden)]
pub experimental: DittoConfigExperimental,
}
impl DittoConfig {
pub fn new<S: Into<String>>(database_id: S, connect: DittoConfigConnect) -> Self {
DittoConfig {
database_id: database_id.into(),
connect,
persistence_directory: None,
experimental: Default::default(),
}
}
pub fn with_persistence_directory<P: Into<PathBuf>>(mut self, path: P) -> Self {
self.persistence_directory = Some(path.into());
self
}
}
#[serde_as]
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum DittoConfigConnect {
Server {
url: Url,
},
SmallPeersOnly {
#[serde_as(as = "Option<Base64>")]
#[serde(skip_serializing_if = "Option::is_none")]
private_key: Option<Vec<u8>>,
},
}
#[doc(hidden)]
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct DittoConfigExperimental {
#[serde(skip_serializing_if = "Option::is_none")]
pub passphrase: Option<String>,
}