use std::fs::File;
use std::io::{ErrorKind, Write};
use std::path::{Path, PathBuf};
use cargo_readme::get_manifest;
use cargo_readme::project;
const DEFAULT_TEMPLATE: &str = "README.tpl";
pub fn get_project_root(given_root: Option<&str>) -> Result<PathBuf, String> {
project::get_root(given_root)
}
pub fn get_source(project_root: &Path, input: Option<&str>) -> Result<File, String> {
match input {
Some(input) => {
let input = project_root.join(input);
File::open(&input)
.map_err(|e| format!("Could not open file '{}': {}", input.to_string_lossy(), e))
}
None => find_entrypoint(project_root),
}
}
pub fn get_dest(project_root: &Path, output: Option<&str>) -> Result<Option<File>, String> {
match output {
Some(filename) => {
let output = project_root.join(filename);
File::create(&output).map(Some).map_err(|e| {
format!(
"Could not create output file '{}': {}",
output.to_string_lossy(),
e
)
})
}
None => Ok(None),
}
}
pub fn get_template_file(
project_root: &Path,
template: Option<&str>,
) -> Result<Option<File>, String> {
match template {
Some(template) => {
let template = project_root.join(template);
File::open(&template).map(Some).map_err(|e| {
format!(
"Could not open template file '{}': {}",
template.to_string_lossy(),
e
)
})
}
None => {
let template = project_root.join(DEFAULT_TEMPLATE);
match File::open(&template) {
Ok(file) => Ok(Some(file)),
Err(ref e) if e.kind() != ErrorKind::NotFound => Err(format!(
"Could not open template file '{}': {}",
DEFAULT_TEMPLATE, e
)),
_ => Ok(None),
}
}
}
}
pub fn write_output(dest: &mut Option<File>, readme: String) -> Result<(), String> {
match dest.as_mut() {
Some(dest) => {
let mut bytes = readme.into_bytes();
bytes.push(b'\n');
dest.write_all(&bytes)
.map(|_| ())
.map_err(|e| format!("Could not write to output file: {}", e))?;
}
None => println!("{}", readme),
}
Ok(())
}
pub fn find_entrypoint(current_dir: &Path) -> Result<File, String> {
let manifest = get_manifest(current_dir)?;
let entrypoint = project::find_entrypoint(current_dir, &manifest)?;
File::open(current_dir.join(entrypoint)).map_err(|e| format!("{}", e))
}