use toml; use std::path::PathBuf; use std::fs::File; use std::io::Read; use std::error::Error as STDError; use std::collections::HashMap; use logger::LogLevel; use error::Error; #[derive(Deserialize, Serialize, Clone, Debug)] pub struct GlobalConfigToml { pub website: WebsiteConfig, pub navbar: Option, #[serde(rename = "resource")] pub resources: Option>, pub twitter: Option, pub google: Option, } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct ResourceConfig { pub source: String, pub destination: String, } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct WebsiteConfig { pub website_name: String, pub built_pages: Vec, pub use_default_css: bool, pub use_default_js: bool, pub javascript: Vec, pub css: Vec, pub favicon: Option, pub before_navbar_url: Option, pub before_content_url: Option, pub after_content_url: Option, pub mobile_viewport: Option, pub meta_description: Option, pub charset: Option, pub meta_og: Option, pub output: Option, } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct GoogleConfig { pub google_robots: String, pub google_site_verification: String, } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct TwitterConfig { pub twitter_site: String, pub twitter_creator: String, } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct NavbarConfig { pub items: Vec, #[serde(rename = "item")] pub item_map: HashMap, } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct NavbarItem { pub title: String, pub link: String, pub image_url: Option, } impl GlobalConfigToml { pub fn get_config() -> Result { let mut file = File::open("config.toml")?; let mut contents = String::new(); file.read_to_string(&mut contents)?; match toml::from_str(&contents) { Ok(config) => Ok(config), Err(err) => { if let Some((line, col)) = err.line_col() { Err(Error::new( LogLevel::SEVERE, format!("Erronous config.toml at {}:{}", line, col), )) } else { Err(Error::new( LogLevel::SEVERE, format!("Failed to parse config.toml correctly. Check variable names!"), )) } } } } } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct PageConfigToml { pub page: PageConfig, } impl PageConfigToml { pub fn get_from(path: &PathBuf) -> Result { let path_str = match path.to_str() { Some(path_str) => path_str, None => "", }; let mut file = match File::open(path.as_path()) { Ok(file) => file, Err(err) => { return Err(Error::new( LogLevel::SEVERE, format!( "Failed to open page config: {}, Reason: {}", path.to_str().unwrap(), err.description().to_owned() ), )) } }; let mut contents = String::new(); file.read_to_string(&mut contents)?; match toml::from_str(&contents) { Ok(config) => Ok(config), Err(err) => { if let Some((line, col)) = err.line_col() { Err(Error::new( LogLevel::SEVERE, format!("Erronous toml: {} at {}:{}", path_str, line, col), )) } else { Err(Error::new( LogLevel::SEVERE, format!( "Failed to parse toml correctly: {}. Check variable names!", path_str ), )) } } } } } #[derive(Deserialize, Serialize, Clone, Debug)] pub struct PageConfig { pub html_path: String, pub title: String, pub description: String, pub content_path: String, pub favicon: Option, pub before_navbar_url: Option, pub before_content_url: Option, pub after_content_url: Option, pub javascript: Option>, pub css: Option>, }