pub mod chunk;
pub mod image_template;
pub mod pickle;
use crate::{Error, Result};
use image_template::ImageTemplate;
use rand::{Rng, seq::IndexedRandom};
#[derive(Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Template {
pub(crate) _version: u32,
pub(crate) image_templates: Vec<ImageTemplate>,
}
impl Template {
pub fn from_input<I: AsRef<[u8]>>(input: I) -> Result<Self> {
Self::from_inputs([input])
}
pub fn from_inputs<A, I>(inputs: I) -> Result<Self>
where
A: AsRef<[u8]>,
I: IntoIterator<Item = A>,
{
let mut this = Self::default();
this.learn_many(inputs).and(Ok(this))
}
pub fn learn<A: AsRef<[u8]>>(&mut self, input: A) -> Result<()> {
self.image_templates.push(input.as_ref().try_into()?);
Ok(())
}
pub fn learn_many<A, I>(&mut self, inputs: I) -> Result<()>
where
A: AsRef<[u8]>,
I: IntoIterator<Item = A>,
{
inputs.into_iter().try_for_each(|item| self.learn(item))
}
pub(crate) fn choose<T: Rng>(&self, rng: &mut T) -> Result<&ImageTemplate> {
self.image_templates.choose(rng).ok_or(Error::EmptyTemplate)
}
}
impl TryFrom<&[u8]> for Template {
type Error = Error;
fn try_from(input: &[u8]) -> Result<Self> {
Self::from_input(input)
}
}
impl TryFrom<Vec<u8>> for Template {
type Error = Error;
fn try_from(input: Vec<u8>) -> Result<Self> {
Self::from_input(input)
}
}
impl TryFrom<&Vec<u8>> for Template {
type Error = Error;
fn try_from(input: &Vec<u8>) -> Result<Self> {
Self::from_input(input)
}
}