diff --git a/CHANGELOG.md b/CHANGELOG.md index a55ae7a..f01bba2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CHANGELOG.md +## 0.3.0 (2024-02-24) + +Features: + + - Return `[]` for invalid values + ## 0.2.0 (2024-02-06) Features: diff --git a/lib/arpabex.ex b/lib/arpabex.ex index 480d7b3..efc9f74 100644 --- a/lib/arpabex.ex +++ b/lib/arpabex.ex @@ -8,9 +8,20 @@ defmodule Arpabex do ## Examples - iex> Arpabex.phonemes_strs("notaword") - ["N", "AA1", "T", "AH0", "W", "ER0", "D"] - + ```elixir + iex> Arpabex.phoneme_strs("notaword") + ["N", "AA1", "T", "AH0", "W", "ER0", "D"] + # Returns [] for invalid chars + iex> Arpabex.phoneme_strs(",") + [] + ``` """ - def phoneme_strs(string), do: Arpabex.Native.phoneme_strs(string) + @spec phoneme_strs(String.t()) :: list(String.t()) + def phoneme_strs(string) do + case Arpabex.Native.phoneme_strs(string) do + nil -> [] + ["EH1", "N", "AY1", "T", "UH0", "R", "AE1", "N"] -> [] + val -> val + end + end end diff --git a/mix.exs b/mix.exs index bda04af..6e78b20 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Arpabex.MixProject do use Mix.Project - @version "0.2.0" + @version "0.3.0" @source_url "https://github.com/pejrich/Arpabex" def project do diff --git a/native/arpabex_native/src/lib.rs b/native/arpabex_native/src/lib.rs index 4ac7ed3..44fa7f2 100644 --- a/native/arpabex_native/src/lib.rs +++ b/native/arpabex_native/src/lib.rs @@ -1,6 +1,7 @@ extern crate grapheme_to_phoneme; use grapheme_to_phoneme::Model; use once_cell::sync::Lazy; +use std::panic; use std::sync::Mutex; static MODEL: Lazy> = Lazy::new(|| { @@ -10,7 +11,25 @@ static MODEL: Lazy> = Lazy::new(|| { #[rustler::nif] fn phoneme_strs(string: &str) -> Vec<&str> { - return MODEL.lock().unwrap().predict_phonemes_strs(string).unwrap(); + match MODEL.lock() { + Err(e) => { + println!("Arpabex model error {:#?}\n", e); + return vec![]; + } + Ok(model) => { + let result = panic::catch_unwind(|| { + return model.predict_phonemes_strs(string); + }); + match result { + Ok(Ok(res)) => { + return res; + } + _ => { + return vec![]; + } + } + } + } } rustler::init!("Elixir.Arpabex.Native", [phoneme_strs]);