v-common-onto 0.1.13

common part of the veda platform
Documentation
use crate::datatype::{DataType, Lang};
use derivative::Derivative;

#[derive(Debug, PartialEq, Clone)]

pub enum Value {
    Int(i64),
    Str(String, Lang),
    Uri(String),
    Bool(bool),
    Num(i64, i64),
    Binary(Vec<u8>),
    Datetime(i64),
}

#[derive(Derivative)]
#[derivative(Debug, PartialEq)]
pub struct Resource {
    pub rtype: DataType,
    pub value: Value,
    #[derivative(PartialEq = "ignore")]
    pub order: u16,
}

impl Resource {
    pub fn new_bool(data: bool) -> Self {
        Resource {
            rtype: DataType::Boolean,
            order: 0,
            value: Value::Bool(data),
        }
    }

    pub fn new_uri(data: &str) -> Self {
        Resource {
            rtype: DataType::Uri,
            order: 0,
            value: Value::Uri(data.to_owned()),
        }
    }

    pub fn get_copy(&self) -> Self {
        Resource {
            rtype: self.rtype.clone(),
            order: self.order,
            value: self.value.clone(),
        }
    }

    pub fn get_binary(&self) -> &[u8] {
        if let Value::Binary(v) = &self.value {
            v
        } else {
            &[]
        }
    }

    pub fn get_str(&self) -> &str {
        if let Value::Str(s, _) = &self.value {
            &s
        } else {
            ""
        }
    }

    pub fn get_uri(&self) -> &str {
        if let Value::Uri(s) = &self.value {
            &s
        } else {
            ""
        }
    }

    pub fn get_lang(&self) -> Lang {
        if let Value::Str(_, l) = &self.value {
            l.clone()
        } else {
            Lang::NONE
        }
    }

    pub fn get_int(&self) -> i64 {
        if let Value::Int(t) = self.value {
            t
        } else {
            0
        }
    }

    pub fn get_datetime(&self) -> i64 {
        if let Value::Datetime(t) = self.value {
            t
        } else {
            0
        }
    }

    pub fn get_bool(&self) -> bool {
        if let Value::Bool(t) = self.value {
            t
        } else {
            false
        }
    }

    pub fn get_num(&self) -> (i64, i64) {
        if let Value::Num(m, e) = self.value {
            (m, e)
        } else {
            (0, 0)
        }
    }

    pub fn get_float(&self) -> f64 {
        if let Value::Num(m, e) = self.value {
            m as f64 * 10.0_f64.powf(e as f64)
        } else {
            0.0
        }
    }
}

impl From<Value> for i64 {
    fn from(v: Value) -> Self {
        if let Value::Int(t) = v {
            t
        } else {
            0
        }
    }
}

impl From<Value> for bool {
    fn from(v: Value) -> Self {
        if let Value::Bool(t) = v {
            t
        } else {
            false
        }
    }
}