1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
// Copyright 2017 The UNIC Project Developers.
//
// See the COPYRIGHT file at the top-level directory of this distribution.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//! *Version* data types.
use core::fmt;
#[cfg(feature = "unstable")]
use core::char;
/// Represents a *Unicode Version* type.
///
/// UNIC's *Unicode Version* type is used for Unicode datasets and specifications, including The
/// Unicode Standard (TUS), Unicode Character Database (UCD), Common Local Data Repository (CLDR),
/// IDNA, Emoji, etc.
///
/// TODO: *Unicode Version* is guaranteed to have three integer fields between 0 and 255. We are
/// going to switch over to `u8` after Unicode 11.0.0 release.
///
/// Refs:
/// - <https://www.unicode.org/versions/>
/// - <https://www.unicode.org/L2/L2017/17222.htm#152-C3>
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash, Default)]
pub struct UnicodeVersion {
/// Major version.
pub major: u16,
/// Minor version.
pub minor: u16,
/// Micro (or Update) version.
pub micro: u16,
}
impl fmt::Display for UnicodeVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}.{}.{}", self.major, self.minor, self.micro)
}
}
#[cfg(feature = "unstable")]
/// Convert from Rust's internal Unicode Version.
impl From<char::UnicodeVersion> for UnicodeVersion {
fn from(value: char::UnicodeVersion) -> UnicodeVersion {
UnicodeVersion {
major: value.major as u16,
minor: value.minor as u16,
micro: value.micro as u16,
}
}
}
#[cfg(test)]
mod tests {
#[cfg(feature = "unstable")]
#[test]
fn test_against_rust_internal() {
use core::char;
use super::UnicodeVersion;
let core_unicode_version: UnicodeVersion = char::UNICODE_VERSION.into();
assert!(core_unicode_version.major >= 10);
}
}
|