¿Cómo implemento Queryable e Insertable para tipos de campo personalizados en Diesel?

Tengo una tabla SQL con la que quiero trabajar a través de Diesel:

CREATE TABLE records (
    id BIGSERIAL PRIMARY KEY,
    record_type SMALLINT NOT NULL,
    value DECIMAL(10, 10) NOT NULL
)

Esta tabla genera el siguiente esquema:

table! {
    records (id) {
        id -> Int8,
        record_type -> Int2,
        value -> Numeric,
    }
}

Diesel exporta decimales comobigdecimal::BigDecimal, pero me gustaría trabajar condecimal::d128 en lugar. También quiero mapearrecord_type a una enumeración, así que declaro mi modelo así:

use decimal::d128;

pub enum RecordType {
    A,
    B,
}

pub struct Record {
    pub id: i64,
    pub record_type: RecordType,
    pub value: d128,
}

No puedo usar#derive(Queryable, Insertable) debido a la asignación de tipos no estándar, así que trato de implementar estos rasgos yo mismo:

impl Queryable<records::SqlType, Pg> for Record {
    type Row = (i64, i16, BigDecimal);

    fn build(row: Self::Row) -> Self {
        Record {
            id: row.0,
            record_type: match row.1 {
                1 => RecordType::A,
                2 => RecordType::B,
                _ => panic!("Wrong record type"),
            },
            value: d128!(format!("{}", row.2)),
        }
    }
}

No puedo entender cómo implementarInsertable. Cuál es elValues tipo asociado? La documentación de Diesel no es muy clara al respecto.

¿Quizás haya una mejor manera de lograr lo que estoy tratando de hacer?

Cargo.toml:

[dependencies]
bigdecimal = "0.0.10"
decimal = "2.0.4"
diesel = { version = "1.1.1", features = ["postgres", "bigdecimal", "num-bigint", "num-integer", "num-traits"] }
dotenv = "0.9.0"

Respuestas a la pregunta(2)

Su respuesta a la pregunta