diff --git a/src/cli/cli.rs b/src/cli/cli.rs index 65dd5703fafacfa1d6483af9a25da6166a3c721c..578dc8c79d2e00028b89073ce3cd6c361c8ca533 100644 --- a/src/cli/cli.rs +++ b/src/cli/cli.rs @@ -1,3 +1,6 @@ +pub use std::path::PathBuf; +pub use std::env::current_dir; + pub const USAGE: &'static str = " Static file swerver and api mocker for local development. For full documentation, visit https://swerve.louiscap.io. @@ -39,4 +42,16 @@ pub struct Args { pub flag_upload: bool, pub flag_upload_path: Option<String>, pub flag_license: bool, +} + +impl Args { + pub fn get_dir(&self) -> PathBuf { + let dir_flag = self.flag_dir.clone(); + PathBuf::from( + dir_flag.unwrap_or( + current_dir().unwrap_or( + PathBuf::from("") + ).to_string_lossy().into_owned()) + ) + } } \ No newline at end of file diff --git a/src/cli/config_file.rs b/src/cli/config_file.rs index 538dac181bbe340ced756ea782f3e1d073f509c1..09e088fa23f7569ed865d94b76c33758726a02f5 100644 --- a/src/cli/config_file.rs +++ b/src/cli/config_file.rs @@ -3,26 +3,119 @@ use std::convert::AsRef; use std::io::prelude::*; use std::io; use std::fs::File; +use std::io::BufReader; +use std::default::Default; +use serde::{Deserialize, Deserializer, de::{self, Error}}; +use std::fmt; +use serde_yaml as yaml; +#[derive(Debug, Copy, Clone)] pub enum HandlerMethod { Log, File, } +struct HandlerMethodVisitor; +impl <'de>de::Visitor<'de> for HandlerMethodVisitor { + type Value = HandlerMethod; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!(formatter, "a string with value 'Log' or 'File'") + } + fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> where + E: de::Error, { + match v { + "Log" => Ok(HandlerMethod::Log), + "File" => Ok(HandlerMethod::File), + _ => Err(de::Error::unknown_variant(v, &["Log", "File"])), + } + } +} + +impl <'de>Deserialize<'de> for HandlerMethod { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where + D: Deserializer<'de> { + deserializer.deserialize_str(HandlerMethodVisitor) + } +} + +impl Default for HandlerMethod { + fn default() -> Self { + HandlerMethod::Log + } +} + +#[derive(Deserialize, Debug, Clone)] pub struct SwerveConfig { + #[serde(default)] pub field_handling: HandlerMethod, + #[serde(default)] pub file_handling: HandlerMethod, + #[serde(default)] + pub server: ServerOptions, } -impl SwerveConfig { - pub fn from_file<P>(path: P) -> io::Result<SwerveConfig> where P: AsRef<Path> { -// let mut file = File::open(path)?; -// let mut buffer = String::new(); -// file.read_to_string(buffer)?; +#[derive(Deserialize, Debug, Clone)] +pub struct ServerOptions { + #[serde(default="get_default_port")] + pub port: u16, + #[serde(default="get_default_threads")] + pub threads: u16, + #[serde(default="get_default_address")] + pub address: String, + #[serde(default="get_default_quiet_attr")] + pub quiet: bool, + #[serde(default="get_default_index_attr")] + pub no_index: bool, +} + +fn get_default_port() -> u16 { 8200 } +fn get_default_threads() -> u16 { 32} +fn get_default_address() -> String { String::from("localhost") } +fn get_default_quiet_attr() -> bool { false } +fn get_default_index_attr() -> bool { false } - Ok(SwerveConfig { +impl Default for SwerveConfig { + fn default() -> Self { + SwerveConfig { field_handling: HandlerMethod::Log, file_handling: HandlerMethod::Log, - }) + server: ServerOptions::default(), + } + } +} + +impl Default for ServerOptions { + fn default() -> Self { + ServerOptions { + port: get_default_port(), + threads: get_default_threads(), + address: get_default_address(), + quiet: get_default_quiet_attr(), + no_index: get_default_index_attr(), + } + } +} + +impl SwerveConfig { + pub fn from_file<P>(path: P) -> io::Result<SwerveConfig> where P: AsRef<Path> { + let mut buffer = String::new(); + { + match File::open(path) { + Ok(mut file) => file.read_to_string(&mut buffer)?, + Err(e) => { + if e.kind() == io::ErrorKind::NotFound { + return Ok(SwerveConfig::default()); + } else { + return Err(e); + } + } + }; + } + + match yaml::from_str(&buffer) { + Ok(conf) => Ok(conf), + Err(er) => Err(io::Error::new(io::ErrorKind::InvalidData, format!("{}", er))), + } } } \ No newline at end of file