Skip to main content

runmat_core/
lib.rs

1#![allow(clippy::result_large_err)]
2
3#[cfg(all(test, target_arch = "wasm32"))]
4wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
5
6pub mod abi;
7mod diagnostic_path;
8mod error;
9mod execution;
10mod fusion;
11mod profiling;
12mod session;
13mod source_pool;
14mod telemetry;
15mod value_metadata;
16mod workspace;
17
18pub use error::{runtime_error_telemetry_failure_info, RunError};
19pub use execution::*;
20pub use fusion::*;
21pub use runmat_parser::CompatMode;
22pub use session::RunMatSession;
23pub use telemetry::{
24    TelemetryFailureInfo, TelemetryHost, TelemetryPlatformInfo, TelemetryRunConfig,
25    TelemetryRunFinish, TelemetryRunGuard, TelemetrySink,
26};
27pub use value_metadata::{
28    approximate_size_bytes, matlab_class_name, numeric_dtype_label, preview_numeric_values,
29    sparse_tensor_memory_bytes, value_shape,
30};
31pub use workspace::*;
32
33#[cfg(test)]
34mod tests;
35
36/// Test-only helper that executes a text source via `ExecutionRequest`.
37#[cfg(not(target_arch = "wasm32"))]
38pub fn execute_text_request_for_testing(
39    session: &mut RunMatSession,
40    source_text: &str,
41) -> Result<SessionExecutionResult, RunError> {
42    let request = abi::ExecutionRequest::for_source(
43        abi::SourceInput::Text {
44            name: "<test>".to_string(),
45            text: source_text.to_string(),
46        },
47        session.compat_mode(),
48        abi::HostExecutionPolicy::default(),
49        session.workspace_handle(),
50    );
51    let response = futures::executor::block_on(session.execute_request(request));
52    let outcome = response.result?;
53    let workspace = session.workspace_snapshot();
54    let warnings = outcome
55        .diagnostics
56        .iter()
57        .filter(|diag| diag.severity == abi::DiagnosticSeverity::Warning)
58        .map(|diag| runmat_runtime::warning_store::RuntimeWarning {
59            identifier: diag.code.clone(),
60            message: diag.message.clone(),
61        })
62        .collect();
63    let error = outcome
64        .diagnostics
65        .iter()
66        .find(|diag| diag.severity == abi::DiagnosticSeverity::Error)
67        .map(|diag| {
68            runmat_runtime::build_runtime_error(diag.message.clone())
69                .with_identifier(diag.code.clone())
70                .with_call_stack(diag.callstack.clone())
71                .with_call_frames_elided(diag.callstack_elided)
72                .build()
73        });
74    Ok(SessionExecutionResult {
75        value: outcome.flow.durable_workspace_value().cloned(),
76        execution_time_ms: outcome.execution_time_ms,
77        used_jit: outcome.used_jit,
78        error,
79        type_info: outcome.type_info,
80        streams: outcome.streams,
81        workspace,
82        figures_touched: outcome.figures_touched,
83        warnings,
84        profiling: outcome.profiling,
85        fusion_plan: outcome.fusion_plan,
86        stdin_events: outcome.stdin_events,
87    })
88}