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 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
27impl 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
88impl 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
194impl 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#[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}