Skip to main content

diesel/mysql_like/types/
enum_.rs

1use crate::mysql_like::MysqlLikeBackend;
2use crate::sql_types::EnumSqlType;
3use crate::types::enum_::{EnumMapping, EnumTypeMapping, EnumVariant, IntMapping};
4use std::io::Write;
5
6#[diagnostic::do_not_recommend]
7impl<DB: MysqlLikeBackend> EnumMapping<DB> for EnumTypeMapping {
8    fn map_to_database_value<'b>(
9        output: &mut crate::serialize::Output<'b, '_, DB>,
10        variant: &'static EnumVariant,
11    ) -> crate::serialize::Result {
12        output.write_all(variant.sql_name.as_bytes())?;
13        Ok(crate::serialize::IsNull::No)
14    }
15
16    fn map_from_database_value(
17        raw: <DB as crate::backend::Backend>::RawValue<'_>,
18        type_name: &'static str,
19        variants: &'static [EnumVariant],
20    ) -> crate::deserialize::Result<usize> {
21        let name = raw.as_bytes();
22        variants
23            .iter()
24            .position(|v| v.sql_name.as_bytes() == name)
25            .ok_or_else(|| {
26                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("Invalid enum variant `{0}` for `{2}`. Allowed variants are {1}",
                String::from_utf8_lossy(name),
                variants.iter().map(|v|
                                ::alloc::__export::must_use({
                                        ::alloc::fmt::format(format_args!("`{0}`", v.sql_name))
                                    })).collect::<Vec<_>>().join(", "), type_name))
    })format!(
27                    "Invalid enum variant `{}` for `{type_name}`. Allowed variants are {}",
28                    String::from_utf8_lossy(name),
29                    variants
30                        .iter()
31                        .map(|v| format!("`{}`", v.sql_name))
32                        .collect::<Vec<_>>()
33                        .join(", ")
34                )
35                .into()
36            })
37    }
38}
39
40#[diagnostic::do_not_recommend]
41impl<DB: MysqlLikeBackend> EnumSqlType<true, DB>
42    for crate::sql_types::Unsigned<crate::sql_types::BigInt>
43{
44    type Strategy = IntMapping<u64, Self>;
45}
46
47#[diagnostic::do_not_recommend]
48impl<DB: MysqlLikeBackend> EnumSqlType<true, DB>
49    for crate::sql_types::Unsigned<crate::sql_types::Integer>
50{
51    type Strategy = IntMapping<u32, Self>;
52}
53
54#[diagnostic::do_not_recommend]
55impl<DB: MysqlLikeBackend> EnumSqlType<true, DB>
56    for crate::sql_types::Unsigned<crate::sql_types::SmallInt>
57{
58    type Strategy = IntMapping<u16, Self>;
59}
60
61#[diagnostic::do_not_recommend]
62impl<DB: MysqlLikeBackend> EnumSqlType<true, DB>
63    for crate::sql_types::Unsigned<crate::sql_types::TinyInt>
64{
65    type Strategy = IntMapping<u8, Self>;
66}