pub mod postgres; pub mod error; use std::error::Error; use futures::TryFutureExt; pub use error::DatabaseError; use proto::touchpad::common::v1; use crate::hub::Output; type Result = std::result::Result; #[async_trait::async_trait] pub trait DatabaseClient { async fn get_swimmer(&self, id: u32) -> Result; async fn add_swimmer(&self, swimmer: &v1::Swimmer) -> Result<()>; async fn get_team(&self, id: u32) -> Result; async fn add_team(&self, team: &v1::Team) -> Result<()>; async fn get_meet(&self, id: u32) -> Result; async fn add_meet(&self, meet: &v1::SwimMeet) -> Result<()>; async fn get_event(&self, id: u32) -> Result; async fn get_event_by_number(&self, meet_id: u32, number: u32) -> Result; async fn add_event(&self, event: &v1::Event) -> Result<()>; } #[async_trait::async_trait] impl Output for T where T: DatabaseClient + Sync { async fn add_swimmer(&self, swimmer: &v1::Swimmer) -> std::result::Result<(), Box> { self.add_swimmer(swimmer).err_into().await } async fn add_team(&self, team: &v1::Team) -> std::result::Result<(), Box> { self.add_team(team).err_into().await } async fn add_meet(&self, meet: &v1::SwimMeet) -> std::result::Result<(), Box> { self.add_meet(meet).err_into().await } async fn upsert_event(&self, event: &v1::Event) -> std::result::Result<(), Box> { self.add_event(event).err_into().await } }