Line data Source code
1 : use diesel::pg::{Pg, PgValue};
2 : use diesel::{
3 : deserialize::FromSql, deserialize::FromSqlRow, expression::AsExpression, serialize::ToSql,
4 : sql_types::Int2,
5 : };
6 : use serde::{Deserialize, Serialize};
7 :
8 1455 : #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, FromSqlRow, AsExpression)]
9 : #[diesel(sql_type = SplitStateSQLRepr)]
10 504 : #[derive(Deserialize, Serialize)]
11 : pub enum SplitState {
12 : Idle = 0,
13 : Splitting = 1,
14 : }
15 :
16 : impl Default for SplitState {
17 504 : fn default() -> Self {
18 504 : Self::Idle
19 504 : }
20 : }
21 :
22 : type SplitStateSQLRepr = Int2;
23 :
24 : impl ToSql<SplitStateSQLRepr, Pg> for SplitState {
25 516 : fn to_sql<'a>(
26 516 : &'a self,
27 516 : out: &'a mut diesel::serialize::Output<Pg>,
28 516 : ) -> diesel::serialize::Result {
29 516 : let raw_value: i16 = *self as i16;
30 516 : let mut new_out = out.reborrow();
31 516 : ToSql::<SplitStateSQLRepr, Pg>::to_sql(&raw_value, &mut new_out)
32 516 : }
33 : }
34 :
35 : impl FromSql<SplitStateSQLRepr, Pg> for SplitState {
36 1455 : fn from_sql(pg_value: PgValue) -> diesel::deserialize::Result<Self> {
37 1455 : match FromSql::<SplitStateSQLRepr, Pg>::from_sql(pg_value).map(|v| match v {
38 1450 : 0 => Some(Self::Idle),
39 5 : 1 => Some(Self::Splitting),
40 0 : _ => None,
41 1455 : })? {
42 1455 : Some(v) => Ok(v),
43 0 : None => Err(format!("Invalid SplitState value, was: {:?}", pg_value.as_bytes()).into()),
44 : }
45 1455 : }
46 : }
|