1use crate::*;
2
3#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
9pub struct MikaSection {
10 pub elements: Section,
11}
12
13#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
14pub enum Mika {
15 Mini(MiniMika),
16 Micro(MicroMika),
17}
18
19impl std::fmt::Display for Mika {
20 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21 write!(f, "{}", self.to_string())
22 }
23}
24
25impl Mika {
26
27 pub fn to_string(&self) -> String {
28 match self {
29 Mika::Mini(mini) => mini.to_string(),
30 Mika::Micro(micro) => micro.to_string(),
31 }
32 }
33
34 pub fn tokens(&self) -> Vec<Token> {
35 vec![Token::new(TokenKind::Mika(self.clone()), SourceRange::default(), vec![])]
36 }
37}
38
39#[derive(Clone, Copy,Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
40pub struct MiniMika {
41 pub expression: MikaExpression,
42 pub left_arm: Option<MikaArm>,
43 pub right_arm: Option<MikaArm>,
44}
45
46impl MiniMika {
47 pub fn to_string(&self) -> String {
48 let (left_eye, nose, right_eye) = self.expression.symbols();
49 let left_arm = self.left_arm.map_or("", |arm| arm.symbol());
50 let right_arm = self.right_arm.map_or("", |arm| arm.symbol());
51 format!("{}({}{}{}){}", left_arm, left_eye, nose, right_eye, right_arm)
52 }
53}
54
55#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
59pub enum MikaNose {
60 Normal, Open, Back, Stage1, Stage2, Stage3, Blink, Wide, Error, Filled, FlatMouth, Hexagon, Pentagon, Hexagon2, HexagonOpen, }
76
77impl std::fmt::Display for MikaNose {
78 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79 write!(f, "{}", self.symbol())
80 }
81}
82
83impl MikaNose {
84 pub fn symbol(&self) -> &'static str {
85 match self {
86 MikaNose::Normal => "⦿",
87 MikaNose::Open => "◯",
88 MikaNose::Back => "⊕",
89 MikaNose::Stage1 => "∘",
90 MikaNose::Stage2 => "⦾",
91 MikaNose::Stage3 => "⦾",
92 MikaNose::Blink => "⊖",
93 MikaNose::Wide => "⦵",
94 MikaNose::Error => "⊗",
95 MikaNose::Filled => "⏺",
96 MikaNose::FlatMouth => "⍜",
97 MikaNose::Hexagon => "⬢",
98 MikaNose::Pentagon => "⬟",
99 MikaNose::Hexagon2 => "⬣",
100 MikaNose::HexagonOpen => "⎔",
101 }
102 }
103}
104
105
106#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
107pub enum MikaArm {
108 BatWing, BigGripperLeft, BigGripperRight, CurlLeft, CurlRight, Dance, GestureLeft, GestureRight, GripperLeft, GripperRight, Left, RaisedLeft, RaisedRight, Right, Shield, ShootLeft, ShootRight, ShrugLeft, ShrugRight, Sword, Point, PunchLeft, PunchRight, PunchLowLeft, PunchLowRight, UpLeft, UpRight, }
136
137impl MikaArm {
138 pub fn symbol(&self) -> &'static str {
139 match self {
140 MikaArm::BatWing => "ᗑ",
141 MikaArm::BigGripperLeft => "Ɔ∞",
142 MikaArm::BigGripperRight => "∞C",
143 MikaArm::CurlLeft => "ᕦ",
144 MikaArm::CurlRight => "ᕤ",
145 MikaArm::Dance => "~",
146 MikaArm::GestureLeft => "⌣",
147 MikaArm::GestureRight => "⌣",
148 MikaArm::GripperLeft => "›─",
149 MikaArm::GripperRight => "─‹",
150 MikaArm::Left => "╭",
151 MikaArm::RaisedLeft => "⸌",
152 MikaArm::RaisedRight => "⸍",
153 MikaArm::Right => "╮",
154 MikaArm::Shield => "ᗢ",
155 MikaArm::ShootLeft => "·¬",
156 MikaArm::ShootRight => "⌐·",
157 MikaArm::ShrugLeft => "-◡",
158 MikaArm::ShrugRight => "◡-",
159 MikaArm::Sword => "⸸",
160 MikaArm::Point => "─",
161 MikaArm::PunchLeft => "ᓂ",
162 MikaArm::PunchRight => "ᓀ",
163 MikaArm::PunchLowLeft => "ᓇ",
164 MikaArm::PunchLowRight => "ᓄ",
165 MikaArm::UpLeft => "╰",
166 MikaArm::UpRight => "╯",
167 }
168 }
169
170 pub fn is_left(&self) -> bool {
171 matches!(self, MikaArm::UpLeft | MikaArm::BatWing | MikaArm::BigGripperLeft | MikaArm::CurlLeft | MikaArm::GestureLeft | MikaArm::GripperLeft | MikaArm::Left | MikaArm::ShootLeft | MikaArm::ShrugLeft | MikaArm::Dance)
172 }
173
174 pub fn is_right(&self) -> bool {
175 matches!(self, MikaArm::UpRight | MikaArm::BatWing | MikaArm::BigGripperRight | MikaArm::CurlRight | MikaArm::GestureRight | MikaArm::GripperRight | MikaArm::Right | MikaArm::ShootRight | MikaArm::ShrugRight | MikaArm::Dance)
176 }
177
178}
179
180#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
181pub enum MikaEyeLeft {
182 Content, Confused, Crying, Dazed, Dead, EyesSqueezed, SuperSqueezed, Glaring, Happy, Normal, PeerRight, PeerStraight, Pleased, Resolved, RollingEyes, Sad, Scared, Shades, Sleeping, Smiling, Squinting, Surprised, TearingUp, Unimpressed, Wired, }
208
209impl Display for MikaEyeLeft {
210 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
211 write!(f, "{}", self.symbol())
212 }
213}
214
215impl MikaEyeLeft {
216 pub fn symbol(&self) -> &'static str {
217 match self {
218 MikaEyeLeft::Content => "ˆ",
219 MikaEyeLeft::Confused => "ಠ",
220 MikaEyeLeft::Crying => "╥",
221 MikaEyeLeft::Dazed => "⋇",
222 MikaEyeLeft::Dead => "✖",
223 MikaEyeLeft::EyesSqueezed => "≻",
224 MikaEyeLeft::SuperSqueezed => "ᗒ",
225 MikaEyeLeft::Glaring => "ㆆ",
226 MikaEyeLeft::Happy => "◜",
227 MikaEyeLeft::Normal => "˙",
228 MikaEyeLeft::PeerRight => "⚆",
229 MikaEyeLeft::PeerStraight => "☉",
230 MikaEyeLeft::Pleased => "◠",
231 MikaEyeLeft::Resolved => "◡̀",
232 MikaEyeLeft::RollingEyes => "◕",
233 MikaEyeLeft::Sad => "◞",
234 MikaEyeLeft::Scared => "Ͼ",
235 MikaEyeLeft::Shades => "⌐▰",
236 MikaEyeLeft::Sleeping => "⹇",
237 MikaEyeLeft::Smiling => "ᗣ",
238 MikaEyeLeft::Squinting => "≖",
239 MikaEyeLeft::Surprised => "°",
240 MikaEyeLeft::TearingUp => "ᗩ",
241 MikaEyeLeft::Unimpressed => "¬",
242 MikaEyeLeft::Wired => "◉",
243 }
244 }
245}
246
247#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
248pub enum MikaEyeRight {
249 Content, Confused, Crying, Dazed, Dead, EyesSqueezed, SuperSqueezed, Glaring, Happy, Normal, PeerRight, PeerStraight, Pleased, Resolved, RollingEyes, Sad, Scared, Shades, Sleeping, Smiling, Squinting, Surprised, TearingUp, Unimpressed, Wired, }
275
276impl std::fmt::Display for MikaEyeRight {
277 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
278 write!(f, "{}", self.symbol())
279 }
280}
281
282impl MikaEyeRight {
283 pub fn symbol(&self) -> &'static str {
284 match self {
285 MikaEyeRight::Content => "ˆ",
286 MikaEyeRight::Confused => "ಠ",
287 MikaEyeRight::Crying => "╥",
288 MikaEyeRight::Dazed => "⋇",
289 MikaEyeRight::Dead => "✖",
290 MikaEyeRight::EyesSqueezed => "≺",
291 MikaEyeRight::SuperSqueezed => "ᗕ",
292 MikaEyeRight::Glaring => "ㆆ",
293 MikaEyeRight::Happy => "◝",
294 MikaEyeRight::Normal => "˙",
295 MikaEyeRight::PeerRight => "⚆",
296 MikaEyeRight::PeerStraight => "☉",
297 MikaEyeRight::Pleased => "◠",
298 MikaEyeRight::Resolved => "◡́",
299 MikaEyeRight::RollingEyes => "◕",
300 MikaEyeRight::Sad => "◟",
301 MikaEyeRight::Scared => "Ͽ",
302 MikaEyeRight::Shades => "▰",
303 MikaEyeRight::Sleeping => "⹇",
304 MikaEyeRight::Smiling => "ᗣ",
305 MikaEyeRight::Squinting => "≖",
306 MikaEyeRight::Surprised => "°",
307 MikaEyeRight::TearingUp => "ᗩ",
308 MikaEyeRight::Unimpressed => "¬",
309 MikaEyeRight::Wired => "◉",
310 }
311 }
312}
313
314#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
315pub enum MikaExpression {
316 Content, Confused, Crying, Dazed, Dead, EyesSqueezed, SuperSqueezed, Glaring, Happy, Normal, PeerRight, PeerStraight, Pleased, Resolved, RollingEyes, Sad, Scared, Shades, Sleeping, Smiling, Squinting, Surprised, TearingUp, Unimpressed, Wired, }
342
343impl MikaExpression {
344 pub fn symbols(&self) -> (MikaEyeLeft, MikaNose, MikaEyeRight) {
345 match self {
346 MikaExpression::Content => (MikaEyeLeft::Content, MikaNose::Open, MikaEyeRight::Content),
347 MikaExpression::Confused => (MikaEyeLeft::Confused, MikaNose::Open, MikaEyeRight::Confused),
348 MikaExpression::Crying => (MikaEyeLeft::Crying, MikaNose::Open, MikaEyeRight::Crying),
349 MikaExpression::Dazed => (MikaEyeLeft::Dazed, MikaNose::Open, MikaEyeRight::Dazed),
350 MikaExpression::Dead => (MikaEyeLeft::Dead, MikaNose::Open, MikaEyeRight::Dead),
351 MikaExpression::EyesSqueezed => (MikaEyeLeft::EyesSqueezed, MikaNose::Open, MikaEyeRight::EyesSqueezed),
352 MikaExpression::Glaring => (MikaEyeLeft::Glaring, MikaNose::FlatMouth, MikaEyeRight::Glaring),
353 MikaExpression::Happy => (MikaEyeLeft::Happy, MikaNose::Open, MikaEyeRight::Happy),
354 MikaExpression::Normal => (MikaEyeLeft::Normal, MikaNose::Open, MikaEyeRight::Normal),
355 MikaExpression::PeerRight => (MikaEyeLeft::PeerRight, MikaNose::Open, MikaEyeRight::PeerRight),
356 MikaExpression::PeerStraight => (MikaEyeLeft::PeerStraight, MikaNose::Open, MikaEyeRight::PeerStraight),
357 MikaExpression::Pleased => (MikaEyeLeft::Pleased, MikaNose::Open, MikaEyeRight::Pleased),
358 MikaExpression::Resolved => (MikaEyeLeft::Resolved, MikaNose::Open, MikaEyeRight::Resolved),
359 MikaExpression::RollingEyes => (MikaEyeLeft::RollingEyes, MikaNose::Open, MikaEyeRight::RollingEyes),
360 MikaExpression::Sad => (MikaEyeLeft::Sad, MikaNose::Open, MikaEyeRight::Sad),
361 MikaExpression::Scared => (MikaEyeLeft::Scared, MikaNose::Open, MikaEyeRight::Scared),
362 MikaExpression::Shades => (MikaEyeLeft::Shades, MikaNose::Open, MikaEyeRight::Shades),
363 MikaExpression::Sleeping => (MikaEyeLeft::Sleeping, MikaNose::Open, MikaEyeRight::Sleeping),
364 MikaExpression::Smiling => (MikaEyeLeft::Smiling, MikaNose::Open, MikaEyeRight::Smiling),
365 MikaExpression::Squinting => (MikaEyeLeft::Squinting, MikaNose::Open, MikaEyeRight::Squinting),
366 MikaExpression::SuperSqueezed => (MikaEyeLeft::SuperSqueezed, MikaNose::Open, MikaEyeRight::SuperSqueezed),
367 MikaExpression::Surprised => (MikaEyeLeft::Surprised, MikaNose::Open, MikaEyeRight::Surprised),
368 MikaExpression::TearingUp => (MikaEyeLeft::TearingUp, MikaNose::Open, MikaEyeRight::TearingUp),
369 MikaExpression::Unimpressed => (MikaEyeLeft::Unimpressed, MikaNose::Open, MikaEyeRight::Unimpressed),
370 MikaExpression::Wired => (MikaEyeLeft::Wired, MikaNose::Open, MikaEyeRight::Wired),
371 }
372 }
373}
374
375#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
379pub struct MicroMika {
380 pub left_arm: MikaArm,
381 pub nose: MikaNose,
382 pub right_arm: MikaArm,
383}
384
385impl MicroMika {
386 pub fn to_string(&self) -> String {
387 format!("{}{}{}", self.left_arm.symbol(), self.nose.symbol(), self.right_arm.symbol())
388 }
389}
390
391#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
392pub enum MicroMikaKind {
393 Bat, BigHug, Cheer, Dance, Goal, GripperLeft, GripperRight, GestureLeft, GestureRight, Idle, Knight, Matrix, OneWing, PointLeft, PointRight, Punch, ShootLeft, ShootRight, Shrug, ServeLeft, ServeRight, WaveLeft, WaveRight, }
417
418impl MicroMikaKind {
419
420 pub fn to_string(&self) -> String {
421 let (left_arm, nose, right_arm) = self.symbols();
422 format!("{}{}{}", left_arm.symbol(), nose.symbol(), right_arm.symbol())
423 }
424
425 pub fn symbols(&self) -> (MikaArm, MikaNose, MikaArm) {
426 match self {
427 MicroMikaKind::Bat => (MikaArm::BatWing, MikaNose::Normal, MikaArm::BatWing),
428 MicroMikaKind::BigHug => (MikaArm::GestureLeft, MikaNose::Normal, MikaArm::GestureRight),
429 MicroMikaKind::Cheer => (MikaArm::RaisedLeft, MikaNose::Normal, MikaArm::RaisedRight),
430 MicroMikaKind::Dance => (MikaArm::Dance, MikaNose::Normal, MikaArm::Dance),
431 MicroMikaKind::Goal => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::UpRight),
432 MicroMikaKind::GripperLeft => (MikaArm::GripperLeft, MikaNose::Normal, MikaArm::UpRight),
433 MicroMikaKind::GripperRight => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::GripperRight),
434 MicroMikaKind::GestureLeft => (MikaArm::GestureLeft, MikaNose::Normal, MikaArm::UpRight),
435 MicroMikaKind::GestureRight => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::GestureRight),
436 MicroMikaKind::Idle => (MikaArm::Left, MikaNose::Normal, MikaArm::Right),
437 MicroMikaKind::Knight => (MikaArm::Sword, MikaNose::Normal, MikaArm::Shield),
438 MicroMikaKind::Matrix => (MikaArm::ShootLeft, MikaNose::Normal, MikaArm::ShootRight),
439 MicroMikaKind::OneWing => (MikaArm::Sword, MikaNose::Normal, MikaArm::BatWing),
440 MicroMikaKind::PointLeft => (MikaArm::Point, MikaNose::Normal, MikaArm::UpRight),
441 MicroMikaKind::PointRight => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::Point),
442 MicroMikaKind::Punch => (MikaArm::PunchLeft, MikaNose::Normal, MikaArm::PunchLowRight),
443 MicroMikaKind::ShootLeft => (MikaArm::ShootLeft, MikaNose::Normal, MikaArm::UpRight),
444 MicroMikaKind::ShootRight => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::ShootRight),
445 MicroMikaKind::Shrug => (MikaArm::ShrugLeft, MikaNose::Normal, MikaArm::ShrugRight),
446 MicroMikaKind::ServeLeft => (MikaArm::ShrugLeft, MikaNose::Normal, MikaArm::UpRight),
447 MicroMikaKind::ServeRight => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::ShrugRight),
448 MicroMikaKind::WaveLeft => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::UpRight),
449 MicroMikaKind::WaveRight => (MikaArm::UpLeft, MikaNose::Normal, MikaArm::UpRight),
450 }
451 }
452}
453
454
455static MIRCOMIKA_POWEROFF: &[&str] = &["╭⦿╮","╭⦾╮","╭⊚╮","╭⊙╮","╭◯╮"];
460static MIRCOMIKA_POWERON: &[&str] = &["╭◯╮","╭⊙╮","╭⊚╮","╭⦾╮","╭⦿╮"];
461static MICROMIKA_BLINK: &[&str] = &["╭⦿╮","╭⊖╮","╭⦿╮"];
462static MICROMIKA_PULSE: &[&str] = &["╭⦿╮","╭⦾╮","╭⊚╮","╭⊙╮","╭⊚╮","╭⦾╮","╭⦿╮"];
463static MICROMIKA_WAVE: &[&str] = &["╭⦿╯","╭⦿─",];
464static MICROMIKA_RAISE_ARMS: &[&str] = &["╭⦿╮","─⦿─","╰⦿╯"];
465static MICROMIKA_LOWER_ARMS: &[&str] = &["╰⦿╯","─⦿─","╭⦿╮"];
466static MICROMIKA_FLAPPING: &[&str] = &["─⦿─","╰⦿╯"];
467static MICROMIKA_GRIPPING_RIGHT: &[&str] = &["╭⦿─‹ -> ╭⦿─-"];
468static MICROMIKA_GRIPPING_LEFT: &[&str] = &["›─⦿╮ -> -─⦿╮"];
469
470#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
476pub enum MyloExpression {
477 Eyes, Focused, Alarm, Angry, Crossed, }
483
484impl MyloExpression {
485 pub fn symbols(&self) -> (&'static str, &'static str, &'static str) {
486 match self {
487 MyloExpression::Eyes => ("ᑕ", "⎔", "ᑐ"),
488 MyloExpression::Focused => ("ᕮ", "⎔", "ᕭ"),
489 MyloExpression::Alarm => ("ᕳ", "⎔", "ᕲ"),
490 MyloExpression::Angry => ("ᘭ", "⎔", "ᘪ"),
491 MyloExpression::Crossed => ("ᑢ", "⎔", "ᑝ"),
492 }
493 }
494}