use std::marker::PhantomData;
use super::{Java, Member, Nanite, Reply};
pub struct Added<O, T> {
member: Member,
_types: PhantomData<fn() -> (O, T)>,
}
impl<O: Nanite, T: Java + Reply> Added<O, T> {
pub const fn new(name: &'static str) -> Self {
Added {
member: Member::new(O::CLASS, name, <T as Java>::desc),
_types: PhantomData,
}
}
pub fn member(&'static self) -> &'static Member {
&self.member
}
pub fn get(&self, object: &O) -> T {
<T as Reply>::from_reply(self.member.get(object.handle().to_value()))
}
pub fn set(&self, object: &O, value: T) -> bool {
self.member
.set(object.handle().to_value(), value.to_value())
}
}
#[macro_export]
macro_rules! added_field {
($owner:ty, $vis:vis $name:ident : $ty:ty) => {
$vis static $name: $crate::nanite::Added<$owner, $ty> = $crate::nanite::Added::new(
$crate::yog_ids::concatcp!(
$crate::yog_ids::nanite_added::PREFIX,
::core::env!("CARGO_PKG_NAME"),
$crate::yog_ids::nanite_added::SEP,
::core::stringify!($name),
),
);
const _: () = {
#[$crate::ctor::ctor(unsafe, crate_path = $crate::ctor)]
fn declare() {
$crate::nanite::__declare(
$crate::yog_ids::nanite_kind::ADD_FIELD,
$name.member(),
"",
);
}
};
};
}
#[macro_export]
macro_rules! implement {
($owner:ty, $interface:expr) => {
const _: () = {
static CLASS: $crate::nanite::Member = $crate::nanite::Member::new(
<$owner as $crate::nanite::Nanite>::CLASS,
"",
::std::string::String::new,
);
#[$crate::ctor::ctor(unsafe, crate_path = $crate::ctor)]
fn declare() {
$crate::nanite::__declare(
$crate::yog_ids::nanite_kind::IMPLEMENT,
&CLASS,
$interface,
);
}
};
};
}