Add trait for db_model to model conversion

This commit is contained in:
Tobias Reisinger 2023-11-27 15:09:14 +01:00
parent 8dab4b9a50
commit cb47dcda5c
Signed by: serguzim
GPG key ID: 13AD60C237A28DFE
5 changed files with 92 additions and 59 deletions
emgauwa-lib/src/models

View file

@ -1,20 +1,33 @@
use crate::db;
use crate::db::errors::DatabaseError;
use crate::db::{DbRelay, DbSchedule};
use futures::executor;
use serde_derive::Serialize;
use sqlx::pool::PoolConnection;
use sqlx::Sqlite;
pub trait FromDbModel {
type DbModel: Clone;
fn from_db_model(
conn: &mut PoolConnection<Sqlite>,
db_model: Self::DbModel,
) -> Result<Self, DatabaseError>
where
Self: Sized;
}
#[derive(Serialize, Debug)]
pub struct Schedule {
#[serde(flatten)]
pub schedule: db::DbSchedule,
pub schedule: DbSchedule,
pub tags: Vec<String>,
}
#[derive(Serialize, Debug)]
pub struct Relay {
#[serde(flatten)]
pub relay: db::DbRelay,
pub relay: DbRelay,
pub controller: db::DbController,
pub tags: Vec<String>,
}
@ -26,25 +39,53 @@ pub struct Controller {
pub relays: Vec<Relay>,
}
impl Schedule {
pub fn from_schedule(schedule: db::DbSchedule, conn: &mut PoolConnection<Sqlite>) -> Self {
let schedule = schedule.clone();
let tags = executor::block_on(schedule.get_tags(conn)).unwrap();
impl FromDbModel for Schedule {
type DbModel = DbSchedule;
Schedule { schedule, tags }
fn from_db_model(
conn: &mut PoolConnection<Sqlite>,
db_model: Self::DbModel,
) -> Result<Self, DatabaseError> {
let schedule = db_model.clone();
let tags = executor::block_on(schedule.get_tags(conn))?;
Ok(Schedule { schedule, tags })
}
}
impl Relay {
pub fn from_db_relay(relay: db::DbRelay, conn: &mut PoolConnection<Sqlite>) -> Self {
let relay = relay.clone();
let controller = executor::block_on(relay.get_controller(conn)).unwrap();
let tags = executor::block_on(relay.get_tags(conn)).unwrap();
impl FromDbModel for Relay {
type DbModel = DbRelay;
Relay {
fn from_db_model(
conn: &mut PoolConnection<Sqlite>,
db_model: Self::DbModel,
) -> Result<Self, DatabaseError> {
let relay = db_model.clone();
let controller = executor::block_on(relay.get_controller(conn))?;
let tags = executor::block_on(relay.get_tags(conn))?;
Ok(Relay {
relay,
controller,
tags,
}
})
}
}
pub fn convert_db_list<T: FromDbModel>(
conn: &mut PoolConnection<Sqlite>,
db_models: Vec<T::DbModel>,
) -> Result<Vec<T>, DatabaseError> {
let mut result: Vec<T> = Vec::new();
db_models.into_iter().try_for_each(|s| {
let new = T::from_db_model(conn, s);
match new {
Ok(new) => {
result.push(new);
Ok(())
}
Err(e) => Err(e),
}
})?;
Ok(result)
}