Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commiteb76895

Browse files
committed
refactor(validator): make schama validator more flexable
1 parent9d6cb01 commiteb76895

File tree

3 files changed

+229
-10
lines changed

3 files changed

+229
-10
lines changed

‎lib/helper/converter/editor_to_html/index.ex‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
# defmodule Helper.Converter.EditorToHTML.Parser do
2-
# @moduledoc false
3-
4-
# # TODO: map should be editor_block
5-
# @callback parse_block(editor_json :: Map.t()) :: String.t()
6-
# end
7-
81
defmoduleHelper.Converter.EditorToHTMLdo
92
@moduledoc"""
103
parse editor.js's json data to raw html and sanitize it

‎lib/helper/validator/schema.ex‎

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ defmodule Helper.Validator.Schema do
55
currently support boolean / string / number / enum
66
"""
77

8-
useHelper.Validator.Schema.Matchers,[:string,:number,:list,:boolean]
8+
#use Helper.Validator.Schema.Matchers, [:string, :number, :list, :boolean]
99

1010
@doc"""
1111
cast data by given schema
@@ -49,10 +49,9 @@ defmodule Helper.Validator.Schema do
4949
end)
5050
end
5151

52-
# enum
5352
defpmatch(field,nil,enum:_,required:false),do:done(field,nil)
5453

55-
defpmatch(field,value,enum:enum,required:false)do
54+
defpmatch(field,value,enum:enum,required:_)do
5655
match(field,value,enum:enum)
5756
end
5857

@@ -70,8 +69,89 @@ defmodule Helper.Validator.Schema do
7069
end
7170
end
7271

72+
defpmatch(field,value,[type|options])do
73+
match(field,value,type,options)
74+
end
75+
76+
defpmatch(field,nil,_type,[{:required,false}|_options])do
77+
done(field,nil)
78+
end
79+
80+
defpmatch(field,value,type,[{:required,_}|options])do
81+
match(field,value,type,options)
82+
end
83+
84+
# custom validate logic
85+
defpmatch(field,value,:string,[{:min,min}|options])
86+
whenis_binary(value)andis_integer(min)do
87+
caseString.length(value)>=mindo
88+
true->
89+
match(field,value,:string,options)
90+
91+
false->
92+
error(field,value,:min,min)
93+
end
94+
end
95+
96+
defpmatch(field,value,:number,[{:min,min}|options])
97+
whenis_integer(value)andis_integer(min)do
98+
casevalue>=mindo
99+
true->
100+
match(field,value,:number,options)
101+
102+
false->
103+
error(field,value,:min,min)
104+
end
105+
end
106+
107+
# custom validate logic end
108+
109+
# main type
110+
defpmatch(field,value,:string,[])whenis_binary(value)do
111+
done(field,value)
112+
end
113+
114+
defpmatch(field,value,:number,[])whenis_integer(value)do
115+
done(field,value)
116+
end
117+
118+
defpmatch(field,value,:list,[])whenis_list(value)do
119+
done(field,value)
120+
end
121+
122+
defpmatch(field,value,:boolean,[])whenis_boolean(value)do
123+
done(field,value)
124+
end
125+
126+
# main type end
127+
128+
defpmatch(field,value,_type,[option])whenis_tuple(option)andnotis_nil(value)do
129+
{k,v}=option
130+
error(field,value,option:"#{to_string(k)}:#{to_string(v)}")
131+
end
132+
133+
defpmatch(field,value,_type,[_option])whennotis_nil(value)do
134+
error(field,value,:option)
135+
end
136+
137+
defpmatch(field,value,type,_)do
138+
error(field,value,type)
139+
end
140+
73141
defpdone(field,value),do:{:ok,%{field:field,value:value}}
74142

143+
defperror(field,value,:min,min)do
144+
{:error,%{field:field|>to_string,value:value,message:"min size:#{min}"}}
145+
end
146+
147+
defperror(field,value,option:option)do
148+
{:error,%{field:field|>to_string,value:value,message:"unknow option:#{option}"}}
149+
end
150+
151+
defperror(field,value,:option)do
152+
{:error,%{field:field|>to_string,value:value,message:"unknow option"}}
153+
end
154+
75155
defperror(field,value,schema)do
76156
{:error,%{field:field|>to_string,value:value,message:"should be:#{schema}"}}
77157
end
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
defmoduleGroupherServer.Test.Helper.Validator.Schemado
2+
@moduledocfalse
3+
4+
useGroupherServerWeb.ConnCase,async:true
5+
6+
aliasHelper.Validator.Schema
7+
8+
describe"[basic schema]"do
9+
@tag:wip
10+
test"string with options"do
11+
schema=%{"text"=>[:string,required:false]}
12+
data=%{"no_exsit"=>"text"}
13+
assert{:ok,_}=Schema.cast(schema,data)
14+
15+
schema=%{"text"=>[:string,required:true]}
16+
data=%{"no_exsit"=>"text"}
17+
{:error,error}=Schema.cast(schema,data)
18+
asserterror==[%{field:"text",message:"should be: string",value:nil}]
19+
20+
schema=%{"text"=>[:string,required:true]}
21+
data=%{"text"=>"text"}
22+
assert{:ok,_}=Schema.cast(schema,data)
23+
24+
schema=%{"text"=>[:string,min:5]}
25+
data=%{"text"=>"text"}
26+
{:error,error}=Schema.cast(schema,data)
27+
asserterror==[%{field:"text",message:"min size: 5",value:"text"}]
28+
29+
schema=%{"text"=>[:string,required:false,min:5]}
30+
data=%{"text"=>"text"}
31+
{:error,error}=Schema.cast(schema,data)
32+
asserterror==[%{field:"text",message:"min size: 5",value:"text"}]
33+
34+
schema=%{"text"=>[:string,min:5]}
35+
data=%{"no_exsit"=>"text"}
36+
{:error,error}=Schema.cast(schema,data)
37+
asserterror==[%{field:"text",message:"should be: string",value:nil}]
38+
39+
schema=%{"text"=>[:string,required:true,min:5]}
40+
data=%{"no_exsit"=>"text"}
41+
{:error,error}=Schema.cast(schema,data)
42+
asserterror==[%{field:"text",message:"should be: string",value:nil}]
43+
44+
schema=%{"text"=>[:string,required:true,min:"5"]}
45+
data=%{"text"=>"text"}
46+
{:error,error}=Schema.cast(schema,data)
47+
asserterror==[%{field:"text",message:"unknow option: min: 5",value:"text"}]
48+
# IO.inspect(Schema.cast(schema, data), label: "schema result")
49+
end
50+
51+
@tag:wip
52+
test"number with options"do
53+
schema=%{"text"=>[:number,required:false]}
54+
data=%{"no_exsit"=>1}
55+
assert{:ok,_}=Schema.cast(schema,data)
56+
57+
schema=%{"text"=>[:number,required:true]}
58+
data=%{"no_exsit"=>1}
59+
{:error,error}=Schema.cast(schema,data)
60+
asserterror==[%{field:"text",message:"should be: number",value:nil}]
61+
62+
schema=%{"text"=>[:number,required:true]}
63+
data=%{"text"=>1}
64+
assert{:ok,_}=Schema.cast(schema,data)
65+
66+
schema=%{"text"=>[:number,min:5]}
67+
data=%{"text"=>4}
68+
{:error,error}=Schema.cast(schema,data)
69+
asserterror==[%{field:"text",message:"min size: 5",value:4}]
70+
71+
schema=%{"text"=>[:number,required:false,min:5]}
72+
data=%{"text"=>4}
73+
{:error,error}=Schema.cast(schema,data)
74+
asserterror==[%{field:"text",message:"min size: 5",value:4}]
75+
76+
schema=%{"text"=>[:number,min:5]}
77+
data=%{"no_exsit"=>4}
78+
{:error,error}=Schema.cast(schema,data)
79+
asserterror==[%{field:"text",message:"should be: number",value:nil}]
80+
81+
schema=%{"text"=>[:number,required:true,min:5]}
82+
data=%{"no_exsit"=>1}
83+
{:error,error}=Schema.cast(schema,data)
84+
asserterror==[%{field:"text",message:"should be: number",value:nil}]
85+
86+
schema=%{"text"=>[:number,required:true,min:"5"]}
87+
data=%{"text"=>1}
88+
{:error,error}=Schema.cast(schema,data)
89+
asserterror==[%{field:"text",message:"unknow option: min: 5",value:1}]
90+
91+
# IO.inspect(Schema.cast(schema, data), label: "schema result")
92+
# hello world
93+
end
94+
95+
@tag:wip
96+
test"list with options"do
97+
schema=%{"text"=>[:list,required:false]}
98+
data=%{"no_exsit"=>[]}
99+
assert{:ok,_}=Schema.cast(schema,data)
100+
101+
schema=%{"text"=>[:list,required:true]}
102+
data=%{"no_exsit"=>[]}
103+
{:error,error}=Schema.cast(schema,data)
104+
asserterror==[%{field:"text",message:"should be: list",value:nil}]
105+
106+
schema=%{"text"=>[:list,required:true]}
107+
data=%{"text"=>[]}
108+
assert{:ok,_}=Schema.cast(schema,data)
109+
end
110+
111+
@tag:wip
112+
test"boolean with options"do
113+
schema=%{"text"=>[:boolean,required:false]}
114+
data=%{"no_exsit"=>false}
115+
assert{:ok,_}=Schema.cast(schema,data)
116+
117+
schema=%{"text"=>[:boolean,required:true]}
118+
data=%{"no_exsit"=>false}
119+
{:error,error}=Schema.cast(schema,data)
120+
asserterror==[%{field:"text",message:"should be: boolean",value:nil}]
121+
122+
schema=%{"text"=>[:boolean,required:true]}
123+
data=%{"text"=>false}
124+
assert{:ok,_}=Schema.cast(schema,data)
125+
end
126+
127+
@tag:wip
128+
test"enum with options"do
129+
schema=%{"text"=>[enum:[1,2,3],required:false]}
130+
data=%{"no_exsit"=>false}
131+
assert{:ok,_}=Schema.cast(schema,data)
132+
133+
schema=%{"text"=>[enum:[1,2,3],required:true]}
134+
data=%{"no_exsit"=>false}
135+
{:error,error}=Schema.cast(schema,data)
136+
asserterror==[%{field:"text",message:"should be: 1 | 2 | 3"}]
137+
138+
schema=%{"text"=>[enum:[1,2,3]]}
139+
data=%{"text"=>1}
140+
assert{:ok,_}=Schema.cast(schema,data)
141+
142+
# IO.inspect(Schema.cast(schema, data), label: "schema result")
143+
# hello world
144+
end
145+
end
146+
end

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp