pub struct Keywords(/* private fields */);
Expand description
A list of Key
-Value
pairs representing functional information
about locale’s internationalization preferences.
Here are examples of fields used in Unicode:
hc
- Hour Cycle (h11
,h12
,h23
,h24
)ca
- Calendar (buddhist
,gregory
, …)fw
- First Day Of the Week (sun
,mon
,sat
, …)
You can find the full list in Unicode BCP 47 U Extension
section of LDML.
§Examples
Manually build up a Keywords
object:
use icu::locid::extensions::unicode::{key, value, Keywords};
let keywords = [(key!("hc"), value!("h23"))]
.into_iter()
.collect::<Keywords>();
assert_eq!(&keywords.to_string(), "hc-h23");
Access a Keywords
object from a Locale
:
use icu::locid::{
extensions::unicode::{key, value},
Locale,
};
let loc: Locale = "und-u-hc-h23-kc-true".parse().expect("Valid BCP-47");
assert_eq!(loc.extensions.unicode.keywords.get(&key!("ca")), None);
assert_eq!(
loc.extensions.unicode.keywords.get(&key!("hc")),
Some(&value!("h23"))
);
assert_eq!(
loc.extensions.unicode.keywords.get(&key!("kc")),
Some(&value!("true"))
);
assert_eq!(loc.extensions.unicode.keywords.to_string(), "hc-h23-kc");
Implementations§
Source§impl Keywords
impl Keywords
Sourcepub const fn new_single(key: Key, value: Value) -> Self
pub const fn new_single(key: Key, value: Value) -> Self
Create a new list of key-value pairs having exactly one pair, callable in a const
context.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if there are no keywords.
§Examples
use icu::locid::locale;
use icu::locid::Locale;
let loc1 = Locale::try_from_bytes(b"und-t-h0-hybrid").unwrap();
let loc2 = locale!("und-u-ca-buddhist");
assert!(loc1.extensions.unicode.keywords.is_empty());
assert!(!loc2.extensions.unicode.keywords.is_empty());
Sourcepub fn contains_key<Q>(&self, key: &Q) -> bool
pub fn contains_key<Q>(&self, key: &Q) -> bool
Sourcepub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value>
pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut Value>
Returns a mutable reference to the Value
corresponding to the Key
.
Returns None
if the key doesn’t exist or if the key has no value.
§Examples
use icu::locid::extensions::unicode::{key, value, Keywords};
let mut keywords = [(key!("ca"), value!("buddhist"))]
.into_iter()
.collect::<Keywords>();
if let Some(value) = keywords.get_mut(&key!("ca")) {
*value = value!("gregory");
}
assert_eq!(keywords.get(&key!("ca")), Some(&value!("gregory")));
Sourcepub fn set(&mut self, key: Key, value: Value) -> Option<Value>
pub fn set(&mut self, key: Key, value: Value) -> Option<Value>
Sets the specified keyword, returning the old value if it already existed.
§Examples
use icu::locid::extensions::unicode::{key, value};
use icu::locid::Locale;
let mut loc: Locale = "und-u-hello-ca-buddhist-hc-h12"
.parse()
.expect("valid BCP-47 identifier");
let old_value = loc
.extensions
.unicode
.keywords
.set(key!("ca"), value!("japanese"));
assert_eq!(old_value, Some(value!("buddhist")));
assert_eq!(loc, "und-u-hello-ca-japanese-hc-h12".parse().unwrap());
Sourcepub fn remove<Q: Borrow<Key>>(&mut self, key: Q) -> Option<Value>
pub fn remove<Q: Borrow<Key>>(&mut self, key: Q) -> Option<Value>
Removes the specified keyword, returning the old value if it existed.
§Examples
use icu::locid::extensions::unicode::key;
use icu::locid::Locale;
let mut loc: Locale = "und-u-hello-ca-buddhist-hc-h12"
.parse()
.expect("valid BCP-47 identifier");
loc.extensions.unicode.keywords.remove(key!("ca"));
assert_eq!(loc, "und-u-hello-hc-h12".parse().unwrap());
Sourcepub fn clear(&mut self) -> Self
pub fn clear(&mut self) -> Self
Clears all Unicode extension keywords, leaving Unicode attributes.
Returns the old Unicode extension keywords.
§Example
use icu::locid::Locale;
let mut loc: Locale = "und-u-hello-ca-buddhist-hc-h12".parse().unwrap();
loc.extensions.unicode.keywords.clear();
assert_eq!(loc, "und-u-hello".parse().unwrap());
Sourcepub fn retain_by_key<F>(&mut self, predicate: F)
pub fn retain_by_key<F>(&mut self, predicate: F)
Retains a subset of keywords as specified by the predicate function.
§Examples
use icu::locid::extensions::unicode::key;
use icu::locid::Locale;
let mut loc: Locale = "und-u-ca-buddhist-hc-h12-ms-metric".parse().unwrap();
loc.extensions
.unicode
.keywords
.retain_by_key(|&k| k == key!("hc"));
assert_eq!(loc, "und-u-hc-h12".parse().unwrap());
loc.extensions
.unicode
.keywords
.retain_by_key(|&k| k == key!("ms"));
assert_eq!(loc, Locale::UND);
Sourcepub fn strict_cmp(&self, other: &[u8]) -> Ordering
pub fn strict_cmp(&self, other: &[u8]) -> Ordering
Compare this Keywords
with BCP-47 bytes.
The return value is equivalent to what would happen if you first converted this
Keywords
to a BCP-47 string and then performed a byte comparison.
This function is case-sensitive and results in a total order, so it is appropriate for
binary search. The only argument producing Ordering::Equal
is self.to_string()
.
§Examples
use icu::locid::Locale;
use std::cmp::Ordering;
let bcp47_strings: &[&str] =
&["ca-hebrew", "ca-japanese", "ca-japanese-nu-latn", "nu-latn"];
for ab in bcp47_strings.windows(2) {
let a = ab[0];
let b = ab[1];
assert!(a.cmp(b) == Ordering::Less);
let a_kwds = format!("und-u-{}", a)
.parse::<Locale>()
.unwrap()
.extensions
.unicode
.keywords;
assert!(a_kwds.strict_cmp(a.as_bytes()) == Ordering::Equal);
assert!(a_kwds.strict_cmp(b.as_bytes()) == Ordering::Less);
}
Sourcepub fn strict_cmp_iter<'l, I>(&self, subtags: I) -> SubtagOrderingResult<I>
👎Deprecated since 1.5.0: if you need this, please file an issue
pub fn strict_cmp_iter<'l, I>(&self, subtags: I) -> SubtagOrderingResult<I>
Compare this Keywords
with an iterator of BCP-47 subtags.
This function has the same equality semantics as Keywords::strict_cmp
. It is intended as
a more modular version that allows multiple subtag iterators to be chained together.
For an additional example, see SubtagOrderingResult
.
§Examples
use icu::locid::locale;
use std::cmp::Ordering;
let subtags: &[&[u8]] = &[b"ca", b"buddhist"];
let kwds = locale!("und-u-ca-buddhist").extensions.unicode.keywords;
assert_eq!(
Ordering::Equal,
kwds.strict_cmp_iter(subtags.iter().copied()).end()
);
let kwds = locale!("und").extensions.unicode.keywords;
assert_eq!(
Ordering::Less,
kwds.strict_cmp_iter(subtags.iter().copied()).end()
);
let kwds = locale!("und-u-nu-latn").extensions.unicode.keywords;
assert_eq!(
Ordering::Greater,
kwds.strict_cmp_iter(subtags.iter().copied()).end()
);
Trait Implementations§
Source§impl Display for Keywords
impl Display for Keywords
This trait is implemented for compatibility with fmt!
.
To create a string, Writeable::write_to_string
is usually more efficient.
Source§impl Ord for Keywords
impl Ord for Keywords
Source§impl PartialOrd for Keywords
impl PartialOrd for Keywords
Source§impl Writeable for Keywords
impl Writeable for Keywords
Source§fn write_to<W: Write + ?Sized>(&self, sink: &mut W) -> Result
fn write_to<W: Write + ?Sized>(&self, sink: &mut W) -> Result
write_to_parts
, and discards any
Part
annotations.Source§fn writeable_length_hint(&self) -> LengthHint
fn writeable_length_hint(&self) -> LengthHint
Source§fn write_to_parts<S>(&self, sink: &mut S) -> Result<(), Error>where
S: PartsWrite + ?Sized,
fn write_to_parts<S>(&self, sink: &mut S) -> Result<(), Error>where
S: PartsWrite + ?Sized,
Part
annotations to the given sink. Errors from the
sink are bubbled up. The default implementation delegates to write_to
,
and doesn’t produce any Part
annotations.