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