replace anyhow and log with color_eyre and tracing

Since Himalaya is intended to be ran as a CLI in the terminal emulator
environment, their user experience could vastly improve with better and
more colorful error messages and logging.

This change will replace more minimal libraries for error-reporting/han-
dling with their more advanced counterparts.

Since these crates have tight integrations, this commit will change both
in one shot.

Also we have don't need env_logger any more. So I also have removed that
guy as well.

Signed-off-by: Perma Alesheikh <me@prma.dev>
This commit is contained in:
Perma Alesheikh
2024-04-15 00:10:46 +03:30
committed by Clément DOUIN
parent cc79f5cc38
commit 5a0ff83a5e
68 changed files with 376 additions and 198 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::context::BackendContextBuilder;
use log::info;
use tracing::info;
use crate::{
account::arg::name::OptionalAccountNameArg, backend, config::TomlConfig, printer::Printer,
+3 -3
View File
@@ -1,12 +1,12 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
#[cfg(feature = "imap")]
use email::imap::config::ImapAuthConfig;
#[cfg(feature = "smtp")]
use email::smtp::config::SmtpAuthConfig;
use log::info;
use tracing::info;
#[cfg(any(feature = "imap", feature = "smtp"))]
use log::{debug, warn};
use tracing::{debug, warn};
#[cfg(any(feature = "imap", feature = "smtp", feature = "pgp"))]
use crate::ui::prompt;
+2 -2
View File
@@ -1,6 +1,6 @@
use anyhow::Result;
use clap::Parser;
use log::info;
use color_eyre::Result;
use tracing::info;
use crate::{
account::Accounts,
+1 -1
View File
@@ -4,7 +4,7 @@ mod list;
#[cfg(feature = "account-sync")]
mod sync;
use anyhow::Result;
use color_eyre::Result;
use clap::Subcommand;
use crate::{config::TomlConfig, printer::Printer};
+3 -3
View File
@@ -1,5 +1,5 @@
use anyhow::{anyhow, bail, Result};
use clap::{ArgAction, Parser};
use color_eyre::{eyre::bail, eyre::eyre, Result};
use email::backend::context::BackendContextBuilder;
#[cfg(feature = "imap")]
use email::imap::ImapContextBuilder;
@@ -10,12 +10,12 @@ use email::{
sync::{hash::SyncHash, SyncEvent},
};
use indicatif::{MultiProgress, ProgressBar, ProgressFinish, ProgressStyle};
use log::info;
use once_cell::sync::Lazy;
use std::{
collections::{BTreeSet, HashMap},
sync::{Arc, Mutex},
};
use tracing::info;
use crate::{
account::arg::name::OptionalAccountNameArg, backend::BackendKind, config::TomlConfig,
@@ -99,7 +99,7 @@ impl AccountSyncCommand {
.as_ref()
.map(Clone::clone)
.map(Arc::new)
.ok_or_else(|| anyhow!("imap config not found"))?;
.ok_or_else(|| eyre!("imap config not found"))?;
let imap_ctx = ImapContextBuilder::new(account_config.clone(), imap_config)
.with_prebuilt_credentials()
.await?;
+1 -1
View File
@@ -3,7 +3,7 @@ pub mod command;
pub mod config;
pub(crate) mod wizard;
use anyhow::Result;
use color_eyre::Result;
use serde::Serialize;
use std::{collections::hash_map::Iter, fmt, ops::Deref};
+1 -1
View File
@@ -1,6 +1,6 @@
#[cfg(feature = "account-sync")]
use crate::account::config::SyncConfig;
use anyhow::{bail, Result};
use color_eyre::{eyre::bail, Result};
#[cfg(feature = "account-sync")]
use dialoguer::Confirm;
use dialoguer::Input;
+1 -1
View File
@@ -1,7 +1,7 @@
pub mod config;
pub(crate) mod wizard;
use anyhow::Result;
use color_eyre::Result;
use async_trait::async_trait;
use std::{ops::Deref, sync::Arc};
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::Select;
#[cfg(feature = "account-discovery")]
use email::account::discover::config::AutoConfig;
+4 -4
View File
@@ -1,11 +1,11 @@
pub mod arg;
use anyhow::{anyhow, Context, Result};
use color_eyre::{eyre::eyre, eyre::Context, Result};
use dirs::data_dir;
use email::account::config::AccountConfig;
use log::debug;
use sled::{Config, Db};
use std::collections::HashSet;
use tracing::debug;
#[derive(Debug)]
pub enum IdMapper {
@@ -17,7 +17,7 @@ impl IdMapper {
pub fn new(account_config: &AccountConfig, folder: &str) -> Result<Self> {
let digest = md5::compute(account_config.name.clone() + folder);
let db_path = data_dir()
.ok_or(anyhow!("cannot get XDG data directory"))?
.ok_or(eyre!("cannot get XDG data directory"))?
.join("himalaya")
.join(".id-mappers")
.join(format!("{digest:x}"));
@@ -108,7 +108,7 @@ impl IdMapper {
None
}
})
.ok_or_else(|| anyhow!("cannot get id from alias {alias}"))?;
.ok_or_else(|| eyre!("cannot get id from alias {alias}"))?;
debug!("found id {id} from alias {alias}");
Ok(id)
+15 -1
View File
@@ -1,5 +1,5 @@
use anyhow::Result;
use clap::{Parser, Subcommand};
use color_eyre::Result;
use std::path::PathBuf;
use crate::{
@@ -75,6 +75,20 @@ pub struct Cli {
#[arg(long, short = 'C', global = true)]
#[arg(value_name = "MODE", value_enum, default_value_t = Default::default())]
pub color: ColorFmt,
/// Enable logs with spantrace.
///
/// This is the same as running the command with `RUST_LOG=debug`
/// environment variable.
#[arg(long, global = true, conflicts_with = "trace")]
pub debug: bool,
/// Enable verbose logs with backtrace.
///
/// This is the same as running the command with `RUST_LOG=trace`
/// and `RUST_BACKTRACE=1` environment variables.
#[arg(long, global = true, conflicts_with = "debug")]
pub trace: bool,
}
#[derive(Subcommand, Debug)]
+2 -2
View File
@@ -1,8 +1,8 @@
use anyhow::Result;
use clap::{value_parser, CommandFactory, Parser};
use clap_complete::Shell;
use log::info;
use color_eyre::Result;
use std::io;
use tracing::info;
use crate::cli::Cli;
+8 -5
View File
@@ -1,17 +1,20 @@
pub mod wizard;
use anyhow::{anyhow, bail, Context, Result};
use color_eyre::{
eyre::{bail, eyre, Context},
Result,
};
use dirs::{config_dir, home_dir};
use email::{
account::config::AccountConfig, config::Config, envelope::config::EnvelopeConfig,
flag::config::FlagConfig, folder::config::FolderConfig, message::config::MessageConfig,
};
use log::debug;
use serde::{Deserialize, Serialize};
use serde_toml_merge::merge;
use shellexpand_utils::{canonicalize, expand};
use std::{collections::HashMap, fs, path::PathBuf, sync::Arc};
use toml::{self, Value};
use tracing::debug;
#[cfg(feature = "account-sync")]
use crate::backend::BackendKind;
@@ -136,7 +139,7 @@ impl TomlConfig {
/// found.
pub fn default_path() -> Result<PathBuf> {
Ok(config_dir()
.ok_or(anyhow!("cannot get XDG config directory"))?
.ok_or(eyre!("cannot get XDG config directory"))?
.join("himalaya")
.join("config.toml"))
}
@@ -175,12 +178,12 @@ impl TomlConfig {
.filter(|default| *default)
.map(|_| (name.to_owned(), account.clone()))
})
.ok_or_else(|| anyhow!("cannot find default account")),
.ok_or_else(|| eyre!("cannot find default account")),
Some(name) => self
.accounts
.get(name)
.map(|account| (name.to_owned(), account.clone()))
.ok_or_else(|| anyhow!("cannot find account {name}")),
.ok_or_else(|| eyre!("cannot find account {name}")),
}?;
#[cfg(feature = "imap")]
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::{Confirm, Input, Select};
use shellexpand_utils::expand;
use std::{fs, path::PathBuf, process};
+2 -2
View File
@@ -1,12 +1,12 @@
use anyhow::Result;
use ariadne::{Color, Label, Report, ReportKind, Source};
use clap::Parser;
use color_eyre::Result;
use email::{
backend::feature::BackendFeatureSource, email::search_query,
envelope::list::ListEnvelopesOptions, search_query::SearchEmailsQuery,
};
use log::info;
use std::process::exit;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+1 -1
View File
@@ -1,7 +1,7 @@
pub mod list;
pub mod watch;
use anyhow::Result;
use color_eyre::Result;
use clap::Subcommand;
use crate::{config::TomlConfig, printer::Printer};
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+1 -1
View File
@@ -1,6 +1,6 @@
use clap::Parser;
use email::flag::{Flag, Flags};
use log::debug;
use tracing::debug;
/// The ids and/or flags arguments parser.
#[derive(Debug, Parser)]
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+1 -1
View File
@@ -2,7 +2,7 @@ mod add;
mod remove;
mod set;
use anyhow::Result;
use color_eyre::Result;
use clap::Subcommand;
use crate::{config::TomlConfig, printer::Printer};
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+1 -1
View File
@@ -3,7 +3,7 @@ pub mod command;
pub mod config;
pub mod flag;
use anyhow::Result;
use color_eyre::Result;
use email::account::config::AccountConfig;
use serde::Serialize;
use std::ops;
@@ -1,8 +1,8 @@
use anyhow::{Context, Result};
use clap::Parser;
use color_eyre::{eyre::Context, Result};
use email::backend::feature::BackendFeatureSource;
use log::info;
use std::{fs, path::PathBuf};
use tracing::info;
use uuid::Uuid;
#[cfg(feature = "account-sync")]
+1 -1
View File
@@ -1,6 +1,6 @@
mod download;
use anyhow::Result;
use color_eyre::Result;
use clap::Subcommand;
use crate::{config::TomlConfig, printer::Printer};
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+3 -3
View File
@@ -1,7 +1,7 @@
use anyhow::{anyhow, Result};
use clap::Parser;
use color_eyre::{eyre::eyre, Result};
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
@@ -75,7 +75,7 @@ impl MessageForwardCommand {
.get_messages(folder, &[id])
.await?
.first()
.ok_or(anyhow!("cannot find message"))?
.ok_or(eyre!("cannot find message"))?
.to_forward_tpl_builder(account_config.clone())
.with_headers(self.headers.raw)
.with_body(self.body.raw())
+2 -2
View File
@@ -1,8 +1,8 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use mail_builder::MessageBuilder;
use tracing::info;
use url::Url;
#[cfg(feature = "account-sync")]
+1 -1
View File
@@ -9,7 +9,7 @@ pub mod save;
pub mod send;
pub mod write;
use anyhow::Result;
use color_eyre::Result;
use clap::Subcommand;
use crate::{config::TomlConfig, printer::Printer};
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,8 +1,8 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use mml::message::FilterParts;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+3 -3
View File
@@ -1,7 +1,7 @@
use anyhow::{anyhow, Result};
use clap::Parser;
use color_eyre::{eyre::eyre, Result};
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
@@ -77,7 +77,7 @@ impl MessageReplyCommand {
.get_messages(folder, &[id])
.await?
.first()
.ok_or(anyhow!("cannot find message {id}"))?
.ok_or(eyre!("cannot find message {id}"))?
.to_reply_tpl_builder(account_config.clone())
.with_headers(self.headers.raw)
.with_body(self.body.raw())
+2 -2
View File
@@ -1,8 +1,8 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use std::io::{self, BufRead, IsTerminal};
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,8 +1,8 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use std::io::{self, BufRead, IsTerminal};
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::{backend::feature::BackendFeatureSource, message::Message};
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
@@ -1,7 +1,7 @@
use anyhow::{anyhow, Result};
use clap::Parser;
use color_eyre::{eyre::eyre, Result};
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
@@ -69,7 +69,7 @@ impl TemplateForwardCommand {
.get_messages(folder, &[id])
.await?
.first()
.ok_or(anyhow!("cannot find message {id}"))?
.ok_or(eyre!("cannot find message {id}"))?
.to_forward_tpl_builder(account_config)
.with_headers(self.headers.raw)
.with_body(self.body.raw())
+1 -1
View File
@@ -4,7 +4,7 @@ mod save;
mod send;
mod write;
use anyhow::Result;
use color_eyre::Result;
use clap::Subcommand;
use crate::{config::TomlConfig, printer::Printer};
+3 -3
View File
@@ -1,7 +1,7 @@
use anyhow::{anyhow, Result};
use clap::Parser;
use color_eyre::{eyre::eyre, Result};
use email::backend::feature::BackendFeatureSource;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
@@ -73,7 +73,7 @@ impl TemplateReplyCommand {
.get_messages(folder, &[id])
.await?
.first()
.ok_or(anyhow!("cannot find message {id}"))?
.ok_or(eyre!("cannot find message {id}"))?
.to_reply_tpl_builder(account_config)
.with_headers(self.headers.raw)
.with_body(self.body.raw())
+2 -2
View File
@@ -1,9 +1,9 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use mml::MmlCompilerBuilder;
use std::io::{self, BufRead, IsTerminal};
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,9 +1,9 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::backend::feature::BackendFeatureSource;
use log::info;
use mml::MmlCompilerBuilder;
use std::io::{self, BufRead, IsTerminal};
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::message::Message;
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+1 -1
View File
@@ -1,7 +1,7 @@
pub mod arg;
pub mod command;
use anyhow::Result;
use color_eyre::Result;
use email::template::Template;
use crate::printer::{Print, WriteColor};
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::{backend::feature::BackendFeatureSource, folder::add::AddFolder};
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,9 +1,9 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use dialoguer::Confirm;
use email::{backend::feature::BackendFeatureSource, folder::delete::DeleteFolder};
use log::info;
use std::process;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::{backend::feature::BackendFeatureSource, folder::expunge::ExpungeFolder};
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+2 -2
View File
@@ -1,7 +1,7 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use email::{backend::feature::BackendFeatureSource, folder::list::ListFolders};
use log::info;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+1 -1
View File
@@ -4,7 +4,7 @@ mod expunge;
mod list;
mod purge;
use anyhow::Result;
use color_eyre::Result;
use clap::Subcommand;
use crate::{config::TomlConfig, printer::Printer};
+2 -2
View File
@@ -1,9 +1,9 @@
use anyhow::Result;
use clap::Parser;
use color_eyre::Result;
use dialoguer::Confirm;
use email::{backend::feature::BackendFeatureSource, folder::purge::PurgeFolder};
use log::info;
use std::process;
use tracing::info;
#[cfg(feature = "account-sync")]
use crate::cache::arg::disable::CacheDisableFlag;
+1 -1
View File
@@ -2,7 +2,7 @@ pub mod arg;
pub mod command;
pub mod config;
use anyhow::Result;
use color_eyre::Result;
use serde::Serialize;
use std::ops;
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::{Confirm, Input, Password, Select};
#[cfg(feature = "account-discovery")]
use email::account::discover::config::{AuthenticationType, AutoConfig, SecurityType, ServerType};
+1
View File
@@ -19,6 +19,7 @@ pub mod printer;
pub mod sendmail;
#[cfg(feature = "smtp")]
pub mod smtp;
pub mod tracing;
pub mod ui;
#[doc(inline)]
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::Input;
use dirs::home_dir;
use email::maildir::config::MaildirConfig;
+32 -15
View File
@@ -1,25 +1,35 @@
use anyhow::Result;
use std::env;
use clap::Parser;
use env_logger::{Builder as LoggerBuilder, Env, DEFAULT_FILTER_ENV};
use color_eyre::{Result, Section};
use himalaya::{
cli::Cli, config::TomlConfig, envelope::command::list::ListEnvelopesCommand,
message::command::mailto::MessageMailtoCommand, printer::StdoutPrinter,
};
use log::{debug, trace};
use tracing::{debug, level_filters::LevelFilter, trace};
#[tokio::main]
async fn main() -> Result<()> {
if env::var("RUST_LOG").is_err() {
if std::env::args().any(|arg| arg == "--debug") {
env::set_var("RUST_LOG", "debug");
}
if std::env::args().any(|arg| arg == "--trace") {
env::set_var("RUST_LOG", "trace");
}
}
let cli = Cli::parse();
let filter = himalaya::tracing::install()?;
let mut printer = StdoutPrinter::new(cli.output, cli.color);
#[cfg(not(target_os = "windows"))]
if let Err((_, err)) = coredump::register_panic_handler() {
debug!("cannot register coredump panic handler: {err}");
trace!("{err:?}");
trace!("cannot register coredump panic handler: {err}");
debug!("{err:?}");
}
LoggerBuilder::new()
.parse_env(Env::new().filter_or(DEFAULT_FILTER_ENV, "warn"))
.format_timestamp(None)
.init();
// if the first argument starts by "mailto:", execute straight the
// mailto message command
let mailto = std::env::args()
@@ -35,10 +45,7 @@ async fn main() -> Result<()> {
.await;
}
let cli = Cli::parse();
let mut printer = StdoutPrinter::new(cli.output, cli.color);
match cli.command {
let mut res = match cli.command {
Some(cmd) => cmd.execute(&mut printer, cli.config_paths.as_ref()).await,
None => {
let config = TomlConfig::from_paths_or_default(cli.config_paths.as_ref()).await?;
@@ -46,5 +53,15 @@ async fn main() -> Result<()> {
.execute(&mut printer, &config)
.await
}
}
};
if filter < LevelFilter::DEBUG {
res = res.note("Run with --debug to enable logs with spantrace.");
};
if filter < LevelFilter::TRACE {
res = res.note("Run with --trace to enable verbose logs with backtrace.")
};
res
}
+2 -2
View File
@@ -1,9 +1,9 @@
use anyhow::Result;
use clap::{CommandFactory, Parser};
use clap_mangen::Man;
use log::info;
use color_eyre::Result;
use shellexpand_utils::{canonicalize, expand};
use std::{fs, path::PathBuf};
use tracing::info;
use crate::{cli::Cli, printer::Printer};
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::Input;
use email::notmuch::config::NotmuchConfig;
+3 -3
View File
@@ -1,5 +1,5 @@
use anyhow::{anyhow, Error, Result};
use clap::ValueEnum;
use color_eyre::{eyre::eyre, eyre::Error, Result};
use serde::Serialize;
use std::{
fmt,
@@ -23,7 +23,7 @@ impl FromStr for OutputFmt {
match fmt {
fmt if fmt.eq_ignore_ascii_case("json") => Ok(Self::Json),
fmt if fmt.eq_ignore_ascii_case("plain") => Ok(Self::Plain),
unknown => Err(anyhow!("cannot parse output format {}", unknown)),
unknown => Err(eyre!("cannot parse output format {}", unknown)),
}
}
}
@@ -69,7 +69,7 @@ impl FromStr for ColorFmt {
fmt if fmt.eq_ignore_ascii_case("always") => Ok(Self::Always),
fmt if fmt.eq_ignore_ascii_case("ansi") => Ok(Self::Ansi),
fmt if fmt.eq_ignore_ascii_case("auto") => Ok(Self::Auto),
unknown => Err(anyhow!("cannot parse color format {}", unknown)),
unknown => Err(eyre!("cannot parse color format {}", unknown)),
}
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::{Context, Result};
use color_eyre::{eyre::Context, Result};
use crate::printer::WriteColor;
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use email::email::config::EmailTextPlainFormat;
use std::io;
use termcolor::{self, StandardStream};
+2 -2
View File
@@ -1,5 +1,5 @@
use anyhow::{Context, Error, Result};
use clap::ArgMatches;
use color_eyre::{eyre::Context, Report, Result};
use std::fmt::{self, Debug};
use termcolor::StandardStream;
@@ -87,7 +87,7 @@ impl From<OutputFmt> for StdoutPrinter {
}
impl TryFrom<&ArgMatches> for StdoutPrinter {
type Error = Error;
type Error = Report;
fn try_from(m: &ArgMatches) -> Result<Self, Self::Error> {
let fmt: OutputFmt = m
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::Input;
use email::sendmail::config::SendmailConfig;
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::{Confirm, Input, Password, Select};
#[cfg(feature = "account-discovery")]
use email::account::discover::config::{AuthenticationType, AutoConfig, SecurityType, ServerType};
+40
View File
@@ -0,0 +1,40 @@
use color_eyre::eyre::Result;
use std::env;
use tracing_error::ErrorLayer;
use tracing_subscriber::{filter::LevelFilter, fmt, prelude::*, EnvFilter};
pub fn install() -> Result<LevelFilter> {
let fmt_layer = fmt::layer().with_target(false);
let (filter_layer, current_filter) = match EnvFilter::try_from_default_env() {
Err(_) => (EnvFilter::try_new("warn").unwrap(), LevelFilter::OFF),
Ok(layer) => {
let level = layer.max_level_hint().unwrap_or(LevelFilter::OFF);
(layer, level)
}
};
let registry = tracing_subscriber::registry()
.with(filter_layer)
.with(ErrorLayer::default());
if current_filter == LevelFilter::OFF {
registry.with(fmt_layer.without_time()).init()
} else {
registry.with(fmt_layer).init()
}
if env::var("RUST_BACKTRACE").is_err() && current_filter == LevelFilter::TRACE {
env::set_var("RUST_BACKTRACE", "1");
}
let debug = current_filter >= LevelFilter::DEBUG;
color_eyre::config::HookBuilder::new()
.capture_span_trace_by_default(debug)
.display_location_section(debug)
.display_env_section(false)
.install()?;
Ok(current_filter)
}
+1 -1
View File
@@ -1,4 +1,4 @@
use anyhow::Result;
use color_eyre::Result;
use dialoguer::Select;
use super::THEME;
+2 -2
View File
@@ -1,4 +1,4 @@
use anyhow::{Context, Result};
use color_eyre::{eyre::Context, Result};
use email::{
account::config::AccountConfig,
email::utils::{local_draft_path, remove_local_draft},
@@ -6,10 +6,10 @@ use email::{
folder::DRAFTS,
template::Template,
};
use log::debug;
use mml::MmlCompilerBuilder;
use process::SingleCommand;
use std::{env, fs, sync::Arc};
use tracing::debug;
use crate::{
backend::Backend,
+2 -2
View File
@@ -4,11 +4,11 @@
//!
//! [builder design pattern]: https://refactoring.guru/design-patterns/builder
use anyhow::{Context, Result};
use color_eyre::{eyre::Context, Result};
use email::email::config::EmailTextPlainFormat;
use log::trace;
use termcolor::{Color, ColorSpec};
use terminal_size::terminal_size;
use tracing::trace;
use unicode_width::UnicodeWidthStr;
use crate::printer::{Print, PrintTableOpts, WriteColor};