unic_common/version.rs
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);
}
}