cli-toolbox 0.8.0

Utility library for working with cli output ergonomically
use proc_macro2::TokenStream;
#[cfg(any(feature = "debug", feature = "report"))]
use quote::ToTokens;
#[cfg(any(feature = "eval", feature = "release"))]
use syn::Expr;
#[cfg(any(feature = "eval", feature = "release"))]
use verbosity::Verbosity;

#[cfg(any(feature = "debug", feature = "report"))]
use crate::common::Message;

#[cfg(any(feature = "debug", feature = "report"))]
impl ToTokens for Message {
    fn to_tokens(&self, tokens: &mut TokenStream) {
        tokens.extend(self.build_message(false));
    }
}

#[cfg(any(feature = "eval", feature = "release"))]
pub fn tokenize_expression(terse: &Option<Expr>, verbose: &Option<Expr>) -> TokenStream {
    match (terse, verbose) {
        (Some(terse), None) =>
            tokenize_verbosity_expression(Verbosity::Terse, terse),
        (None, Some(verbose)) =>
            tokenize_verbosity_expression(Verbosity::Verbose, verbose),
        (Some(terse), Some(verbose)) => {
            let terse = tokenize_verbosity_expression(Verbosity::Terse, terse);
            let verbose = tokenize_verbosity_expression(Verbosity::Verbose, verbose);

            quote! {
                match verbosity::Verbosity::level() {
                    verbosity::Verbosity::Terse => #terse,
                    verbosity::Verbosity::Verbose => #verbose,
                    verbosity::Verbosity::Quite => {}
                }
            }
        }
        (None, None) => TokenStream::new()
    }
}

#[cfg(any(feature = "eval", feature = "release"))]
pub fn tokenize_verbosity_expression(verbosity: Verbosity, expr: &Expr) -> TokenStream {
    let verbosity_check = if verbosity == Verbosity::Terse {
        quote! { verbosity::Verbosity::is_terse() }
    } else {
        quote! { verbosity::Verbosity::is_verbose() }
    };

    quote! { if #verbosity_check { #expr; } }
}