Line data Source code
1 : // Package valerr は、ドメイン層で発生する値検証エラーを表現するための共通インターフェースおよび型定義を提供します。
2 : // バリデーションエラーの集約やエラーメッセージ整形などに利用します。
3 : package valerr
4 :
5 : // FieldError は 1 フィールドに対する単一の検証エラーを表します。
6 : // JSON では {"code": "...", "params": {...}} の形でシリアライズされます。
7 : type FieldError struct {
8 : // Code はエラーコードです (例: "validation.rules.required", "validation.rules.duplicate" など)。
9 : Code string `json:"code"`
10 :
11 : // Params はメッセージ組み立てや i18n に利用する追加パラメータです。
12 : // 例: {"field": "domain.address.purposeId.label"}
13 : Params map[string]any `json:"params,omitempty"`
14 : }
15 :
16 : // ValidationErrors はフィールド名ごとの検証エラー一覧を表します。
17 : // JSON では {"domain.address.purposeId": [ {..}, {..} ]} のようにシリアライズされます。
18 : type ValidationErrors map[string][]FieldError
19 :
20 : // New は空の ValidationErrors を返します。
21 0 : func New() ValidationErrors {
22 0 : return make(ValidationErrors)
23 0 : }
24 :
25 : // Add は指定フィールドに FieldError を追加します。
26 0 : func (ve ValidationErrors) Add(field, code string, params map[string]any) {
27 0 : ve[field] = append(ve[field], FieldError{
28 0 : Code: code,
29 0 : Params: params,
30 0 : })
31 0 : }
32 :
33 : // ToDetails は app エラーの Details フィールドに設定可能な形式へ変換します。
34 : // apperr.New の第3引数 (details map[string]any) にそのまま渡すために利用します。
35 0 : func (ve ValidationErrors) ToDetails() map[string]any {
36 0 : if ve == nil {
37 0 : return nil
38 0 : }
39 :
40 0 : details := make(map[string]any, len(ve))
41 0 : for k, v := range ve {
42 0 : details[k] = v
43 0 : }
44 0 : return details
45 : }
|