diff --git a/crates/aiken-project/src/lib.rs b/crates/aiken-project/src/lib.rs index 469999cb..b165545f 100644 --- a/crates/aiken-project/src/lib.rs +++ b/crates/aiken-project/src/lib.rs @@ -466,7 +466,7 @@ where }) } - pub fn export(&self, module: &str, name: &str) -> Result { + pub fn export(&self, module: &str, name: &str, tracing: Tracing) -> Result { self.checked_modules .get(module) .and_then(|checked_module| { @@ -476,7 +476,7 @@ where }) }) .map(|(checked_module, func)| { - let mut generator = self.new_generator(Tracing::silent()); + let mut generator = self.new_generator(tracing); Export::from_function(func, checked_module, &mut generator, &self.checked_modules) }) diff --git a/crates/aiken/src/cmd/export.rs b/crates/aiken/src/cmd/export.rs index 10839c8d..86d41058 100644 --- a/crates/aiken/src/cmd/export.rs +++ b/crates/aiken/src/cmd/export.rs @@ -1,7 +1,10 @@ use std::path::PathBuf; +use aiken_lang::ast::{TraceLevel, Tracing}; use aiken_project::{options::Options, watch::with_project}; +use super::build::{filter_traces_parser, trace_level_parser}; + #[derive(clap::Args)] pub struct Args { /// Path to project @@ -14,6 +17,24 @@ pub struct Args { /// Name of the function within the module #[clap(short, long)] name: String, + + /// Filter traces to be considered during testing: + /// - user-defined: only consider traces that you've explicitly defined (either through the + /// 'trace' keyword of via the trace-if-false ('?') operator. + /// - compiler-generated: only included internal traces generated by the Aiken compiler, for + /// example in usage of 'expect'. + /// - all: include both user-defined and compiler-generated traces. + /// [optional] [default: all] + #[clap(short, long, value_parser=filter_traces_parser(), default_missing_value="all", verbatim_doc_comment)] + filter_traces: Option Tracing>, + + /// Choose the verbosity level of traces: + /// - silent: disable traces altogether + /// - compact: only culprit line numbers are shown on failures + /// - verbose: enable full verbose traces as provided by the user or the compiler + /// [optional] + #[clap(short, long, value_parser=trace_level_parser(), default_value_t=TraceLevel::Verbose, verbatim_doc_comment)] + trace_level: TraceLevel, } pub fn exec( @@ -21,12 +42,21 @@ pub fn exec( directory, module, name, + filter_traces, + trace_level, }: Args, ) -> miette::Result<()> { with_project(directory.as_deref(), false, |p| { p.compile(Options::default())?; - let export = p.export(&module, &name)?; + let export = p.export( + &module, + &name, + match filter_traces { + Some(filter_traces) => filter_traces(trace_level), + None => Tracing::All(trace_level), + }, + )?; let json = serde_json::to_string_pretty(&export).unwrap();