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