use std::fmt::{Debug, Display};
use chrono;
use serde::{self, Deserialize, Serialize};
mod serde_impl;
#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, PartialOrd)]
pub struct Conductivity(f64);
impl Conductivity {
pub fn from_us_per_cm(value: f64) -> Conductivity {
value.into()
}
pub fn as_us_per_cm(&self) -> f64 {
return self.0;
}
}
impl From<f64> for Conductivity {
fn from(value: f64) -> Self {
Conductivity(value)
}
}
impl Display for Conductivity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} µS/cm", self.0)
}
}
impl Debug for Conductivity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self)
}
}
#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, PartialOrd)]
pub struct Temperature(f64);
impl Temperature {
pub fn from_celsius(value: f64) -> Temperature {
value.into()
}
pub fn as_celsius(&self) -> f64 {
return self.0;
}
pub fn as_kelvin(&self) -> f64 {
return self.0 + 273.15;
}
}
impl From<f64> for Temperature {
fn from(value: f64) -> Self {
Temperature(value)
}
}
impl Display for Temperature {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} °C", self.0)
}
}
impl Debug for Temperature {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self)
}
}
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub struct Measurement {
pub timestamp: chrono::DateTime<chrono::Utc>,
pub conductivity: Option<Conductivity>,
pub temperature: Option<Temperature>,
}
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub struct SuccessfulMeasurement {
pub timestamp: chrono::DateTime<chrono::Utc>,
pub conductivity: Conductivity,
pub temperature: Option<Temperature>,
}