From 69a52b6c7e057644df8dd60d1ff7a8aaee6abaa6 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Fri, 7 May 2021 21:37:29 +0800 Subject: [PATCH] Use generic for try_get --- src/query/result.rs | 51 ++++++++++++++++++++++++++++--------------- src/tests_cfg/cake.rs | 4 ++-- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/query/result.rs b/src/query/result.rs index 3225612f..39fc8b30 100644 --- a/src/query/result.rs +++ b/src/query/result.rs @@ -14,38 +14,47 @@ pub(crate) enum QueryResultRow { #[derive(Debug)] pub struct TypeErr; -// QueryResult // +pub trait TryGetable { + fn try_get(res: &QueryResult, col: &str) -> Result + where + Self: std::marker::Sized; +} -impl QueryResult { - pub fn try_get_i32(&self, col: &str) -> Result { - match &self.row { +// TryGetable // + +impl TryGetable for i32 { + fn try_get(res: &QueryResult, col: &str) -> Result { + match &res.row { QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - - if let Ok(val) = row.try_get(col) { - Ok(val) - } else { - Err(TypeErr) - } + Ok(row.try_get(col)?) } } } +} - pub fn try_get_string(&self, col: &str) -> Result { - match &self.row { +impl TryGetable for String { + fn try_get(res: &QueryResult, col: &str) -> Result { + match &res.row { QueryResultRow::SqlxMySql(row) => { use sqlx::Row; - - if let Ok(val) = row.try_get(col) { - Ok(val) - } else { - Err(TypeErr) - } + Ok(row.try_get(col)?) } } } } +// QueryResult // + +impl QueryResult { + pub fn try_get(&self, col: &str) -> Result + where + T: TryGetable, + { + T::try_get(self, col) + } +} + // TypeErr // impl Error for TypeErr {} @@ -55,3 +64,9 @@ impl fmt::Display for TypeErr { write!(f, "{:?}", self) } } + +impl From for TypeErr { + fn from(_: sqlx::Error) -> TypeErr { + TypeErr + } +} diff --git a/src/tests_cfg/cake.rs b/src/tests_cfg/cake.rs index f8243e85..9b12a39b 100644 --- a/src/tests_cfg/cake.rs +++ b/src/tests_cfg/cake.rs @@ -53,8 +53,8 @@ impl Relation for CakeRelation { impl Model for CakeModel { fn from_query_result(row: QueryResult) -> Result { Ok(Self { - id: row.try_get_i32("id")?, - name: row.try_get_string("name")?, + id: row.try_get("id")?, + name: row.try_get("name")?, }) } }