difftreelog
fix mark -S and --format as mutually exclusive
in: master
1 file changed
crates/jrsonnet-cli/src/manifest.rsdiffbeforeafterboth1use std::{path::PathBuf, str::FromStr};23use clap::Parser;4use jrsonnet_evaluator::{error::Result, ManifestFormat, State};56use crate::ConfigureState;78pub enum ManifestFormatName {9 /// Expect string as output, and write them directly10 String,11 Json,12 Yaml,13}1415impl FromStr for ManifestFormatName {16 type Err = &'static str;17 fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {18 Ok(match s {19 "string" => ManifestFormatName::String,20 "json" => ManifestFormatName::Json,21 "yaml" => ManifestFormatName::Yaml,22 _ => return Err("no such format"),23 })24 }25}2627#[derive(Parser)]28#[clap(next_help_heading = "MANIFESTIFICATION OUTPUT")]29pub struct ManifestOpts {30 /// Output format, wraps resulting value to corresponding std.manifest call.31 /// If set to `string` then plain string value is expected to be returned,32 /// otherwise output will be serialized to the specified format.33 #[clap(long, short = 'f', default_value = "json", possible_values = &["string", "json", "yaml"])]34 format: ManifestFormatName,35 /// Expect plain string as output.36 /// Shortcut for `--format=string` thus this option is mutually exclusive with `format` option.37 #[clap(long, short = 'S')]38 string: bool,39 /// Write output as YAML stream, can be used with --format json/yaml40 #[clap(long, short = 'y')]41 yaml_stream: bool,42 /// Number of spaces to pad output manifest with.43 /// `0` for hard tabs, `-1` for single line output [default: 3 for json, 2 for yaml]44 #[clap(long)]45 line_padding: Option<usize>,46 /// Preserve order in object manifestification47 #[cfg(feature = "exp-preserve-order")]48 #[clap(long)]49 exp_preserve_order: bool,50}51impl ConfigureState for ManifestOpts {52 fn configure(&self, s: &State) -> Result<()> {53 if self.string {54 s.set_manifest_format(ManifestFormat::String);55 } else {56 #[cfg(feature = "exp-preserve-order")]57 let preserve_order = self.exp_preserve_order;58 match self.format {59 ManifestFormatName::String => s.set_manifest_format(ManifestFormat::String),60 ManifestFormatName::Json => s.set_manifest_format(ManifestFormat::Json {61 padding: self.line_padding.unwrap_or(3),62 #[cfg(feature = "exp-preserve-order")]63 preserve_order,64 }),65 ManifestFormatName::Yaml => s.set_manifest_format(ManifestFormat::Yaml {66 padding: self.line_padding.unwrap_or(2),67 #[cfg(feature = "exp-preserve-order")]68 preserve_order,69 }),70 }71 }72 if self.yaml_stream {73 s.set_manifest_format(ManifestFormat::YamlStream(Box::new(s.manifest_format())))74 }75 Ok(())76 }77}7879#[derive(Parser)]80pub struct OutputOpts {81 /// Write to the output file rather than stdout82 #[clap(long, short = 'o')]83 pub output_file: Option<PathBuf>,84 /// Automatically creates all parent directories for files85 #[clap(long, short = 'c')]86 pub create_output_dirs: bool,87 /// Write multiple files to the directory, list files on stdout88 #[clap(long, short = 'm')]89 pub multi: Option<PathBuf>,90}