1use std::{path::PathBuf, str::FromStr};23use clap::Parser;4use jrsonnet_evaluator::{error::Result, EvaluationState, ManifestFormat};56use crate::ConfigureState;78pub enum ManifestFormatName {9 10 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 31 32 33 #[clap(long, short = 'f', default_value = "json", possible_values = &["string", "json", "yaml"])]34 format: ManifestFormatName,35 36 37 #[clap(long, short = 'S')]38 string: bool,39 40 #[clap(long, short = 'y')]41 yaml_stream: bool,42 43 44 #[clap(long)]45 line_padding: Option<usize>,46}47impl ConfigureState for ManifestOpts {48 fn configure(&self, state: &EvaluationState) -> Result<()> {49 if self.string {50 state.set_manifest_format(ManifestFormat::String);51 } else {52 match self.format {53 ManifestFormatName::String => state.set_manifest_format(ManifestFormat::String),54 ManifestFormatName::Json => {55 state.set_manifest_format(ManifestFormat::Json(self.line_padding.unwrap_or(3)))56 }57 ManifestFormatName::Yaml => {58 state.set_manifest_format(ManifestFormat::Yaml(self.line_padding.unwrap_or(2)))59 }60 }61 }62 if self.yaml_stream {63 state.set_manifest_format(ManifestFormat::YamlStream(Box::new(64 state.manifest_format(),65 )))66 }67 Ok(())68 }69}7071#[derive(Parser)]72pub struct OutputOpts {73 74 #[clap(long, short = 'o')]75 pub output_file: Option<PathBuf>,76 77 #[clap(long, short = 'c')]78 pub create_output_dirs: bool,79 80 #[clap(long, short = 'm')]81 pub multi: Option<PathBuf>,82}