diff --git a/src/bertterm.rs b/src/bertterm.rs index 40ee8ba..345ee31 100644 --- a/src/bertterm.rs +++ b/src/bertterm.rs @@ -1,7 +1,6 @@ extern crate itoa; use std::fmt::{self, Write as FmtWrite}; -use std::io::{self, Write as IoWrite}; use std::iter; use num_bigint::{BigInt, Sign}; @@ -63,40 +62,6 @@ fn is_proplist_tuple(elems: &[BertTerm]) -> bool { } } - -/// Outputs a vector of BertTerms to stdout. -pub fn pp_bert(terms: Vec, indent_width: usize, terms_per_line: usize) { - let stdout = io::stdout(); - let mut stdout = stdout.lock(); - for t in terms { - let pp = PrettyPrinter::new(&t, indent_width, terms_per_line); - let _ = writeln!(stdout, "{}", pp); - } -} - -/// Outputs a BertTerm as JSON to stdout. -pub fn pp_json(terms: Vec, _: usize, _: usize) { - let stdout = io::stdout(); - let mut stdout = stdout.lock(); - for t in terms { - let pp = JsonPrettyPrinter { term: &t, transform_proplists: false }; - let _ = writeln!(stdout, "{}", pp); - } -} - - -/// Outputs a BertTerm as JSON to stdout; -/// Erlang proplists are converted to JSON objects. -pub fn pp_json_proplist(terms: Vec, _: usize, _: usize) { - let stdout = io::stdout(); - let mut stdout = stdout.lock(); - for t in terms { - let pp = JsonPrettyPrinter { term: &t, transform_proplists: true }; - let _ = writeln!(stdout, "{}", pp); - } -} - - pub struct PrettyPrinter<'a> { term: &'a BertTerm, indent_width: usize, @@ -109,7 +74,6 @@ impl <'a> fmt::Display for PrettyPrinter<'a> { } } - impl <'a> PrettyPrinter<'a> { /// Creates a pretty printer for `term` where sub-terms /// are indented with a width of `indent_width` and a @@ -243,6 +207,11 @@ pub struct JsonPrettyPrinter<'a> { transform_proplists: bool } +impl <'a> JsonPrettyPrinter<'a> { + pub fn new(term: &'a BertTerm, transform_proplists: bool) -> Self { + JsonPrettyPrinter { term, transform_proplists } + } +} impl <'a> fmt::Display for JsonPrettyPrinter<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { diff --git a/src/main.rs b/src/main.rs index 08c500e..79dbf07 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ extern crate ppbert; #[macro_use] extern crate clap; -use std::io::{self, Read}; +use std::io::{self, Read, Write}; use std::fs; use std::process::exit; use std::time::Instant; @@ -87,16 +87,16 @@ fn main() { let output_fn = if matches.is_present("json") { if transform_proplists { - bertterm::pp_json_proplist + pp_json_proplist } else { - bertterm::pp_json + pp_json } } else { if transform_proplists { eprintln!("{}: warning: --transform-proplists is only valid with the --json flag", PROG_NAME); } - bertterm::pp_bert + pp_bert }; let mut return_code = 0; @@ -187,3 +187,34 @@ fn parse_disk_log(buf: Vec) -> Result> { let mut parser = parser::Parser::new(buf); return parser.parse_disk_log(); } + +/// Outputs a vector of BertTerms to stdout. +fn pp_bert(terms: Vec, indent_width: usize, terms_per_line: usize) { + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + for t in terms { + let pp = bertterm::PrettyPrinter::new(&t, indent_width, terms_per_line); + let _ = writeln!(stdout, "{}", pp); + } +} + +/// Outputs a BertTerm as JSON to stdout. +fn pp_json(terms: Vec, _: usize, _: usize) { + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + for t in terms { + let pp = bertterm::JsonPrettyPrinter::new(&t, false); + let _ = writeln!(stdout, "{}", pp); + } +} + +/// Outputs a BertTerm as JSON to stdout; +/// Erlang proplists are converted to JSON objects. +fn pp_json_proplist(terms: Vec, _: usize, _: usize) { + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + for t in terms { + let pp = bertterm::JsonPrettyPrinter::new(&t, true); + let _ = writeln!(stdout, "{}", pp); + } +}