runmat-runtime 0.4.1

Core runtime for RunMat with builtins, BLAS/LAPACK integration, and execution APIs
Documentation
use runmat_builtins::Value;

use crate::builtins::plotting::state::FigureHandle;
use crate::BuiltinResult;

use super::handles::{handle_from_string, handles_from_value, parse_string};

#[derive(Debug)]
pub enum FigureAction {
    Current,
    Handles(Vec<FigureHandle>),
    All,
}

pub fn parse_clf_action(args: &[Value]) -> BuiltinResult<(FigureAction, bool)> {
    if args.is_empty() {
        return Ok((FigureAction::Current, false));
    }
    let mut handles = Vec::new();
    let mut clear_all = false;
    let mut reset = false;
    for value in args {
        if let Some(text) = parse_string(value) {
            let normalized = text.trim().to_ascii_lowercase();
            if normalized.is_empty() {
                continue;
            }
            match normalized.as_str() {
                "all" => {
                    clear_all = true;
                    continue;
                }
                "reset" => {
                    reset = true;
                    continue;
                }
                _ => {
                    handles.push(handle_from_string(&normalized, "clf")?);
                    continue;
                }
            }
        }
        handles.extend(handles_from_value(value, "clf")?);
    }
    if clear_all {
        Ok((FigureAction::All, reset))
    } else if handles.is_empty() {
        Ok((FigureAction::Current, reset))
    } else {
        Ok((FigureAction::Handles(handles), reset))
    }
}

pub fn parse_close_action(args: &[Value]) -> BuiltinResult<FigureAction> {
    if args.is_empty() {
        return Ok(FigureAction::Current);
    }
    let mut handles = Vec::new();
    let mut close_all = false;
    for value in args {
        if let Some(text) = parse_string(value) {
            let normalized = text.trim().to_ascii_lowercase();
            if normalized.is_empty() {
                continue;
            }
            if matches!(normalized.as_str(), "all" | "force" | "force all") {
                close_all = true;
                continue;
            }
            if normalized == "current" {
                continue;
            }
            handles.push(handle_from_string(&normalized, "close")?);
            continue;
        }
        handles.extend(handles_from_value(value, "close")?);
    }
    if close_all {
        Ok(FigureAction::All)
    } else if handles.is_empty() {
        Ok(FigureAction::Current)
    } else {
        Ok(FigureAction::Handles(handles))
    }
}