#![warn(clippy::all)]
#![warn(clippy::pedantic)]
#![cfg_attr(test, allow(clippy::non_ascii_literal))]
#![cfg_attr(test, allow(clippy::shadow_unrelated))]
#![warn(clippy::cargo)]
#![allow(unknown_lints)]
#![allow(clippy::struct_field_names)]
#![warn(missing_copy_implementations)]
#![warn(missing_debug_implementations)]
#![warn(missing_docs)]
#![warn(rust_2018_idioms)]
#![warn(trivial_casts, trivial_numeric_casts)]
#![warn(unused_qualifications)]
#![warn(variant_size_differences)]
#![forbid(unsafe_code)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(
not(feature = "alloc"),
doc = "[`alloc`]: https://doc.rust-lang.org/alloc/index.html"
)]
#![cfg_attr(feature = "alloc", doc = "[`String`]: alloc::string::String")]
#![cfg_attr(
not(feature = "alloc"),
doc = "[`String`]: https://doc.rust-lang.org/alloc/string/struct.String.html"
)]
#![cfg_attr(feature = "alloc", doc = "[`Vec`]: alloc::vec::Vec")]
#![cfg_attr(
not(feature = "alloc"),
doc = "[`Vec`]: https://doc.rust-lang.org/alloc/vec/struct.Vec.html"
)]
#![no_std]
#![doc(html_root_url = "https://docs.rs/roe/0.0.9")]
#[cfg(any(feature = "alloc", test))]
extern crate alloc;
use core::fmt;
mod lowercase;
pub mod ruby;
mod swapcase;
mod unicode;
mod uppercase;
#[doc = include_str!("../LICENSE-UNICODE")]
#[cfg(doc)]
#[cfg_attr(docsrs, doc(cfg(doc)))]
pub mod unicode_terms {}
#[cfg(feature = "alloc")]
pub use lowercase::to_ascii_lowercase;
pub use lowercase::{Lowercase, LowercaseMode, lowercase, make_ascii_lowercase};
#[cfg(feature = "alloc")]
pub use swapcase::to_ascii_swapcase;
pub use swapcase::{Swapcase, SwapcaseMode, make_ascii_swapcase, swapcase};
pub use unicode::UNICODE_VERSION;
pub use unicode::to_titlecase;
#[cfg(feature = "alloc")]
pub use uppercase::to_ascii_uppercase;
pub use uppercase::{Uppercase, UppercaseMode, make_ascii_uppercase, uppercase};
#[derive(Default, Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct InvalidCaseMappingMode {
_private: (),
}
impl InvalidCaseMappingMode {
#[must_use]
pub const fn new() -> Self {
Self { _private: () }
}
#[must_use]
#[allow(clippy::unused_self)]
pub const fn message(self) -> &'static str {
"invalid option"
}
}
impl fmt::Display for InvalidCaseMappingMode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
const MESSAGE: &str = InvalidCaseMappingMode::new().message();
f.write_str(MESSAGE)
}
}
impl core::error::Error for InvalidCaseMappingMode {}
#[cfg(doctest)]
macro_rules! readme {
($x:expr) => {
#[doc = $x]
mod readme {}
};
() => {
readme!(include_str!("../README.md"));
};
}
#[cfg(doctest)]
readme!();
#[cfg(test)]
mod tests {
use alloc::format;
use crate::InvalidCaseMappingMode;
#[test]
fn test_invalid_case_mapping_mode_fmt() {
let err = InvalidCaseMappingMode::new();
assert_eq!(format!("{err}"), "invalid option");
let error: &dyn core::error::Error = &err;
assert!(error.source().is_none());
}
}