use clap::{load_yaml, App, ArgMatches}; use directories::BaseDirs; use dotenv; use sprintf::sprintf; use std::{env, path::PathBuf}; pub struct Params { pub source_lang: String, pub target_lang: String, key: String, uri: String, text: String, } impl Params { pub fn new() -> Result { let base_dir: BaseDirs = BaseDirs::new().unwrap(); let my_path: PathBuf = base_dir.config_dir().join("deepl/.env"); match dotenv::from_path(my_path.as_path()) { Ok(env) => env, Err(_) => { return Err(format!( "Could not load .env file {:?}", base_dir.config_dir().join("deepl/.env").as_path() )); } }; let yaml = load_yaml!("./../../cli.yml"); let matches: ArgMatches = App::from_yaml(yaml).get_matches(); Ok(Self { source_lang: matches.value_of("source").unwrap_or("0").to_string(), target_lang: matches.value_of("target").unwrap_or("EN-US").to_string(), key: env::var("KEY").unwrap(), uri: env::var("URI").unwrap(), text: matches.value_of("INPUT").unwrap().to_string(), }) } pub fn url(&self) -> String { sprintf!("%s?auth_key=%s", self.uri, self.key).unwrap() } pub fn body(&self) -> String { let mut body = sprintf!( "auth_key=%s&text=%s&target_lang=%s", self.key, self.text, self.target_lang ) .unwrap(); if self.source_lang != "0" { let add = sprintf!("&source_lang=%s", self.source_lang).unwrap(); body.push_str(&add); } body } }