config.rs 993 B

1234567891011121314151617181920212223242526272829303132
  1. use serde::{de::DeserializeOwned, Serialize};
  2. use std::{fs, path::PathBuf};
  3. /// read data from yaml as struct T
  4. pub fn read_yaml<T: DeserializeOwned + Default>(path: PathBuf) -> T {
  5. let yaml_str = fs::read_to_string(path).unwrap_or("".into());
  6. serde_yaml::from_str::<T>(&yaml_str).unwrap_or(T::default())
  7. }
  8. /// - save the data to the file
  9. /// - can set `prefix` string to add some comments
  10. pub fn save_yaml<T: Serialize>(
  11. path: PathBuf,
  12. data: &T,
  13. prefix: Option<&str>,
  14. ) -> Result<(), String> {
  15. match serde_yaml::to_string(data) {
  16. Ok(data_str) => {
  17. let yaml_str = match prefix {
  18. Some(prefix) => format!("{}{}", prefix, data_str),
  19. None => data_str,
  20. };
  21. let path_str = path.as_os_str().to_string_lossy().to_string();
  22. match fs::write(path, yaml_str.as_bytes()) {
  23. Ok(_) => Ok(()),
  24. Err(_) => Err(format!("can not save file `{}`", path_str)),
  25. }
  26. }
  27. Err(_) => Err("can not convert the data to yaml".into()),
  28. }
  29. }