我想保存实体在数据库中的一些特定错误的情况下,这似乎很好使用自定义结果枚举这应该重新抛出Err
和SaveOnErr
当使用?
.
我试着从Result
中复制FromResidual
个性状,这似乎是?
个使用的原因,但失败了,可以这样做吗?
#[derive(Copy, PartialEq, Eq, Debug, Clone)]
pub enum SavableResult<T, E> {
Ok(T),
Err(E),
SaveOnErr(E),
}
fn test1() {
let result = test2();
match result {
SavableResult::Ok(_) | SavableResult::SaveOnErr(_) => save(),
SavableResult::Err(_) => {}
};
}
fn test2() -> SavableResult<(), ApiErr> {
test3()?; // not working
SavableResult::Ok(())
}
fn test3() -> SavableResult<(), ApiErr> {
SavableResult::Ok(())
}
fn save() {
// save in db
}
我想解决的具体问题:
pub async fn execute(&self) -> Result<JwtTokensPair, ApiErr> {
let mut auth = AuthRepository::get_by_user_id(user_id, &trx).await?;
// in case of incorrect password `auth` entity `failed_auth_count`
// is incremented and I need to save it in database anyway
// to block any auth after 10 fails for hour
// but only for one specific error
let result = auth.login(&self.password, self.hash_service);
// problem here is that it's easy to forget which
// entities have this special requirement
// or use this ugly match everywhere
match result {
Ok(_)
| Err(ApiErr {
save_on_err: true, ..
}) => AuthRepository::save(&auth, &trx).await?,
Err(_) => {}
};
trx.commit().await?;
result
}