1use std::str::FromStr;23use clap::Parser;4use jrsonnet_evaluator::{5 error::Result,6 trace::{CompactFormat, ExplainingFormat, PathResolver},7 State,8};910use crate::ConfigureState;1112#[derive(PartialEq, Eq)]13pub enum TraceFormatName {14 Compact,15 Explaining,16}1718impl FromStr for TraceFormatName {19 type Err = &'static str;20 fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {21 Ok(match s {22 "compact" => TraceFormatName::Compact,23 "explaining" => TraceFormatName::Explaining,24 _ => return Err("no such format"),25 })26 }27}2829#[derive(Parser)]30#[clap(next_help_heading = "STACK TRACE VISUAL")]31pub struct TraceOpts {32 33 34 35 36 #[clap(long, possible_values = &["compact", "explaining"])]37 trace_format: Option<TraceFormatName>,38 39 40 #[clap(long, short = 't', default_value = "20")]41 max_trace: usize,42}43impl ConfigureState for TraceOpts {44 type Guards = ();45 fn configure(&self, s: &State) -> Result<()> {46 let resolver = PathResolver::new_cwd_fallback();47 match self48 .trace_format49 .as_ref()50 .unwrap_or(&TraceFormatName::Compact)51 {52 TraceFormatName::Compact => s.set_trace_format(CompactFormat {53 resolver,54 padding: 4,55 }),56 TraceFormatName::Explaining => s.set_trace_format(ExplainingFormat { resolver }),57 }58 s.set_max_trace(self.max_trace);59 Ok(())60 }61}