#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
#[non_exhaustive]
pub enum StdlibClass {
Date,
Map,
Match,
MatchGroups,
MatchFnResult,
RegExp,
Set,
}
pub const MATCH_CLASS_NAME: &str = "__SmeltMatch";
pub const MATCH_GROUPS_CLASS_NAME: &str = "__SmeltMatchGroups";
#[must_use]
pub fn typescript_stdlib_class(name: &str) -> Option<StdlibClass> {
match name {
"Date" => Some(StdlibClass::Date),
"Map" => Some(StdlibClass::Map),
MATCH_CLASS_NAME => Some(StdlibClass::Match),
MATCH_GROUPS_CLASS_NAME => Some(StdlibClass::MatchGroups),
"MatchFnResult" => Some(StdlibClass::MatchFnResult),
"RegExp" => Some(StdlibClass::RegExp),
"Set" => Some(StdlibClass::Set),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn recognizes_stdlib_class_names() {
assert_eq!(typescript_stdlib_class("Date"), Some(StdlibClass::Date));
assert_eq!(typescript_stdlib_class("Map"), Some(StdlibClass::Map));
assert_eq!(
typescript_stdlib_class(MATCH_CLASS_NAME),
Some(StdlibClass::Match)
);
assert_eq!(
typescript_stdlib_class(MATCH_GROUPS_CLASS_NAME),
Some(StdlibClass::MatchGroups)
);
assert_eq!(
typescript_stdlib_class("MatchFnResult"),
Some(StdlibClass::MatchFnResult)
);
assert_eq!(typescript_stdlib_class("RegExp"), Some(StdlibClass::RegExp));
assert_eq!(typescript_stdlib_class("Set"), Some(StdlibClass::Set));
}
#[test]
fn rejects_user_class_names() {
for name in ["Regexp", "RegExpLike", "Dates", "HashMap", "MyClass"] {
assert_eq!(typescript_stdlib_class(name), None);
}
}
}