use std::{iter::FromIterator, mem::take};
use include_dir::Dir;
use crate::{loader::from_directory, MigrationHook, Result, M};
#[derive(Default, Debug)]
pub struct MigrationsBuilder<'u> {
migrations: Vec<Option<M<'u>>>,
}
impl<'u> MigrationsBuilder<'u> {
#[cfg_attr(test, mutants::skip)] pub fn from_directory(dir: &'static Dir<'static>) -> Result<Self> {
Ok(Self {
migrations: from_directory(dir)?,
})
}
#[must_use]
pub fn edit(mut self, id: usize, f: impl Fn(M) -> M) -> Self {
if id < 1 {
panic!("id cannot be equal to 0");
}
self.migrations[id - 1] = take(&mut self.migrations[id - 1]).map(f);
self
}
pub fn finalize<T: FromIterator<M<'u>>>(mut self) -> T {
T::from_iter(self.migrations.drain(..).flatten())
}
}
impl<'u> FromIterator<M<'u>> for MigrationsBuilder<'u> {
fn from_iter<T: IntoIterator<Item = M<'u>>>(iter: T) -> Self {
Self {
migrations: Vec::from_iter(iter.into_iter().map(Some)),
}
}
}
impl<'u> M<'u> {
pub fn set_up_hook(mut self, hook: impl MigrationHook + 'static) -> Self {
self.up_hook = Some(hook.clone_box());
self
}
pub fn set_down_hook(mut self, hook: impl MigrationHook + 'static) -> Self {
self.down_hook = Some(hook.clone_box());
self
}
}