#sea-orm #orm #model #convert #try #active-model

sea-orm-try-into-active-model

sea-orm的TryIntoActiveModel

2个不稳定版本

0.2.0 2023年10月26日
0.1.0 2023年10月26日

#1427 in 数据库接口

MIT 许可证

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