Skip to content
Snippets Groups Projects
properties.rs 1.66 KiB
Newer Older
use std::collections::HashMap;

// use serde::Serialize;
use serde_derive::{Serialize, Deserialize};
use crate::{error::OpossumError, lightdata::LightData, optical::OpticGraph};
#[derive(Default, Serialize, Deserialize, Debug, Clone)]
pub struct Properties {
  pub props: HashMap<String, Property>
}

impl Properties {
  pub fn set(&mut self, name: &str, value: Property) -> Option<()> {
    if self.props.insert(name.into(), value).is_some() {
      Some(())
    } else {
      None
    }
  }
  pub fn get(&self, name: &str) -> Option<&Property> {
    self.props.get(name)
  }
  pub fn get_bool(&self, name: & str) -> Result<Option<bool>, OpossumError> {
    if let Some(property)=self.props.get(name) {
      if let Proptype::Bool(value)=property.prop {
        Ok(Some(value))
      } else {
        Err(OpossumError::Other("not a bool property".into()))
      }
    } else {
        Ok(None)
    }
// impl Serialize for Properties {
//     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
//     where
//         S: serde::Serializer {
//         serializer.serialize_newtype_struct("properties", &self.props)
//     }
// }
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Property {
  pub prop: Proptype
}

// impl Serialize for Property {
//     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
//     where
//         S: serde::Serializer {
//         serializer.serialize_newtype_struct("property", &self.prop)
//     }
// }
#[non_exhaustive]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum Proptype {
  String(String),
  I32(i32),
  F64(f64),
  LightData(Option<LightData>),
  #[serde(skip)]
  OpticGraph(OpticGraph)