55 lines
1.3 KiB
Rust
55 lines
1.3 KiB
Rust
#[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<Table> {
|
|
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<T: Into<String>>(roll: T) -> Result<DiceResult, DiceError> {
|
|
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<LuaFunction> {
|
|
Ok(lua.create_function(roll)?)
|
|
}
|