renovate 0.2.23

A new way to handle Postgres schema migration.
Documentation
use crate::{
    utils::{create_diff, create_diff_added, create_diff_removed},
    Differ, MigrationPlanner, NodeDiff, NodeItem,
};

impl<T> Differ for T
where
    T: PartialEq + Clone + NodeItem + ToString,
    NodeDiff<T>: MigrationPlanner,
{
    type Diff = NodeDiff<T>;
    fn diff(&self, new: &Self) -> anyhow::Result<Option<Self::Diff>> {
        let old_id = self.id();
        let new_id = new.id();
        if old_id != new_id {
            anyhow::bail!("can't diff {} and {}", old_id, new_id);
        }

        let self_str = self.to_string();
        let new_str = new.to_string();
        if self_str != new_str {
            let diff = create_diff(self, new)?;
            Ok(Some(NodeDiff {
                old: Some(self.clone()),
                new: Some(new.clone()),
                diff,
            }))
        } else {
            Ok(None)
        }
    }
}

impl<T> NodeDiff<T>
where
    T: NodeItem,
{
    pub fn with_old(old: T) -> Self {
        let diff = create_diff_removed(&old).unwrap();
        Self {
            old: Some(old),
            new: None,
            diff,
        }
    }

    pub fn with_new(new: T) -> Self {
        let diff = create_diff_added(&new).unwrap();
        Self {
            old: None,
            new: Some(new),
            diff,
        }
    }
}