1use std::fmt::Display;
2
3use super::IntoSqlType;
4use crate::error::*;
5
6pub trait SqlEnum: Sized + 'static + Clone {
9 type IntegerType: Display + TryInto<usize> + IntoSqlType;
11
12 const ENUM_NAME: &'static str;
14
15 const VARIANTS_IN_ORDER: &'static [Self];
17
18 fn from_integer(integer: Self::IntegerType) -> Result<Self> {
20 let err = Error::NoSuchEnumVariant {
21 enum_name: Self::ENUM_NAME,
22 integer_string: integer.to_string(),
23 };
24
25 let as_usize: usize = match integer.try_into() {
26 Ok(v) => v,
27 Err(_) => return Err(err),
28 };
29
30 Self::VARIANTS_IN_ORDER.get(as_usize).cloned().ok_or(err)
31 }
32
33 fn to_integer(self) -> Self::IntegerType;
35}