surfpool_db/
lib.rs

1pub use diesel;
2use diesel::deserialize::*;
3pub use diesel_dynamic_schema;
4use diesel_dynamic_schema::dynamic_value::*;
5use txtx_addon_kit::types::types::Value;
6
7pub mod schema;
8
9#[derive(PartialEq, Debug)]
10pub struct DynamicValue(pub Value);
11
12#[cfg(feature = "sqlite")]
13impl FromSql<Any, diesel::sqlite::Sqlite> for DynamicValue {
14    fn from_sql(value: diesel::sqlite::SqliteValue) -> Result<Self> {
15        use diesel::sqlite::{Sqlite, SqliteType};
16        match value.value_type() {
17            Some(SqliteType::Text) => {
18                <String as FromSql<diesel::sql_types::Text, Sqlite>>::from_sql(value)
19                    .map(|s| DynamicValue(Value::string(s)))
20            }
21            Some(SqliteType::Long) => {
22                <i32 as FromSql<diesel::sql_types::Integer, Sqlite>>::from_sql(value)
23                    .map(|s| DynamicValue(Value::integer(s.into())))
24            }
25            _ => Err("Unknown data type".into()),
26        }
27    }
28}
29
30#[cfg(feature = "postgres")]
31impl FromSql<Any, diesel::pg::Pg> for DynamicValue {
32    fn from_sql(value: diesel::pg::PgValue) -> Result<Self> {
33        use std::num::NonZeroU32;
34
35        use diesel::pg::Pg;
36
37        const VARCHAR_OID: NonZeroU32 = NonZeroU32::new(1043).unwrap();
38        const TEXT_OID: NonZeroU32 = NonZeroU32::new(25).unwrap();
39        const INTEGER_OID: NonZeroU32 = NonZeroU32::new(23).unwrap();
40
41        match value.get_oid() {
42            VARCHAR_OID | TEXT_OID => {
43                <String as FromSql<diesel::sql_types::Text, Pg>>::from_sql(value)
44                    .map(|s| DynamicValue(Value::string(s)))
45            }
46            INTEGER_OID => <i32 as FromSql<diesel::sql_types::Integer, Pg>>::from_sql(value)
47                .map(|s| DynamicValue(Value::integer(s.into()))),
48            e => Err(format!("Unknown type: {e}").into()),
49        }
50    }
51}