use crate::{
diagnostic::{EnkryptitOutput, logging::EnkryptitLogger, output::snippet::Snippet},
frontend::{
cli::{
inspection::inspect_one_or_more_objects,
params_helpers::{show_params, update_params},
treatment::treat_objects_with_multiple_paths,
},
tui::{input::RealTuiInput, launch_ui},
},
types::Version,
};
use clap::{Parser, Subcommand};
mod compression;
mod context;
mod conversions;
mod diagnostic;
mod directory;
mod encryption;
mod errors;
mod frontend;
mod key;
mod metadatas;
mod parallelism;
mod parameters;
mod treatment;
mod types;
use crate::frontend::cli::treatment::treat_object_with_path;
pub const VERSION: Version = 3;
#[derive(Parser)]
#[command(name = "eck")]
#[command(author = "Olruix")]
#[command(version = "0.0.3")]
#[command(about = "Fast & Secure File Encryption Manager")]
struct Cli {
#[command(subcommand)]
command: Option<Commands>,
#[arg(value_name = "PATH")]
path: Vec<String>,
#[arg(short = 'p', long = "password")]
password: Option<String>,
}
#[derive(Subcommand)]
enum Commands {
Ui,
Inspect {
#[arg(value_name = "PATHS")]
paths: Vec<String>,
},
Params {
#[arg(short = 'c', long = "compression", value_name = "ALGO")]
compression: Option<String>,
#[arg(short = 'k', long = "keytype", value_name = "TYPE")]
key_type: Option<String>,
#[arg(short = 'p', long = "parallelism", value_name = "PARA")]
parallelism: Option<String>,
},
Parameters {
#[arg(short = 'c', long = "compression", value_name = "ALGO")]
compression: Option<String>,
#[arg(long = "keytype", visible_alias = "kt", value_name = "TYPE")]
key_type: Option<String>,
#[arg(short = 'p', long = "parallelism", value_name = "PARA")]
parallelism: Option<String>,
},
}
fn main() {
let cli: Cli = Cli::parse();
if let Err(e) = EnkryptitLogger::init() {
EnkryptitOutput::error("Error while initializing the logger.", e)
.with_location("main.rs::main()")
.display();
}
match cli.command {
Some(Commands::Ui) => {
launch_ui(&RealTuiInput);
}
Some(Commands::Params {
compression,
key_type,
parallelism,
}) => {
if compression.is_none() && key_type.is_none() && parallelism.is_none() {
show_params()
} else {
update_params(compression, key_type, parallelism);
}
}
Some(Commands::Inspect { paths }) => {
inspect_one_or_more_objects(&paths);
}
Some(Commands::Parameters {
compression,
key_type,
parallelism,
}) => {
if compression.is_none() && key_type.is_none() && parallelism.is_none() {
show_params()
} else {
update_params(compression, key_type, parallelism);
}
}
None => {
let path: Vec<String> = cli.path;
match path.len() {
0 => launch_ui(&RealTuiInput),
1 => match treat_object_with_path(&path[0], cli.password) {
Ok(output) => output.display(),
Err(e) => {
e.into_output()
.with_snippet(Snippet::cli_invocation("eck", &path[0]))
.display();
}
},
_ => match treat_objects_with_multiple_paths(&path, cli.password) {
Ok(()) => (),
Err(e) => e
.into_output()
.with_snippet(Snippet::cli_invocation("eck", &path[0]))
.display(),
},
}
}
}
}