runmat_runtime/builtins/close/
mod.rs1use 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}