Skip to main content

luaur_analyze_cli/methods/
file_navigation_context_navigation_context_trait.rs

1//! `NavigationContextTrait` impl wiring `FileNavigationContext` to the per-method
2//! ports of `CLI/src/AnalyzeRequirer.cpp`. The C++ `: NavigationContext` base
3//! relationship is realized here, in lieu of struct embedding.
4
5use crate::records::file_navigation_context::FileNavigationContext;
6use alloc::rc::Rc;
7use alloc::string::String;
8use core::ffi::c_int;
9use core::ffi::c_void;
10use luaur_require::enums::config_behavior::ConfigBehavior;
11use luaur_require::enums::navigate_result::NavigateResult;
12use luaur_require::records::navigation_context::{ConfigStatus, NavigationContextTrait};
13use luaur_vm::functions::lua_setthreaddata::lua_setthreaddata;
14use luaur_vm::type_aliases::lua_state::lua_State;
15
16impl NavigationContextTrait for FileNavigationContext {
17    fn reset_to_requirer(&mut self) -> NavigateResult {
18        unsafe {
19            crate::methods::file_navigation_context_reset_to_requirer::file_navigation_context_reset_to_requirer(self)
20        }
21    }
22
23    fn jump_to_alias(&mut self, path: &str) -> NavigateResult {
24        unsafe {
25            crate::methods::file_navigation_context_jump_to_alias::file_navigation_context_jump_to_alias(
26                self,
27                &String::from(path),
28            )
29        }
30    }
31
32    fn to_parent(&mut self) -> NavigateResult {
33        unsafe {
34            crate::methods::file_navigation_context_to_parent::file_navigation_context_to_parent(
35                self,
36            )
37        }
38    }
39
40    fn to_child(&mut self, component: &str) -> NavigateResult {
41        unsafe {
42            crate::methods::file_navigation_context_to_child::file_navigation_context_to_child(
43                self,
44                &String::from(component),
45            )
46        }
47    }
48
49    fn get_config_status(&self) -> ConfigStatus {
50        unsafe {
51            crate::methods::file_navigation_context_get_config_status::file_navigation_context_get_config_status(self)
52        }
53    }
54
55    fn get_config_behavior(&self) -> ConfigBehavior {
56        unsafe {
57            crate::methods::file_navigation_context_get_config_behavior::file_navigation_context_get_config_behavior(self)
58        }
59    }
60
61    fn get_alias(&self, alias: &str) -> Option<String> {
62        unsafe {
63            crate::methods::file_navigation_context_get_alias::file_navigation_context_get_alias(
64                self,
65                &String::from(alias),
66            )
67        }
68    }
69
70    fn get_config(&self) -> Option<String> {
71        unsafe {
72            crate::methods::file_navigation_context_get_config::file_navigation_context_get_config(
73                self,
74            )
75        }
76    }
77
78    /// C++ `navigationContext.luauConfigInit = [&info](lua_State* L) { lua_setthreaddata(L, &info); };`
79    /// (`CLI/src/Analyze.cpp:194-197`).
80    fn luau_config_init(&self) -> Option<Rc<dyn Fn(*mut lua_State)>> {
81        let info_ptr = self.interrupt_info.as_ref()?.as_ref()
82            as *const crate::records::luau_config_interrupt_info::LuauConfigInterruptInfo
83            as *mut c_void;
84        Some(Rc::new(move |l: *mut lua_State| unsafe {
85            lua_setthreaddata(l, info_ptr);
86        }))
87    }
88
89    /// C++ `navigationContext.luauConfigInterrupt = [](lua_State* L, int gc) { ... };`
90    /// (`CLI/src/Analyze.cpp:198-205`) — identical body to the config-resolver interrupt.
91    fn luau_config_interrupt(
92        &self,
93    ) -> Option<unsafe extern "C-unwind" fn(l: *mut lua_State, gc: c_int)> {
94        self.interrupt_info.as_ref()?;
95        Some(crate::methods::cli_config_resolver_read_config_rec::luau_config_interrupt)
96    }
97}