#[macro_use] extern crate mlua_derive; use std::str::FromStr; use dnd_dice_roller::{dice::{Dice, DiceResult}, error::DiceError}; use mlua::{prelude::*, Table, Error}; use std::sync::Arc; fn roll(lua: &Lua, roll: String) -> LuaResult { match dice_roll(roll) { Ok(res) => { let result = lua.create_table()?; if res.final_result.len() == 1 { result.set("result", res.final_result[0])?; } else { result.set("result", res.final_result)?; } result.set("first", res.dice_results.first_roll)?; if let Some(roll) = res.dice_results.second_roll { result.set("second", roll)?; } Ok(result) } Err(why) => { Err(Error::ExternalError(Arc::new(why))) } } } fn dice_roll>(roll: T) -> Result { let mut dice = Dice::from_str(&roll.into())?; if dice.number_of_dice_to_roll > 100 { dice.number_of_dice_to_roll = 100; } if dice.sides > 100 { dice.sides = 100 } if dice.sides == 0 { dice.sides = 6; } Ok(dice.roll_dice()) } #[lua_module] fn dnd_dice(lua: &Lua) -> LuaResult { Ok(lua.create_function(roll)?) }