dnd_dice/src/lib.rs

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)?)
}