use anyhow::{Context, Result};
use std::path::Path;
pub fn run(file: &Path, component: Option<&str>) -> Result<()> {
let content = std::fs::read_to_string(file)
.with_context(|| format!("failed to read {}", file.display()))?;
match component {
None => {
print!("{}", content);
}
Some(name) => {
let components = crate::component::parse(&content)
.with_context(|| format!("failed to parse components in {}", file.display()))?;
let comp = components
.iter()
.find(|c| c.name == name)
.with_context(|| format!("component '{}' not found in {}", name, file.display()))?;
print!("{}", comp.content(&content));
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Write;
use tempfile::NamedTempFile;
fn write_temp(content: &str) -> NamedTempFile {
let mut f = NamedTempFile::new().unwrap();
f.write_all(content.as_bytes()).unwrap();
f
}
#[test]
fn read_full_file() {
let content = "hello\nworld\n";
let f = write_temp(content);
run(f.path(), None).unwrap();
}
#[test]
fn read_named_component() {
let content = "<!-- agent:exchange -->\nbody text\n<!-- /agent:exchange -->\n";
let f = write_temp(content);
run(f.path(), Some("exchange")).unwrap();
}
#[test]
fn read_missing_component_errors() {
let content = "<!-- agent:exchange -->\nbody\n<!-- /agent:exchange -->\n";
let f = write_temp(content);
let err = run(f.path(), Some("notexist")).unwrap_err();
assert!(err.to_string().contains("notexist"));
}
#[test]
fn read_missing_file_errors() {
let err = run(Path::new("/tmp/does-not-exist-read-test.md"), None).unwrap_err();
assert!(err.to_string().contains("failed to read"));
}
}