jellyflow-core 0.2.0

Headless graph model, IDs, type descriptors, and interaction policy primitives for Jellyflow.
Documentation
use crate::core::Graph;
use crate::ops::GraphOp;

use super::ApplyError;

pub(super) fn apply_symbol_op(graph: &mut Graph, op: &GraphOp) -> Result<(), ApplyError> {
    match op {
        GraphOp::AddSymbol { id, symbol } => {
            if graph.symbols.contains_key(id) {
                return Err(ApplyError::SymbolAlreadyExists { id: *id });
            }
            graph.symbols.insert(*id, symbol.clone());
        }
        GraphOp::RemoveSymbol { id, symbol } => {
            let Some(current) = graph.symbols.get(id) else {
                return Err(ApplyError::MissingSymbol { id: *id });
            };
            if current.name != symbol.name
                || current.ty != symbol.ty
                || current.default_value != symbol.default_value
                || current.meta != symbol.meta
            {
                return Err(ApplyError::RemoveSymbolMismatch { id: *id });
            }
            graph.symbols.remove(id);
        }
        GraphOp::SetSymbolName { id, to, .. } => {
            let Some(symbol) = graph.symbols.get_mut(id) else {
                return Err(ApplyError::MissingSymbol { id: *id });
            };
            symbol.name = to.clone();
        }
        GraphOp::SetSymbolType { id, to, .. } => {
            let Some(symbol) = graph.symbols.get_mut(id) else {
                return Err(ApplyError::MissingSymbol { id: *id });
            };
            symbol.ty = to.clone();
        }
        GraphOp::SetSymbolDefaultValue { id, to, .. } => {
            let Some(symbol) = graph.symbols.get_mut(id) else {
                return Err(ApplyError::MissingSymbol { id: *id });
            };
            symbol.default_value = to.clone();
        }
        GraphOp::SetSymbolMeta { id, to, .. } => {
            let Some(symbol) = graph.symbols.get_mut(id) else {
                return Err(ApplyError::MissingSymbol { id: *id });
            };
            symbol.meta = to.clone();
        }
        _ => unreachable!("non-symbol op routed to symbol apply"),
    }
    Ok(())
}