git.delta.rocks / jrsonnet / refs/commits / 30d381bece76

difftreelog

source

crates/jrsonnet-cli/src/trace.rs1.6 KiBsourcehistory
1use std::str::FromStr;23use clap::Parser;4use jrsonnet_evaluator::{5	error::Result,6	trace::{CompactFormat, ExplainingFormat, PathResolver},7	State,8};910use crate::ConfigureState;1112#[derive(PartialEq, Eq)]13pub enum TraceFormatName {14	Compact,15	Explaining,16}1718impl FromStr for TraceFormatName {19	type Err = &'static str;20	fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {21		Ok(match s {22			"compact" => TraceFormatName::Compact,23			"explaining" => TraceFormatName::Explaining,24			_ => return Err("no such format"),25		})26	}27}2829#[derive(Parser)]30#[clap(next_help_heading = "STACK TRACE VISUAL")]31pub struct TraceOpts {32	/// Format of stack traces' display in console.33	/// `compact` format only shows `filename:line:column`s34	/// while `explaining` displays source code with attached trace annotations35	/// thus being more verbose.36	#[clap(long, possible_values = &["compact", "explaining"])]37	trace_format: Option<TraceFormatName>,38	/// Amount of stack trace elements to be displayed.39	/// If set to `0` then full stack trace will be displayed.40	#[clap(long, short = 't', default_value = "20")]41	max_trace: usize,42}43impl ConfigureState for TraceOpts {44	type Guards = ();45	fn configure(&self, s: &State) -> Result<()> {46		let resolver = PathResolver::new_cwd_fallback();47		match self48			.trace_format49			.as_ref()50			.unwrap_or(&TraceFormatName::Compact)51		{52			TraceFormatName::Compact => s.set_trace_format(CompactFormat {53				resolver,54				padding: 4,55			}),56			TraceFormatName::Explaining => s.set_trace_format(ExplainingFormat { resolver }),57		}58		s.set_max_trace(self.max_trace);59		Ok(())60	}61}