use ext::{
no_std::{algebraic::sum::TimeUnit, pipelines::pipe::Pipe},
standard::functions::fun::{measure_time_with_value, time_conversion_with_unit},
};
use std::time::Duration;
use vz::{
cli::{
get_args,
Compress::{C, D, N, S},
}, compress::{decompress, par_compress}, encrypt::{Caesar, Crypt, Crypto}, pack::{pack, unpack}
};
fn tla() -> (impl FnOnce(Duration) -> f32, TimeUnit) {
let a = get_args(); let ret_self = |x| x;
let (r#in, cs, aes, des, rsa, compress, time) = (&a.input, a.caesar, &a.aes_key, &a.des_key, &a.rsa_private_key, a.compress, a.time);
let _pack = |ext, f: fn(Vec<u8>) -> Vec<u8>| pack(r#in)(ext, f, |v| v.cs_enc(cs).encrypt(aes, des, rsa));
let _unpack = |ext, f: fn(Vec<u8>) -> Vec<u8>| unpack(r#in)(ext, f, |v| v.decrypt(aes, des, rsa).cs_dec(cs));
match compress {
C => _pack(".vz", par_compress),
D => _unpack(".vz", decompress),
N(t) => if t.tar { _pack(".vz-n", ret_self) } else { _unpack(".vz-n", ret_self) },
S(t) => if t.tar {
pack(r#in)(".vz-s", par_compress, |v| v.cs_enc(173).des_enc(des).aes_enc(aes))
} else {
unpack(r#in)(".vz-s", decompress, |v| v.aes_dec(aes).des_dec(des).cs_dec(173))
},
}
time_conversion_with_unit(time)
}
fn main() {
measure_time_with_value(tla).pipe(|(e, (f, u))| println!("Execution time: {} {u:?}.", f(e)));
}