feat: common function to get file writer

This commit is contained in:
Gabriele Musco 2023-06-02 15:43:46 +02:00
parent e005208dd9
commit 77289d2f45
3 changed files with 53 additions and 33 deletions

40
src/file_utils.rs Normal file
View file

@ -0,0 +1,40 @@
use std::{
fs::{create_dir_all, OpenOptions},
io::BufWriter,
path::Path, env,
};
use crate::constants::CMD_NAME;
pub fn get_writer(path_s: &String) -> BufWriter<std::fs::File> {
let path = Path::new(path_s);
match path.parent() {
Some(parent) => {
if !parent.is_dir() {
create_dir_all(parent).expect("Could not create dir")
}
}
None => {}
};
let file = OpenOptions::new()
.write(true)
.create(true)
.open(path)
.expect("Could not open file");
BufWriter::new(file)
}
pub fn get_config_dir() -> String {
match env::var("XDG_CONFIG_HOME") {
Ok(conf_home) => format!(
"{chome}/{name}",
chome = conf_home,
name = CMD_NAME
),
Err(_) => format!(
"{home}/.config/{name}",
home = env::var("HOME").expect("HOME env var not defined"),
name = CMD_NAME
),
}
}

View file

@ -3,10 +3,12 @@ use std::{
collections::HashMap,
fs::{create_dir_all, File, OpenOptions},
io::{BufReader, BufWriter},
path::Path,
path::Path, fmt::Display,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
use crate::file_utils::get_writer;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Profile {
pub name: String,
pub monado_path: String,
@ -20,6 +22,12 @@ pub struct Profile {
pub environment: HashMap<String, String>,
}
impl Display for Profile {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.name.to_string())
}
}
pub fn load_profile(path: &String) -> Result<Profile, serde_json::Error> {
let file = File::open(path).unwrap();
let reader = BufReader::new(file);
@ -27,21 +35,7 @@ pub fn load_profile(path: &String) -> Result<Profile, serde_json::Error> {
}
pub fn dump_profile(profile: Profile, path_s: &String) -> () {
let path = Path::new(path_s);
match path.parent() {
Some(parent) => {
if !parent.is_dir() {
create_dir_all(parent).expect("Could not create dir")
}
}
None => {}
};
let file = OpenOptions::new()
.write(true)
.create(true)
.open(path)
.expect("Could not open file");
let writer = BufWriter::new(file);
let writer = get_writer(path_s);
serde_json::to_writer_pretty(writer, &profile).expect("Could not write profile")
}

View file

@ -6,7 +6,7 @@ use std::{
process::{Child, Command, Stdio},
};
use crate::profile::Profile;
use crate::{profile::Profile, file_utils::get_writer};
pub struct Runner {
environment: HashMap<String, String>,
@ -118,21 +118,7 @@ impl Runner {
}
fn save_log(path_s: String, log: &Vec<String>) -> Result<(), std::io::Error> {
let path = Path::new(&path_s);
match path.parent() {
Some(parent) => {
if !parent.is_dir() {
create_dir_all(parent).expect("Could not create dir")
}
}
None => {}
};
let file = OpenOptions::new()
.write(true)
.create(true)
.open(path)
.expect("Could not open file");
let mut writer = BufWriter::new(file);
let mut writer = get_writer(&path_s);
let log_s = log.concat();
writer.write_all(log_s.as_ref())
}