use crate::tags::{PrimaryTag, Tag};
use crate::Deserializer;
use thiserror::Error;

pub trait Deserialize<T: Tag>: Sized {
    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError>;
}

pub trait DeserializePrimary: PrimaryTag + Deserialize<Self::Tag> {}

impl<T: PrimaryTag + Deserialize<T::Tag>> DeserializePrimary for T {}

#[derive(Error, Debug, Copy, Clone, PartialEq, Eq)]
pub enum DeserializeError {
    #[error("invalid serialization")]
    InvalidSerialization,

    #[error("unexpected end of input")]
    UnexpectedEoi,

    #[error("unexpected value type")]
    UnexpectedValue,

    #[error("too deeply nested")]
    TooDeeplyNested,

    #[error("no more elements")]
    NoMoreElements,

    #[error("more elements remain")]
    MoreElementsRemain,

    #[error("serialization contains trailing data")]
    TrailingData,
}
