cranpose-core 0.0.60

Core runtime for a Jetpack Compose inspired UI framework in Rust
Documentation
use super::super::{GroupRecord, NodeLifecycle, NodeRecord};
use super::{
    groups::{SlotTreeChecks, SlotTreeView},
    SlotInvariantError,
};
use crate::{collections::map::HashSet, NodeId};

pub(super) fn validate_group_nodes(
    view: &SlotTreeView<'_>,
    checks: &mut impl SlotTreeChecks,
    node_ids: &mut HashSet<NodeId>,
    group_index: usize,
    group: &GroupRecord,
    expected_node_start: usize,
) -> Result<usize, SlotInvariantError> {
    let node_start = group.node_start as usize;
    if node_start != expected_node_start {
        return Err(view.node_start_mismatch(group_index, expected_node_start, node_start));
    }

    let node_len = group.node_len as usize;
    let node_end = node_start.saturating_add(node_len);
    if node_end > view.nodes.len() {
        return Err(view.node_out_of_range(group_index, node_start, node_len, view.nodes.len()));
    }

    for node in &view.nodes[node_start..node_end] {
        if !node_ids.insert(node.id) {
            return Err(view.duplicate_node_id(node.id));
        }
        if node.owner != group.anchor {
            return Err(view.node_owner_mismatch(node.id, group.anchor, node.owner));
        }
        checks.validate_node(group_index, group, node)?;
    }

    Ok(node_end)
}

pub(super) fn validate_active_node_lifecycle(node: &NodeRecord) -> Result<(), SlotInvariantError> {
    if node.lifecycle == NodeLifecycle::Active {
        return Ok(());
    }

    Err(SlotInvariantError::NodeLifecycleMismatch {
        node_id: node.id,
        expected: NodeLifecycle::Active,
        actual: node.lifecycle,
    })
}