use std::fs;
use serde::Deserialize;
use toml::{self, de::Error};
#[derive(Debug, Deserialize)]
pub struct ReplaceConfig{
pub pattern: String,
pub replace: String,
}
#[derive(Debug, Deserialize)]
pub struct FullReplace{
pub vec_file_pattern: Vec<String>,
pub replace: Vec<ReplaceConfig>,
}
pub fn load_configuration(filename: &String) -> Result<FullReplace, Error>{
let simu: FullReplace = match fs::read_to_string(filename) {
Ok(str) => match toml::from_str(&str){
Ok(value) => value,
Err(error) => panic!("load_configuration : parsing error {}", error)
},
Err(err) => panic!("load_configuration : cannot read file '{}', error: {}", filename, err)
};
Ok(simu)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_load_configuration() {
let config_content = r#"# Defining files to look at for a inplace replacement
vec_file_pattern = ["*.txt", "*.cpp", "*.yml", "*.toml", "*.txt", "*.cmake", "*.dox"]
# Then, define multiline pattern and replace string
[[replace]]
pattern = "some\nmultiline\npattern to search"
replace = "some\nreplace\npattern"
# You can define as many replace section as you want
"#;
let output_dir = "generated/";
let configfile = format!("{}/config.toml", output_dir);
fs::create_dir_all(output_dir).unwrap();
fs::write(&configfile, config_content).unwrap();
let _ = load_configuration(&configfile).unwrap();
}
#[test]
#[should_panic]
fn test_load_configuration_file_not_found_error() {
let _ = load_configuration(&String::from("unexisting_config.toml"));
}
#[test]
#[should_panic]
fn test_load_configuration_parsing_error() {
let config_content = r#"# Defining files to look at for a inplace replacement
vec_file_pattern = ["*.txt", "*.cpp", "*.yml", "*.toml", "*.txt", "*.cmake", "*.dox"]
"#;
let output_dir = "generated/";
let configfile = format!("{}/wrong_config.toml", output_dir);
fs::create_dir_all(output_dir).unwrap();
fs::write(&configfile, config_content).unwrap();
let _ = load_configuration(&configfile);
}
}