git.delta.rocks / jrsonnet / refs/commits / ea5e4eca6eae

difftreelog

source

crates/jrsonnet-cli/src/trace.rs1.6 KiBsourcehistory
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)]27// #[clap(help_heading = "STACK TRACE VISUAL")]28pub struct TraceOpts {29	/// How stack traces should be displayed in console.30	/// compact format only shows `filename:line:column`s, where explaining displays source code31	/// with attached trace annotations, so it is more verbose32	#[clap(long, possible_values = &["compact", "explaining"])]33	trace_format: Option<TraceFormatName>,34	/// Amount of stack trace elements to be displayed, if zero - then full stack trace will be displayed35	#[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 self.trace_format.as_ref().unwrap_or(&TraceFormatName::Compact) {42			TraceFormatName::Compact => state.set_trace_format(Box::new(CompactFormat {43				resolver,44				padding: 4,45			})),46			TraceFormatName::Explaining => {47				state.set_trace_format(Box::new(ExplainingFormat { resolver }))48			}49		}50		state.set_max_trace(self.max_trace);51		Ok(())52	}53}