use std::fs::{create_dir_all, File}; use std::io::prelude::*; use std::path::{Path, PathBuf}; use std::error::Error as STDError; use serde::Serialize; use toml; use error::Error; use logger::LogLevel; pub fn add_to_beginning>(path: PathBuf, to_add: T) -> Result { if let (Some(parent), Some(file_name)) = (path.clone().parent(), path.clone().file_name()) { let parent = Path::new(&to_add.into()).join(parent); Ok(parent.join(file_name)) } else { return Err(Error::new( LogLevel::SEVERE, format!("Could not find parent folder or file name for {:?}", path), )); } } pub fn write_toml(path: &PathBuf, data: &T, overwrite: bool) -> Result<(), Error> { match toml::ser::to_string(data) { Ok(text) => match write_file(&path, text, overwrite) { Ok(_) => Ok(()), Err(err) => Err(Error::new( LogLevel::SEVERE, format!( "Failed to write {:?}: {}", path, err.description().to_owned() ), )), }, Err(err) => Err(Error::new( LogLevel::SEVERE, format!( "Failed to serialize {:?}: {}", path, err.description().to_owned() ), )), } } pub fn write_file>( path: &PathBuf, content: T, overwrite: bool, ) -> Result<(), Error> { if let Some(parent) = path.clone().parent() { create_dir_all(parent.clone())?; } else { return Err(Error::new( LogLevel::SEVERE, format!("Could not find parent folder for {:?}", path), )); } let content = content.into(); if path.exists() && !overwrite { Err(Error::new( LogLevel::SEVERE, format!( "File already exists: {:?} -- Consider using overwrite-flag", path ), )) } else { match File::create(path) { Ok(mut file) => Ok(file.write_all(content.as_bytes()).unwrap()), Err(err) => Err(Error::from(err)), } } }