diff --git a/Cargo.lock b/Cargo.lock index 5bc12bed..aefefcf7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -23,7 +23,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cipher", "cpufeatures", ] @@ -206,7 +206,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" dependencies = [ "async-lock", - "cfg-if", + "cfg-if 1.0.0", "concurrent-queue", "futures-io", "futures-lite", @@ -254,7 +254,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", @@ -318,7 +318,7 @@ dependencies = [ "arrayref", "arrayvec 0.7.6", "cc", - "cfg-if", + "cfg-if 1.0.0", "constant_time_eq 0.3.1", "digest", ] @@ -433,6 +433,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -650,7 +656,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -744,7 +750,7 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", ] [[package]] @@ -758,6 +764,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "dirs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" +dependencies = [ + "cfg-if 0.1.10", + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + [[package]] name = "dirs-sys" version = "0.4.1" @@ -805,7 +832,7 @@ version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -890,7 +917,7 @@ version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "rustix", "windows-sys 0.52.0", ] @@ -999,7 +1026,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb949699c3e4df3a183b1d2142cb24277057055ed23c68ed58894f76c517223" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "log", "rustversion", @@ -1022,7 +1049,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -1033,7 +1060,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] @@ -1432,7 +1459,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-targets 0.52.6", ] @@ -1490,7 +1517,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "generator", "scoped-tls", "tracing", @@ -1660,6 +1687,7 @@ dependencies = [ "mlua-luau-scheduler", "once_cell", "rbx_cookie", + "roblox_install", ] [[package]] @@ -1763,7 +1791,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "digest", ] @@ -1844,7 +1872,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebe026d6bd1583a9cf9080e189030ddaea7e6f5f0deb366a8e26f8a26c4135b8" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.0", "luau0-src", "pkg-config", ] @@ -1865,7 +1893,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ "bitflags 2.6.0", - "cfg-if", + "cfg-if 1.0.0", "cfg_aliases", "libc", ] @@ -1992,7 +2020,7 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall 0.5.7", "smallvec", @@ -2101,7 +2129,7 @@ version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", @@ -2249,7 +2277,7 @@ checksum = "d8a61b073240f4c13b1e780a8999a113dfa28bc93f2cf9fc41c6f36e7aceb5bf" dependencies = [ "byteorder 0.5.3", "cookie", - "dirs", + "dirs 1.0.5", "log", "plist", "winapi", @@ -2447,7 +2475,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.0", "getrandom 0.2.15", "libc", "spin", @@ -2477,6 +2505,17 @@ dependencies = [ "serde", ] +[[package]] +name = "roblox_install" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bb8c693a387f1ae8d2026d82d8b0c175cc4777b97c1f7b12fdb3be595bb13" +dependencies = [ + "dirs 2.0.2", + "thiserror", + "winreg 0.6.2", +] + [[package]] name = "rust-argon2" version = "0.8.3" @@ -2613,7 +2652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7803e8936da37efd9b6d4478277f4b2b9bb5cdb37a113e8d63222e58da647e63" dependencies = [ "bitflags 2.6.0", - "cfg-if", + "cfg-if 1.0.0", "clipboard-win", "fd-lock", "home", @@ -2784,7 +2823,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -2801,7 +2840,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -3008,7 +3047,7 @@ version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "once_cell", "rustix", @@ -3041,7 +3080,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", ] @@ -3503,7 +3542,7 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", "wasm-bindgen-macro", ] @@ -3529,7 +3568,7 @@ version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -3850,6 +3889,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +dependencies = [ + "winapi", +] + [[package]] name = "winreg" version = "0.10.1" @@ -3865,7 +3913,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-sys 0.48.0", ] diff --git a/crates/lune-std-roblox/Cargo.toml b/crates/lune-std-roblox/Cargo.toml index 599a768a..c2eb1143 100644 --- a/crates/lune-std-roblox/Cargo.toml +++ b/crates/lune-std-roblox/Cargo.toml @@ -18,6 +18,7 @@ mlua-luau-scheduler = { version = "0.0.2", path = "../mlua-luau-scheduler" } once_cell = "1.17" rbx_cookie = { version = "0.1.4", default-features = false } +roblox_install = "1.0.0" lune-utils = { version = "0.1.3", path = "../lune-utils" } lune-roblox = { version = "0.1.4", path = "../lune-roblox" } diff --git a/crates/lune-std-roblox/src/lib.rs b/crates/lune-std-roblox/src/lib.rs index d1f6a979..ec574b73 100644 --- a/crates/lune-std-roblox/src/lib.rs +++ b/crates/lune-std-roblox/src/lib.rs @@ -13,6 +13,7 @@ use lune_roblox::{ static REFLECTION_DATABASE: OnceCell = OnceCell::new(); use lune_utils::TableBuilder; +use roblox_install::RobloxStudio; /** Creates the `roblox` standard library module. @@ -39,6 +40,10 @@ pub fn module(lua: &Lua) -> LuaResult { .with_function("getReflectionDatabase", get_reflection_database)? .with_function("implementProperty", implement_property)? .with_function("implementMethod", implement_method)? + .with_function("studioApplicationPath", studio_application_path)? + .with_function("studioContentPath", studio_content_path)? + .with_function("studioPluginPath", studio_plugin_path)? + .with_function("studioBuiltinPluginPath", studio_builtin_plugin_path)? .build_readonly() } @@ -147,3 +152,27 @@ fn implement_method( InstanceRegistry::insert_method(lua, &class_name, &method_name, method).into_lua_err()?; Ok(()) } + +fn studio_application_path(_: &Lua, _: ()) -> LuaResult { + RobloxStudio::locate() + .map(|rs| rs.application_path().display().to_string()) + .map_err(LuaError::external) +} + +fn studio_content_path(_: &Lua, _: ()) -> LuaResult { + RobloxStudio::locate() + .map(|rs| rs.content_path().display().to_string()) + .map_err(LuaError::external) +} + +fn studio_plugin_path(_: &Lua, _: ()) -> LuaResult { + RobloxStudio::locate() + .map(|rs| rs.plugins_path().display().to_string()) + .map_err(LuaError::external) +} + +fn studio_builtin_plugin_path(_: &Lua, _: ()) -> LuaResult { + RobloxStudio::locate() + .map(|rs| rs.built_in_plugins_path().display().to_string()) + .map_err(LuaError::external) +} diff --git a/types/roblox.luau b/types/roblox.luau index b79ad605..44285981 100644 --- a/types/roblox.luau +++ b/types/roblox.luau @@ -504,4 +504,95 @@ roblox.Instance = (nil :: any) :: { new: ((className: "DataModel") -> DataModel) & ((className: string) -> Instance), } +--[=[ + @within Roblox + @tag must_use + + Returns the path to the system's Roblox Studio executable. + + There is no guarantee that this will exist, but if Studio is installed this + is where it will be. + + ### Example usage + + ```lua + local roblox = require("@lune/roblox") + + local pathToStudio = roblox.studioApplicationPath() + print("Studio is located at:", pathToStudio) + ``` +]=] +function roblox.studioApplicationPath(): string + return nil :: any +end + +--[=[ + @within Roblox + @tag must_use + + Returns the path to the `Content` folder of the system's current Studio + install. + + This folder will always exist if Studio is installed. + + ### Example usage + + ```lua + local roblox = require("@lune/roblox") + + local pathToContent = roblox.studioContentPath() + print("Studio's content folder is located at:", pathToContent) + ``` +]=] +function roblox.studioContentPath(): string + return nil :: any +end + +--[=[ + @within Roblox + @tag must_use + + Returns the path to the `plugin` folder of the system's current Studio + install. This is the path where local plugins are installed. + + This folder may not exist if the user has never installed a local plugin. + It will also not necessarily take into account custom plugin directories + set from Studio. + + ### Example usage + + ```lua + local roblox = require("@lune/roblox") + + local pathToPluginFolder = roblox.studioPluginPath() + print("Studio's plugin folder is located at:", pathToPluginFolder) + ``` +]=] +function roblox.studioPluginPath(): string + return nil :: any +end + +--[=[ + @within Roblox + @tag must_use + + Returns the path to the `BuiltInPlugin` folder of the system's current + Studio install. This is the path where built-in plugins like the ToolBox + are installed. + + This folder will always exist if Studio is installed. + + ### Example usage + + ```lua + local roblox = require("@lune/roblox") + + local pathToPluginFolder = roblox.studioBuiltinPluginPath() + print("Studio's built-in plugin folder is located at:", pathToPluginFolder) + ``` +]=] +function roblox.studioBuiltinPluginPath(): string + return nil :: any +end + return roblox