From 7de728f1db45b18263a31869d6a0257cc4fcf949 Mon Sep 17 00:00:00 2001
From: Udo Eisenbarth <u.eisenbarth@gsi.de>
Date: Mon, 9 Oct 2023 09:57:05 +0200
Subject: [PATCH] Add MeterType to properties of EnergyMeter

---
 src/nodes/energy_meter.rs | 27 +++++++++++++++++----------
 src/properties.rs         | 10 +++++++++-
 2 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/src/nodes/energy_meter.rs b/src/nodes/energy_meter.rs
index 2ff3d2f5..f8d99de9 100644
--- a/src/nodes/energy_meter.rs
+++ b/src/nodes/energy_meter.rs
@@ -1,4 +1,5 @@
 #![warn(missing_docs)]
+use serde_derive::{Deserialize, Serialize};
 use serde_json::{json, Number};
 
 use crate::dottable::Dottable;
@@ -15,7 +16,7 @@ use std::fmt::Debug;
 type Result<T> = std::result::Result<T, OpossumError>;
 
 #[non_exhaustive]
-#[derive(Debug, Default, PartialEq, Clone, Copy)]
+#[derive(Debug, Default, PartialEq, Clone, Copy, Serialize, Deserialize)]
 /// Type of the [`EnergyMeter`]. This is currently not used.
 pub enum Metertype {
     /// an ideal energy meter
@@ -38,7 +39,7 @@ pub enum Metertype {
 /// different dectector nodes can be "stacked" or used somewhere in between arbitrary optic nodes.
 pub struct EnergyMeter {
     light_data: Option<LightData>,
-    meter_type: Metertype,
+    //meter_type: Metertype,
     props: Properties,
 }
 
@@ -46,6 +47,7 @@ fn create_default_props() -> Properties {
     let mut props = Properties::default();
     props.set("name", "energy meter".into());
     props.set("inverted", false.into());
+    props.set("meter type", Metertype::default().into());
     props
 }
 
@@ -53,7 +55,7 @@ impl Default for EnergyMeter {
     fn default() -> Self {
         Self {
             light_data: Default::default(),
-            meter_type: Default::default(),
+            //meter_type: Default::default(),
             props: create_default_props(),
         }
     }
@@ -63,19 +65,24 @@ impl EnergyMeter {
     pub fn new(name: &str, meter_type: Metertype) -> Self {
         let mut props = create_default_props();
         props.set("name", name.into());
+        props.set("meter type", meter_type.into());
         EnergyMeter {
             light_data: None,
-            meter_type,
             props,
         }
     }
     /// Returns the meter type of this [`EnergyMeter`].
     pub fn meter_type(&self) -> Metertype {
-        self.meter_type
+        let meter_type=self.props.get("meter type").unwrap().prop.clone();
+        if let Proptype::Metertype(meter_type)=meter_type {
+            meter_type
+        } else {
+            panic!("wrong data format")
+        }
     }
     /// Sets the meter type of this [`EnergyMeter`].
     pub fn set_meter_type(&mut self, meter_type: Metertype) {
-        self.meter_type = meter_type;
+        self.props.set("meter type", meter_type.into());
     }
 }
 impl Optical for EnergyMeter {
@@ -140,7 +147,7 @@ impl Optical for EnergyMeter {
 impl Debug for EnergyMeter {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         match &self.light_data {
-            Some(data) => write!(f, "{} (Type: {:?})", data, self.meter_type),
+            Some(data) => write!(f, "{} (Type: {:?})", data, self.meter_type()),
             None => write!(f, "no data"),
         }
     }
@@ -160,13 +167,13 @@ mod test {
     fn new() {
         let meter = EnergyMeter::new("test", Metertype::IdealEnergyMeter);
         assert!(meter.light_data.is_none());
-        assert_eq!(meter.meter_type, Metertype::IdealEnergyMeter);
+        assert_eq!(meter.meter_type(), Metertype::IdealEnergyMeter);
     }
     #[test]
     fn default() {
         let meter = EnergyMeter::default();
         assert!(meter.light_data.is_none());
-        assert_eq!(meter.meter_type, Metertype::IdealEnergyMeter);
+        assert_eq!(meter.meter_type(), Metertype::IdealEnergyMeter);
         assert_eq!(meter.node_type(), "energy meter");
         assert_eq!(meter.is_detector(), true);
         assert_eq!(meter.node_color(), "whitesmoke");
@@ -181,7 +188,7 @@ mod test {
     fn set_meter_type() {
         let mut meter = EnergyMeter::new("test", Metertype::IdealEnergyMeter);
         meter.set_meter_type(Metertype::IdealPowerMeter);
-        assert_eq!(meter.meter_type, Metertype::IdealPowerMeter);
+        assert_eq!(meter.meter_type(), Metertype::IdealPowerMeter);
     }
     #[test]
     fn ports() {
diff --git a/src/properties.rs b/src/properties.rs
index 4c406d0a..6f031060 100644
--- a/src/properties.rs
+++ b/src/properties.rs
@@ -4,7 +4,7 @@ use std::collections::HashMap;
 use crate::{
     error::OpossumError,
     lightdata::LightData,
-    nodes::{FilterType, SpectrometerType},
+    nodes::{FilterType, SpectrometerType, Metertype},
     optical::OpticGraph,
 };
 
@@ -96,6 +96,13 @@ impl From<SpectrometerType> for Property {
         }
     }
 }
+impl From<Metertype> for Property {
+    fn from(value: Metertype) -> Self {
+        Property {
+            prop: Proptype::Metertype(value),
+        }
+    }
+}
 #[non_exhaustive]
 #[derive(Serialize, Deserialize, Debug, Clone)]
 pub enum Proptype {
@@ -107,4 +114,5 @@ pub enum Proptype {
     OpticGraph(OpticGraph),
     FilterType(FilterType),
     SpectrometerType(SpectrometerType),
+    Metertype(Metertype)
 }
-- 
GitLab