feat(sync): impl Default trait for conf struct

This commit is contained in:
PoiScript 2019-09-16 15:12:49 +08:00
parent 3a1b568743
commit 7d838b4c03

View file

@ -13,23 +13,6 @@ const APP_INFO: AppInfo = AppInfo {
author: "PoiScript", author: "PoiScript",
}; };
#[derive(Serialize, Deserialize, Debug)]
pub struct Conf {
#[serde(default = "default_env_path")]
pub env_path: PathBuf,
#[serde(default)]
pub files: Vec<File>,
#[cfg(feature = "google_calendar")]
#[serde(skip_serializing_if = "Option::is_none")]
pub google_calendar: Option<GoogleCalendarGlobalConf>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EnvConf {
#[serde(default = "default_env_path")]
pub env_path: PathBuf,
}
pub fn user_config_path() -> PathBuf { pub fn user_config_path() -> PathBuf {
app_root(AppDataType::UserConfig, &APP_INFO).unwrap() app_root(AppDataType::UserConfig, &APP_INFO).unwrap()
} }
@ -50,26 +33,68 @@ pub fn default_env_path() -> PathBuf {
path path
} }
#[derive(Serialize, Deserialize)]
#[serde(default)]
pub struct Conf {
#[cfg(feature = "dotenv")]
pub env_path: PathBuf,
pub up_days: i64,
pub down_days: i64,
pub files: Vec<FileConf>,
#[cfg(feature = "google_calendar")]
#[serde(skip_serializing_if = "Option::is_none")]
pub google_calendar: Option<GoogleCalendarGlobalConf>,
}
impl Default for Conf {
fn default() -> Self {
Conf {
#[cfg(feature = "dotenv")]
env_path: default_env_path(),
up_days: 7,
down_days: 7,
files: Vec::new(),
google_calendar: None,
}
}
}
#[derive(Serialize, Deserialize)]
#[serde(default)]
pub struct EnvConf {
pub env_path: PathBuf,
}
impl Default for EnvConf {
fn default() -> Self {
EnvConf {
env_path: default_env_path(),
}
}
}
impl Conf { impl Conf {
pub fn new(path: Option<PathBuf>) -> Result<Self> { pub fn new(path: Option<PathBuf>) -> Result<Self> {
let path = path.unwrap_or_else(default_config_path); let path = path.unwrap_or_else(default_config_path);
let content = fs::read(&path).expect(&format!( let content = fs::read(&path).expect(&format!(
"Failed to read file: {}", "Failed to read fileConf: {}",
path.as_path().display() path.as_path().display()
)); ));
if cfg!(feature = "dotenv") { if cfg!(feature = "dotenv") {
let env_conf: EnvConf = toml::from_slice(&content)?; let env_conf: EnvConf = toml::from_slice(&content)?;
if env_conf.env_path.as_path().exists() {
dotenv::from_path(env_conf.env_path.as_path())?; dotenv::from_path(env_conf.env_path.as_path())?;
} }
}
Ok(toml::from_slice(&content)?) Ok(toml::from_slice(&content)?)
} }
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize)]
pub struct File { pub struct FileConf {
pub path: String, pub path: String,
pub name: Option<String>, pub name: Option<String>,
#[cfg(feature = "google_calendar")] #[cfg(feature = "google_calendar")]
@ -81,56 +106,45 @@ pub struct File {
pub mod google_calendar { pub mod google_calendar {
use super::*; use super::*;
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize)]
#[serde(default)]
pub struct GoogleCalendarGlobalConf { pub struct GoogleCalendarGlobalConf {
#[serde(default = "default_client_id")]
pub client_id: String, pub client_id: String,
#[serde(default = "default_client_secret")]
pub client_secret: String, pub client_secret: String,
#[serde(default = "default_token_dir")]
pub token_dir: PathBuf, pub token_dir: PathBuf,
#[serde(default = "default_token_filename")]
pub token_filename: String, pub token_filename: String,
#[serde(default = "default_property")]
pub property: String,
#[serde(default = "default_redirect_uri")]
pub redirect_uri: String, pub redirect_uri: String,
} }
#[derive(Serialize, Deserialize, Debug)] impl Default for GoogleCalendarGlobalConf {
fn default() -> Self {
GoogleCalendarGlobalConf {
client_id: env::var("GOOGLE_CLIENT_ID").unwrap(),
client_secret: env::var("GOOGLE_CLIENT_SECRET").unwrap(),
token_dir: user_cache_path(),
token_filename: "google-token.json".into(),
redirect_uri: "http://localhost".into(),
}
}
}
#[derive(Serialize, Deserialize)]
#[serde(default)]
pub struct GoogleCalendarConf { pub struct GoogleCalendarConf {
pub calendar: String, pub calendar: String,
#[serde(default)]
pub append_new: bool, pub append_new: bool,
#[serde(default = "default_append_headline")]
pub append_headline: String, pub append_headline: String,
pub property: String,
} }
fn default_client_id() -> String { impl Default for GoogleCalendarConf {
env::var("GOOGLE_CLIENT_ID").unwrap() fn default() -> Self {
} GoogleCalendarConf {
calendar: String::new(),
fn default_client_secret() -> String { append_new: false,
env::var("GOOGLE_CLIENT_SECRET").unwrap() append_headline: "Sync".into(),
} property: "EVENT_ID".into(),
}
fn default_token_dir() -> PathBuf { }
app_root(AppDataType::UserCache, &APP_INFO).unwrap()
}
fn default_token_filename() -> String {
"google-token.json".into()
}
fn default_property() -> String {
"EVENT_ID".into()
}
fn default_redirect_uri() -> String {
"http://localhost".into()
}
fn default_append_headline() -> String {
"Sync".into()
} }
} }