use std::fmt;
use std::io::{self, Write};
use crate::error::AgentMemoryError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputMode {
Standard,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MessageLevel {
Info,
Success,
Warning,
Error,
}
pub fn print_info(message: impl AsRef<str>) {
let _ = write_message(
io::stdout(),
MessageLevel::Info,
message.as_ref(),
OutputMode::Standard,
);
}
pub fn print_success(message: impl AsRef<str>) {
let _ = write_message(
io::stdout(),
MessageLevel::Success,
message.as_ref(),
OutputMode::Standard,
);
}
pub fn print_warning(message: impl AsRef<str>) {
let _ = write_message(
io::stderr(),
MessageLevel::Warning,
message.as_ref(),
OutputMode::Standard,
);
}
pub fn print_error(error: &AgentMemoryError) {
let _ = write_message(
io::stderr(),
MessageLevel::Error,
&format_error(error),
OutputMode::Standard,
);
}
pub fn print_line(message: impl AsRef<str>) {
let _ = writeln!(io::stdout(), "{}", message.as_ref());
}
pub fn print_field(label: impl AsRef<str>, value: impl AsRef<str>) {
let _ = writeln!(io::stdout(), "{:<18} {}", label.as_ref(), value.as_ref());
}
pub fn print_heading(title: impl AsRef<str>) {
let title = title.as_ref();
let _ = writeln!(io::stdout(), "{title}");
let _ = writeln!(io::stdout(), "{}", "-".repeat(title.len()));
}
pub fn print_blank_line() {
let _ = writeln!(io::stdout());
}
fn write_message<W>(
mut writer: W,
level: MessageLevel,
message: &str,
mode: OutputMode,
) -> io::Result<()>
where
W: Write,
{
match mode {
OutputMode::Standard => {
writeln!(writer, "{} {}", prefix(level), message)
}
}
}
#[must_use]
const fn prefix(level: MessageLevel) -> &'static str {
match level {
MessageLevel::Info => "[info]",
MessageLevel::Success => "[ok]",
MessageLevel::Warning => "[warn]",
MessageLevel::Error => "[error]",
}
}
#[must_use]
pub fn format_error(error: &AgentMemoryError) -> String {
error.to_string()
}
pub fn print_list<I, T>(items: I)
where
I: IntoIterator<Item = T>,
T: fmt::Display,
{
for item in items {
let _ = writeln!(io::stdout(), "{item}");
}
}