summaryrefslogtreecommitdiffstats
path: root/third_party/rust/unic-langid
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/unic-langid')
-rw-r--r--third_party/rust/unic-langid/.cargo-checksum.json1
-rw-r--r--third_party/rust/unic-langid/Cargo.toml43
-rw-r--r--third_party/rust/unic-langid/README.md70
-rw-r--r--third_party/rust/unic-langid/src/lib.rs136
4 files changed, 250 insertions, 0 deletions
diff --git a/third_party/rust/unic-langid/.cargo-checksum.json b/third_party/rust/unic-langid/.cargo-checksum.json
new file mode 100644
index 0000000000..a24497bb69
--- /dev/null
+++ b/third_party/rust/unic-langid/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"22c66abe20079b152feec2c6e54c2026fcfe5b896fb20f7b45b1f5d11690aecd","README.md":"f68b87b732b8a0d7fe6bc3b4ff5989207e87bd51f98220136ced4cd65f814f7c","src/lib.rs":"af8a91215b975e94cfff7282d948ed74236c1cb10ad047df583ea1b01e2fe4cd"},"package":"398f9ad7239db44fd0f80fe068d12ff22d78354080332a5077dc6f52f14dcf2f"} \ No newline at end of file
diff --git a/third_party/rust/unic-langid/Cargo.toml b/third_party/rust/unic-langid/Cargo.toml
new file mode 100644
index 0000000000..7455943612
--- /dev/null
+++ b/third_party/rust/unic-langid/Cargo.toml
@@ -0,0 +1,43 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2018"
+name = "unic-langid"
+version = "0.9.1"
+authors = ["Zibi Braniecki <gandalf@mozilla.com>"]
+include = [
+ "src/**/*",
+ "benches/*.rs",
+ "Cargo.toml",
+ "README.md",
+]
+description = "API for managing Unicode Language Identifiers"
+readme = "README.md"
+categories = ["internationalization"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/zbraniecki/unic-locale"
+
+[dependencies.unic-langid-impl]
+version = "0.9"
+
+[dependencies.unic-langid-macros]
+version = "0.9"
+optional = true
+
+[dev-dependencies.unic-langid-macros]
+version = "0.9"
+
+[features]
+default = []
+likelysubtags = ["unic-langid-impl/likelysubtags"]
+macros = ["unic-langid-macros"]
+serde = ["unic-langid-impl/serde"]
diff --git a/third_party/rust/unic-langid/README.md b/third_party/rust/unic-langid/README.md
new file mode 100644
index 0000000000..4ec1f31950
--- /dev/null
+++ b/third_party/rust/unic-langid/README.md
@@ -0,0 +1,70 @@
+# unic-langid [![Build Status](https://travis-ci.org/zbraniecki/unic-locale.svg?branch=master)](https://travis-ci.org/zbraniecki/unic-locale) [![Coverage Status](https://coveralls.io/repos/github/zbraniecki/unic-locale/badge.svg?branch=master)](https://coveralls.io/github/zbraniecki/unic-locale?branch=master)
+
+`unic-langid` is an API for managing [Unicode Language Identifiers](http://unicode.org/reports/tr35/#Unicode_language_identifier).
+
+The crate provides a way to create a struct from a string, manipulate its fields, canonicalize it, and serialize into a string.
+
+Usage
+-----
+
+```rust
+use unic_langid::LanguageIdentifier;
+
+let loc: LanguageIdentifier = "en-US".parse().expect("Parsing failed.");
+
+assert_eq!(loc.language(), "en");
+assert_eq!(loc.script(), None);
+assert_eq!(loc.region(), Some("US"));
+
+loc.set_script(Some("latn"));
+
+assert_eq!(&loc.to_string(), "en-Latn-US");
+```
+
+```rust
+use unic_langid::LanguageIdentifier;
+
+let langid = LanguageIdentifier::from_parts(
+ Some("en"),
+ None,
+ None,
+ Some(&["nedis", "macos"])
+).expect("Parsing failed.");
+
+assert_eq!(&langid.to_string(), "en-macos-nedis")
+```
+
+Macros
+------
+
+`unic-langid` can be also compiled with `features = ["macros"]` which enables `langid!` macro:
+
+```rust
+use unic_langid::langid;
+
+// The `const` assignment will currently work only
+// if the langid doesn't contain any variants.
+const EN_US: LanguageIdentifier = langid!("en-US");
+
+fn main() {
+ let de_at = langid!("de-AT");
+
+ assert_eq!(&de_at.to_string(), "de-AT")
+ assert_eq!(&EN_US.to_string(), "en-US")
+}
+```
+
+The macro allows for compile-time parsing and validation of literal language identifiers.
+
+Status
+------
+
+The crate is mostly complete on the `well-formed` level. The next batch of work will go into
+API maturity.
+
+Get Involved
+------------
+
+`unic-langid` is open-source, licensed under the Apache License, Version 2.0. We
+encourage everyone to take a look at our code and we'll listen to your
+feedback.
diff --git a/third_party/rust/unic-langid/src/lib.rs b/third_party/rust/unic-langid/src/lib.rs
new file mode 100644
index 0000000000..f66fb444a3
--- /dev/null
+++ b/third_party/rust/unic-langid/src/lib.rs
@@ -0,0 +1,136 @@
+//! `unic-langid` is a core API for parsing, manipulating, and serializing Unicode Language
+//! Identifiers.
+//!
+//! The crate provides algorithms for parsing a string into a well-formed language identifier
+//! as defined by [`UTS #35: Unicode LDML 3.1 Unicode Language Identifier`].
+//!
+//! # Examples
+//!
+//! ```
+//! use unic_langid::LanguageIdentifier;
+//! use unic_langid::subtags::{Language, Script, Region};
+//!
+//! let mut li: LanguageIdentifier = "en-US".parse()
+//! .expect("Parsing failed.");
+//!
+//! let lang: Language = "en".parse().expect("Parsing failed.");
+//! let region: Region = "US".parse().expect("Parsing failed.");
+//! assert_eq!(li.language, lang);
+//! assert_eq!(li.script, None);
+//! assert_eq!(li.region, Some(region));
+//! assert_eq!(li.variants().len(), 0);
+//!
+//! let region: Region = "GB".parse().expect("Parsing failed.");
+//! li.region = Some(region);
+//!
+//! assert_eq!(li.to_string(), "en-GB");
+//! ```
+//!
+//! For more details, see [`LanguageIdentifier`].
+//!
+//! # Optional features
+//!
+//! ## `langid!`, `langids!`, and `langid_slice!` macros
+//!
+//! If `feature = "macros"` is selected, the crate provides a procedural macro
+//! which allows to construct build-time well-formed language identifiers with zero-cost at runtime.
+//!
+//! ``` ignore
+//! use unic_langid::{langid, langid_slice, langids, lang, region, script, variant, LanguageIdentifier};
+//! use unic_langid::subtags::{Language, Script, Region, Variant};
+//! use std::str::FromStr;
+//!
+//! let es_ar = langid!("es-AR");
+//! let en_us = langid!("en-US");
+//!
+//! assert_eq!(&es_ar.to_string(), "es-AR");
+//! assert_eq!(&en_us.to_string(), "en-US");
+//!
+//! let lang_ids = langids!("es-AR", "en-US", "de");
+//!
+//! assert_eq!(lang_ids[0], "es-AR");
+//! assert_eq!(lang_ids[1], "en-US");
+//! assert_eq!(lang_ids[2], "de");
+//!
+//! const LANGUAGES: &[LanguageIdentifier] = langid_slice!["en-GB", "fr"];
+//!
+//! assert_eq!(lang!("pl"), "pl");
+//! assert_eq!(lang!("pl"), Language::from_str("pl").unwrap());
+//!
+//! assert_eq!(script!("latn"), "Latn");
+//! assert_eq!(script!("latn"), Script::from_str("Latn").unwrap());
+//!
+//! assert_eq!(region!("us"), "US");
+//! assert_eq!(region!("us"), Region::from_str("us").unwrap());
+//!
+//! assert_eq!(variant!("macos"), "macos");
+//! assert_eq!(variant!("macos"), Variant::from_str("macos").unwrap());
+//! ```
+//!
+//! The macros produce instances of `LanguageIdentifier` the same way as parsing from `&str` does,
+//! but since the parsing is performed at build time, it doesn't need a `Result`.
+//!
+//! At the moment `langid!` can also be used for const variables, but only if no variants are used.
+//!
+//! The macros are optional to reduce the dependency chain and compilation time of `unic-langid`.
+//!
+//! ## Likely Subtags
+//!
+//! If `feature = "likelysubtags"` is selected, the `LanguageIdentifier` gains two more methods:
+//!
+//! * add_likely_subtags
+//! * remove_likely_subtags
+//!
+//! Both of them operate in place updating the existing `LanguageIdentifier` by either extending
+//! subtags to most likely values, or removing the subtags that are not needed.
+//!
+//! Both methods return a `bool` that indicates if the identifier has been modified.
+//!
+//! ``` ignore
+//! use unic_langid::LanuageIdentifier;
+//!
+//! let mut li: LanguageIdentifier = "fr-FR".parse()
+//! .expect("Parsing failed.");
+//!
+//! assert_eq!(li.add_likely_subtags(), true);
+//! assert_eq!(li, "fr-Latn-FR");
+//!
+//! assert_eq!(li.remove_likely_subtags(), true);
+//! assert_eq!(li, "fr");
+//! ```
+//!
+//! The feature is optional because it increases the binary size of the library by including
+//! a data table for CLDR likelySubtags.
+//!
+//! [`UTS #35: Unicode LDML 3.1 Unicode Language Identifier`]: https://unicode.org/reports/tr35/tr35.html#Unicode_language_identifier
+//! [`LanguageIdentifier`]: ./struct.LanguageIdentifier.html
+
+pub use unic_langid_impl::*;
+
+#[cfg(feature = "unic-langid-macros")]
+pub use unic_langid_macros::{lang, langid, region, script, variant};
+
+#[cfg(feature = "unic-langid-macros")]
+#[macro_export]
+macro_rules! langids {
+ ( $($langid:expr),* ) => {
+ vec![$(
+ $crate::langid!($langid),
+ )*]
+ };
+ ( $($langid:expr,)* ) => {
+ $crate::langids![$($langid),*]
+ };
+}
+#[cfg(feature = "unic-langid-macros")]
+#[macro_export]
+macro_rules! langid_slice {
+ ( $($langid:expr),* ) => {
+ &[$(
+ $crate::langid!($langid),
+ )*]
+ };
+ ( $($langid:expr,)* ) => {
+ $crate::langid_slice![$($langid),*]
+ };
+}