maya-mel 0.1.2

Single-entry Autodesk Maya MEL parsing and analysis library.
Documentation
use crate::model::{MayaCommandValidationDiagnostic, MayaTopLevelCommand};
use crate::normalize::{normalized_flags, normalized_positionals};
use mel_syntax::SourceView;

pub(crate) fn validate_maya_command(
    source: SourceView<'_>,
    command: &MayaTopLevelCommand,
) -> Vec<MayaCommandValidationDiagnostic> {
    match command.head.as_str() {
        "setAttr" => validate_set_attr_command(source, command),
        _ => Vec::new(),
    }
}

fn validate_set_attr_command(
    source: SourceView<'_>,
    command: &MayaTopLevelCommand,
) -> Vec<MayaCommandValidationDiagnostic> {
    let Some(normalized) = &command.normalized else {
        return Vec::new();
    };
    let positionals = normalized_positionals(normalized);
    if positionals.is_empty() {
        return Vec::new();
    }

    let values = &positionals[1..];
    if !values.is_empty() {
        return Vec::new();
    }

    let has_type_flag = normalized_flags(normalized)
        .iter()
        .any(|flag| flag.canonical_name.as_deref() == Some("type"));
    let message = if has_type_flag {
        "setAttr requires at least one value after the attribute path when -type is present"
            .to_owned()
    } else {
        "setAttr requires at least one value after the attribute path".to_owned()
    };

    vec![MayaCommandValidationDiagnostic {
        command_span: command.span,
        head: Some(source.slice(normalized.head_range).to_owned()),
        message,
    }]
}