Skip to main content

runmat_runtime/builtins/close/
mod.rs

1//! Canonical `close` builtin dispatcher.
2//!
3//! This module owns the single runtime registration for `close` and routes
4//! requests to plotting or networking close handlers.
5
6use runmat_builtins::{
7    BuiltinCompletionPolicy, BuiltinDescriptor, BuiltinErrorDescriptor, BuiltinOutputMode,
8    BuiltinParamArity, BuiltinParamDescriptor, BuiltinParamType, BuiltinSignatureDescriptor, Value,
9};
10use runmat_macros::runtime_builtin;
11
12const CLOSE_OUTPUT_RESULT: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
13    name: "result",
14    ty: BuiltinParamType::NumericScalar,
15    arity: BuiltinParamArity::Required,
16    default: None,
17    description: "Closed handle for single-target calls or count/status for multi/all closures.",
18}];
19
20const CLOSE_INPUTS_NONE: [BuiltinParamDescriptor; 0] = [];
21const CLOSE_INPUTS_TARGET: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
22    name: "target",
23    ty: BuiltinParamType::Any,
24    arity: BuiltinParamArity::Required,
25    default: None,
26    description: "Figure target, tcp resource handle, option token, or target container.",
27}];
28const CLOSE_INPUTS_TARGETS: [BuiltinParamDescriptor; 1] = [BuiltinParamDescriptor {
29    name: "targets",
30    ty: BuiltinParamType::Any,
31    arity: BuiltinParamArity::Variadic,
32    default: None,
33    description: "One or more close targets.",
34}];
35
36const CLOSE_SIGNATURES: [BuiltinSignatureDescriptor; 3] = [
37    BuiltinSignatureDescriptor {
38        label: "result = close()",
39        inputs: &CLOSE_INPUTS_NONE,
40        outputs: &CLOSE_OUTPUT_RESULT,
41    },
42    BuiltinSignatureDescriptor {
43        label: "result = close(target)",
44        inputs: &CLOSE_INPUTS_TARGET,
45        outputs: &CLOSE_OUTPUT_RESULT,
46    },
47    BuiltinSignatureDescriptor {
48        label: "result = close(targets...)",
49        inputs: &CLOSE_INPUTS_TARGETS,
50        outputs: &CLOSE_OUTPUT_RESULT,
51    },
52];
53
54const CLOSE_ERROR_INVALID_ARGUMENT: BuiltinErrorDescriptor = BuiltinErrorDescriptor {
55    code: "RM.CLOSE.INVALID_ARGUMENT",
56    identifier: Some("RunMat:close:InvalidArgument"),
57    when: "Close target values are invalid or unsupported.",
58    message: "close: invalid argument",
59};
60const CLOSE_ERRORS: [BuiltinErrorDescriptor; 1] = [CLOSE_ERROR_INVALID_ARGUMENT];
61
62pub const CLOSE_DESCRIPTOR: BuiltinDescriptor = BuiltinDescriptor {
63    signatures: &CLOSE_SIGNATURES,
64    output_mode: BuiltinOutputMode::Fixed,
65    completion_policy: BuiltinCompletionPolicy::Public,
66    errors: &CLOSE_ERRORS,
67};
68
69#[runtime_builtin(
70    name = "close",
71    category = "general",
72    summary = "Close figures or networking resources.",
73    keywords = "close,figure,tcpclient,tcpserver,networking",
74    sink = true,
75    suppress_auto_output = true,
76    type_resolver(crate::builtins::io::type_resolvers::close_type),
77    descriptor(crate::builtins::close::CLOSE_DESCRIPTOR),
78    builtin_path = "crate::builtins::close"
79)]
80pub async fn close_builtin(args: Vec<Value>) -> crate::BuiltinResult<f64> {
81    if let Some(status) = crate::builtins::io::net::close::close_if_network_targets(&args).await? {
82        return Ok(status);
83    }
84
85    close_plotting_targets(&args)
86}
87
88#[cfg(feature = "plot-core")]
89fn close_plotting_targets(args: &[Value]) -> crate::BuiltinResult<f64> {
90    crate::builtins::plotting::close::close_plot_targets(args)
91}
92
93#[cfg(not(feature = "plot-core"))]
94fn close_plotting_targets(_args: &[Value]) -> crate::BuiltinResult<f64> {
95    let mut builder =
96        crate::build_runtime_error(CLOSE_ERROR_INVALID_ARGUMENT.message).with_builtin("close");
97    if let Some(identifier) = CLOSE_ERROR_INVALID_ARGUMENT.identifier {
98        builder = builder.with_identifier(identifier);
99    }
100    Err(builder.build())
101}