2个不稳定版本
0.2.0 | 2023年10月26日 |
---|---|
0.1.0 | 2023年10月26日 |
#1427 in 数据库接口
7KB
sea-orm-try-into-active-model
提供DeriveTryIntoActiveModel
派生宏和TryIntoActiveModel
特质
使用示例
use sea_orm_try_into_active_model::DeriveTryIntoActiveModel;
use sea_orm::entity::prelude::*;
use sea_orm::ActiveEnum;
use sea_orm::ActiveValue;
use sea_orm::Value;
use strum::VariantNames;
use strum_macros::EnumVariantNames;
use strum_macros::EnumString;
use strum_macros::IntoStaticStr;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, EnumIter, DeriveActiveEnum, IntoStaticStr, EnumString, EnumVariantNames]
#[sea_orm(rs_type = "i32", db_type = "Integer")]
#[repr(i32)]
pub enum Kind {
Type1 = 0,
Type2 = 1,
}
#[derive(Clone, Debug, DeriveEntityModel, Eq)]
#[sea_orm(schema_name = "generic_devices", table_name = "list")]
pub struct DeviceInfo {
#[sea_orm(primary_key, auto_increment = false, unique)]
pub brand_id: i32,
pub object_uuid: Option<Uuid>,
pub kind: Kind,
}
#[derive(DeriveTryIntoActiveModel)]
#[sea_orm(
active_model = GenericDevice::ActiveModel,
error = anyhow::Error
)]
pub struct DeviceInfoPost {
pub brand_id: i32,
#[sea_orm(try_into = "try_parse_option_uuid")]
pub object_uuid: Option<String>,
#[sea_orm(try_into = "try_parse_to_enum", direct)]
pub kind: i32,
}
pub fn try_parse_to_enum<T: ActiveEnum + VariantNames + Into<Value>>(
value: T::Value,
) -> Result<ActiveValue<T>, ParseError> {
Ok(ActiveValue::Set(T::try_from_value(&value).map_err(|_| e_active_enum::<T>(value))?))
}
pub fn try_parse_option_uuid(value: Option<String>) -> Result<Option<Uuid>, uuid::Error> {
value.map(|v| v.parse()).transpose()
}
此代码将在DeviceInfoPost
上添加方法try_into_active_model()
,如果提供的所有解析器都未失败,则将其转换为DeviceInfo::ActiveModel
。如果其中一个失败,它将返回在error
属性中指定的错误。
支持在#[sea_orm()
内部使用的结构属性
active_model
- 指向结构可以转换为的ActiveModel
error
- 指向错误类型应在try_into_active_model()
转换错误
支持在#[sea_orm()
内部使用的字段属性
try_into
- 指定一个应使用的辅助函数,用于将值转换为ActiveModel值direct
- 指定辅助函数直接返回ActiveValue<T>
或结构错误属性中指定的错误,如果没有指定,则辅助函数的值始终封装在ActiveValue::Set
中,错误转换为指定的错误类型
依赖
~6MB
~138K SLoC