You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
postsack/src/bin/cli.rs

88 lines
2.1 KiB
Rust

use eyre::Result;
use std::{
io::{stdout, Write},
thread::sleep,
time::Duration,
};
use postsack::{
self,
importer::{Adapter, State},
types::FormatType,
};
fn main() -> Result<()> {
postsack::setup_tracing();
let config = postsack::make_config();
let adapter = postsack::importer::Adapter::new();
// Could not figure out how to build this properly
// with dynamic dispatch. (to abstract away the match)
// Will try again when I'm online.
let handle = match config.format {
FormatType::AppleMail => {
let importer = postsack::importer::applemail_importer(config);
adapter.process(importer)?
}
FormatType::GmailVault => {
let importer = postsack::importer::gmail_importer(config);
adapter.process(importer)?
}
FormatType::Mbox => {
let importer = postsack::importer::mbox_importer(config);
adapter.process(importer)?
}
};
let mut stdout = stdout();
loop {
match handle_adapter(&adapter) {
Ok(true) => break,
Ok(false) => (),
Err(e) => {
println!("Execution Error:\n{:?}", &e);
panic!();
}
}
stdout.flush().unwrap();
}
match handle.join() {
Err(e) => println!("Error: {:?}", e),
Ok(Err(e)) => println!("Error: {:?}", e),
_ => (),
}
println!("\rDone");
Ok(())
}
fn handle_adapter(adapter: &Adapter) -> Result<bool> {
let State {
done, finishing, ..
} = adapter.finished()?;
if done {
return Ok(true);
}
if finishing {
print!("\rFinishing up...");
} else {
let write = adapter.write_count()?;
if write.count > 0 {
print!("\rWriting emails to DB {}/{}...", write.count, write.total);
} else {
let read = adapter.read_count()?;
print!(
"\rReading Emails {}%...",
(read.count as f32 / read.total as f32) * 100.0
);
}
}
sleep(Duration::from_millis(50));
Ok(false)
}