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 {
assert!(id >= 1, "id cannot be equal to 0");
self.migrations[id - 1] = take(&mut self.migrations[id - 1]).map(f);
self
}
pub fn finalize(mut self) -> crate::Migrations<'u> {
self.migrations.drain(..).flatten().collect()
}
}
impl<'u> FromIterator<M<'u>> for MigrationsBuilder<'u> {
fn from_iter<T: IntoIterator<Item = M<'u>>>(iter: T) -> Self {
Self {
migrations: iter.into_iter().map(Some).collect(),
}
}
}
impl M<'_> {
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
}
}