summaryrefslogtreecommitdiff
path: root/crates/utils/cfg_file/src
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-01-02 23:28:28 +0800
committer魏曹先生 <1992414357@qq.com>2026-01-03 00:43:49 +0800
commitf5b47fcbee422d23bfada5681a98e599918dbe4b (patch)
tree27925d2147a52828ba4ca4c33443944849d5458f /crates/utils/cfg_file/src
parent118f24df4024099b6fbdd6d74fca46ae089ac07a (diff)
Refactor config loading to read files after format detection
Diffstat (limited to 'crates/utils/cfg_file/src')
-rw-r--r--crates/utils/cfg_file/src/config.rs46
1 files changed, 30 insertions, 16 deletions
diff --git a/crates/utils/cfg_file/src/config.rs b/crates/utils/cfg_file/src/config.rs
index 8f9edc9..daf5e10 100644
--- a/crates/utils/cfg_file/src/config.rs
+++ b/crates/utils/cfg_file/src/config.rs
@@ -115,13 +115,7 @@ pub trait ConfigFile: Serialize + for<'a> Deserialize<'a> + Default {
));
}
- // Open file
- let mut file = fs::File::open(&file_path).await?;
-
- let mut contents = String::new();
- file.read_to_string(&mut contents).await?;
-
- // Determine file format
+ // Determine file format first
let format = file_path
.file_name()
.and_then(|name| name.to_str())
@@ -130,16 +124,36 @@ pub trait ConfigFile: Serialize + for<'a> Deserialize<'a> + Default {
// Deserialize based on format
let result = match format {
- ConfigFormat::Yaml => serde_yaml::from_str(&contents)
- .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?,
- ConfigFormat::Toml => toml::from_str(&contents)
- .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?,
- ConfigFormat::Ron => ron::from_str(&contents)
- .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?,
- ConfigFormat::Json => serde_json::from_str(&contents)
- .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?,
+ ConfigFormat::Yaml => {
+ let mut file = fs::File::open(&file_path).await?;
+ let mut contents = String::new();
+ file.read_to_string(&mut contents).await?;
+ serde_yaml::from_str(&contents)
+ .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?
+ }
+ ConfigFormat::Toml => {
+ let mut file = fs::File::open(&file_path).await?;
+ let mut contents = String::new();
+ file.read_to_string(&mut contents).await?;
+ toml::from_str(&contents)
+ .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?
+ }
+ ConfigFormat::Ron => {
+ let mut file = fs::File::open(&file_path).await?;
+ let mut contents = String::new();
+ file.read_to_string(&mut contents).await?;
+ ron::from_str(&contents)
+ .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?
+ }
+ ConfigFormat::Json => {
+ let mut file = fs::File::open(&file_path).await?;
+ let mut contents = String::new();
+ file.read_to_string(&mut contents).await?;
+ serde_json::from_str(&contents)
+ .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?
+ }
ConfigFormat::Bincode => {
- // For Bincode, we need to read the file as bytes
+ // For Bincode, we need to read the file as bytes directly
let bytes = fs::read(&file_path).await?;
bincode2::deserialize(&bytes)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?