icu_locid/
ordering.rs

1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5//! Utilities for performing ordering operations on locales.
6
7use core::cmp::Ordering;
8
9/// The result of a subtag iterator comparison operation.
10///
11/// See [`Locale::strict_cmp_iter`].
12///
13/// # Examples
14///
15/// Check whether a stream of subtags contains two expected locales back-to-back:
16///
17/// ```
18/// use icu::locid::{locale, SubtagOrderingResult};
19/// use std::cmp::Ordering;
20///
21/// let subtags = b"en-US-it-IT".split(|b| *b == b'-');
22/// let locales = [locale!("en-US"), locale!("it-IT")];
23/// let mut result = SubtagOrderingResult::Subtags(subtags);
24/// for loc in locales.iter() {
25///     match result {
26///         SubtagOrderingResult::Subtags(it) => {
27///             result = loc.strict_cmp_iter(it);
28///         }
29///         SubtagOrderingResult::Ordering(ord) => break,
30///     }
31/// }
32///
33/// assert_eq!(Ordering::Equal, result.end());
34/// ```
35///
36/// [`Locale::strict_cmp_iter`]: crate::Locale::strict_cmp_iter
37#[allow(clippy::exhaustive_enums)] // well-defined exhaustive enum semantics
38#[derive(Debug)]
39#[deprecated(since = "1.5.0", note = "if you need this, please file an issue")]
40pub enum SubtagOrderingResult<I> {
41    /// Potentially remaining subtags after the comparison operation.
42    #[deprecated(since = "1.5.0", note = "if you need this, please file an issue")]
43    Subtags(I),
44    /// Resolved ordering between the locale object and the subtags.
45    #[deprecated(since = "1.5.0", note = "if you need this, please file an issue")]
46    Ordering(Ordering),
47}
48
49#[allow(deprecated)]
50impl<I> SubtagOrderingResult<I>
51where
52    I: Iterator,
53{
54    /// Invoke this function if there are no remaining locale objects to chain in order to get
55    /// a fully resolved [`Ordering`].
56    #[inline]
57    pub fn end(self) -> Ordering {
58        match self {
59            Self::Subtags(mut it) => match it.next() {
60                Some(_) => Ordering::Less,
61                None => Ordering::Equal,
62            },
63            Self::Ordering(o) => o,
64        }
65    }
66}