term_do 0.7.0

This is a small terminal tool for tracking tasks and also my first project! It is simple, but hope it is as helpful for other people as it is for me.
use std::fs;
use std::fs::File;
use crossterm::event::KeyCode;
use ini::{Ini, Properties};
use tui::style::Color;

pub struct ConfigManager {
    pub(crate) ini: Ini,
    pub(crate) task: Properties,
    pub(crate) group: Properties,
    pub(crate) path: Properties,
    pub(crate) default_settings_file: String,
    input: Properties
}

impl Default for ConfigManager {
    fn default() -> Self {
        Self { ini: Default::default(), task: Default::default(), group: Default::default(), input: Default::default(), default_settings_file: Default::default(), path: Default::default() }
    }
}

impl ConfigManager {
    pub fn new() -> ConfigManager {
        let conf = Ini::load_from_file("settings.ini");
        let content = r#"
[group]
selected_color="(6, 152, 154)"
non_selected_color="(255, 255, 255)"
border_color="(255, 255, 255)"
icon=""

[task]
selected_color="(196, 160, 0)"
non_selected_color="(255, 255, 255)"
completed_color="(78, 154, 6)"
border_color="(255, 255, 255)"
icon_uncompleted=""
icon_completed=""
vertical_child_char_icon="║"
turn_right_child_char_icon="╚"
horizontal_child_char_icon="═"

[key_bindings]
add_group='a'
edit_group='e'
delete_group='d'
apply_add_or_edit_group="Enter"
down_group="Down"
up_group="Up"
add_task='a'
add_subtask='A'
delete_task_or_subtask='d'
edit_task_or_subtask='e'
complete_or_uncomplete_task='c'
apply_add_or_edit_task_or_subtask="Enter"
down_task_or_subtask="Down"
up_task_or_subtask="Up"
fold_subtasks='f'
undo='u'
redo='r'

[paths]
settings_path='.'
data_path='.'
            "#;

        if conf.is_err() {
            File::create("settings.ini").expect("Couldn't create config.ini");
            fs::write("settings.ini", content).expect("Couldn't write contents");
        }

        let (conf, task_conf, group_conf, input_conf, path_conf) = ConfigManager::load_config(content, "settings.ini");

        ConfigManager {
            ini: conf.clone(),
            task: task_conf.clone(),
            group: group_conf.clone(),
            input: input_conf.clone(),
            path: path_conf.clone(),
            default_settings_file: content.parse().unwrap(),
        }
    }

    pub fn get_color(&self, section: &str, key: &str) -> Color {
        let properties : &Properties;
        if section.eq("group") {
            properties = &self.group;
        } else {
            properties = &self.task;
        }

        let color = properties.get(key).unwrap().replace('(', "").replace(')', "");
        let values: Vec<&str> = color.split(",").collect();

        return Color::Rgb(values[0].trim().parse().unwrap(), values[1].trim().parse().unwrap(), values[2].trim().parse().unwrap());
    }

    pub fn get_key(&self, key: &str) -> KeyCode {
        let key_value = self.input.get(key).unwrap();
        return if key_value.len() > 1 {
            let kv_lower = key_value.to_lowercase();

            match kv_lower.as_str() {
                "backspace" => KeyCode::Backspace,
                "enter" => KeyCode::Enter,
                "end" => KeyCode::End,
                "esc" => KeyCode::Esc,
                "delete" => KeyCode::Delete,
                "up" => KeyCode::Up,
                "down" => KeyCode::Down,
                "right" => KeyCode::Right,
                "left" => KeyCode::Left,
                "backtab" => KeyCode::BackTab,
                "tab" => KeyCode::Tab,
                "home" => KeyCode::Home,
                "pageup" => KeyCode::PageUp,
                "pagedown" => KeyCode::PageDown,
                "insert" => KeyCode::Insert,
                _ => KeyCode::Null
            }
        } else {
            KeyCode::Char(key_value.chars().nth(0).unwrap())
        }
    }

    fn load_config(content: &str, path_to_search: &str) -> (Ini, Properties, Properties, Properties, Properties) {
        let mut conf_conf = Ini::load_from_file(path_to_search).unwrap();
        let mut task_conf = conf_conf.section(Some("task"));
        let mut group_conf = conf_conf.section(Some("group"));
        let mut input_conf = conf_conf.section(Some("key_bindings"));
        let mut path_conf = conf_conf.section(Some("paths"));

        if task_conf.is_none() || group_conf.is_none() || input_conf.is_none() || path_conf.is_none() {
            fs::write("settings.ini", content).expect("Couldn't write contents");
            conf_conf = Ini::load_from_file("settings.ini").unwrap();
            task_conf = conf_conf.section(Some("task"));
            group_conf = conf_conf.section(Some("group"));
            input_conf = conf_conf.section(Some("key_bindings"));
            path_conf = conf_conf.section(Some("paths"));
        }

        let conf : Ini;
        let task : Properties;
        let group : Properties;
        let input : Properties;
        let path : Properties;

        if !path_conf.unwrap().get("settings_path").unwrap().eq(".") {
            let (c, t, g, i, p) = ConfigManager::load_config(content, format!("{}/{}", path_conf.unwrap().get("settings_path").unwrap(), "settings.ini").as_str());
            conf = c;
            task = t;
            group = g;
            input = i;
            path = p;
        } else {
            conf = conf_conf.clone();
            task = task_conf.unwrap().clone();
            group = group_conf.unwrap().clone();
            input = input_conf.unwrap().clone();
            path = path_conf.unwrap().clone();
        }

        return (conf.clone(), task.clone(), group.clone(), input.clone(), path.clone());
    }
}