#macro-derive #pattern #domain #architecture #design #design-pattern

domainderive

domain_derive 包含 domain_patterns crate 的 derive 宏

27 个版本

0.2.137 2019年11月12日
0.2.136 2019年9月26日
0.1.99 2019年9月10日

28#设计模式

Download history 3/week @ 2024-03-08 2/week @ 2024-03-15 92/week @ 2024-03-29 29/week @ 2024-04-05

63 每月下载次数
domain_patterns 中使用

MIT 许可证

60KB
562

domain_derive

此 crate 提供了 domain_patterns derive 宏。

实体宏

Entity derive 宏可用于自动实现来自 domain_patterns crate 的 Entity 特质的全部方法。这仅在某些先决条件满足时有效

  1. 您正在将其应用于一个结构体。
  2. 您的结构体有一个类型为 Uuidid 字段。
  3. 您的结构体有一个 version 字段,它是一种整数类型。
#[macro_use]
extern crate domain_derive;
use uuid::Uuid;

#[derive(Entity)]
struct User {
    id: Uuid,
    version: u64
};

值设置宏

ValueSetup derive 宏可用于为您的选择值对象设置尽可能多的样板代码。它检查一些先决条件

  1. 您正在将其应用于一个结构体。
  2. 您的结构体有一个名为 value 的单个字段,其类型为任何可克隆的类型。

使用此宏后,您仍然需要实现 ValueObject 特质,但您不需要实现 TryFrom(或为 TryFrom 创建验证错误,这由宏处理),也不需要实现 PartialEqClone

如果需要在其他地方使用验证错误,则创建的验证错误将是您的结构体名称加上 ValidationError。例如,如果您有一个 Email 结构体,则生成的验证错误将称为 EmailValidationError

#[macro_use]
extern crate domain_derive;

use domain_patterns::ValueObject;
use regex::Regex;

#[derive(ValueSetup)]
pub struct Email {
    pub value: String,
}

impl ValueObject<String> for Email {
    fn validate(value: &String) -> bool {
        let email_rx = Regex::new(
            r"^(?i)[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$"
        ).unwrap();

        email_rx.is_match(value)
    }

    fn value(&self) -> &String {
        return &self.value;
    }
}

领域事件宏

DomainEvent 宏应应用于表示领域事件的结构体。只要满足某些先决条件,它将完全实现 DomainEvent 特质的全部方法

  1. 您正在将其应用于一个结构体。
  2. 需要有一个类型为 Uuidid 字段。
  3. 任何整数类型都需要有一个版本字段(不允许浮点数)。
  4. 需要有一个类型为 Uuidaggregate_id 字段。
  5. 需要有一个类型为 i64occurred 字段。
#[macro_use]
extern crate domain_derive;

use uuid::Uuid;
use domain_patterns::event::DomainEvent;

#[derive(Serialize, Clone, DomainEvent)]
pub struct FirstNameUpdatedEvent {
    pub aggregate_id: Uuid,
    pub first_name: String,
    pub version: u64,
    pub id: Uuid,
    pub occurred: i64,
}

领域事件宏

DomainEvents 宏应该应用于包含所有领域事件变体的枚举。这是一个非常薄的包装,宏所做的只是检查结构是否为枚举,然后应用具有无方法的特质。

#[macro_use]
extern crate domain_derive;

use uuid::Uuid;
use domain_patterns::event::{DomainEvent, DomainEvents};

#[derive(Serialize, Clone, DomainEvent)]
pub struct FirstNameUpdatedEvent {
    pub aggregate_id: Uuid,
    pub first_name: String,
    pub version: u64,
    pub id: Uuid,
    pub occurred: i64,
}

#[derive(Clone, DomainEvents)]
pub enum UserEvents {
    FirstNameUpdated(FirstNameUpdatedEvent),
}

许可:MIT

依赖项

~0.4–1MB
~23K SLoC