Skip to main content

nanonis_rs/
types.rs

1use crate::error::NanonisError;
2use serde::{Deserialize, Serialize};
3
4// ==================== Core Protocol Value Type ====================
5
6#[derive(Debug, Clone)]
7pub enum NanonisValue {
8    U8(u8),
9    U16(u16),
10    I16(i16),
11    U32(u32),
12    I32(i32),
13    F32(f32),
14    F64(f64),
15    String(String),
16    ArrayU8(Vec<u8>),
17    ArrayU16(Vec<u16>),
18    ArrayI16(Vec<i16>),
19    ArrayU32(Vec<u32>),
20    ArrayI32(Vec<i32>),
21    ArrayF32(Vec<f32>),
22    ArrayF64(Vec<f64>),
23    ArrayString(Vec<String>),
24    Array2DF32(Vec<Vec<f32>>),
25}
26
27// From implementations for NanonisValue
28impl From<f32> for NanonisValue {
29    fn from(value: f32) -> Self {
30        NanonisValue::F32(value)
31    }
32}
33
34impl From<f64> for NanonisValue {
35    fn from(value: f64) -> Self {
36        NanonisValue::F64(value)
37    }
38}
39
40impl From<u16> for NanonisValue {
41    fn from(value: u16) -> Self {
42        NanonisValue::U16(value)
43    }
44}
45
46impl From<u32> for NanonisValue {
47    fn from(value: u32) -> Self {
48        NanonisValue::U32(value)
49    }
50}
51
52impl From<i16> for NanonisValue {
53    fn from(value: i16) -> Self {
54        NanonisValue::I16(value)
55    }
56}
57
58impl From<i32> for NanonisValue {
59    fn from(value: i32) -> Self {
60        NanonisValue::I32(value)
61    }
62}
63
64impl From<String> for NanonisValue {
65    fn from(value: String) -> Self {
66        NanonisValue::String(value)
67    }
68}
69
70impl From<Vec<f32>> for NanonisValue {
71    fn from(value: Vec<f32>) -> Self {
72        NanonisValue::ArrayF32(value)
73    }
74}
75
76impl From<Vec<String>> for NanonisValue {
77    fn from(value: Vec<String>) -> Self {
78        NanonisValue::ArrayString(value)
79    }
80}
81
82impl From<Vec<i32>> for NanonisValue {
83    fn from(value: Vec<i32>) -> Self {
84        NanonisValue::ArrayI32(value)
85    }
86}
87
88// TryFrom implementations
89impl TryFrom<NanonisValue> for f32 {
90    type Error = NanonisError;
91
92    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
93        match value {
94            NanonisValue::F32(v) => Ok(v),
95            _ => Err(NanonisError::Protocol(format!("Expected f32, got {value:?}"))),
96        }
97    }
98}
99
100impl TryFrom<NanonisValue> for f64 {
101    type Error = NanonisError;
102
103    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
104        match value {
105            NanonisValue::F64(v) => Ok(v),
106            _ => Err(NanonisError::Protocol(format!("Expected f64, got {value:?}"))),
107        }
108    }
109}
110
111impl TryFrom<NanonisValue> for u16 {
112    type Error = NanonisError;
113
114    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
115        match value {
116            NanonisValue::U16(v) => Ok(v),
117            _ => Err(NanonisError::Protocol(format!("Expected u16, got {value:?}"))),
118        }
119    }
120}
121
122impl TryFrom<NanonisValue> for u32 {
123    type Error = NanonisError;
124
125    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
126        match value {
127            NanonisValue::U32(v) => Ok(v),
128            _ => Err(NanonisError::Protocol(format!("Expected u32, got {value:?}"))),
129        }
130    }
131}
132
133impl TryFrom<NanonisValue> for i16 {
134    type Error = NanonisError;
135
136    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
137        match value {
138            NanonisValue::I16(v) => Ok(v),
139            _ => Err(NanonisError::Protocol(format!("Expected i16, got {value:?}"))),
140        }
141    }
142}
143
144impl TryFrom<NanonisValue> for i32 {
145    type Error = NanonisError;
146
147    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
148        match value {
149            NanonisValue::I32(v) => Ok(v),
150            _ => Err(NanonisError::Protocol(format!("Expected i32, got {value:?}"))),
151        }
152    }
153}
154
155impl TryFrom<NanonisValue> for Vec<f32> {
156    type Error = NanonisError;
157
158    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
159        match value {
160            NanonisValue::ArrayF32(v) => Ok(v),
161            _ => Err(NanonisError::Protocol(format!(
162                "Expected Vec<f32>, got {value:?}"
163            ))),
164        }
165    }
166}
167
168impl TryFrom<NanonisValue> for Vec<String> {
169    type Error = NanonisError;
170
171    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
172        match value {
173            NanonisValue::ArrayString(v) => Ok(v),
174            _ => Err(NanonisError::Protocol(format!(
175                "Expected Vec<String>, got {value:?}"
176            ))),
177        }
178    }
179}
180
181impl TryFrom<NanonisValue> for Vec<i32> {
182    type Error = NanonisError;
183
184    fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
185        match value {
186            NanonisValue::ArrayI32(v) => Ok(v),
187            _ => Err(NanonisError::Protocol(format!(
188                "Expected Vec<i32>, got {value:?}"
189            ))),
190        }
191    }
192}
193
194// Convenience methods
195impl NanonisValue {
196    pub fn as_f32(&self) -> Result<f32, NanonisError> {
197        match self {
198            NanonisValue::F32(v) => Ok(*v),
199            _ => Err(NanonisError::Protocol(format!("Expected f32, got {self:?}"))),
200        }
201    }
202
203    pub fn as_f64(&self) -> Result<f64, NanonisError> {
204        match self {
205            NanonisValue::F64(v) => Ok(*v),
206            _ => Err(NanonisError::Protocol(format!("Expected f64, got {self:?}"))),
207        }
208    }
209
210    pub fn as_u16(&self) -> Result<u16, NanonisError> {
211        match self {
212            NanonisValue::U16(v) => Ok(*v),
213            _ => Err(NanonisError::Protocol(format!("Expected u16, got {self:?}"))),
214        }
215    }
216
217    pub fn as_u32(&self) -> Result<u32, NanonisError> {
218        match self {
219            NanonisValue::U32(v) => Ok(*v),
220            _ => Err(NanonisError::Protocol(format!("Expected u32, got {self:?}"))),
221        }
222    }
223
224    pub fn as_i16(&self) -> Result<i16, NanonisError> {
225        match self {
226            NanonisValue::I16(v) => Ok(*v),
227            _ => Err(NanonisError::Protocol(format!("Expected i16, got {self:?}"))),
228        }
229    }
230
231    pub fn as_i32(&self) -> Result<i32, NanonisError> {
232        match self {
233            NanonisValue::I32(v) => Ok(*v),
234            _ => Err(NanonisError::Protocol(format!("Expected i32, got {self:?}"))),
235        }
236    }
237
238    pub fn as_string_array(&self) -> Result<&[String], NanonisError> {
239        match self {
240            NanonisValue::ArrayString(arr) => Ok(arr),
241            _ => Err(NanonisError::Protocol(format!(
242                "Expected string array, got {self:?}"
243            ))),
244        }
245    }
246
247    pub fn as_f32_array(&self) -> Result<&[f32], NanonisError> {
248        match self {
249            NanonisValue::ArrayF32(arr) => Ok(arr),
250            _ => Err(NanonisError::Protocol(format!(
251                "Expected f32 array, got {self:?}"
252            ))),
253        }
254    }
255
256    pub fn as_f64_array(&self) -> Result<&[f64], NanonisError> {
257        match self {
258            NanonisValue::ArrayF64(arr) => Ok(arr),
259            _ => Err(NanonisError::Protocol(format!(
260                "Expected f64 array, got {self:?}"
261            ))),
262        }
263    }
264
265    pub fn as_i32_array(&self) -> Result<&[i32], NanonisError> {
266        match self {
267            NanonisValue::ArrayI32(arr) => Ok(arr),
268            _ => Err(NanonisError::Protocol(format!(
269                "Expected i32 array, got {self:?}"
270            ))),
271        }
272    }
273
274    pub fn as_u32_array(&self) -> Result<&[u32], NanonisError> {
275        match self {
276            NanonisValue::ArrayU32(arr) => Ok(arr),
277            _ => Err(NanonisError::Protocol(format!(
278                "Expected u32 array, got {self:?}"
279            ))),
280        }
281    }
282
283    pub fn as_string(&self) -> Result<&str, NanonisError> {
284        match self {
285            NanonisValue::String(s) => Ok(s),
286            _ => Err(NanonisError::Protocol(format!("Expected string, got {self:?}"))),
287        }
288    }
289
290    pub fn as_f32_2d_array(&self) -> Result<&Vec<Vec<f32>>, NanonisError> {
291        match self {
292            NanonisValue::Array2DF32(arr) => Ok(arr),
293            _ => Err(NanonisError::Protocol(format!(
294                "Expected 2D f32 array, got {self:?}"
295            ))),
296        }
297    }
298}
299
300// ==================== Domain-Specific Types ====================
301// Note: Domain-specific types have been moved to their respective modules:
302// - Motor types -> client::motor::types
303// - Scan types -> client::scan::types
304// - Z-controller types -> client::z_ctrl::types
305// - Bias types -> client::bias::types
306// - Signal types -> client::signals::types
307// - Oscilloscope types -> client::oscilloscope::types
308// - TCP Logger types -> client::tcplog::types
309
310// ==================== Position Types ====================
311
312#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
313pub struct Position {
314    pub x: f64,
315    pub y: f64,
316}
317
318impl Position {
319    pub fn new(x: f64, y: f64) -> Self {
320        Self { x, y }
321    }
322}