vibe-action 0.2.2

Command router — execute shell commands and LLM prompts via simple YAML actions.
//! FlowApiModel validation.
//! Validates the input and output settings for IDE plugin integration.

use anyhow::Result;

use crate::models::api::FlowApiModel;
use crate::validate::ValidateTrait;

impl ValidateTrait for FlowApiModel {
    /// Validate API model.
    fn validate(&self) -> Result<()> {
        let valid_inputs = [
            "query",
            "query|file_path",
            "query|project_path",
            "query|line",
            "query|prompt",
            "query|image",
        ];

        if let Some(input) = &self.input {
            if !valid_inputs.contains(&input.as_str()) {
                anyhow::bail!(
                    "Invalid api input: '{}'. Expected one of: {}",
                    input.as_str(),
                    valid_inputs.join(", ")
                );
            }
        }

        for (name, query_type) in &self.args {
            if !valid_inputs.contains(&query_type.as_str()) {
                anyhow::bail!(
                    "Invalid api args value for '{}': '{}'. Expected one of: {}",
                    name,
                    query_type,
                    valid_inputs.join(", ")
                );
            }
        }

        // ApiTarget is an enum, so Serde already validates it,
        // but we can leave it here for future complex checks.
        match &self.output {
            crate::models::api::ApiTarget::Replace
            | crate::models::api::ApiTarget::Clipboard
            | crate::models::api::ApiTarget::Dialog => {}
        }

        Ok(())
    }
}