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

difftreelog

source

crates/jrsonnet-cli/src/trace.rs1.6 KiBsourcehistory
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	/// How stack traces should be displayed in console.31	/// compact format only shows `filename:line:column`s, where explaining displays source code32	/// with attached trace annotations, so it is more verbose33	#[clap(long, possible_values = &["compact", "explaining"])]34	trace_format: Option<TraceFormatName>,35	/// Amount of stack trace elements to be displayed, if zero - then full stack trace will be displayed36	#[clap(long, short = 't', default_value = "20")]37	max_trace: usize,38}39impl ConfigureState for TraceOpts {40	fn configure(&self, state: &EvaluationState) -> Result<()> {41		let resolver = PathResolver::Absolute;42		match self43			.trace_format44			.as_ref()45			.unwrap_or(&TraceFormatName::Compact)46		{47			TraceFormatName::Compact => state.set_trace_format(Box::new(CompactFormat {48				resolver,49				padding: 4,50			})),51			TraceFormatName::Explaining => {52				state.set_trace_format(Box::new(ExplainingFormat { resolver }))53			}54		}55		state.set_max_trace(self.max_trace);56		Ok(())57	}58}