use crate::error::NanonisError;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
pub enum NanonisValue {
U8(u8),
U16(u16),
I16(i16),
U32(u32),
I32(i32),
F32(f32),
F64(f64),
String(String),
ArrayU8(Vec<u8>),
ArrayU32(Vec<u32>),
ArrayI32(Vec<i32>),
ArrayF32(Vec<f32>),
ArrayF64(Vec<f64>),
ArrayString(Vec<String>),
Array2DF32(Vec<Vec<f32>>),
}
impl From<f32> for NanonisValue {
fn from(value: f32) -> Self {
NanonisValue::F32(value)
}
}
impl From<f64> for NanonisValue {
fn from(value: f64) -> Self {
NanonisValue::F64(value)
}
}
impl From<u16> for NanonisValue {
fn from(value: u16) -> Self {
NanonisValue::U16(value)
}
}
impl From<u32> for NanonisValue {
fn from(value: u32) -> Self {
NanonisValue::U32(value)
}
}
impl From<i16> for NanonisValue {
fn from(value: i16) -> Self {
NanonisValue::I16(value)
}
}
impl From<i32> for NanonisValue {
fn from(value: i32) -> Self {
NanonisValue::I32(value)
}
}
impl From<String> for NanonisValue {
fn from(value: String) -> Self {
NanonisValue::String(value)
}
}
impl From<Vec<f32>> for NanonisValue {
fn from(value: Vec<f32>) -> Self {
NanonisValue::ArrayF32(value)
}
}
impl From<Vec<String>> for NanonisValue {
fn from(value: Vec<String>) -> Self {
NanonisValue::ArrayString(value)
}
}
impl From<Vec<i32>> for NanonisValue {
fn from(value: Vec<i32>) -> Self {
NanonisValue::ArrayI32(value)
}
}
impl TryFrom<NanonisValue> for f32 {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::F32(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!("Expected f32, got {value:?}"))),
}
}
}
impl TryFrom<NanonisValue> for f64 {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::F64(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!("Expected f64, got {value:?}"))),
}
}
}
impl TryFrom<NanonisValue> for u16 {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::U16(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!("Expected u16, got {value:?}"))),
}
}
}
impl TryFrom<NanonisValue> for u32 {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::U32(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!("Expected u32, got {value:?}"))),
}
}
}
impl TryFrom<NanonisValue> for i16 {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::I16(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!("Expected i16, got {value:?}"))),
}
}
}
impl TryFrom<NanonisValue> for i32 {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::I32(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!("Expected i32, got {value:?}"))),
}
}
}
impl TryFrom<NanonisValue> for Vec<f32> {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::ArrayF32(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!(
"Expected Vec<f32>, got {value:?}"
))),
}
}
}
impl TryFrom<NanonisValue> for Vec<String> {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::ArrayString(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!(
"Expected Vec<String>, got {value:?}"
))),
}
}
}
impl TryFrom<NanonisValue> for Vec<i32> {
type Error = NanonisError;
fn try_from(value: NanonisValue) -> Result<Self, Self::Error> {
match value {
NanonisValue::ArrayI32(v) => Ok(v),
_ => Err(NanonisError::Protocol(format!(
"Expected Vec<i32>, got {value:?}"
))),
}
}
}
impl NanonisValue {
pub fn as_f32(&self) -> Result<f32, NanonisError> {
match self {
NanonisValue::F32(v) => Ok(*v),
_ => Err(NanonisError::Protocol(format!("Expected f32, got {self:?}"))),
}
}
pub fn as_f64(&self) -> Result<f64, NanonisError> {
match self {
NanonisValue::F64(v) => Ok(*v),
_ => Err(NanonisError::Protocol(format!("Expected f64, got {self:?}"))),
}
}
pub fn as_u16(&self) -> Result<u16, NanonisError> {
match self {
NanonisValue::U16(v) => Ok(*v),
_ => Err(NanonisError::Protocol(format!("Expected u16, got {self:?}"))),
}
}
pub fn as_u32(&self) -> Result<u32, NanonisError> {
match self {
NanonisValue::U32(v) => Ok(*v),
_ => Err(NanonisError::Protocol(format!("Expected u32, got {self:?}"))),
}
}
pub fn as_i16(&self) -> Result<i16, NanonisError> {
match self {
NanonisValue::I16(v) => Ok(*v),
_ => Err(NanonisError::Protocol(format!("Expected i16, got {self:?}"))),
}
}
pub fn as_i32(&self) -> Result<i32, NanonisError> {
match self {
NanonisValue::I32(v) => Ok(*v),
_ => Err(NanonisError::Protocol(format!("Expected i32, got {self:?}"))),
}
}
pub fn as_string_array(&self) -> Result<&[String], NanonisError> {
match self {
NanonisValue::ArrayString(arr) => Ok(arr),
_ => Err(NanonisError::Protocol(format!(
"Expected string array, got {self:?}"
))),
}
}
pub fn as_f32_array(&self) -> Result<&[f32], NanonisError> {
match self {
NanonisValue::ArrayF32(arr) => Ok(arr),
_ => Err(NanonisError::Protocol(format!(
"Expected f32 array, got {self:?}"
))),
}
}
pub fn as_f64_array(&self) -> Result<&[f64], NanonisError> {
match self {
NanonisValue::ArrayF64(arr) => Ok(arr),
_ => Err(NanonisError::Protocol(format!(
"Expected f64 array, got {self:?}"
))),
}
}
pub fn as_i32_array(&self) -> Result<&[i32], NanonisError> {
match self {
NanonisValue::ArrayI32(arr) => Ok(arr),
_ => Err(NanonisError::Protocol(format!(
"Expected i32 array, got {self:?}"
))),
}
}
pub fn as_u32_array(&self) -> Result<&[u32], NanonisError> {
match self {
NanonisValue::ArrayU32(arr) => Ok(arr),
_ => Err(NanonisError::Protocol(format!(
"Expected u32 array, got {self:?}"
))),
}
}
pub fn as_string(&self) -> Result<&str, NanonisError> {
match self {
NanonisValue::String(s) => Ok(s),
_ => Err(NanonisError::Protocol(format!("Expected string, got {self:?}"))),
}
}
pub fn as_f32_2d_array(&self) -> Result<&Vec<Vec<f32>>, NanonisError> {
match self {
NanonisValue::Array2DF32(arr) => Ok(arr),
_ => Err(NanonisError::Protocol(format!(
"Expected 2D f32 array, got {self:?}"
))),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Position {
pub x: f64,
pub y: f64,
}
impl Position {
pub fn new(x: f64, y: f64) -> Self {
Self { x, y }
}
}