use std::fmt;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum BubbleEffect {
Slam,
Loud,
Gentle,
InvisibleInk,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum ScreenEffect {
Confetti,
Echo,
Fireworks,
Balloons,
Heart,
Lasers,
ShootingStar,
Sparkles,
Spotlight,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum Expressive<'a> {
Screen(ScreenEffect),
Bubble(BubbleEffect),
Unknown(&'a str),
None,
}
impl fmt::Display for Expressive<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Screen(ScreenEffect::Confetti) => f.write_str("Sent with Confetti"),
Self::Screen(ScreenEffect::Echo) => f.write_str("Sent with Echo"),
Self::Screen(ScreenEffect::Fireworks) => f.write_str("Sent with Fireworks"),
Self::Screen(ScreenEffect::Balloons) => f.write_str("Sent with Balloons"),
Self::Screen(ScreenEffect::Heart) => f.write_str("Sent with Heart"),
Self::Screen(ScreenEffect::Lasers) => f.write_str("Sent with Lasers"),
Self::Screen(ScreenEffect::ShootingStar) => f.write_str("Sent with Shooting Star"),
Self::Screen(ScreenEffect::Sparkles) => f.write_str("Sent with Sparkles"),
Self::Screen(ScreenEffect::Spotlight) => f.write_str("Sent with Spotlight"),
Self::Bubble(BubbleEffect::Slam) => f.write_str("Sent with Slam"),
Self::Bubble(BubbleEffect::Loud) => f.write_str("Sent with Loud"),
Self::Bubble(BubbleEffect::Gentle) => f.write_str("Sent with Gentle"),
Self::Bubble(BubbleEffect::InvisibleInk) => f.write_str("Sent with Invisible Ink"),
Self::Unknown(raw) => f.write_str(raw),
Self::None => Ok(()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_none_is_empty() {
assert_eq!(Expressive::None.to_string(), "");
}
#[test]
fn display_unknown_returns_raw_id() {
assert_eq!(Expressive::Unknown("custom.id").to_string(), "custom.id");
}
#[test]
fn display_screen_effects() {
let cases = [
(ScreenEffect::Confetti, "Sent with Confetti"),
(ScreenEffect::Echo, "Sent with Echo"),
(ScreenEffect::Fireworks, "Sent with Fireworks"),
(ScreenEffect::Balloons, "Sent with Balloons"),
(ScreenEffect::Heart, "Sent with Heart"),
(ScreenEffect::Lasers, "Sent with Lasers"),
(ScreenEffect::ShootingStar, "Sent with Shooting Star"),
(ScreenEffect::Sparkles, "Sent with Sparkles"),
(ScreenEffect::Spotlight, "Sent with Spotlight"),
];
for (effect, expected) in cases {
assert_eq!(Expressive::Screen(effect).to_string(), expected);
}
}
#[test]
fn display_bubble_effects() {
let cases = [
(BubbleEffect::Slam, "Sent with Slam"),
(BubbleEffect::Loud, "Sent with Loud"),
(BubbleEffect::Gentle, "Sent with Gentle"),
(BubbleEffect::InvisibleInk, "Sent with Invisible Ink"),
];
for (effect, expected) in cases {
assert_eq!(Expressive::Bubble(effect).to_string(), expected);
}
}
}