runmat_analysis_core/
field.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub struct DeviceFieldRef {
5 pub backend: String,
6 pub token: String,
7 pub element_count: usize,
8}
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum AnalysisFieldValues {
13 HostF64(Vec<f64>),
14 DeviceRef(DeviceFieldRef),
15}
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub struct AnalysisField {
19 pub field_id: String,
20 pub shape: Vec<usize>,
21 pub values: AnalysisFieldValues,
22}
23
24impl AnalysisField {
25 pub fn host_f64(field_id: impl Into<String>, shape: Vec<usize>, values: Vec<f64>) -> Self {
26 Self {
27 field_id: field_id.into(),
28 shape,
29 values: AnalysisFieldValues::HostF64(values),
30 }
31 }
32
33 pub fn element_count(&self) -> usize {
34 self.shape.iter().product()
35 }
36
37 pub fn is_empty(&self) -> bool {
38 self.element_count() == 0
39 }
40
41 pub fn as_host_f64(&self) -> Option<&[f64]> {
42 match &self.values {
43 AnalysisFieldValues::HostF64(values) => Some(values.as_slice()),
44 AnalysisFieldValues::DeviceRef(_) => None,
45 }
46 }
47}