arthas 0.3.0

Arthas is an in-memory structure database.
Documentation

use std::sync::RwLock;
use std::ops::{Deref, DerefMut};
use std::fmt;
use serde_json::Value;
use super::{RcData, RcItem, DataType};


#[derive(Clone)]
pub struct RcChild(*mut RwLock<Child>);

impl RcChild {
    pub fn new(data: RcData, item: RcItem) -> RcChild {
        RcChild(Box::into_raw(Box::new(RwLock::new(Child::new(data, item)))))
    }

    pub fn destroy(self) {
        unsafe {
            Box::from_raw(self.0);
        }
    }
}

unsafe impl Send for RcChild {}
unsafe impl Sync for RcChild {}

impl fmt::Debug for RcChild {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{:?}", self.read().unwrap().get_item_value())
    }
}

impl Deref for RcChild {
    type Target = RwLock<Child>;
    fn deref(&self) -> &Self::Target {
        unsafe { &*self.0 }
    }
}

impl DerefMut for RcChild {
    fn deref_mut(&mut self) -> &mut Self::Target {
        unsafe { &mut *self.0 }
    }
}


#[derive(Clone)]
pub struct Child {
    pub data: RcData,
    pub item: RcItem,
}

impl Child {
    pub fn new(data: RcData, item: RcItem) -> Child {
        Child {
            data: data,
            item: item,
        }
    }

    pub fn get_item_pointer(&self) -> *const Value {
        self.item.read().unwrap().get_pointer()
    }

    pub fn get_item_value(&self) -> &Value {
        unsafe { &*self.get_item_pointer() }
    }

    pub fn get_value(&self) -> Value {
        self.data.read().unwrap().get_value().clone()
    }

    pub fn get_type(&self) -> DataType {
        self.data.read().unwrap()._type.clone()
    }
}

impl fmt::Debug for Child {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{:?}", self.data)
    }
}