1pub mod builder;
2pub mod cache;
3pub mod cli;
4pub mod config;
5
6use super::*;
7
8pub struct App {}
9
10impl App {
11 pub async fn main() -> anyhow::Result<()> {
12 env_logger::init();
13
14 match Cli::new() {
15 Commands::Query(args) => App::query(args).await,
16 Commands::Edit(args) => App::edit(args).await,
17 Commands::Cache { commands } => App::cache(commands).await,
18 }
19 }
20
21 pub async fn query(mut args: cli::QueryArgs) -> anyhow::Result<()> {
22 let app_builder = AppBuilder::new();
23
24 let mut config = app_builder.config()?;
25 let cache = app_builder.cache()?;
26
27 config.apply(&mut args);
28
29 let word_query = {
30 let word_query = WordQuery::new(args.query());
31 if let Some(word_query) = word_query {
32 word_query
33 } else {
34 println!("Invalid input.");
35 return Ok(());
36 }
37 };
38
39 let word_speech = Speech::query(&word_query, &cache, config.speak);
40 let word_entry = WordEntry::query(&word_query, &cache).await?;
41
42 if word_entry.is_empty() {
43 println!("Word not found.");
44 return Ok(());
45 }
46
47 word_entry.display(&word_query, &config);
48 if let Err(err) = word_speech.await {
49 log::error!("An error occured in speech module: {:?}.", err)
50 }
51
52 Ok(())
53 }
54
55 pub async fn edit(args: cli::EditArgs) -> anyhow::Result<()> {
56 use std::process::Command;
57
58 let editor = std::env::var("EDITOR").map_err(|err| {
59 println!("Please set $EDITOR to your preferred editor.");
60 err
61 })?;
62 let config_path = {
63 let app_builder = AppBuilder::new();
64 if args.reset {
65 app_builder.config_fresh()?
66 } else {
67 app_builder.config()?
68 }
69 .path
70 };
71
72 let mut child = Command::new(editor).args([config_path]).spawn()?;
73 child.wait()?;
74 Ok(())
75 }
76
77 pub async fn cache(cmds: cli::CacheCmds) -> anyhow::Result<()> {
78 let cache = AppBuilder::new().cache()?;
79 match cmds {
80 cli::CacheCmds::Show => {
81 println!("{}", cache.show().display());
82 }
83 cli::CacheCmds::Clean => {
84 cache.clean()?;
85 }
86 cli::CacheCmds::Import { dir } => {
87 log::info!("Importing:\n\t<== {}", dir.display());
88 cache.import(dir)?;
89 }
90 cli::CacheCmds::Export { dir } => {
91 log::info!("Exporting:\n\t==> {}", dir.display());
92 cache.export(dir)?;
93 }
94 }
95 Ok(())
96 }
97}