iqps_backend/db/
models.rs

1use duplicate::duplicate_item;
2use sqlx::{postgres::PgTypeInfo, Postgres};
3
4use crate::qp::{Exam, Semester};
5
6// DO NOT ASK ME WHAT THE BELOW TRAIT IMPLEMENTATIONS DO
7// I JUST KNOW THEY ARE NEEDED TO TEACH SQLX HOW TO DECODE AND ENCODE THIS SHIT
8impl sqlx::Type<Postgres> for Exam {
9    fn type_info() -> <Postgres as sqlx::Database>::TypeInfo {
10        <String as sqlx::Type<Postgres>>::type_info()
11    }
12}
13
14impl sqlx::Type<Postgres> for Semester {
15    fn type_info() -> <Postgres as sqlx::Database>::TypeInfo {
16        // Yes the init sql in queries.rs sets the type to `TEXT` but turns out the database has
17        // `VARCHAR` type so idk what to do here
18        PgTypeInfo::with_name("VARCHAR")
19    }
20}
21
22#[duplicate_item(
23    DBEncodeDecode;
24    [ Exam ];
25    [ Semester ];
26)]
27impl sqlx::Decode<'_, sqlx::Postgres> for DBEncodeDecode {
28    fn decode(
29        value: <sqlx::Postgres as sqlx::Database>::ValueRef<'_>,
30    ) -> Result<Self, sqlx::error::BoxDynError> {
31        Ok(Self::try_from(value.as_str()?)?)
32    }
33}
34
35impl<'q> sqlx::Encode<'q, Postgres> for Exam {
36    fn encode_by_ref(
37        &self,
38        buf: &mut <Postgres as sqlx::Database>::ArgumentBuffer<'q>,
39    ) -> Result<sqlx::encode::IsNull, sqlx::error::BoxDynError> {
40        <String as sqlx::Encode<'q, Postgres>>::encode_by_ref(&String::from(self), buf)
41    }
42}