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