beuvy 0.1.0

Facade crate for beuvy-runtime plus optional declarative UI authoring.
Documentation
use super::resolve::resolve_runtime_path;
use crate::ast::DeclarativeRefSource;
use crate::runtime::refs::resolve_ref;
use crate::runtime::state::{
    DeclarativeLocalState, DeclarativeRefBinding, DeclarativeRefRects, DeclarativeResolvedRef,
    DeclarativeRootComputedLocals, DeclarativeRootViewModel, DeclarativeUiRuntimeValues,
};
use bevy::prelude::*;

pub(crate) fn materialize_declarative_refs(
    mut commands: Commands,
    query: Query<(Entity, &DeclarativeRefBinding), Added<DeclarativeRefBinding>>,
    parents: Query<&ChildOf>,
    local_states: Query<&DeclarativeLocalState>,
    computed: Query<&DeclarativeRootComputedLocals>,
    roots: Query<&DeclarativeRootViewModel>,
    values: Res<DeclarativeUiRuntimeValues>,
    ref_rects: Res<DeclarativeRefRects>,
) {
    for (entity, ref_binding) in &query {
        let ref_id = match &ref_binding.0 {
            DeclarativeRefSource::Static(ref_id) => Some(ref_id.clone()),
            DeclarativeRefSource::Binding(path) => resolve_runtime_path(
                entity,
                path,
                &parents,
                &local_states,
                &computed,
                &roots,
                &values,
                &ref_rects,
            )
            .and_then(|value| value.text().map(str::to_string)),
        };
        let Some(ref_id) = ref_id else {
            continue;
        };
        commands
            .entity(entity)
            .insert(DeclarativeResolvedRef(ref_id.clone()));
        resolve_ref(&mut commands, entity, &ref_id);
    }
}