jni-pointer 0.1.0

Leaks a value and returns a pointer as a number, so that it can be recovered later, this is useful for JNI objects.
Documentation
use std::ops::Deref;
#[allow(non_camel_case_types)]
type jlong = i64;

#[allow(non_camel_case_types)]
pub type jptr = jlong;

#[derive(Debug)]
pub struct Pointer<Kind> {
    value: Box<Kind>,
}

impl<Kind> Pointer<Kind> {
    pub fn new(value: Kind) -> Self {
        Pointer {
            value: Box::new(value),
        }
    }

    pub fn borrow<'a>(self) -> &'a mut Kind {
        Box::leak(self.value)
    }
}

impl<Kind> From<Pointer<Kind>> for jptr {
    fn from(pointer: Pointer<Kind>) -> Self {
        Box::into_raw(pointer.value) as _
    }
}

impl<Kind> From<jptr> for Pointer<Kind> {
    fn from(pointer: jptr) -> Self {
        Self {
            value: unsafe { Box::from_raw(pointer as *mut Kind) },
        }
    }
}

impl<Kind> Deref for Pointer<Kind> {
    type Target = Kind;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}
#[cfg(test)]
mod tests {
    use crate::{jlong, Pointer};

    struct Value {
        num: i64,
        s: String
    }

    #[test]
    pub fn can_recover_value_from_pointer(){
        let value = Value {
            num: 6,
            s: "Some string".into()
        };
        let pointer: Pointer<_> = Pointer::new(value);
        let pointer_n: jlong = pointer.into();
        let pointer2: Pointer<Value> = pointer_n.into();
        assert_eq!(pointer2.s, Into::<String>::into("Some string"));
        assert_eq!(pointer2.num, 6);
    }
}