use crate::app_interface::{Battle, Pokemon}; use crate::handling::cached_value::CachedValue; use crate::handling::Cacheable; use crate::{ cached_value, cached_value_getters, wasm_value_getters, ExternRef, ExternalReferenceType, }; use alloc::rc::Rc; struct BattleSideInner { reference: ExternRef, side_index: CachedValue, pokemon_per_side: CachedValue, battle: CachedValue, } #[derive(Clone)] pub struct BattleSide { inner: Rc, } impl BattleSide { #[cfg(not(feature = "mock_data"))] pub fn new(reference: ExternRef) -> Self { Self::from_ref(reference, &|reference| Self { inner: Rc::new(BattleSideInner { reference, side_index: cached_value!({ battleside_get_side_index(reference) }), pokemon_per_side: cached_value!({ battleside_get_pokemon_per_side(reference) }), battle: cached_value!({ battleside_get_battle(reference).get_value().unwrap() }), }), }) } cached_value_getters! { pub fn side_index(&self) -> u8; pub fn pokemon_per_side(&self) -> u8; pub fn battle(&self) -> Battle; } #[cfg(not(feature = "mock_data"))] pub fn get_pokemon(&self, index: usize) -> Option { unsafe { battleside_get_pokemon(self.inner.reference, index).get_value() } } } wasm_value_getters! { BattleSide, pub fn has_fled_battle(&self) -> bool; pub fn is_defeated(&self) -> bool; } crate::handling::cacheable::cacheable!(BattleSide); #[cfg(not(feature = "mock_data"))] impl ExternalReferenceType for BattleSide { fn from_extern_value(reference: ExternRef) -> Self { Self::new(reference) } } #[cfg(not(feature = "mock_data"))] extern "wasm" { fn battleside_get_side_index(r: ExternRef) -> u8; fn battleside_get_pokemon_per_side(r: ExternRef) -> u8; fn battleside_get_battle(r: ExternRef) -> ExternRef; fn battleside_get_pokemon(r: ExternRef, index: usize) -> ExternRef; }