haematite 0.6.1

Content-addressed, branchable, actor-native storage engine
Documentation
use super::BranchKind;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) enum Disposition {
    Allow,
    ForkAcross,
    NamespaceFork,
    MergeAcross,
    NamespaceMerge,
}

#[derive(Clone, Copy, Debug)]
pub(super) struct MatrixCase {
    pub(super) cell: &'static str,
    pub(super) source_kind: BranchKind,
    pub(super) destination_kind: BranchKind,
    pub(super) source_lineage: Option<&'static str>,
    pub(super) destination_lineage: Option<&'static str>,
    pub(super) disposition: Disposition,
    pub(super) synthetic_reason: Option<&'static str>,
}

pub(super) const FORK_CASES: [MatrixCase; 12] = [
    MatrixCase {
        cell: "F-W-W-S",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::Allow,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-W-W-D",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::ForkAcross,
        synthetic_reason: Some(
            "Work children inherit the Work parent lineage, so public derivation cannot select a different lineage",
        ),
    },
    MatrixCase {
        cell: "F-W-W-L",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Work,
        source_lineage: None,
        destination_lineage: None,
        disposition: Disposition::Allow,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-W-N-S",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::NamespaceFork,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-W-N-D",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::NamespaceFork,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-W-N-L",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Namespace,
        source_lineage: None,
        destination_lineage: Some("ns-b"),
        disposition: Disposition::NamespaceFork,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-N-W-S",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::Allow,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-N-W-D",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::ForkAcross,
        synthetic_reason: Some(
            "Work children inherit the Namespace source name, so public derivation cannot select a different lineage",
        ),
    },
    MatrixCase {
        cell: "F-N-W-L",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: None,
        disposition: Disposition::ForkAcross,
        synthetic_reason: Some(
            "Work children inherit the Namespace source name, so public derivation cannot drop lineage to legacy None",
        ),
    },
    MatrixCase {
        cell: "F-N-N-S",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::NamespaceFork,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-N-N-D",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::NamespaceFork,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "F-N-N-L",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-j2-source"),
        destination_lineage: Some("ns-j2-destination"),
        disposition: Disposition::NamespaceFork,
        synthetic_reason: None,
    },
];

pub(super) const MERGE_CASES: [MatrixCase; 12] = [
    MatrixCase {
        cell: "M-W-W-S",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::Allow,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-W-W-D",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::MergeAcross,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-W-W-L",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Work,
        source_lineage: None,
        destination_lineage: None,
        disposition: Disposition::Allow,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-W-N-S",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::Allow,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-W-N-D",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::MergeAcross,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-W-N-L",
        source_kind: BranchKind::Work,
        destination_kind: BranchKind::Namespace,
        source_lineage: None,
        destination_lineage: Some("ns-b"),
        disposition: Disposition::MergeAcross,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-N-W-S",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::NamespaceMerge,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-N-W-D",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::NamespaceMerge,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-N-W-L",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Work,
        source_lineage: Some("ns-a"),
        destination_lineage: None,
        disposition: Disposition::NamespaceMerge,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-N-N-S",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-a"),
        disposition: Disposition::NamespaceMerge,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-N-N-D",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-a"),
        destination_lineage: Some("ns-b"),
        disposition: Disposition::NamespaceMerge,
        synthetic_reason: None,
    },
    MatrixCase {
        cell: "M-N-N-L",
        source_kind: BranchKind::Namespace,
        destination_kind: BranchKind::Namespace,
        source_lineage: Some("ns-j2-source"),
        destination_lineage: Some("ns-j2-destination"),
        disposition: Disposition::NamespaceMerge,
        synthetic_reason: None,
    },
];