pub mod license;
pub mod wxs;
use crate::Error;
use crate::Result;
use log::trace;
use regex::Regex;
use std::fs::File;
use std::io::{self, Write};
use std::path::PathBuf;
use cargo_metadata::Package;
fn destination(output: Option<&PathBuf>) -> Result<Box<dyn Write>> {
if let Some(ref output) = output {
trace!("An output path has been explicity specified");
let f = File::create(output)?;
Ok(Box::new(f))
} else {
trace!(
"An output path has NOT been explicity specified. Implicitly \
determine output."
);
Ok(Box::new(io::stdout()))
}
}
fn first_author(package: &Package) -> Result<String> {
package
.authors
.first()
.map(|s| {
let re = Regex::new(r"<(.*?)>").unwrap();
re.replace_all(s, "")
})
.map(|s| String::from(s.trim()))
.ok_or(Error::Manifest("authors"))
}
#[cfg(test)]
mod tests {
use super::*;
const SINGLE_AUTHOR_MANIFEST: &str = r#"{
"name": "Example",
"version": "0.1.0",
"authors": ["First Last <first.last@example.com>"],
"id": "",
"dependencies": [],
"targets": [],
"features": {},
"manifest_path": ""
}"#;
const MULTIPLE_AUTHORS_MANIFEST: &str = r#"{
"name": "Example",
"version": "0.1.0",
"authors": ["1 Author <first.last@example.com>", "2 Author <2.author@example.com>", "3 author <3.author@example.com>"],
"id": "",
"dependencies": [],
"targets": [],
"features": {},
"manifest_path": ""
}"#;
#[test]
fn first_author_with_single_author_works() {
let manifest = serde_json::from_str(SINGLE_AUTHOR_MANIFEST).expect("Parsing TOML");
let actual = first_author(&manifest).unwrap();
assert_eq!(actual, String::from("First Last"));
}
#[test]
fn first_author_with_multiple_authors_works() {
let manifest = serde_json::from_str(MULTIPLE_AUTHORS_MANIFEST).expect("Parsing TOML");
let actual = first_author(&manifest).unwrap();
assert_eq!(actual, String::from("1 Author"));
}
}