pub use regex::Regex;
use crate::static_str::StaticStr;
#[doc(hidden)]
pub mod import {
pub use std::{fmt, marker::PhantomData, sync::LazyLock};
}
pub type StaticRegex = &'static Regex;
pub trait TypeRegex {
fn get() -> StaticRegex;
}
pub const INVALID: StaticStr = "invalid regex";
#[macro_export]
macro_rules! type_regex {
($vis: vis $name: ident = $regex: expr $(=> $doc: expr)?) => {
$(
#[doc = $doc]
)?
$vis struct $name {
private: $crate::type_regex::import::PhantomData<()>,
}
impl $crate::type_regex::TypeRegex for $name {
fn get() -> $crate::type_regex::StaticRegex {
use $crate::type_regex::import::LazyLock;
static REGEX: LazyLock<$crate::type_regex::Regex> = LazyLock::new(|| {
$crate::type_regex::Regex::new($regex).expect($crate::type_regex::INVALID)
});
LazyLock::force(®EX)
}
}
impl $crate::type_regex::import::fmt::Display for $name {
fn fmt(
&self, formatter: &mut $crate::type_regex::import::fmt::Formatter<'_>
) -> $crate::type_regex::import::fmt::Result {
use $crate::type_regex::TypeRegex;
Self::get().fmt(formatter)
}
}
};
}