use std::process::exit;
use url::Url;
pub struct Config {
pub bucket: String,
pub website: Url,
pub region: String,
pub filter: Vec<String>,
pub ignore: Vec<String>,
pub object: String,
pub style: String
}
fn parse_vec(value: &str) -> Option<Vec<String>> {
if value.is_empty() {
return None;
}
match serde_json::from_str::<Vec<String>>(value) {
Ok(mut parsed) => {
for elem in &mut parsed {
if !elem.ends_with('/') {
elem.push('/');
}
}
Some(parsed)
}
Err(err) => {
eprintln!("{:?}", err);
exit(1)
}
}
}
fn parse_url(string: &str) -> Url {
Url::parse(string).unwrap_or_else(|err| {
eprintln!("Parse error: {:?}", err);
exit(1)
})
}
pub fn parse_config(
bucket: String,
website: String,
region: String,
filter: String,
ignore: String,
object: String,
style: String
) -> Config {
if bucket.is_empty() {
eprintln!("\n--bucket\n\tBucket name is mandatory!!\n");
exit(1)
}
let parsed_filter = parse_vec(&filter).unwrap_or_default();
let parsed_ignore = parse_vec(&ignore).unwrap_or_default();
let parsed_url = parse_url(&website);
let styling = vec!["bootstrap".to_string(), "vanilla".to_string()];
let parsed_style;
if style.is_empty() {
parsed_style = styling.first().unwrap().to_string()
} else if styling.contains(&style) {
parsed_style = style.clone().to_lowercase()
} else {
eprintln!("\n{:?}\n\tStyling option is invalid.\n\tExpected one of {:?}", style, styling);
exit(1)
}
Config {
bucket,
website: parsed_url,
region,
filter: parsed_filter,
ignore: parsed_ignore,
object,
style: parsed_style
}
}