use crate::{StrictlyPositive, config::*};
use serde::{Deserialize, Serialize};
use strum::EnumMessage;
use strum_macros;
#[cfg_attr(
feature = "python-bindings",
gen_stub_pyclass_enum,
pyclass(eq, eq_int, from_py_object)
)]
#[derive(
PartialEq, Serialize, Deserialize, strum_macros::EnumMessage, Debug, Clone, Copy, Default,
)]
#[allow(dead_code)]
#[repr(u32)]
pub enum Qty {
#[default]
#[strum(message = "number", detailed_message = "Unit full scale")]
Number = 0,
#[strum(
message = "acousticpressure",
detailed_message = "Acoustic Pressure [Pa]"
)]
AcousticPressure = 1,
#[strum(message = "voltage", detailed_message = "Voltage [V]")]
Voltage = 2,
#[strum(message = "vibration", detailed_message = "Vibration [m/s²]")]
Vib = 3,
}
impl From<u32> for Qty {
fn from(value: u32) -> Self {
match value {
0 => Qty::Number,
1 => Qty::AcousticPressure,
2 => Qty::Voltage,
3 => Qty::Vib,
_ => panic!("Invalid value for Qty"),
}
}
}
#[cfg_attr(feature = "python-bindings", gen_stub_pymethods, pymethods)]
impl Qty {
#[cfg(feature = "python-bindings")]
#[staticmethod]
fn all() -> Vec<Qty> {
use Qty::*;
vec![Number, AcousticPressure, Voltage]
}
fn __str__(&self) -> String {
self.get_detailed_message().unwrap().into()
}
#[cfg(feature = "python-bindings")]
#[staticmethod]
#[pyo3(name = "default")]
fn default_py() -> Self {
Self::default()
}
pub fn unit_symb(&self) -> String {
use Qty::*;
match self {
Number => "1".into(),
AcousticPressure => "Pa".into(),
Voltage => "V".into(),
Vib => "m/s²".into(),
}
}
pub fn level_ref_value(&self) -> StrictlyPositive {
use Qty::*;
match self {
Number => 1.0.try_into().unwrap(),
AcousticPressure => 2e-5.try_into().unwrap(),
Voltage => 1.0.try_into().unwrap(),
Vib => 1.0.try_into().unwrap(),
}
}
pub fn level_unit(&self) -> String {
use Qty::*;
match self {
Number => "dB re FS".into(),
AcousticPressure => "dB SPL".into(),
Voltage => "dBV".into(),
Vib => "dB re 1 m/s²".into(),
}
}
pub fn ref_level_txt(&self) -> String {
use Qty::*;
match self {
Number => "".into(),
AcousticPressure => "re 20 µPa".into(),
Voltage => "re 1 V".into(),
Vib => "re 1 m/s²".into(),
}
}
}