jvm 0.1.1

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

use crate::{Result, class_instance::ClassInstance, jvm::Jvm};

use super::JavaLangString;

pub struct JavaLangClassLoader;

impl JavaLangClassLoader {
    pub async fn get_system_class_loader(jvm: &Jvm) -> Result<Box<dyn ClassInstance>> {
        let system_class_loader = jvm
            .invoke_static("java/lang/ClassLoader", "getSystemClassLoader", "()Ljava/lang/ClassLoader;", ())
            .await?;

        Ok(system_class_loader)
    }

    #[allow(clippy::borrowed_box)]
    pub async fn load_class(jvm: &Jvm, this: &Box<dyn ClassInstance>, class_name: &str) -> Result<Option<Box<dyn ClassInstance>>> {
        let binary_name = class_name.replace('/', ".");
        let java_class_name = JavaLangString::from_rust_string(jvm, &binary_name).await?;

        let java_class: Option<Box<dyn ClassInstance>> = jvm
            .invoke_virtual(
                this,
                "java/lang/ClassLoader",
                "loadClass",
                "(Ljava/lang/String;)Ljava/lang/Class;",
                (java_class_name,),
            )
            .await?;

        Ok(java_class)
    }

    #[allow(clippy::borrowed_box)]
    pub async fn get_resource_as_stream(jvm: &Jvm, this: &Box<dyn ClassInstance>, name: &str) -> Result<Option<Box<dyn ClassInstance>>> {
        let java_name = JavaLangString::from_rust_string(jvm, name).await?;

        let java_resource: Option<Box<dyn ClassInstance>> = jvm
            .invoke_virtual(
                this,
                "java/lang/ClassLoader",
                "getResourceAsStream",
                "(Ljava/lang/String;)Ljava/io/InputStream;",
                (java_name,),
            )
            .await?;

        Ok(java_resource)
    }
}