use alloc::{borrow::Cow, boxed::Box, string::String, vec::Vec};
use core::fmt::Debug;
use dyn_clone::{DynClone, clone_trait_object};
use jvm_types::ClassAccessFlags;
use crate::{ArrayClassDefinition, ClassInstance, Field, JavaValue, Jvm, Method, Result, as_any::AsAny};
#[async_trait::async_trait]
pub trait ClassDefinition: Sync + Send + AsAny + Debug + DynClone {
fn name(&self) -> Cow<'_, str>;
fn super_class_name(&self) -> Option<String>;
fn interface_names(&self) -> Vec<String>;
fn access_flags(&self) -> ClassAccessFlags;
async fn instantiate(&self, jvm: &Jvm) -> Result<Box<dyn ClassInstance>>;
async fn prepare(&self, jvm: &Jvm) -> Result<()>;
fn method(&self, name: &str, descriptor: &str, is_static: bool) -> Option<Box<dyn Method>>;
fn field(&self, name: &str, descriptor: &str, is_static: bool) -> Option<Box<dyn Field>>;
fn fields(&self) -> Vec<Box<dyn Field>>;
fn get_static_field(&self, field: &dyn Field) -> Result<JavaValue>; fn put_static_field(&mut self, field: &dyn Field, value: JavaValue) -> Result<()>;
fn as_array_class_definition(&self) -> Option<&dyn ArrayClassDefinition> {
None
}
}
clone_trait_object!(ClassDefinition);