Line data Source code
1 : // Package valerr は、ドメイン層で発生する値検証エラーを表現するための共通インターフェースおよび型定義を提供します。
2 : // バリデーションエラーの集約やエラーメッセージ整形などに利用します。
3 : package valerr
4 :
5 : import "resume/internal/domain/entity"
6 :
7 : // FromDomain converts domain-level InvalidAddressError to a handler/presenter friendly details map.
8 : // Same shape as your handlerutil's "details".
9 0 : func FromDomain(inv entity.InvalidAddressError) map[string]any {
10 0 : if len(inv.Problems) == 0 {
11 0 : return nil
12 0 : }
13 0 : out := make(map[string]any, len(inv.Problems))
14 0 : for _, p := range inv.Problems {
15 0 : // last-wins(同一フィールドに複数ある場合は最後を採用)
16 0 : out[p.Field] = map[string]any{
17 0 : "tag": p.Tag,
18 0 : "param": p.Param,
19 0 : }
20 0 : }
21 0 : return out
22 : }
23 :
24 : // FromDomainAll converts domain-level InvalidAddressError to a handler/presenter friendly details map.
25 : // Same shape as your handlerutil's "details".
26 : // “同一フィールドに複数エラーを全部出す”版
27 0 : func FromDomainAll(inv entity.InvalidAddressError) map[string]any {
28 0 : if len(inv.Problems) == 0 {
29 0 : return nil
30 0 : }
31 0 : out := make(map[string]any)
32 0 : for _, p := range inv.Problems {
33 0 : d := map[string]any{"tag": p.Tag, "param": p.Param}
34 0 : if cur, ok := out[p.Field]; ok {
35 0 : switch vv := cur.(type) {
36 0 : case []map[string]any:
37 0 : out[p.Field] = append(vv, d)
38 0 : case map[string]any:
39 0 : out[p.Field] = []map[string]any{vv, d}
40 : }
41 0 : } else {
42 0 : out[p.Field] = d
43 0 : }
44 : }
45 0 : return out
46 : }
|