use std::convert::Infallible;

use ufotofu::sync::{consumer::IntoVec, producer::FromSlice};
use willow_encoding::{
    sync::{Decodable, Encodable, RelativeDecodable, RelativeEncodable},
    DecodeError,
};

pub fn from_bytes<T: Decodable>(data: &[u8]) -> Result<T, DecodeError<Infallible>> {
    let mut producer = FromSlice::new(data);
    let decoded = T::decode(&mut producer)?;
    Ok(decoded)
}

pub fn to_vec<T: Encodable>(item: &T) -> Vec<u8> {
    let mut consumer = IntoVec::new();
    item.encode(&mut consumer).expect("infallible");
    consumer.into_vec()
}

pub fn from_bytes_relative<T: RelativeDecodable<U>, U>(
    previous: &U,
    data: &[u8],
) -> Result<T, DecodeError<Infallible>> {
    let mut producer = FromSlice::new(data);
    let decoded = T::relative_decode(previous, &mut producer)?;
    Ok(decoded)
}

pub fn to_vec_relative<T: RelativeEncodable<U>, U>(previous: &U, item: &T) -> Vec<u8> {
    let mut consumer = IntoVec::new();
    item.relative_encode(previous, &mut consumer)
        .expect("infallible");
    consumer.into_vec()
}

Neighbours