zoi 0.1.3

A tool to manage your ssh connections
Documentation
use std::{fs, path::Path};

use crate::parser;

pub fn get_path() -> String {
    let mut path = String::from("");
    match home::home_dir() {
        Some(p) => path = p.to_str().unwrap().to_string(),
        None => println!("Impossible to get your home dir!"),
    }
    path.push_str("/.ssh/config");
    if !Path::new(&path).exists() {
        reset_config_file(path.to_owned());
    }
    path
}

fn reset_config_file(path: String) {
    match fs::write(path, "") {
        Ok(_) => println!("Recreated config file!"),
        Err(_) => ()
    }
}

pub fn delete_all_command() {
    let path = get_path();
    reset_config_file(path);
}

fn extract_host_name(host_item: &mut parser::HostItem, host_string: String) {
    let mut user = String::from("root");
    let mut hostname = String::from("");
    let mut port = String::from("22");

    let splitted: Vec<String> = host_string.split("@")
        .map(|s| s.to_string())
        .collect();

    if splitted.len() == 1 {
        hostname = String::from(&splitted[0]);
    } else if splitted.len() == 2 {
        user = String::from(&splitted[0]);
        hostname = String::from(&splitted[1]);
    }

    let hostname_splitted: Vec<String> = hostname.split(":")
        .map(|s| s.to_string())
        .collect();

    if hostname_splitted.len() == 2 {
        hostname = String::from(&hostname_splitted[0]);
        port = String::from(&hostname_splitted[1]);
    }

    host_item.user = user;
    host_item.host = hostname;
    host_item.port = port;
}

pub fn add_command(name: &String, host: &String) {
    let path = get_path();

    let mut new_host = parser::HostItem::new();
    new_host.name = name.clone();
    extract_host_name(&mut new_host, host.to_string());
    let mut config = parser::parse(&path);
    config.hosts.push(new_host);
    config.write(&path).unwrap();
}

pub fn edit_command(name: &String, host: &String) {
    let path = get_path();
    let mut config = parser::parse(&path);
    let mut host_item = parser::HostItem::new();

    extract_host_name(&mut host_item, host.to_string());

    match config.edit(name, &host_item) {
        Ok(_) => config.write(&path).unwrap(),
        Err(err) => eprintln!("Can not edit: {}", err)
    }
}

pub fn rename_command(name: &String, host: &String) {
    let path = get_path();
    let mut config = parser::parse(&path);
    match config.rename(name, host) {
        Ok(_) => config.write(&path).unwrap(),
        Err(err) => eprintln!("Can not rename: {}", err)
    }
}

pub fn delete_command(name: &String) {
    let path = get_path();
    let mut config = parser::parse(&path);
    match config.delete(name) {
        Ok(_) => config.write(&path).unwrap(),
        Err(err) => eprintln!("Can not delete: {}", err)
    }
}

pub fn list_command() {
    let path = get_path();
    let config = parser::parse(&path);

    if config.hosts.len() == 0 {
        println!("No records");
    } else {
        config.log()
    }
}