difftreelog
feat use relative paths in traces by default
in: master
1 file changed
crates/jrsonnet-cli/src/trace.rsdiffbeforeafterboth1use 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)]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 fn configure(&self, s: &State) -> Result<()> {45 let resolver = PathResolver::Absolute;46 match self47 .trace_format48 .as_ref()49 .unwrap_or(&TraceFormatName::Compact)50 {51 TraceFormatName::Compact => s.set_trace_format(Box::new(CompactFormat {52 resolver,53 padding: 4,54 })),55 TraceFormatName::Explaining => {56 s.set_trace_format(Box::new(ExplainingFormat { resolver }))57 }58 }59 s.set_max_trace(self.max_trace);60 Ok(())61 }62}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)]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 fn configure(&self, s: &State) -> Result<()> {45 let resolver = if let Ok(dir) = std::env::current_dir() {46 PathResolver::Relative(dir)47 } else {48 PathResolver::Absolute49 };50 match self51 .trace_format52 .as_ref()53 .unwrap_or(&TraceFormatName::Compact)54 {55 TraceFormatName::Compact => s.set_trace_format(Box::new(CompactFormat {56 resolver,57 padding: 4,58 })),59 TraceFormatName::Explaining => {60 s.set_trace_format(Box::new(ExplainingFormat { resolver }))61 }62 }63 s.set_max_trace(self.max_trace);64 Ok(())65 }66}