// 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 or the MIT license // , 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: /// - /// - #[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 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); } }