From f5a8e16ce003a073d8e2d00016901b182f1fb17c Mon Sep 17 00:00:00 2001 From: projectmoon Date: Tue, 2 Feb 2021 22:02:43 +0000 Subject: [PATCH] Slight refactor of calculate_dice_amount. Lazy error handling. Use unwrap_or_else instead of unwrap_or to prevent unnecessary error string creation. Also some changes to make the code a bit more readable. --- src/dice.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/dice.rs b/src/dice.rs index 5489255..ad1eae6 100644 --- a/src/dice.rs +++ b/src/dice.rs @@ -6,26 +6,27 @@ use crate::parser::Amount; use crate::parser::Element as NewElement; use futures::stream::{self, StreamExt, TryStreamExt}; -//New hotness +/// Calculate the amount of dice to roll by consulting the database +/// and replacing variables with corresponding amounts. Errors out if +/// it cannot find a variable defined, or if the database errors. pub async fn calculate_dice_amount(amounts: &[Amount], ctx: &Context<'_>) -> Result { let stream = stream::iter(amounts); let key = UserAndRoom(&ctx.username, ctx.room.id.as_str()); let variables = &ctx.db.variables.get_user_variables(&key)?; use DiceRollingError::VariableNotFound; - let dice_amount: Result = stream + let dice_amount: i32 = stream .then(|amount| async move { match &amount.element { - NewElement::Number(num_dice) => Ok(*num_dice * amount.operator.mult()), + NewElement::Number(num_dice) => Ok(num_dice * amount.operator.mult()), NewElement::Variable(variable) => variables .get(variable) - .ok_or(VariableNotFound(variable.clone().to_string())) - .map(|i| *i) - .map_err(|e| e.into()), + .ok_or_else(|| VariableNotFound(variable.clone())) + .map(|i| *i), } }) .try_fold(0, |total, num_dice| async move { Ok(total + num_dice) }) - .await; + .await?; - dice_amount + Ok(dice_amount) }