char_coal/
app.rs

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}