gdritter repos rrecutils / 80a3938
Allow rr-format to output several files via template Getty Ritter 6 years ago
1 changed file(s) with 63 addition(s) and 21 deletion(s). Collapse all Expand all
5151 .value_name("FILE")
5252 .help("The desired output location (or - for stdout)"))
5353
54 .arg(clap::Arg::with_name("output-files")
55 .short("O")
56 .long("output-files")
57 .value_name("TEMPLATE")
58 .help("The desired output "))
59
5460 .arg(clap::Arg::with_name("mustache")
5561 .short("m")
5662 .long("mustache")
7379 .get_matches()
7480 }
7581
82
83 fn create_output_files(
84 filename_template: &str,
85 recfile: rrecutils::Recfile,
86 template: String,
87 ) -> Result<(), failure::Error> {
88 for r in recfile.records.into_iter().map( |rec| R { rec } ) {
89 let mut filename = std::io::Cursor::new(Vec::new());
90 r.render(filename_template, &mut filename)
91 .map_err(|e| format_err!("Rustache error: {:?}", e))?;
92 let filename = String::from_utf8(filename.into_inner())?;
93 println!("writing file `{}'", &filename);
94
95 let mut file = std::fs::File::create(&filename)?;
96 r.render(&template, &mut file)
97 .map_err(|e| format_err!("Rustache error: {:?}", e))?;
98 }
99 Ok(())
100 }
101
102
103 fn render_to_single_file(
104 mut output: Box<std::io::Write>,
105 joiner: Option<&str>,
106 recfile: rrecutils::Recfile,
107 template: String,
108 ) -> Result<(), failure::Error> {
109 let mut first = true;
110 for r in recfile.records.into_iter() {
111 if first {
112 first = false;
113 } else if let Some(j) = joiner {
114 output.write(j.as_bytes())?;
115 output.write(&['\n' as u8])?;
116 }
117 R { rec: r }.render(&template, &mut output.as_mut())
118 .map_err(|e| format_err!("Rustache error: {:?}", e))?;
119 }
120
121 Ok(())
122 }
123
124
76125 fn run() -> Result<(), failure::Error> {
77126 let matches = rr_format_args();
78127
79128 let input = common::input_from_spec(
80129 matches.value_of("input"))?;
81 let mut output = common::output_from_spec(
82 matches.value_of("output"))?;
130
131 let mut recfile = rrecutils::Recfile::parse(input)?;
132 if let Some(typ) = matches.value_of("type") {
133 recfile.filter_by_type(typ);
134 }
83135
84136 let template: String = match matches.value_of("mustache") {
85137 Some(path) => {
91143 None => bail!("No template specified!"),
92144 };
93145
94 let mut recfile = rrecutils::Recfile::parse(input)?;
95
96 if let Some(typ) = matches.value_of("type") {
97 recfile.filter_by_type(typ);
98 }
99
100
101 let joiner = matches.value_of("joiner");
102
103 let mut first = true;
104 for r in recfile.records.into_iter() {
105 if first {
106 first = false;
107 } else if let Some(j) = joiner {
108 output.write(j.as_bytes())?;
109 output.write(&['\n' as u8])?;
110 }
111 R { rec: r }.render(&template, &mut output.as_mut())
112 .map_err(|e| format_err!("Rustache error: {:?}", e))?;
146 if let Some(filename) = matches.value_of("output-files") {
147 create_output_files(filename, recfile, template)?;
148 } else {
149 render_to_single_file(
150 common::output_from_spec(matches.value_of("output"))?,
151 matches.value_of("joiner"),
152 recfile,
153 template,
154 )?;
113155 }
114156
115157 Ok(())