rh 0.1.14

A user-friendly command-line tool to request HTTP APis
Documentation
use super::alias_filename;
use crate::commands::alias::error::ErrorKind;
use crate::commands::alias::Error;
use crate::commands::alias::Result;
use crate::core::Args;
use crate::shell::os::OsDirs;
use std::fs::{self, File};
use std::io::{self, BufWriter, Write};
use std::path::Path;

pub fn save<OD: OsDirs>(os_dirs: &OD, name: &str, args: &Args) -> Result<()> {
    match os_dirs.app_path(&alias_filename(name)) {
        Some(path) => match get_config_directory_error_if_any(os_dirs) {
            None => {
                let file = create_alias_file(name, &path)?;
                write(args, &file)
            }
            Some(err_kind) => Err(Error::CannotCreateAlias(name.to_string(), err_kind)),
        },
        None => Err(Error::CannotCreateAlias(name.to_string(), ErrorKind::ConfigDirectoryNotFound)),
    }
}

pub fn delete<OD: OsDirs>(os_dirs: &OD, name: &str) -> Result<()> {
    match os_dirs.app_path(&alias_filename(name)) {
        Some(path) => match get_config_directory_error_if_any(os_dirs) {
            None => match fs::remove_file(&path) {
                Ok(_) => Ok(()),
                Err(err) => Err(Error::CannotDeleteAlias(name.to_string(), err.kind().into())),
            },
            Some(err_kind) => Err(Error::CannotDeleteAlias(name.to_string(), err_kind)),
        },
        None => Err(Error::CannotDeleteAlias(name.to_string(), ErrorKind::ConfigDirectoryNotFound)),
    }
}

fn write<R: io::Write>(args: &Args, writer: R) -> Result<()> {
    let mut buffer = BufWriter::new(writer);
    buffer.write_all(args.join("\n").as_bytes()).expect("Unable to write data");
    Ok(())
}

fn get_config_directory_error_if_any<OD: OsDirs>(os_dirs: &OD) -> Option<ErrorKind> {
    match os_dirs.config_directory() {
        Some(dir) => {
            if Path::exists(&dir) {
                None
            } else {
                Some(ErrorKind::InvalidConfigDirectory)
            }
        }
        None => Some(ErrorKind::ConfigDirectoryNotFound),
    }
}

fn create_alias_file(name: &str, path: &Path) -> Result<File> {
    match path.parent() {
        Some(dir) => {
            if !Path::exists(dir) && fs::create_dir(dir).is_err() {
                return Err(Error::CannotCreateAlias(name.to_string(), ErrorKind::CannotCreateAppConfigDirectory));
            }
            let file = File::create(&path)?;
            Ok(file)
        }
        None => Err(Error::CannotCreateAlias(name.to_string(), ErrorKind::CannotCreateAppConfigDirectory)),
    }
}