use yog_event::java;
use crate::typeck::surface::SURFACE;
pub struct Service {
pub record: String,
pub on_handle: bool,
}
pub fn service(group: &str, method: &str) -> Option<Service> {
let m = SURFACE.groups.get(group)?.methods.get(method)?.first()?;
Some(Service {
record: format!(
"{}.{}.{}",
java::PACKAGE,
java::SERVICES,
java::record_path(m.domain, method)
),
on_handle: is_handle(group),
})
}
pub fn event(group: &str, name: &str) -> Option<String> {
let plane = SURFACE.groups.get(group)?.planes.get(name)?;
Some(format!(
"{}.{}.{}",
java::PACKAGE,
java::EVENTS,
java::record_path(plane, name)
))
}
pub fn data(name: &str) -> Option<String> {
if let Some((plane, event)) = SURFACE.args_planes.get(name) {
return Some(format!(
"{}.{}.{}",
java::PACKAGE,
java::EVENTS,
java::record_path(plane, event)
));
}
let s = SURFACE.structs.get(name)?;
Some(format!("{}.{}.{}", java::PACKAGE, java::TYPES, s.name))
}
pub fn field(name: &str) -> String {
java::field(&yog_codegen::snake(name))
}
pub fn is_handle(name: &str) -> bool {
yog_event::SUBJECTS.iter().any(|(_, h)| *h == name)
}
pub fn world() -> &'static str {
handle_name::<yog_event::World>()
}
pub fn player() -> &'static str {
handle_name::<yog_event::Player>()
}
fn handle_name<T>() -> &'static str {
let full = std::any::type_name::<T>();
full.rsplit(yog_script_ids::rust::PATH_SEP)
.next()
.unwrap_or(full)
}