emet 1.0.1

A lightweight file integrity and digital signature library powered by the Tequel hashing primitive. Fast, local-first, and designed for long-term data truth.
Documentation
use colored::*;

use emet::{Emet, core::EmetError};
use crate::{cli::commands::Commands, core::Files};

use std::{io::{Error, ErrorKind}, path::PathBuf};

pub fn matches(command: &Commands, emet: &mut Emet, files: &mut Files) -> Result<(), EmetError> {

    match command {

        Commands::Up { private_key, show, change } => {
        
            if let Some(nk) = change {

                if let Ok(key_created) = files.verify_if_has_private_key() {

                    if key_created {

                        emet.private_key = nk.clone();
                        println!("{}", "Don't forget this new key".red());
                        println!("{}", "Private Key Changed!".yellow().bold());

                        files.write(emet.private_key.clone(), &files.emet_path).map_err(|e| {
                            EmetError::IoError(Error::new(ErrorKind::Other, e))
                        })?;


                    } else {

                        println!("");
                        println!("{}", "You don't have a private key already".dimmed());
                        println!("To create use: {}", "emet up <YOUR_PRIVATE_KEY>".yellow().bold());
                        println!("");

                    }

                }

            }

            if let Some(pk) = private_key {

                if let Ok(key_created) = files.verify_if_has_private_key() {
                    
                    if !key_created {

                        emet.private_key = pk.clone();
                        println!("{}", "Don't forget that".red());
                        println!("-- {}", "Private Key Created!".yellow().bold());

                        files.write(emet.private_key.clone(), &files.emet_path).map_err(|e| {
                            EmetError::IoError(Error::new(ErrorKind::Other, e))
                        })?;
                        
                        //

                        files.edit_emet_cfg_prvkey(true).map_err(|e| EmetError::IoError(Error::new(ErrorKind::Other, e)))?;
                    
                    } else {
                        
                        println!("");
                        println!("{}", "Your digital signatures are maked with this key.".dimmed());
                        println!("If you want change (not recommended) use: {}", "emet up --change".yellow().bold());
                        println!("");
                        println!("{}", "All your files signed will be lost".red());
                        println!("");
                    
                    }

                }
                
            
            } else {
                if *show {
                    
                    let content = files.read(&files.emet_path).map_err(|e| {
                        EmetError::IoError(Error::new(ErrorKind::Other, e))
                    })?;

                    if !content.is_empty() {
                        println!("{}", content.yellow().bold());
                    } else {
                        println!("{}", "You didn't create a private key already.".dimmed());
                        println!("Use: {}", "emet up <YOUR_PRIVATE_KEY>".yellow().bold());
                    }

                }
            }

            Ok(())

        },

        Commands::Seal { path } => {
        
            if let Some(p) = path {

                if let Ok(key_created) = files.verify_if_has_private_key() {

                    if key_created {

                        let path_str = p.to_str().ok_or_else(|| EmetError::IoError(Error::new(ErrorKind::Other, "UTF-8 Error")))?;
                        let sealed = emet.seal(path_str).map_err(|e| e)?;

                        let path_to_save = PathBuf::from(path_str);

                        let pts_str = path_to_save.to_str().ok_or_else(|| EmetError::IoError(Error::new(ErrorKind::Other, "UTF-8 Error")))?;

                        emet.save_seal(pts_str, &sealed).map_err(|e| EmetError::IoError(Error::new(ErrorKind::Other, format!("UTF-8 Error -- {}", e))))?;

                        println!("{} was signed!", p.display().to_string().yellow());
                        println!(" -- {}{} created!", p.display().to_string().yellow(), ".emet".yellow());

                    } else {
                        
                        println!("{}", "You didn't set your private key already.".yellow());
                        println!("Use: {}", "emet up <YOUR_KEY>".yellow().bold());

                    }
                
                }

            } else {

                println!("{}", "Path not provided".yellow())

            }

            Ok(())

        }


        Commands::Check { path, emet_path } => {
            
            if let Some(p) = path {
                
                if let Some(ep) = emet_path {

                    if let Ok(key_created) = files.verify_if_has_private_key() {

                        if key_created {

                            let path_str = p.to_str().ok_or_else(|| EmetError::IoError(Error::new(ErrorKind::Other, "UTF-8 Error")))?;
                            let emet_path_str = ep.to_str().ok_or_else(|| EmetError::IoError(Error::new(ErrorKind::Other, "UTF-8 Error")))?;

                            match emet.check(path_str, emet_path_str) {
                                Ok(_) => {
                                    println!("{} {} is {}!", "[emet]".dimmed(), path_str.yellow(), "authentic".yellow().bold())
                                }
                                Err(e) => {
                                    println!("{} {} -- {}", "[emet alert]".dimmed(), emet_path_str.yellow(), e.to_string().red());
                                } 
                            }
                            

                        } else {

                            println!("{}", "You didn't set your private key already.".yellow());
                            println!("Use: {}", "emet up <YOUR_KEY>".yellow());

                        }

                    } else {

                        println!("{}", "You didn't set your private key already.".yellow());
                        println!("Use: {}", "emet up <YOUR_KEY>".yellow());

                    }

                } else {
                    println!("{}", ".emet Path not provided".yellow())
                }

            } else {
                println!("{}", "Path not provided".yellow())
            }

            Ok(())
        
        }

    }

}