1use crate::error::NanonisError;
2use serde::{Deserialize, Serialize};
3
4#[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
25impl 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
86impl 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
192impl 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#[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}