jvm 0.3.0

Core abstractions and runtime services for embeddable JVM implementations
Documentation
use alloc::boxed::Box;

use crate::class_instance::ClassInstance;

pub type JavaChar = u16;

#[derive(Debug, Clone)]
pub enum JavaValue {
    Void,
    Boolean(bool),
    Byte(i8),
    Char(JavaChar),
    Short(i16),
    Int(i32),
    Long(i64),
    Float(f32),
    Double(f64),
    Object(Option<Box<dyn ClassInstance>>),
}

impl From<JavaValue> for bool {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Boolean(x) => x,
            _ => panic!("Expected boolean, got {:?}", x),
        }
    }
}

impl From<JavaValue> for i8 {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Byte(x) => x,
            _ => panic!("Expected byte, got {:?}", x),
        }
    }
}

impl From<JavaValue> for JavaChar {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Char(x) => x,
            _ => panic!("Expected char, got {:?}", x),
        }
    }
}

impl From<JavaValue> for i16 {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Short(x) => x,
            _ => panic!("Expected short, got {:?}", x),
        }
    }
}

impl From<JavaValue> for i32 {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Int(x) => x,
            _ => panic!("Expected int, got {:?}", x),
        }
    }
}

impl From<JavaValue> for i64 {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Long(x) => x,
            _ => panic!("Expected long, got {:?}", x),
        }
    }
}

impl From<JavaValue> for f32 {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Float(x) => x,
            _ => panic!("Expected float, got {:?}", x),
        }
    }
}

impl From<JavaValue> for f64 {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Double(x) => x,
            _ => panic!("Expected double, got {:?}", x),
        }
    }
}

impl<'a> From<&'a JavaValue> for &'a Option<Box<dyn ClassInstance>> {
    fn from(x: &'a JavaValue) -> Self {
        match x {
            JavaValue::Object(x) => x,
            _ => panic!("Expected object, got {:?}", x),
        }
    }
}

impl From<JavaValue> for Option<Box<dyn ClassInstance>> {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Object(x) => x,
            _ => panic!("Expected object, got {:?}", x),
        }
    }
}

impl From<JavaValue> for Box<dyn ClassInstance> {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Object(x) => x.unwrap(),
            _ => panic!("Expected object, got {:?}", x),
        }
    }
}

impl From<JavaValue> for () {
    fn from(x: JavaValue) -> Self {
        match x {
            JavaValue::Void => (),
            _ => panic!("Expected void, got {:?}", x),
        }
    }
}

impl From<bool> for JavaValue {
    fn from(x: bool) -> Self {
        JavaValue::Boolean(x)
    }
}

impl From<i8> for JavaValue {
    fn from(x: i8) -> Self {
        JavaValue::Byte(x)
    }
}

impl From<JavaChar> for JavaValue {
    fn from(x: JavaChar) -> Self {
        JavaValue::Char(x)
    }
}

impl From<i16> for JavaValue {
    fn from(x: i16) -> Self {
        JavaValue::Short(x)
    }
}

impl From<i32> for JavaValue {
    fn from(x: i32) -> Self {
        JavaValue::Int(x)
    }
}

impl From<i64> for JavaValue {
    fn from(x: i64) -> Self {
        JavaValue::Long(x)
    }
}

impl From<f32> for JavaValue {
    fn from(x: f32) -> Self {
        JavaValue::Float(x)
    }
}

impl From<f64> for JavaValue {
    fn from(x: f64) -> Self {
        JavaValue::Double(x)
    }
}

impl From<Box<dyn ClassInstance>> for JavaValue {
    fn from(x: Box<dyn ClassInstance>) -> Self {
        JavaValue::Object(Some(x))
    }
}

impl From<Option<Box<dyn ClassInstance>>> for JavaValue {
    fn from(x: Option<Box<dyn ClassInstance>>) -> Self {
        JavaValue::Object(x)
    }
}