From dc3b5351ddd0f9802e6d7bc3c8e1cd020805f1fb Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Mon, 6 Jul 2020 21:34:48 -0400 Subject: [PATCH] dnd dice --- .envrc | 1 + .gitignore | 2 ++ Cargo.toml | 19 +++++++++++++++++++ shell.nix | 14 ++++++++++++++ src/lib.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 shell.nix create mode 100644 src/lib.rs diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..051d09d --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +eval "$(lorri direnv)" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..e7bdb5a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "dnd_dice" +version = "0.1.0" +authors = ["Christine Dodrill "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib"] + +[dependencies] +dnd_dice_roller = "0.3" +mlua = { version = "0.4", features = ["lua53", "module", "async"] } +mlua_derive = "0.4" + +[profile.release] +lto = true +opt-level = "s" \ No newline at end of file diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..a5cbfbd --- /dev/null +++ b/shell.nix @@ -0,0 +1,14 @@ +{ pkgs ? import { } }: + +pkgs.mkShell { + buildInputs = with pkgs; [ + rustc + cargo + rls + rustfmt + cargo-watch + pkg-config + lua5_3 + bashInteractive + ]; +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..be7545e --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,54 @@ +#[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)?) +}