This commit is contained in:
Chris Tsang 2023-01-09 14:46:19 +08:00
parent f0634c2451
commit 5c93253877
4 changed files with 16 additions and 22 deletions

View File

@ -352,13 +352,8 @@ impl ActiveEnum {
#[automatically_derived] #[automatically_derived]
impl sea_orm::TryGetable for #ident { impl sea_orm::TryGetable for #ident {
fn try_get(res: &sea_orm::QueryResult, pre: &str, col: &str) -> std::result::Result<Self, sea_orm::TryGetError> { fn try_get_by<I: sea_orm::ColIdx>(res: &sea_orm::QueryResult, idx: I) -> std::result::Result<Self, sea_orm::TryGetError> {
let value = <<Self as sea_orm::ActiveEnum>::Value as sea_orm::TryGetable>::try_get(res, pre, col)?; let value = <<Self as sea_orm::ActiveEnum>::Value as sea_orm::TryGetable>::try_get_by(res, idx)?;
<Self as sea_orm::ActiveEnum>::try_from_value(&value).map_err(sea_orm::TryGetError::DbErr)
}
fn try_get_by_index(res: &sea_orm::QueryResult, idx: usize) -> std::result::Result<Self, sea_orm::TryGetError> {
let value = <<Self as sea_orm::ActiveEnum>::Value as sea_orm::TryGetable>::try_get_by_index(res, idx)?;
<Self as sea_orm::ActiveEnum>::try_from_value(&value).map_err(sea_orm::TryGetError::DbErr) <Self as sea_orm::ActiveEnum>::try_from_value(&value).map_err(sea_orm::TryGetError::DbErr)
} }
} }

View File

@ -61,6 +61,15 @@ impl From<TryGetError> for DbErr {
// QueryResult // // QueryResult //
impl QueryResult { impl QueryResult {
/// Get a value from the query result with an ColIdx
pub fn try_get_by<T, I>(&self, index: I) -> Result<T, DbErr>
where
T: TryGetable,
I: ColIdx,
{
Ok(T::try_get_by(self, index)?)
}
/// Get a value from the query result with prefixed column name /// Get a value from the query result with prefixed column name
pub fn try_get<T>(&self, pre: &str, col: &str) -> Result<T, DbErr> pub fn try_get<T>(&self, pre: &str, col: &str) -> Result<T, DbErr>
where where
@ -125,7 +134,7 @@ impl<T: TryGetable> TryGetable for Option<T> {
} }
/// Column Index, used by [`TryGetable`] /// Column Index, used by [`TryGetable`]
pub trait ColIdx: std::fmt::Debug { pub trait ColIdx: std::fmt::Debug + Copy {
#[cfg(feature = "sqlx-mysql")] #[cfg(feature = "sqlx-mysql")]
/// Type shenanigans /// Type shenanigans
type SqlxMySqlIndex: sqlx::ColumnIndex<sqlx::mysql::MySqlRow>; type SqlxMySqlIndex: sqlx::ColumnIndex<sqlx::mysql::MySqlRow>;

View File

@ -39,13 +39,8 @@ impl From<Events> for Value {
} }
impl TryGetable for Events { impl TryGetable for Events {
fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> { fn try_get_by<I: sea_orm::ColIdx>(res: &QueryResult, idx: I) -> Result<Self, TryGetError> {
let vec: Vec<String> = res.try_get(pre, col).map_err(TryGetError::DbErr)?; let vec: Vec<String> = res.try_get_by(idx).map_err(TryGetError::DbErr)?;
Ok(Events(vec.into_iter().map(Event).collect()))
}
fn try_get_by_index(res: &QueryResult, idx: usize) -> Result<Self, TryGetError> {
let vec: Vec<String> = res.try_get_by_index(idx).map_err(TryGetError::DbErr)?;
Ok(Events(vec.into_iter().map(Event).collect())) Ok(Events(vec.into_iter().map(Event).collect()))
} }
} }

View File

@ -25,13 +25,8 @@ impl From<StringVec> for Value {
} }
impl TryGetable for StringVec { impl TryGetable for StringVec {
fn try_get(res: &QueryResult, pre: &str, col: &str) -> Result<Self, TryGetError> { fn try_get_by<I: sea_orm::ColIdx>(res: &QueryResult, idx: I) -> Result<Self, TryGetError> {
let json_str: String = res.try_get(pre, col).map_err(TryGetError::DbErr)?; let json_str: String = res.try_get_by(idx).map_err(TryGetError::DbErr)?;
serde_json::from_str(&json_str).map_err(|e| TryGetError::DbErr(DbErr::Json(e.to_string())))
}
fn try_get_by_index(res: &QueryResult, idx: usize) -> Result<Self, TryGetError> {
let json_str: String = res.try_get_by_index(idx).map_err(TryGetError::DbErr)?;
serde_json::from_str(&json_str).map_err(|e| TryGetError::DbErr(DbErr::Json(e.to_string()))) serde_json::from_str(&json_str).map_err(|e| TryGetError::DbErr(DbErr::Json(e.to_string())))
} }
} }