woopsa 0.1.1

A pure Rust library for Woopsa.
Documentation
use serde::{Deserialize, Serialize};

use crate::protocol::element::WoopsaElement;
use crate::protocol::value::WoopsaValue;
use crate::protocol::value_type::WoopsaValueType;

use std::fmt;
use std::time::SystemTime;

pub trait Property {
    fn type_of(&self) -> &'static str;
    fn name(&self) -> String;
    fn is_read_only(&self) -> bool;
}

#[derive(Serialize, Deserialize)]
pub struct WoopsaProperty {
    pub element: WoopsaElement,
    pub value: WoopsaValue,
    pub value_type: WoopsaValueType,
    pub readonly: bool,
}

impl WoopsaProperty {
    pub fn new_readonly(element_name: String, value: String, value_type: WoopsaValueType) -> WoopsaProperty {
        WoopsaProperty {
            element: WoopsaElement {
                name: element_name,
            },
            value: WoopsaValue {
                as_text: value,
                timestamp: SystemTime::now(),
                value_type: value_type
            },
            value_type: value_type,
            readonly: true
        }
    }

    pub fn new(element_name: String, value: String, value_type: WoopsaValueType) -> WoopsaProperty {
        WoopsaProperty {
            element: WoopsaElement {
                name: element_name,
            },
            value: WoopsaValue {
                as_text: value,
                timestamp: SystemTime::now(),
                value_type: value_type
            },
            value_type: value_type,
            readonly: false
        }
    }

    pub fn set_value(&mut self, value: String, value_type: WoopsaValueType) {
        self.value.value_type = value_type;
        self.value.as_text = value;
        self.value.timestamp = SystemTime::now();
    }

    pub fn set_readonly(&mut self) {
        self.readonly = true;
    }

    pub fn set_read_write(&mut self) {
        self.readonly = false;
    }
}

impl Property for WoopsaProperty {
    fn type_of(&self) -> &'static str {
        "WoopsaProperty"
    }

    fn name(&self) -> String {
        return self.element.name.clone();
    }
    
    fn is_read_only(&self) -> bool {
        return self.readonly.clone();
    }
}

impl fmt::Display for WoopsaProperty {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "({} with value {})", 
        self.element.name,
        self.value.as_text)
    }
}