Skip to content

Commit ef71027

Browse files
Allow optional arguments (#273)
* Allow optional arguments * rename parameter * add integration test for FluentValue from Option<T>
1 parent 681245b commit ef71027

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

fluent-bundle/src/types/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,15 @@ impl<'source> From<Cow<'source, str>> for FluentValue<'source> {
216216
FluentValue::String(s)
217217
}
218218
}
219+
220+
impl<'source, T> From<Option<T>> for FluentValue<'source>
221+
where
222+
T: Into<FluentValue<'source>>,
223+
{
224+
fn from(v: Option<T>) -> Self {
225+
match v {
226+
Some(v) => v.into(),
227+
None => FluentValue::None,
228+
}
229+
}
230+
}

fluent-bundle/tests/optional_value.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use fluent_bundle::{FluentArgs, FluentBundle, FluentResource};
2+
3+
#[test]
4+
fn test_optional_value() {
5+
let ftl_string = String::from(
6+
"
7+
hello = { $title ->
8+
[Miss] Hello, Miss. { $name }!
9+
[Mr] Hello, Mr. { $name }!
10+
[Mrs] Hello, Mrs. { $name }!
11+
[Ms] Hello, Ms. { $name }!
12+
*[Mx] Hello, Mx. { $name }!
13+
}
14+
",
15+
);
16+
17+
let res = FluentResource::try_new(ftl_string).expect("Could not parse an FTL string.");
18+
let mut bundle = FluentBundle::default();
19+
bundle.set_use_isolating(false);
20+
21+
bundle
22+
.add_resource(res)
23+
.expect("Failed to add FTL resources to the bundle.");
24+
25+
let msg = bundle.get_message("hello").expect("Message doesn't exist.");
26+
27+
let pattern = msg.value().expect("Message has no value.");
28+
29+
// Optional value that matches a non-default variant
30+
let mut args = FluentArgs::new();
31+
let title = Some("Mr");
32+
args.set("title", title);
33+
args.set("name", "John");
34+
35+
let mut errors = vec![];
36+
let value = bundle.format_pattern(pattern, Some(&args), &mut errors);
37+
assert_eq!("Hello, Mr. John!", &value);
38+
39+
// No value, use default variant
40+
let mut args = FluentArgs::new();
41+
let title: Option<&str> = None;
42+
args.set("title", title);
43+
args.set("name", "John");
44+
45+
let mut errors = vec![];
46+
let value = bundle.format_pattern(pattern, Some(&args), &mut errors);
47+
assert_eq!("Hello, Mx. John!", &value);
48+
49+
// Optional value that does not match any variant and therefore reverts to the default variant
50+
let mut args = FluentArgs::new();
51+
let title = Some(2);
52+
args.set("title", title);
53+
args.set("name", "John");
54+
55+
let mut errors = vec![];
56+
let value = bundle.format_pattern(pattern, Some(&args), &mut errors);
57+
assert_eq!("Hello, Mx. John!", &value);
58+
}

0 commit comments

Comments
 (0)