From 84049d8293d55b2c0cb13d2bbf660912324e0744 Mon Sep 17 00:00:00 2001 From: Dmitry Vdovin Date: Mon, 27 Aug 2018 20:29:38 +0200 Subject: [PATCH] Expose vm through `LuaActorBuilder::with_vm` --- src/actor.rs | 8 +++++++- src/builder.rs | 26 ++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/actor.rs b/src/actor.rs index e722be0..54e2b0d 100644 --- a/src/actor.rs +++ b/src/actor.rs @@ -11,7 +11,7 @@ use uuid::Uuid; use message::LuaMessage; -use builder::LuaActorBuilder; +use builder::{LuaActorBuilder, WithVmCallback}; /// Top level struct which holds a lua state for itself. /// @@ -52,8 +52,14 @@ impl LuaActor { started: Option, handle: Option, stopped: Option, + vm_callback: Option> ) -> Result { let vm = Lua::new(); + + if let Some(vm_callback) = vm_callback { + vm_callback(&vm)?; + } + let prelude = include_str!("lua/prelude.lua"); vm.eval::<()>(prelude, Some("Prelude"))?; { diff --git a/src/builder.rs b/src/builder.rs index 8ab2030..3cc0290 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -2,12 +2,15 @@ use std::fs::File; use std::io::prelude::*; use actor::LuaActor; -use rlua::Error as LuaError; +use rlua::{Lua, Error as LuaError}; + +pub type WithVmCallback = Fn(&Lua) -> Result<(), LuaError>; pub struct LuaActorBuilder { started: Option, handle: Option, stopped: Option, + with_vm_callback: Option>, } impl Default for LuaActorBuilder { @@ -17,6 +20,7 @@ impl Default for LuaActorBuilder { started: noop.clone(), handle: noop.clone(), stopped: noop.clone(), + with_vm_callback: None, } } } @@ -26,40 +30,46 @@ impl LuaActorBuilder { LuaActorBuilder::default() } - pub fn on_started(&mut self, filename: &str) -> &mut Self { + pub fn on_started(mut self, filename: &str) -> Self { self.started = Some(read_to_string(filename)); self } - pub fn on_started_with_lua(&mut self, script: &str) -> &mut Self { + pub fn on_started_with_lua(mut self, script: &str) -> Self { self.started = Some(script.to_string()); self } - pub fn on_handle(&mut self, filename: &str) -> &mut Self { + pub fn on_handle(mut self, filename: &str) -> Self { self.handle = Some(read_to_string(filename)); self } - pub fn on_handle_with_lua(&mut self, script: &str) -> &mut Self { + pub fn on_handle_with_lua(mut self, script: &str) -> Self { self.handle = Some(script.to_string()); self } - pub fn on_stopped(&mut self, filename: &str) -> &mut Self { + pub fn on_stopped(mut self, filename: &str) -> Self { self.stopped = Some(read_to_string(filename)); self } - pub fn on_stopped_with_lua(&mut self, script: &str) -> &mut Self { + pub fn on_stopped_with_lua(mut self, script: &str) -> Self { self.stopped = Some(script.to_string()); self } - pub fn build(&self) -> Result { + pub fn with_vm Result<(), LuaError> + 'static>(mut self, callback: F) -> Self { + self.with_vm_callback = Some(Box::new(callback)); + self + } + + pub fn build(self) -> Result { LuaActor::new( self.started.clone(), self.handle.clone(), self.stopped.clone(), + self.with_vm_callback, ) } }