rblx_godot/instance/
service_provider.rs1use r2g_mlua::prelude::*;
2
3use super::instance::IInstanceComponent;
4use super::{DynInstance, IInstance, ManagedInstance, WeakManagedInstance};
5
6use crate::core::lua_macros::{lua_getter, lua_invalid_argument};
7use crate::core::{inheritance_cast_to, RwLockReadGuard, RwLockWriteGuard};
8use crate::userdata::{ManagedRBXScriptSignal, RBXScriptSignal};
9#[derive(Debug)]
10pub struct ServiceProviderComponent {
11 pub close: ManagedRBXScriptSignal,
12 pub service_added: ManagedRBXScriptSignal,
13 pub service_removing: ManagedRBXScriptSignal,
14}
15pub trait IServiceProvider: IInstance {
16 fn get_service_provider_component(&self) -> RwLockReadGuard<'_, ServiceProviderComponent>;
17 fn get_service_provider_component_mut(&self) -> RwLockWriteGuard<'_, ServiceProviderComponent>;
18 fn get_service(&self, service_name: String) -> LuaResult<ManagedInstance>;
19 fn find_service(&self, service_name: String) -> LuaResult<Option<ManagedInstance>>;
20}
21
22impl IInstanceComponent for ServiceProviderComponent {
23 fn lua_get(self: &mut RwLockReadGuard<'_, Self>, _ptr: &DynInstance, lua: &Lua, key: &String) -> Option<LuaResult<LuaValue>> {
24 match key.as_str() {
25 "Close" => Some(lua_getter!(clone, lua, self.close)),
26 "ServiceAdded" => Some(lua_getter!(clone, lua, self.service_added)),
27 "ServiceRemoving" => Some(lua_getter!(clone, lua, self.service_removing)),
28 "GetService" => lua_getter!(function_opt, lua, |_, (this, name): (ManagedInstance, String)| {
29 let i = inheritance_cast_to!(&*this, dyn IServiceProvider);
30 i.map_err(|_|
31 lua_invalid_argument!("ServiceProvider::GetService",1,self cast Instance to ServiceProvider)
32 )?;
33 unsafe {
34 i.unwrap_unchecked().get_service(name)
35 }
36 }),
37 "FindService" => lua_getter!(function_opt, lua, |_, (this, name): (ManagedInstance, String)| {
38 let i = inheritance_cast_to!(&*this, dyn IServiceProvider);
39 i.map_err(|_|
40 lua_invalid_argument!("ServiceProvider::FindService",1,self cast Instance to ServiceProvider)
41 )?;
42 unsafe {
43 i.unwrap_unchecked().find_service(name)
44 }
45 }),
46 _ => None
47 }
48 }
49
50 fn lua_set(self: &mut RwLockWriteGuard<'_, Self>, _ptr: &DynInstance, _lua: &Lua, _key: &String, _value: &LuaValue) -> Option<LuaResult<()>> {
51 None }
53
54 fn clone(self: &RwLockReadGuard<'_, Self>, _: &Lua, new_ptr: &WeakManagedInstance) -> LuaResult<Self> {
55 Ok(Self::new(new_ptr.clone(), ""))
56 }
57
58 fn new(_ptr: WeakManagedInstance, _class_name: &'static str) -> Self {
59 Self {
60 close: RBXScriptSignal::new(),
61 service_added: RBXScriptSignal::new(),
62 service_removing: RBXScriptSignal::new(),
63 }
64 }
65}