From d77bb850ddc77d64d28458e11276434796ff70fb Mon Sep 17 00:00:00 2001 From: Asperatus Date: Sun, 7 May 2023 18:34:48 -0400 Subject: [PATCH] lang: use Box instead of impl Language An overlook I did on the to_language() function caused num2words to require `English` to be returned. Instead of this, we are using a pointer to an element that is a Language on the heap. --- src/lang/en.rs | 15 +++++---------- src/lang/lang.rs | 16 ++++++++-------- src/num2words.rs | 2 +- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/lang/en.rs b/src/lang/en.rs index 2fb4ec1..1bd6995 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -177,7 +177,7 @@ impl English { } impl Language for English { - fn to_cardinal(self, num: BigFloat) -> Result { + fn to_cardinal(&self, num: BigFloat) -> Result { if num.is_inf_pos() { Ok(String::from("infinity")) } else if num.is_inf_neg() { @@ -189,7 +189,7 @@ impl Language for English { } } - fn to_ordinal(self, num: BigFloat) -> Result { + fn to_ordinal(&self, num: BigFloat) -> Result { let cardinal_word = self.to_cardinal(num)?; let mut words: Vec = vec![]; @@ -246,7 +246,7 @@ impl Language for English { Ok(words.join(" ")) } - fn to_ordinal_num(self, num: BigFloat) -> Result { + fn to_ordinal_num(&self, num: BigFloat) -> Result { Ok(format!( "{}{}", num.to_u128().unwrap(), @@ -259,7 +259,7 @@ impl Language for English { )) } - fn to_year(self, num: BigFloat) -> Result { + fn to_year(&self, num: BigFloat) -> Result { if !num.frac().is_zero() { return Err(Num2Err::FloatingYear); } @@ -297,7 +297,7 @@ impl Language for English { Ok(format!("{}{}", year_word, suffix)) } - fn to_currency(self, num: BigFloat, currency: Currency) -> Result { + fn to_currency(&self, num: BigFloat, currency: Currency) -> Result { if num.is_inf() { Ok(format!( "{}an infinity of {}", @@ -638,7 +638,6 @@ mod tests { .to_words(), Ok(String::from("infinity")) ); - assert_eq!( Num2Words::new(f64::NEG_INFINITY) .lang(Lang::English) @@ -646,7 +645,6 @@ mod tests { .to_words(), Ok(String::from("minus infinity")) ); - assert_eq!( Num2Words::new(f64::INFINITY) .lang(Lang::English) @@ -654,7 +652,6 @@ mod tests { .to_words(), Err(num2words::Num2Err::InfiniteOrdinal) ); - assert_eq!( Num2Words::new(f64::INFINITY) .lang(Lang::English) @@ -662,7 +659,6 @@ mod tests { .to_words(), Err(num2words::Num2Err::InfiniteOrdinal) ); - assert_eq!( Num2Words::new(f64::INFINITY) .lang(Lang::English) @@ -670,7 +666,6 @@ mod tests { .to_words(), Err(num2words::Num2Err::InfiniteYear) ); - assert_eq!( Num2Words::new(f64::INFINITY) .lang(Lang::English) diff --git a/src/lang/lang.rs b/src/lang/lang.rs index 01d29bf..532363c 100644 --- a/src/lang/lang.rs +++ b/src/lang/lang.rs @@ -6,11 +6,11 @@ use std::str::FromStr; /// Defines what is a language pub trait Language { - fn to_cardinal(self, num: BigFloat) -> Result; - fn to_ordinal(self, num: BigFloat) -> Result; - fn to_ordinal_num(self, num: BigFloat) -> Result; - fn to_year(self, num: BigFloat) -> Result; - fn to_currency(self, num: BigFloat, currency: Currency) -> Result; + fn to_cardinal(&self, num: BigFloat) -> Result; + fn to_ordinal(&self, num: BigFloat) -> Result; + fn to_ordinal_num(&self, num: BigFloat) -> Result; + fn to_year(&self, num: BigFloat) -> Result; + fn to_currency(&self, num: BigFloat, currency: Currency) -> Result; } /// Languages available in `num2words` @@ -42,7 +42,7 @@ impl FromStr for Lang { } } -pub fn to_language(lang: Lang, preferences: Vec) -> impl Language { +pub fn to_language(lang: Lang, preferences: Vec) -> Box { match lang { Lang::English => { let last = preferences @@ -51,10 +51,10 @@ pub fn to_language(lang: Lang, preferences: Vec) -> impl Language { .last(); if let Some(v) = last { - return lang::English::new(v == "oh", v == "nil"); + return Box::new(lang::English::new(v == "oh", v == "nil")); } - lang::English::new(false, false) + Box::new(lang::English::new(false, false)) } } } diff --git a/src/num2words.rs b/src/num2words.rs index 1428d1f..f9d4231 100644 --- a/src/num2words.rs +++ b/src/num2words.rs @@ -1,4 +1,4 @@ -use crate::{lang, Currency, Lang, Language, Output}; +use crate::{lang, Currency, Lang, Output}; use num_bigfloat::BigFloat; /// Error type returned by the builder