diff --git a/implementations/rust/preserves-tools/src/bin/preserves-tool.rs b/implementations/rust/preserves-tools/src/bin/preserves-tool.rs index b11c32f..f70ae83 100644 --- a/implementations/rust/preserves-tools/src/bin/preserves-tool.rs +++ b/implementations/rust/preserves-tools/src/bin/preserves-tool.rs @@ -21,6 +21,8 @@ use preserves::value::Value; use preserves::value::ViaCodec; use preserves::value::Writer; +use preserves::value::text::writer::CommaStyle; + use std::iter::FromIterator; use std::io; use std::io::Read; @@ -46,6 +48,13 @@ enum OutputFormat { Unquoted, } +#[derive(ArgEnum, Clone, Debug)] +enum CommasFormat { + None, + Separating, + Terminating, +} + #[derive(ArgEnum, Clone, Debug)] enum CompletionDialect { Bash, @@ -69,6 +78,16 @@ impl From for bool { } } +impl From for CommaStyle { + fn from(commas: CommasFormat) -> Self { + match commas { + CommasFormat::None => CommaStyle::None, + CommasFormat::Separating => CommaStyle::Separating, + CommasFormat::Terminating => CommaStyle::Terminating, + } + } +} + #[derive(ArgEnum, Clone, Debug)] enum SelectOutput { Sequence, @@ -92,6 +111,9 @@ struct Convert { #[clap(long)] escape_spaces: bool, + #[clap(long, short, arg_enum, default_value = "none")] + commas: CommasFormat, + #[clap(long)] limit: Option, @@ -381,7 +403,9 @@ fn convert(c: Convert) -> io::Result<()> { let write_ann: bool = c.write_annotations.into(); let mut w: Box io::Result<()>> = match c.output_format { OutputFormat::Text => { - let mut t = TextWriter::new(io::stdout()).set_escape_spaces(c.escape_spaces); + let mut t = TextWriter::new(io::stdout()) + .set_escape_spaces(c.escape_spaces) + .set_comma_style(c.commas.into()); if c.indent.into() { t.indentation = 2; } diff --git a/implementations/rust/preserves/src/value/text/writer.rs b/implementations/rust/preserves/src/value/text/writer.rs index 71acfc8..4643dca 100644 --- a/implementations/rust/preserves/src/value/text/writer.rs +++ b/implementations/rust/preserves/src/value/text/writer.rs @@ -12,7 +12,7 @@ use std::io; use super::super::boundary as B; -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Debug)] pub enum CommaStyle { None, Separating, @@ -59,6 +59,11 @@ impl TextWriter { } } + pub fn set_comma_style(mut self, v: CommaStyle) -> Self { + self.comma_style = v; + self + } + pub fn set_escape_spaces(mut self, v: bool) -> Self { self.escape_spaces = v; self