Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/poga/actix-lua
Safe Lua Scripting Environment for Actix
https://github.com/poga/actix-lua
actix actor-model lua rust
Last synced: about 7 hours ago
JSON representation
Safe Lua Scripting Environment for Actix
- Host: GitHub
- URL: https://github.com/poga/actix-lua
- Owner: poga
- License: mit
- Archived: true
- Created: 2018-07-25T10:01:19.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2020-08-01T07:02:10.000Z (over 4 years ago)
- Last Synced: 2024-11-08T09:19:46.868Z (3 months ago)
- Topics: actix, actor-model, lua, rust
- Language: Rust
- Homepage:
- Size: 104 KB
- Stars: 121
- Watchers: 8
- Forks: 13
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# actix-lua
[![Build Status](https://travis-ci.org/poga/actix-lua.svg?branch=master)](https://travis-ci.org/poga/actix-lua)
[![Latest Version](https://img.shields.io/crates/v/actix-lua.svg)](https://crates.io/crates/actix-lua)
[![API Documentation](https://docs.rs/actix-lua/badge.svg)](https://docs.rs/actix-lua)A safe scripting environment for [actix](https://github.com/actix/actix) with the [Lua Programming Language](https://www.lua.org):
* Each `LuaActor` is an isolated Lua VM.
* Communicate between actors with predefined message types: `String`, `Integer`, `Number`, `Boolean`, `Nil`, and `Table`.
* Asynchronous `send` between actors with Lua coroutine.For more info about the "safety", check [rlua's README](https://github.com/kyren/rlua).
## Synopsis
A basic Lua actor
```rust
extern crate actix_lua;
use actix_lua::{LuaActorBuilder, LuaMessage};fn main () {
let addr = LuaActorBuilder::new()
.on_handle_with_lua(r#"return ctx.msg + 42"#)
.build()
.unwrap()
.start();let res = addr.send(LuaMessage:from(100));
// return: 142
}
```You can send messages to other actor asynchronously with `ctx.send`
```rust
struct Callback;
impl Actor for Callback {
type Context = Context;
}impl Handler for Callback {
type Result = LuaMessage;fn handle(&mut self, msg: LuaMessage, _ctx: &mut Context) -> Self::Result {
LuaMessage::String("hello".to_string())
}
}let mut actor = LuaActorBuilder::new()
// create a new LuaActor from a lua script when the actor is started.
// send message to the newly created actor with `ctx.send`, block and wait for its response.
.on_started_with_lua(
r#"
local result = ctx.send("callback, "Hello")
print(result) -- print "hello"
"#).build()
.unwrap();actor.add_recipients("callback", Callback.start().recipient());
actor.start();
```## Install
Add `actix-lua` to your `Cargo.toml`:
```toml
[dependencies]
actix-lua = "0.7"
```## Example
Check [examples](https://github.com/poga/actix-lua/tree/master/examples) directory.
There's also a write-up about analyzing streaming data with actix-lua. [link](https://devpoga.org/post/parsing-streaming-data-actix-lua/)
## Lua Actor
Use [`LuaActor`](https://docs.rs/actix-lua/latest/actix_lua/struct.LuaActor.html) to integrate Lua scripts to your system with actor model.
### Message
In actor model, actors communicate with messages. `LuaMessage` is the only message type accepted by `LuaActor`:
* `LuaMessage` can be converted to/from primitive types with `LuaMessage::from()`.
* Lua types(e.g. number, table) will be convert to `LuaMessage` automatically.### Lua API
**Note**: Avoid declaring global variables in your Lua script. It might conflict with future `actix-lua` update and break your program.
#### `ctx.msg`
The message sent to Lua actor.
#### `ctx.notify(msg)`
Send message `msg` to self.
#### `ctx.notify_later(msg, seconds)`
Send message `msg` to self after specified period of time.
#### `local result = ctx.send(recipient, msg)`
Send message `msg` to `recipient asynchronously and wait for response.
Equivalent to `actix::Recipient.send`.
#### `ctx.do_send(recipient, msg)`
Send message `msg` to `recipient`.
Equivalent to `actix::Recipient.do_send`.
#### `ctx.terminate()`
Terminate actor execution.
## License
The MIT License