use crate::foundations::{cast, func, Cast, Content, Str};
use crate::text::TextElem;
#[func(title = "Lowercase")]
pub fn lower(
text: Caseable,
) -> Caseable {
case(text, Case::Lower)
}
#[func(title = "Uppercase")]
pub fn upper(
text: Caseable,
) -> Caseable {
case(text, Case::Upper)
}
fn case(text: Caseable, case: Case) -> Caseable {
match text {
Caseable::Str(v) => Caseable::Str(case.apply(&v).into()),
Caseable::Content(v) => {
Caseable::Content(v.styled(TextElem::set_case(Some(case))))
}
}
}
pub enum Caseable {
Str(Str),
Content(Content),
}
cast! {
Caseable,
self => match self {
Self::Str(v) => v.into_value(),
Self::Content(v) => v.into_value(),
},
v: Str => Self::Str(v),
v: Content => Self::Content(v),
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Cast)]
pub enum Case {
Lower,
Upper,
}
impl Case {
pub fn apply(self, text: &str) -> String {
match self {
Self::Lower => text.to_lowercase(),
Self::Upper => text.to_uppercase(),
}
}
}