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}