1mod constants;
2
3use crate::{
4 error::Error,
5 facelet::{Facelet, FaceletTarget},
6};
7use constants::{CORNER_FACELET_MAP, EDGE_FACELET_MAP};
8use std::{fmt, str::FromStr};
9
10#[rustfmt::skip]
11#[derive(Debug, PartialEq, Clone, Copy)]
12pub enum Corner {
13 UBL, BLU, LUB,
14 URB, RBU, BUR,
15 UFR, FRU, RUF,
16 ULF, LFU, FUL,
17 DFL, FLD, LDF,
18 DRF, RFD, FDR,
19 DBR, BRD, RDB,
20 DLB, LBD, BDL,
21}
22
23impl FaceletTarget for Corner {
24 fn to_facelets(&self) -> Vec<Facelet> {
25 CORNER_FACELET_MAP[*self as usize].to_vec()
26 }
27}
28
29impl FromStr for Corner {
30 type Err = Error;
31
32 fn from_str(s: &str) -> Result<Self, Self::Err> {
33 match s {
34 "UBL" => Ok(Self::UBL),
35 "BLU" => Ok(Self::BLU),
36 "LUB" => Ok(Self::LUB),
37 "URB" => Ok(Self::URB),
38 "RBU" => Ok(Self::RBU),
39 "BUR" => Ok(Self::BUR),
40 "UFR" => Ok(Self::UFR),
41 "FRU" => Ok(Self::FRU),
42 "RUF" => Ok(Self::RUF),
43 "ULF" => Ok(Self::ULF),
44 "LFU" => Ok(Self::LFU),
45 "FUL" => Ok(Self::FUL),
46 "DFL" => Ok(Self::DFL),
47 "FLD" => Ok(Self::FLD),
48 "LDF" => Ok(Self::LDF),
49 "DRF" => Ok(Self::DRF),
50 "RFD" => Ok(Self::RFD),
51 "FDR" => Ok(Self::FDR),
52 "DBR" => Ok(Self::DBR),
53 "BRD" => Ok(Self::BRD),
54 "RDB" => Ok(Self::RDB),
55 "DLB" => Ok(Self::DLB),
56 "LBD" => Ok(Self::LBD),
57 "BDL" => Ok(Self::BDL),
58 _ => Err(Error::InvalidCornerString(s.to_owned())),
59 }
60 }
61}
62
63impl fmt::Display for Corner {
64 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65 write!(f, "{:?}", self)
66 }
67}
68
69#[rustfmt::skip]
70#[derive(Debug, PartialEq, Clone, Copy)]
71pub enum Edge {
72 UB, BU,
73 UR, RU,
74 UF, FU,
75 UL, LU,
76 FL, LF,
77 FR, RF,
78 BR, RB,
79 BL, LB,
80 DF, FD,
81 DR, RD,
82 DB, BD,
83 DL, LD,
84}
85
86impl FaceletTarget for Edge {
87 fn to_facelets(&self) -> Vec<Facelet> {
88 EDGE_FACELET_MAP[*self as usize].to_vec()
89 }
90}
91
92impl FromStr for Edge {
93 type Err = Error;
94
95 fn from_str(s: &str) -> Result<Self, Self::Err> {
96 match s {
97 "UB" => Ok(Self::UB),
98 "BU" => Ok(Self::BU),
99 "UR" => Ok(Self::UR),
100 "RU" => Ok(Self::RU),
101 "UF" => Ok(Self::UF),
102 "FU" => Ok(Self::FU),
103 "UL" => Ok(Self::UL),
104 "LU" => Ok(Self::LU),
105 "FL" => Ok(Self::FL),
106 "LF" => Ok(Self::LF),
107 "FR" => Ok(Self::FR),
108 "RF" => Ok(Self::RF),
109 "BR" => Ok(Self::BR),
110 "RB" => Ok(Self::RB),
111 "BL" => Ok(Self::BL),
112 "LB" => Ok(Self::LB),
113 "DF" => Ok(Self::DF),
114 "FD" => Ok(Self::FD),
115 "DR" => Ok(Self::DR),
116 "RD" => Ok(Self::RD),
117 "DB" => Ok(Self::DB),
118 "BD" => Ok(Self::BD),
119 "DL" => Ok(Self::DL),
120 "LD" => Ok(Self::LD),
121 _ => Err(Error::InvalidEdgeString(s.to_owned())),
122 }
123 }
124}
125
126impl fmt::Display for Edge {
127 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
128 write!(f, "{:?}", self)
129 }
130}