1
+ defmodule Helper.ValidateBySchema.Matchers do
2
+ @ moduledoc """
3
+ matchers for basic type, support required option
4
+ """
5
+
6
+ defmacro __using__ ( types ) do
7
+ # can not use Enum.each here, see https://elixirforum.com/t/define-multiple-modules-in-macro-only-last-one-gets-created/1654/4
8
+ for type <- types do
9
+ guard_name = if type == :string , do: "binary" , else: type |> to_string
10
+
11
+ quote do
12
+ defp match ( field , nil , [ unquote ( type ) , required: false ] ) , do: done ( field , nil )
13
+
14
+ defp match ( field , value , [ unquote ( type ) , required: false ] )
15
+ when unquote ( :"is_#{ guard_name } " ) ( value ) do
16
+ done ( field , value )
17
+ end
18
+
19
+ defp match ( field , value , [ unquote ( type ) ] ) when unquote ( :"is_#{ guard_name } " ) ( value ) ,
20
+ do: done ( field , value )
21
+
22
+ defp match ( field , value , [ unquote ( type ) , required: false ] ) ,
23
+ do: error ( field , value , unquote ( type ) )
24
+
25
+ defp match ( field , value , [ unquote ( type ) ] ) , do: error ( field , value , unquote ( type ) )
26
+ end
27
+ end
28
+ end
29
+ end
30
+
1
31
defmodule Helper.ValidateBySchema do
2
32
@ moduledoc """
3
33
validate json data by given schema, mostly used in editorjs validator
@@ -21,6 +51,8 @@ defmodule Helper.ValidateBySchema do
21
51
data = %{checked: true, label: "done"}
22
52
ValidateBySchema.cast(schema, data)
23
53
"""
54
+ use Helper.ValidateBySchema.Matchers , [ :string , :number , :list , :boolean ]
55
+
24
56
def cast ( schema , data ) do
25
57
errors_info = cast_errors ( schema , data )
26
58
@@ -47,56 +79,6 @@ defmodule Helper.ValidateBySchema do
47
79
end )
48
80
end
49
81
50
- # 这里试过用 macro 消除重复代码,但是不可行。
51
- # macro 对于重复定义的 quote 只会覆盖掉,除非每个 quote 中定义的内容不一样
52
- # 参考: https://elixirforum.com/t/define-multiple-modules-in-macro-only-last-one-gets-created/1654
53
-
54
- # boolean field
55
- defp match ( field , nil , [ :boolean , required: false ] ) , do: done ( field , nil )
56
-
57
- defp match ( field , value , [ :boolean , required: false ] ) when is_boolean ( value ) do
58
- done ( field , value )
59
- end
60
-
61
- defp match ( field , value , [ :boolean ] ) when is_boolean ( value ) , do: done ( field , value )
62
- defp match ( field , value , [ :boolean , required: false ] ) , do: error ( field , value , :boolean )
63
- defp match ( field , value , [ :boolean ] ) , do: error ( field , value , :boolean )
64
-
65
- # string field
66
- defp match ( field , nil , [ :string , required: false ] ) , do: done ( field , nil )
67
-
68
- defp match ( field , value , [ :string , required: false ] ) when is_binary ( value ) do
69
- done ( field , value )
70
- end
71
-
72
- defp match ( field , value , [ :string ] ) when is_binary ( value ) , do: done ( field , value )
73
- defp match ( field , value , [ :string , required: false ] ) , do: error ( field , value , :string )
74
- defp match ( field , value , [ :string ] ) , do: error ( field , value , :string )
75
-
76
- defp match ( field , nil , [ :string , required: false ] ) , do: done ( field , nil )
77
-
78
- # number
79
- defp match ( field , nil , [ :number , required: false ] ) , do: done ( field , nil )
80
-
81
- defp match ( field , value , [ :number , required: false ] ) when is_number ( value ) do
82
- done ( field , value )
83
- end
84
-
85
- defp match ( field , value , [ :number ] ) when is_number ( value ) , do: done ( field , value )
86
- defp match ( field , value , [ :number , required: false ] ) , do: error ( field , value , :number )
87
- defp match ( field , value , [ :number ] ) , do: error ( field , value , :number )
88
-
89
- # list
90
- defp match ( field , nil , [ :list , required: false ] ) , do: done ( field , nil )
91
-
92
- defp match ( field , value , [ :list , required: false ] ) when is_list ( value ) do
93
- done ( field , value )
94
- end
95
-
96
- defp match ( field , value , [ :list ] ) when is_list ( value ) , do: done ( field , value )
97
- defp match ( field , value , [ :list , required: false ] ) , do: error ( field , value , :list )
98
- defp match ( field , value , [ :list ] ) , do: error ( field , value , :list )
99
-
100
82
# enum
101
83
defp match ( field , nil , enum: _ , required: false ) , do: done ( field , nil )
102
84