use std::fmt::Formatter;
use syn::Ident;
use crate::impl_from::FromImplementationError::*;
use crate::parameters::IMPL_FROM;
pub mod structs;
pub mod enums;
#[derive(Debug)]
pub enum FromImplementationError {
StructNotExactlyOneField(Ident),
EnumNotExactlyOneField(Ident, Vec<Ident>),
ParameterOnEnumAndVariant(Ident),
}
impl std::error::Error for FromImplementationError {}
impl std::fmt::Display for FromImplementationError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
StructNotExactlyOneField(ident) => write!(f, "'std::convert::From' cannot be implemented for struct '{}', as it has not exactly one field.", ident),
EnumNotExactlyOneField(enum_ident, idents) => {
let idents_string: String = idents.iter()
.enumerate()
.map(|(i, ident)| if i < idents.len() - 1 { format!("{},", ident) } else { format!("{}", ident) })
.collect();
write!(f, "'std::convert::From' cannot be implemented for enum '{}'. The following variants don't have exactly one field: {}", enum_ident, idents_string)
}
ParameterOnEnumAndVariant(ident) => write!(f, "The '{}' parameter was set on enum '{}' and at least one of its variants. Choose only one (enum or variants).", IMPL_FROM, ident)
}
}
}