diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7b4de2ca7..72cb03b2a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,6 +35,8 @@ jobs: container: image: ${{ matrix.container }} steps: + - name: Install Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Install aarch64-linux-gnu if: ${{ matrix.platform == 'linux-arm64' && matrix.libc != 'musl' }} run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 12e614e5b..e03acc9be 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,8 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + - name: Install Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Build for Windows if: ${{ matrix.target == 'windows' }} run: .\make.bat diff --git a/make.lua b/make.lua index f51b6c356..2d5e90e5f 100644 --- a/make.lua +++ b/make.lua @@ -15,11 +15,13 @@ if lm.sanitize then end local includeCodeFormat = true +local rustExtension = true require "make.detect_platform" lm:import "3rd/bee.lua/make.lua" lm:import "make/code_format.lua" +lm:import "make/rust_lib.lua" lm:source_set 'lpeglabel' { rootdir = '3rd', @@ -56,6 +58,15 @@ lm:executable "lua-language-server" { local platform = require 'bee.platform' local exe = platform.os == 'windows' and ".exe" or "" +local lualsRust = "" +if platform.os == 'windows' then + lualsRust = "luals_rust.dll" +elseif platform.os == 'linux' then + lualsRust = "libluals_rust.so" +elseif platform.os == 'macos' then + lualsRust = "libluals_rust.dylib" +end + lm:copy "copy_lua-language-server" { inputs = "$bin/lua-language-server" .. exe, @@ -67,6 +78,17 @@ lm:copy "copy_bootstrap" { outputs = "bin/main.lua", } +lm:build "rust-lib" { + rule = "cargo-build", + inputs = "rustlib", +} + +lm:copy "copy_rust-lib" { + deps = { "rust-lib" }, + inputs = "rustlib/target/release/" .. lualsRust, + outputs = "bin/" .. lualsRust, +} + lm:msvc_copydll 'copy_vcrt' { type = "vcrt", outputs = "bin", @@ -77,6 +99,7 @@ lm:phony "all" { "lua-language-server", "copy_lua-language-server", "copy_bootstrap", + rustExtension and "copy_rust-lib" or nil }, windows = { deps = { diff --git a/make/rust_lib.lua b/make/rust_lib.lua new file mode 100644 index 000000000..c69944c29 --- /dev/null +++ b/make/rust_lib.lua @@ -0,0 +1,8 @@ +local lm = require "luamake" + +lm:rule "cargo-build" { + args = { "cargo", "build", "--manifest-path", "$in/Cargo.toml", "--release" }, + description = "cargo build: $in.", + pool = "console", +} + diff --git a/rustlib/.gitignore b/rustlib/.gitignore new file mode 100644 index 000000000..4fffb2f89 --- /dev/null +++ b/rustlib/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/rustlib/Cargo.toml b/rustlib/Cargo.toml new file mode 100644 index 000000000..6692f6793 --- /dev/null +++ b/rustlib/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "luals_rust" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type = ["cdylib"] + +[dependencies] +mlua = { version = "0.10.0-beta.1", features = ["lua54", "module"] } \ No newline at end of file diff --git a/rustlib/src/lib.rs b/rustlib/src/lib.rs new file mode 100644 index 000000000..a49338646 --- /dev/null +++ b/rustlib/src/lib.rs @@ -0,0 +1,13 @@ +use mlua::prelude::*; + +fn hello(_: &Lua, name: String) -> LuaResult<()> { + println!("hello, {}!", name); + Ok(()) +} + +#[mlua::lua_module] +fn luals_rust(lua: &Lua) -> LuaResult { + let exports = lua.create_table()?; + exports.set("hello", lua.create_function(hello)?)?; + Ok(exports) +} \ No newline at end of file diff --git a/script/provider/rust-lib.lua b/script/provider/rust-lib.lua new file mode 100644 index 000000000..7ea791e41 --- /dev/null +++ b/script/provider/rust-lib.lua @@ -0,0 +1,12 @@ +local suc, rust = pcall(require, 'luals_rust') +if not suc then + return +end + +local m = {} + +function m.hello(str) + return rust.hello(str) +end + +return m diff --git a/test/basic/init.lua b/test/basic/init.lua index 9030cf6dd..33c3a7808 100644 --- a/test/basic/init.lua +++ b/test/basic/init.lua @@ -1,2 +1,3 @@ require 'basic.textmerger' require 'basic.filewatch' +require 'basic.rust' diff --git a/test/basic/rust.lua b/test/basic/rust.lua new file mode 100644 index 000000000..2b9129d82 --- /dev/null +++ b/test/basic/rust.lua @@ -0,0 +1,3 @@ +local m = require "provider.rust-lib" + +m.hello("world")