1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254

/// An enum to represent all characters in the OrnamentalDingbats block.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum OrnamentalDingbats {
    /// \u{1f650}: '🙐'
    NorthWestPointingLeaf,
    /// \u{1f651}: '🙑'
    SouthWestPointingLeaf,
    /// \u{1f652}: '🙒'
    NorthEastPointingLeaf,
    /// \u{1f653}: '🙓'
    SouthEastPointingLeaf,
    /// \u{1f654}: '🙔'
    TurnedNorthWestPointingLeaf,
    /// \u{1f655}: '🙕'
    TurnedSouthWestPointingLeaf,
    /// \u{1f656}: '🙖'
    TurnedNorthEastPointingLeaf,
    /// \u{1f657}: '🙗'
    TurnedSouthEastPointingLeaf,
    /// \u{1f658}: '🙘'
    NorthWestPointingVineLeaf,
    /// \u{1f659}: '🙙'
    SouthWestPointingVineLeaf,
    /// \u{1f65a}: '🙚'
    NorthEastPointingVineLeaf,
    /// \u{1f65b}: '🙛'
    SouthEastPointingVineLeaf,
    /// \u{1f65c}: '🙜'
    HeavyNorthWestPointingVineLeaf,
    /// \u{1f65d}: '🙝'
    HeavySouthWestPointingVineLeaf,
    /// \u{1f65e}: '🙞'
    HeavyNorthEastPointingVineLeaf,
    /// \u{1f65f}: '🙟'
    HeavySouthEastPointingVineLeaf,
    /// \u{1f660}: '🙠'
    NorthWestPointingBud,
    /// \u{1f661}: '🙡'
    SouthWestPointingBud,
    /// \u{1f662}: '🙢'
    NorthEastPointingBud,
    /// \u{1f663}: '🙣'
    SouthEastPointingBud,
    /// \u{1f664}: '🙤'
    HeavyNorthWestPointingBud,
    /// \u{1f665}: '🙥'
    HeavySouthWestPointingBud,
    /// \u{1f666}: '🙦'
    HeavyNorthEastPointingBud,
    /// \u{1f667}: '🙧'
    HeavySouthEastPointingBud,
    /// \u{1f668}: '🙨'
    HollowQuiltSquareOrnament,
    /// \u{1f669}: '🙩'
    HollowQuiltSquareOrnamentInBlackSquare,
    /// \u{1f66a}: '🙪'
    SolidQuiltSquareOrnament,
    /// \u{1f66b}: '🙫'
    SolidQuiltSquareOrnamentInBlackSquare,
    /// \u{1f66c}: '🙬'
    LeftwardsRocket,
    /// \u{1f66d}: '🙭'
    UpwardsRocket,
    /// \u{1f66e}: '🙮'
    RightwardsRocket,
    /// \u{1f66f}: '🙯'
    DownwardsRocket,
    /// \u{1f670}: '🙰'
    ScriptLigatureEtOrnament,
    /// \u{1f671}: '🙱'
    HeavyScriptLigatureEtOrnament,
    /// \u{1f672}: '🙲'
    LigatureOpenEtOrnament,
    /// \u{1f673}: '🙳'
    HeavyLigatureOpenEtOrnament,
    /// \u{1f674}: '🙴'
    HeavyAmpersandOrnament,
    /// \u{1f675}: '🙵'
    SwashAmpersandOrnament,
    /// \u{1f676}: '🙶'
    SansDashSerifHeavyDoubleTurnedCommaQuotationMarkOrnament,
    /// \u{1f677}: '🙷'
    SansDashSerifHeavyDoubleCommaQuotationMarkOrnament,
    /// \u{1f678}: '🙸'
    SansDashSerifHeavyLowDoubleCommaQuotationMarkOrnament,
    /// \u{1f679}: '🙹'
    HeavyInterrobangOrnament,
    /// \u{1f67a}: '🙺'
    SansDashSerifInterrobangOrnament,
    /// \u{1f67b}: '🙻'
    HeavySansDashSerifInterrobangOrnament,
    /// \u{1f67c}: '🙼'
    VeryHeavySolidus,
    /// \u{1f67d}: '🙽'
    VeryHeavyReverseSolidus,
    /// \u{1f67e}: '🙾'
    CheckerBoard,
}

impl Into<char> for OrnamentalDingbats {
    fn into(self) -> char {
        match self {
            OrnamentalDingbats::NorthWestPointingLeaf => '🙐',
            OrnamentalDingbats::SouthWestPointingLeaf => '🙑',
            OrnamentalDingbats::NorthEastPointingLeaf => '🙒',
            OrnamentalDingbats::SouthEastPointingLeaf => '🙓',
            OrnamentalDingbats::TurnedNorthWestPointingLeaf => '🙔',
            OrnamentalDingbats::TurnedSouthWestPointingLeaf => '🙕',
            OrnamentalDingbats::TurnedNorthEastPointingLeaf => '🙖',
            OrnamentalDingbats::TurnedSouthEastPointingLeaf => '🙗',
            OrnamentalDingbats::NorthWestPointingVineLeaf => '🙘',
            OrnamentalDingbats::SouthWestPointingVineLeaf => '🙙',
            OrnamentalDingbats::NorthEastPointingVineLeaf => '🙚',
            OrnamentalDingbats::SouthEastPointingVineLeaf => '🙛',
            OrnamentalDingbats::HeavyNorthWestPointingVineLeaf => '🙜',
            OrnamentalDingbats::HeavySouthWestPointingVineLeaf => '🙝',
            OrnamentalDingbats::HeavyNorthEastPointingVineLeaf => '🙞',
            OrnamentalDingbats::HeavySouthEastPointingVineLeaf => '🙟',
            OrnamentalDingbats::NorthWestPointingBud => '🙠',
            OrnamentalDingbats::SouthWestPointingBud => '🙡',
            OrnamentalDingbats::NorthEastPointingBud => '🙢',
            OrnamentalDingbats::SouthEastPointingBud => '🙣',
            OrnamentalDingbats::HeavyNorthWestPointingBud => '🙤',
            OrnamentalDingbats::HeavySouthWestPointingBud => '🙥',
            OrnamentalDingbats::HeavyNorthEastPointingBud => '🙦',
            OrnamentalDingbats::HeavySouthEastPointingBud => '🙧',
            OrnamentalDingbats::HollowQuiltSquareOrnament => '🙨',
            OrnamentalDingbats::HollowQuiltSquareOrnamentInBlackSquare => '🙩',
            OrnamentalDingbats::SolidQuiltSquareOrnament => '🙪',
            OrnamentalDingbats::SolidQuiltSquareOrnamentInBlackSquare => '🙫',
            OrnamentalDingbats::LeftwardsRocket => '🙬',
            OrnamentalDingbats::UpwardsRocket => '🙭',
            OrnamentalDingbats::RightwardsRocket => '🙮',
            OrnamentalDingbats::DownwardsRocket => '🙯',
            OrnamentalDingbats::ScriptLigatureEtOrnament => '🙰',
            OrnamentalDingbats::HeavyScriptLigatureEtOrnament => '🙱',
            OrnamentalDingbats::LigatureOpenEtOrnament => '🙲',
            OrnamentalDingbats::HeavyLigatureOpenEtOrnament => '🙳',
            OrnamentalDingbats::HeavyAmpersandOrnament => '🙴',
            OrnamentalDingbats::SwashAmpersandOrnament => '🙵',
            OrnamentalDingbats::SansDashSerifHeavyDoubleTurnedCommaQuotationMarkOrnament => '🙶',
            OrnamentalDingbats::SansDashSerifHeavyDoubleCommaQuotationMarkOrnament => '🙷',
            OrnamentalDingbats::SansDashSerifHeavyLowDoubleCommaQuotationMarkOrnament => '🙸',
            OrnamentalDingbats::HeavyInterrobangOrnament => '🙹',
            OrnamentalDingbats::SansDashSerifInterrobangOrnament => '🙺',
            OrnamentalDingbats::HeavySansDashSerifInterrobangOrnament => '🙻',
            OrnamentalDingbats::VeryHeavySolidus => '🙼',
            OrnamentalDingbats::VeryHeavyReverseSolidus => '🙽',
            OrnamentalDingbats::CheckerBoard => '🙾',
        }
    }
}

impl std::convert::TryFrom<char> for OrnamentalDingbats {
    type Error = ();
    fn try_from(c: char) -> Result<Self, Self::Error> {
        match c {
            '🙐' => Ok(OrnamentalDingbats::NorthWestPointingLeaf),
            '🙑' => Ok(OrnamentalDingbats::SouthWestPointingLeaf),
            '🙒' => Ok(OrnamentalDingbats::NorthEastPointingLeaf),
            '🙓' => Ok(OrnamentalDingbats::SouthEastPointingLeaf),
            '🙔' => Ok(OrnamentalDingbats::TurnedNorthWestPointingLeaf),
            '🙕' => Ok(OrnamentalDingbats::TurnedSouthWestPointingLeaf),
            '🙖' => Ok(OrnamentalDingbats::TurnedNorthEastPointingLeaf),
            '🙗' => Ok(OrnamentalDingbats::TurnedSouthEastPointingLeaf),
            '🙘' => Ok(OrnamentalDingbats::NorthWestPointingVineLeaf),
            '🙙' => Ok(OrnamentalDingbats::SouthWestPointingVineLeaf),
            '🙚' => Ok(OrnamentalDingbats::NorthEastPointingVineLeaf),
            '🙛' => Ok(OrnamentalDingbats::SouthEastPointingVineLeaf),
            '🙜' => Ok(OrnamentalDingbats::HeavyNorthWestPointingVineLeaf),
            '🙝' => Ok(OrnamentalDingbats::HeavySouthWestPointingVineLeaf),
            '🙞' => Ok(OrnamentalDingbats::HeavyNorthEastPointingVineLeaf),
            '🙟' => Ok(OrnamentalDingbats::HeavySouthEastPointingVineLeaf),
            '🙠' => Ok(OrnamentalDingbats::NorthWestPointingBud),
            '🙡' => Ok(OrnamentalDingbats::SouthWestPointingBud),
            '🙢' => Ok(OrnamentalDingbats::NorthEastPointingBud),
            '🙣' => Ok(OrnamentalDingbats::SouthEastPointingBud),
            '🙤' => Ok(OrnamentalDingbats::HeavyNorthWestPointingBud),
            '🙥' => Ok(OrnamentalDingbats::HeavySouthWestPointingBud),
            '🙦' => Ok(OrnamentalDingbats::HeavyNorthEastPointingBud),
            '🙧' => Ok(OrnamentalDingbats::HeavySouthEastPointingBud),
            '🙨' => Ok(OrnamentalDingbats::HollowQuiltSquareOrnament),
            '🙩' => Ok(OrnamentalDingbats::HollowQuiltSquareOrnamentInBlackSquare),
            '🙪' => Ok(OrnamentalDingbats::SolidQuiltSquareOrnament),
            '🙫' => Ok(OrnamentalDingbats::SolidQuiltSquareOrnamentInBlackSquare),
            '🙬' => Ok(OrnamentalDingbats::LeftwardsRocket),
            '🙭' => Ok(OrnamentalDingbats::UpwardsRocket),
            '🙮' => Ok(OrnamentalDingbats::RightwardsRocket),
            '🙯' => Ok(OrnamentalDingbats::DownwardsRocket),
            '🙰' => Ok(OrnamentalDingbats::ScriptLigatureEtOrnament),
            '🙱' => Ok(OrnamentalDingbats::HeavyScriptLigatureEtOrnament),
            '🙲' => Ok(OrnamentalDingbats::LigatureOpenEtOrnament),
            '🙳' => Ok(OrnamentalDingbats::HeavyLigatureOpenEtOrnament),
            '🙴' => Ok(OrnamentalDingbats::HeavyAmpersandOrnament),
            '🙵' => Ok(OrnamentalDingbats::SwashAmpersandOrnament),
            '🙶' => Ok(OrnamentalDingbats::SansDashSerifHeavyDoubleTurnedCommaQuotationMarkOrnament),
            '🙷' => Ok(OrnamentalDingbats::SansDashSerifHeavyDoubleCommaQuotationMarkOrnament),
            '🙸' => Ok(OrnamentalDingbats::SansDashSerifHeavyLowDoubleCommaQuotationMarkOrnament),
            '🙹' => Ok(OrnamentalDingbats::HeavyInterrobangOrnament),
            '🙺' => Ok(OrnamentalDingbats::SansDashSerifInterrobangOrnament),
            '🙻' => Ok(OrnamentalDingbats::HeavySansDashSerifInterrobangOrnament),
            '🙼' => Ok(OrnamentalDingbats::VeryHeavySolidus),
            '🙽' => Ok(OrnamentalDingbats::VeryHeavyReverseSolidus),
            '🙾' => Ok(OrnamentalDingbats::CheckerBoard),
            _ => Err(()),
        }
    }
}

impl Into<u32> for OrnamentalDingbats {
    fn into(self) -> u32 {
        let c: char = self.into();
        let hex = c
            .escape_unicode()
            .to_string()
            .replace("\\u{", "")
            .replace("}", "");
        u32::from_str_radix(&hex, 16).unwrap()
    }
}

impl std::convert::TryFrom<u32> for OrnamentalDingbats {
    type Error = ();
    fn try_from(u: u32) -> Result<Self, Self::Error> {
        if let Ok(c) = char::try_from(u) {
            Self::try_from(c)
        } else {
            Err(())
        }
    }
}

impl Iterator for OrnamentalDingbats {
    type Item = Self;
    fn next(&mut self) -> Option<Self> {
        let index: u32 = (*self).into();
        use std::convert::TryFrom;
        Self::try_from(index + 1).ok()
    }
}

impl OrnamentalDingbats {
    /// The character with the lowest index in this unicode block
    pub fn new() -> Self {
        OrnamentalDingbats::NorthWestPointingLeaf
    }

    /// The character's name, in sentence case
    pub fn name(&self) -> String {
        let s = std::format!("OrnamentalDingbats{:#?}", self);
        string_morph::to_sentence_case(&s)
    }
}