use std::fs::create_dir;
use std::path::PathBuf;
use crate::core::file;
pub struct Installation {
title: String,
path: Option<String>,
}
impl Installation {
pub fn new(title: &str) -> Installation {
Installation {title: title.to_string(), path: None}
}
pub fn create_folder(&mut self) -> Result<(), String> {
let path = file::appdata()?;
let mut path = PathBuf::from(&path);
update_folder(&mut path, "d7engine")?;
update_folder(&mut path, &self.title)?;
let path = file::path_as_string(path.as_path())?;
self.path = Some(path);
Ok(())
}
pub fn overwrite(&mut self, file: &str, extension: &str, text: &str) -> Result<(), String> {
if let None = &self.path {
self.create_folder()?;
}
if let Some(path) = &self.path {
let mut path = PathBuf::from(&path);
let file = format!("{}.{}", file, extension);
path.push(&file);
let path = file::path_as_string(path.as_path())?;
return file::write(&path, text);
}
Err("could not create folder".to_string())
}
pub fn read(&self, file: &str, extension: &str) -> Result<Vec<String>, String> {
if let Some(path) = &self.path {
let mut path = PathBuf::from(&path);
let file = format!("{}.{}", file, extension);
path.push(&file);
let path = file::path_as_string(path.as_path())?;
let text = file::read(&path)?;
let collection = text.lines().collect::<Vec<&str>>();
let mut lines = vec![];
for line in collection {
lines.push(line.to_string());
}
return Ok(lines);
}
Err(format!("could not read file {}.{}", file, extension))
}
pub fn path(&self) -> Result<PathBuf, String> {
if let Some(path) = &self.path {
let buffer = PathBuf::from(&path);
return Ok(buffer);
}
Err("No installation path.".to_string())
}
}
fn update_folder(path: &mut PathBuf, sub: &str) -> Result<(), String> {
path.push(sub);
if !path.exists() {
if let Err(_) = create_dir(path) {
return Err(String::from("could not create directory."));
};
}
Ok(())
}