1use crate::ConfigureState;2use clap::Clap;3use jrsonnet_evaluator::{4 error::Result,5 trace::{CompactFormat, ExplainingFormat, PathResolver},6 EvaluationState,7};8use std::str::FromStr;910#[derive(PartialEq)]11pub enum TraceFormatName {12 Compact,13 Explaining,14}1516impl FromStr for TraceFormatName {17 type Err = &'static str;18 fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {19 Ok(match s {20 "compact" => TraceFormatName::Compact,21 "explaining" => TraceFormatName::Explaining,22 _ => return Err("no such format"),23 })24 }25}2627#[derive(Clap)]28#[clap(help_heading = "STACK TRACE VISUAL")]29pub struct TraceOpts {30 31 32 33 34 #[clap(long, possible_values = &["compact", "explaining"])]35 trace_format: Option<TraceFormatName>,36 37 38 #[clap(long, short = 't', default_value = "20")]39 max_trace: usize,40}41impl ConfigureState for TraceOpts {42 fn configure(&self, state: &EvaluationState) -> Result<()> {43 let resolver = PathResolver::Absolute;44 match self45 .trace_format46 .as_ref()47 .unwrap_or(&TraceFormatName::Compact)48 {49 TraceFormatName::Compact => state.set_trace_format(Box::new(CompactFormat {50 resolver,51 padding: 4,52 })),53 TraceFormatName::Explaining => {54 state.set_trace_format(Box::new(ExplainingFormat { resolver }))55 }56 }57 state.set_max_trace(self.max_trace);58 Ok(())59 }60}