use carli::io::Streams;
use carli::prelude::app::*;
use carli::prelude::cmd::*;
use clap::Parser;
use std::io::Write;
#[derive(Parser)]
pub struct Application {
#[clap(short, long)]
error: bool,
}
fn example(app: &Application, streams: &Streams) -> Result<()> {
if app.error {
writeln!(streams.error(), "The command is about to fail!")?;
err!(1, "The command failed.");
} else {
writeln!(streams.output(), "Hello, world!")?;
Ok(())
}
}
fn main() {
let app = Application::parse();
let streams = standard();
if let Err(error) = example(&app, &streams) {
error.exit();
}
}
#[cfg(test)]
mod test {
use super::{example, Application};
use carli::prelude::test::*;
use std::io::{Seek, SeekFrom};
#[test]
fn example_should_fail() {
let app = Application { error: true };
let streams = memory();
let result = example(&app, &streams);
assert!(result.is_err());
let error = result.unwrap_err();
assert_eq!(error.get_message(), Some("The command failed."));
assert_eq!(error.get_status(), 1);
streams.error().seek(SeekFrom::Start(0)).unwrap();
assert_eq!(
streams.error().to_string_lossy(),
"The command is about to fail!\n"
);
}
#[test]
fn example_should_succeed() {
let app = Application { error: false };
let streams = memory();
let result = example(&app, &streams);
assert!(result.is_ok());
streams.output().seek(SeekFrom::Start(0)).unwrap();
assert_eq!(streams.output().to_string_lossy(), "Hello, world!\n");
}
}