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

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	/// Format of stack traces' display in console.31	/// `compact` format only shows `filename:line:column`s32	/// while `explaining` displays source code with attached trace annotations33	/// thus being more verbose.34	#[clap(long, possible_values = &["compact", "explaining"])]35	trace_format: Option<TraceFormatName>,36	/// Amount of stack trace elements to be displayed.37	/// If set to `0` then full stack trace will be displayed.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}