Skip to main content

rblx_godot/instance/
service_provider.rs

1use 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 // unimplemented
52    }
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}