use std::fmt::{Display, Formatter};
use std::io::{IsTerminal, Write};
use std::{fmt, io};
use termcolor::{BufferWriter, Color, ColorChoice, ColorSpec, WriteColor};
pub enum Error {
QrCodeErr(String),
BadPath(),
InvalidOutputExt,
SvgOutputErr(String),
RasterOutputErr(String),
NoStringPiped(),
NoStringGiven(),
}
pub enum ErrorKind {
Error(Error),
}
impl ErrorKind {
pub fn colorize(&self) -> io::Result<()> {
let color_choice = match io::stderr().is_terminal() {
true => ColorChoice::Auto,
false => ColorChoice::Never,
};
let (prefix, color) = match self {
Self::Error(_) => ("error", Some(Color::Red)),
};
let writer = BufferWriter::stderr(color_choice);
let mut buffer = writer.buffer();
buffer.set_color(ColorSpec::new().set_fg(color).set_bold(true))?;
write!(&mut buffer, "{}: ", prefix)?;
buffer.reset()?;
writeln!(&mut buffer, "{}", self)?;
writer.print(&buffer)
}
}
impl Display for ErrorKind {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::Error(error) => match error {
Error::QrCodeErr(msg) => write!(f, "unable to generate QR code: {msg}"),
Error::BadPath() => write!(f, "no logo found at given path"),
Error::InvalidOutputExt => write!(f, "invalid output file extension"),
Error::SvgOutputErr(msg) => write!(f, "unable to write SVG output file: {msg}"),
Error::RasterOutputErr(msg) => write!(f, "unable to write raster image file: {msg}"),
Error::NoStringPiped() => write!(f, "no string piped into command"),
Error::NoStringGiven() => write!(f, "no string given on commandline"),
},
}
}
}