2023-10-20 22:39:26 +00:00
use std ::path ::Path ;
2023-10-19 01:25:37 +00:00
use std ::path ::PathBuf ;
use tokio ::fs ::File ;
use tokio ::io ::AsyncWriteExt ;
use super ::raw ::RawConfig ;
/// This is the config struct used by most of the code, which is an interpreted version of the RawConfig struct which is the raw disk-representation of the config.
pub ( crate ) struct Config {
raw : RawConfig ,
2023-10-20 22:45:24 +00:00
config_path : PathBuf ,
2023-10-19 01:25:37 +00:00
}
impl Config {
2023-10-20 22:45:24 +00:00
pub ( crate ) fn new < P : AsRef < Path > > ( root_dir : P ) -> Result < Config , Box < dyn std ::error ::Error > > {
fn inner ( root_dir : & Path ) -> Result < Config , Box < dyn std ::error ::Error > > {
let file_path = root_dir . join ( " writer.toml " ) ;
Ok ( Config {
raw : RawConfig ::default ( ) ,
config_path : file_path ,
} )
}
inner ( root_dir . as_ref ( ) )
2023-10-19 01:25:37 +00:00
}
2023-10-20 22:45:24 +00:00
pub ( crate ) async fn load_from_file < P : Into < PathBuf > > (
2023-10-20 22:39:26 +00:00
path : P ,
) -> Result < Config , Box < dyn std ::error ::Error > > {
2023-10-20 22:45:24 +00:00
async fn inner ( path : PathBuf ) -> Result < Config , Box < dyn std ::error ::Error > > {
let contents = tokio ::fs ::read_to_string ( & path ) . await ? ;
2023-10-20 22:39:26 +00:00
let parsed_contents : RawConfig = toml ::from_str ( contents . as_str ( ) ) ? ;
Ok ( Config {
raw : parsed_contents ,
2023-10-20 22:45:24 +00:00
config_path : path ,
2023-10-20 22:39:26 +00:00
} )
}
2023-10-20 22:45:24 +00:00
inner ( path . into ( ) ) . await
2023-10-20 22:39:26 +00:00
}
2023-10-19 01:25:37 +00:00
pub ( crate ) async fn write_to_disk ( & self ) -> Result < ( ) , Box < dyn std ::error ::Error > > {
2023-10-20 22:45:24 +00:00
let mut config_file = File ::create ( & self . config_path ) . await ? ;
2023-10-19 01:25:37 +00:00
config_file
. write_all ( toml ::to_string ( & self . raw ) ? . as_bytes ( ) )
. await ? ;
Ok ( ( ) )
}
}