|
@@ -1,5 +1,6 @@
|
|
use anyhow::{Context, Result};
|
|
use anyhow::{Context, Result};
|
|
use serde::{de::DeserializeOwned, Serialize};
|
|
use serde::{de::DeserializeOwned, Serialize};
|
|
|
|
+use serde_yaml::{Mapping, Value};
|
|
use std::{fs, path::PathBuf};
|
|
use std::{fs, path::PathBuf};
|
|
|
|
|
|
/// read data from yaml as struct T
|
|
/// read data from yaml as struct T
|
|
@@ -20,6 +21,29 @@ pub fn read_yaml<T: DeserializeOwned + Default>(path: PathBuf) -> T {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/// read mapping from yaml fix #165
|
|
|
|
+pub fn read_merge_mapping(path: PathBuf) -> Mapping {
|
|
|
|
+ let map = Mapping::new();
|
|
|
|
+
|
|
|
|
+ if !path.exists() {
|
|
|
|
+ log::error!(target: "app", "file not found \"{}\"", path.display());
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let yaml_str = fs::read_to_string(&path).unwrap_or("".into());
|
|
|
|
+
|
|
|
|
+ match serde_yaml::from_str::<Value>(&yaml_str) {
|
|
|
|
+ Ok(mut val) => {
|
|
|
|
+ crate::log_if_err!(val.apply_merge());
|
|
|
|
+ val.as_mapping().unwrap_or(&map).to_owned()
|
|
|
|
+ }
|
|
|
|
+ Err(_) => {
|
|
|
|
+ log::error!(target: "app", "failed to read yaml file \"{}\"", path.display());
|
|
|
|
+ map
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/// save the data to the file
|
|
/// save the data to the file
|
|
/// can set `prefix` string to add some comments
|
|
/// can set `prefix` string to add some comments
|
|
pub fn save_yaml<T: Serialize>(path: PathBuf, data: &T, prefix: Option<&str>) -> Result<()> {
|
|
pub fn save_yaml<T: Serialize>(path: PathBuf, data: &T, prefix: Option<&str>) -> Result<()> {
|