Skip to content

Commit

Permalink
lang: use Box<dyn Language> instead of impl Language
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Ballasi committed May 7, 2023
1 parent 9fb218d commit d77bb85
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 19 deletions.
15 changes: 5 additions & 10 deletions src/lang/en.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ impl English {
}

impl Language for English {
fn to_cardinal(self, num: BigFloat) -> Result<String, Num2Err> {
fn to_cardinal(&self, num: BigFloat) -> Result<String, Num2Err> {
if num.is_inf_pos() {
Ok(String::from("infinity"))
} else if num.is_inf_neg() {
Expand All @@ -189,7 +189,7 @@ impl Language for English {
}
}

fn to_ordinal(self, num: BigFloat) -> Result<String, Num2Err> {
fn to_ordinal(&self, num: BigFloat) -> Result<String, Num2Err> {
let cardinal_word = self.to_cardinal(num)?;

let mut words: Vec<String> = vec![];
Expand Down Expand Up @@ -246,7 +246,7 @@ impl Language for English {
Ok(words.join(" "))
}

fn to_ordinal_num(self, num: BigFloat) -> Result<String, Num2Err> {
fn to_ordinal_num(&self, num: BigFloat) -> Result<String, Num2Err> {
Ok(format!(
"{}{}",
num.to_u128().unwrap(),
Expand All @@ -259,7 +259,7 @@ impl Language for English {
))
}

fn to_year(self, num: BigFloat) -> Result<String, Num2Err> {
fn to_year(&self, num: BigFloat) -> Result<String, Num2Err> {
if !num.frac().is_zero() {
return Err(Num2Err::FloatingYear);
}
Expand Down Expand Up @@ -297,7 +297,7 @@ impl Language for English {
Ok(format!("{}{}", year_word, suffix))
}

fn to_currency(self, num: BigFloat, currency: Currency) -> Result<String, Num2Err> {
fn to_currency(&self, num: BigFloat, currency: Currency) -> Result<String, Num2Err> {
if num.is_inf() {
Ok(format!(
"{}an infinity of {}",
Expand Down Expand Up @@ -638,39 +638,34 @@ mod tests {
.to_words(),
Ok(String::from("infinity"))
);

assert_eq!(
Num2Words::new(f64::NEG_INFINITY)
.lang(Lang::English)
.cardinal()
.to_words(),
Ok(String::from("minus infinity"))
);

assert_eq!(
Num2Words::new(f64::INFINITY)
.lang(Lang::English)
.ordinal()
.to_words(),
Err(num2words::Num2Err::InfiniteOrdinal)
);

assert_eq!(
Num2Words::new(f64::INFINITY)
.lang(Lang::English)
.ordinal_num()
.to_words(),
Err(num2words::Num2Err::InfiniteOrdinal)
);

assert_eq!(
Num2Words::new(f64::INFINITY)
.lang(Lang::English)
.year()
.to_words(),
Err(num2words::Num2Err::InfiniteYear)
);

assert_eq!(
Num2Words::new(f64::INFINITY)
.lang(Lang::English)
Expand Down
16 changes: 8 additions & 8 deletions src/lang/lang.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ use std::str::FromStr;

/// Defines what is a language
pub trait Language {
fn to_cardinal(self, num: BigFloat) -> Result<String, Num2Err>;
fn to_ordinal(self, num: BigFloat) -> Result<String, Num2Err>;
fn to_ordinal_num(self, num: BigFloat) -> Result<String, Num2Err>;
fn to_year(self, num: BigFloat) -> Result<String, Num2Err>;
fn to_currency(self, num: BigFloat, currency: Currency) -> Result<String, Num2Err>;
fn to_cardinal(&self, num: BigFloat) -> Result<String, Num2Err>;
fn to_ordinal(&self, num: BigFloat) -> Result<String, Num2Err>;
fn to_ordinal_num(&self, num: BigFloat) -> Result<String, Num2Err>;
fn to_year(&self, num: BigFloat) -> Result<String, Num2Err>;
fn to_currency(&self, num: BigFloat, currency: Currency) -> Result<String, Num2Err>;
}

/// Languages available in `num2words`
Expand Down Expand Up @@ -42,7 +42,7 @@ impl FromStr for Lang {
}
}

pub fn to_language(lang: Lang, preferences: Vec<String>) -> impl Language {
pub fn to_language(lang: Lang, preferences: Vec<String>) -> Box<dyn Language> {
match lang {
Lang::English => {
let last = preferences
Expand All @@ -51,10 +51,10 @@ pub fn to_language(lang: Lang, preferences: Vec<String>) -> 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))
}
}
}
2 changes: 1 addition & 1 deletion src/num2words.rs
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit d77bb85

Please sign in to comment.