ryo-executor 0.1.0

[experimental] Mutation execution engine for RYO - parallel execution, conflict detection, workspace management
Documentation
//! AddItemConverter: Converts AddItem MutationSpec to appropriate Mutations
//!
//! Uses V2 API (convert_v2) which returns ASTRegApply mutations.
//! The actual item parsing is handled by AddItemMutation in ryo-mutations.

use crate::engine::ASTRegApply;
use crate::executor::registry::converter::{ConvertError, MutationConverter};
use crate::executor::registry::converters::ResolveTargetSymbol;
use crate::executor::spec::MutationSpec;
use ryo_analysis::AnalysisContext;
use ryo_mutations::AddItemMutation;

/// Converter for AddItem MutationSpec
pub struct AddItemConverter;

impl AddItemConverter {
    pub fn new() -> Self {
        Self
    }
}

impl Default for AddItemConverter {
    fn default() -> Self {
        Self::new()
    }
}

// AddItemConverter uses the default implementation of ResolveTargetSymbol
impl ResolveTargetSymbol for AddItemConverter {}

impl MutationConverter for AddItemConverter {
    fn spec_kinds(&self) -> &'static [&'static str] {
        &["AddItem"]
    }

    fn convert_v2(
        &self,
        spec: &MutationSpec,
        ctx: &AnalysisContext,
    ) -> Result<Vec<Box<dyn ASTRegApply>>, ConvertError> {
        match spec {
            MutationSpec::AddItem {
                target, content, ..
            } => {
                // Resolve MutationTargetSymbol to SymbolId (parent module)
                let symbol_id = self.resolve_target_symbol(target, ctx)?;

                let mutation = AddItemMutation::new(symbol_id, content.clone());
                Ok(vec![Box::new(mutation)])
            }
            _ => Err(ConvertError::TypeMismatch {
                expected: "AddItem",
                actual: spec.kind_name().to_string(),
            }),
        }
    }
}