surfpool-db 0.9.5

Surfpool is the best place to train before surfing Solana.
Documentation
pub use diesel;
use diesel::deserialize::*;
pub use diesel_dynamic_schema;
use diesel_dynamic_schema::dynamic_value::*;
use txtx_addon_kit::types::types::Value;

pub mod schema;

#[derive(PartialEq, Debug)]
pub struct DynamicValue(pub Value);

#[cfg(feature = "sqlite")]
impl FromSql<Any, diesel::sqlite::Sqlite> for DynamicValue {
    fn from_sql(value: diesel::sqlite::SqliteValue) -> Result<Self> {
        use diesel::sqlite::{Sqlite, SqliteType};
        match value.value_type() {
            Some(SqliteType::Text) => {
                <String as FromSql<diesel::sql_types::Text, Sqlite>>::from_sql(value)
                    .map(|s| DynamicValue(Value::string(s)))
            }
            Some(SqliteType::Long) => {
                <i32 as FromSql<diesel::sql_types::Integer, Sqlite>>::from_sql(value)
                    .map(|s| DynamicValue(Value::integer(s.into())))
            }
            _ => Err("Unknown data type".into()),
        }
    }
}

#[cfg(feature = "postgres")]
impl FromSql<Any, diesel::pg::Pg> for DynamicValue {
    fn from_sql(value: diesel::pg::PgValue) -> Result<Self> {
        use std::num::NonZeroU32;

        use diesel::pg::Pg;

        const VARCHAR_OID: NonZeroU32 = NonZeroU32::new(1043).unwrap();
        const TEXT_OID: NonZeroU32 = NonZeroU32::new(25).unwrap();
        const INTEGER_OID: NonZeroU32 = NonZeroU32::new(23).unwrap();

        match value.get_oid() {
            VARCHAR_OID | TEXT_OID => {
                <String as FromSql<diesel::sql_types::Text, Pg>>::from_sql(value)
                    .map(|s| DynamicValue(Value::string(s)))
            }
            INTEGER_OID => <i32 as FromSql<diesel::sql_types::Integer, Pg>>::from_sql(value)
                .map(|s| DynamicValue(Value::integer(s.into()))),
            e => Err(format!("Unknown type: {e}").into()),
        }
    }
}