From 8b669c0928e1491d13f77b8ed8a1dd0d2f76bc3e Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Thu, 4 Jun 2020 15:17:30 +0200 Subject: [PATCH] New validator generator and generated validator --- apps/roster/src/roster_validator.erl | 2431 +++++++++++++------------- rebar.lock | 2 +- 2 files changed, 1234 insertions(+), 1199 deletions(-) diff --git a/apps/roster/src/roster_validator.erl b/apps/roster/src/roster_validator.erl index 9ad9eda28..a8ab412c7 100644 --- a/apps/roster/src/roster_validator.erl +++ b/apps/roster/src/roster_validator.erl @@ -21,7 +21,7 @@ %% roster_validator.erl in "priv/src". %% This file is ignored however, since ?MODULE in apps/roster/src is used instead. -%% Generate at 2020-05-26T10:18:12+02:00 +%% Generate at 2020-06-04T15:09:25+02:00 -compile(export_all). -define(COND_FUN(Cond), fun(Rec) when Cond -> true; (_) -> false end). validate(Obj) -> @@ -30,1205 +30,1240 @@ validate(Obj) -> Err -> Err end. -validate(_, [{[_|_] , _R}|_] = Acc) -> {error, Acc}; +validate(_, [{[_ | _] , _R} | _] = Acc) -> {error, Acc}; validate([], _) -> ok; -validate(Objs, [{[] , R}|T]) -> validate(Objs, [R|T]); -validate([{CondFun, _, []}|T], Acc) when is_function(CondFun) -> validate(T, Acc); -validate([{CondFun, Field, [Obj|TObjs]}|T], Acc) when is_function(CondFun) -> +validate(Objs, [{[] , R} | T]) -> validate(Objs, [R|T]); +validate([{CondFun, _, []} | T], Acc) when is_function(CondFun) -> validate(T, Acc); +validate([{CondFun, Field, [Obj | TObjs]} | T], Acc) when is_function(CondFun) -> case CondFun(Obj) of - true -> validate([{CondFun, Field, TObjs}|T], Acc); - false -> {error, [Field, Obj|Acc]} - end; -validate([{CondFun, Field, Obj}|T], Acc) when is_function(CondFun) -> - case CondFun(Obj) of true -> validate(T, Acc); false -> {error, [Field, Obj|Acc]} end; -validate([{_Field, []}|T], Acc) -> validate(T, Acc); -validate([{Field, [Obj|TObjs]}|T], Acc) -> - case validate(Obj, [Field|Acc]) of - ok -> validate([{Field, TObjs}|T], Acc); + true -> validate([{CondFun, Field, TObjs} | T], Acc); + false -> {error, [Field, Obj | Acc]} end; +validate([{CondFun, Field, Obj} | T], Acc) when is_function(CondFun) -> + case CondFun(Obj) of true -> validate(T, Acc); false -> {error, [Field, Obj | Acc]} end; +validate([{_Field, []} | T], Acc) -> validate(T, Acc); +validate([{Field, [Obj | TObjs]} | T], Acc) -> + case validate(Obj, [Field | Acc]) of + ok -> validate([{Field, TObjs} | T], Acc); Err -> Err end; -validate(D = #'writer'{count = Count, cache = Cache, first = First}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} -> []; - {count,_} when is_integer(Count) -> []; - {cache,_} when (is_tuple(Cache) orelse Cache==[]) -> []; - {args,_} -> []; - {first,_} when (is_tuple(First) orelse First==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'writer'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'reader'{pos = Pos, cache = Cache}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} -> []; - {pos,_} when (is_integer(Pos) orelse Pos==[]) -> []; - {cache,_} when (is_integer(Cache) orelse Cache==[]) -> []; - {args,_} -> []; - {feed,_} -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'reader'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'iter'{id = Id, container = Container, next = Next, prev = Prev}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {container,_} when is_atom(Container) -> []; - {feed,_} -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {prev,_} when (is_integer(Prev) orelse Prev==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'iter'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'container'{id = Id, top = Top, rear = Rear, count = Count}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {top,_} when (is_integer(Top) orelse Top==[]) -> []; - {rear,_} when (is_integer(Rear) orelse Rear==[]) -> []; - {count,_} when is_integer(Count) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'container'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'iterator'{id = Id, container = Container, prev = Prev, next = Next, feeds = Feeds}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {container,_} when is_atom(Container) -> []; - {feed_id,_} -> []; - {prev,_} when (is_integer(Prev) orelse Prev==[]) -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {feeds,_} when is_list(Feeds) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'iterator'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'task'{name = Name, module = Module, prompt = Prompt, roles = Roles}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - {roles,_} when is_binary(Roles) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'task'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'userTask'{name = Name, module = Module, prompt = Prompt, roles = Roles}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - {roles,_} when is_binary(Roles) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'userTask'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'serviceTask'{name = Name, module = Module, prompt = Prompt, roles = Roles}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - {roles,_} when is_binary(Roles) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'serviceTask'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'receiveTask'{name = Name, module = Module, prompt = Prompt, roles = Roles}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - {roles,_} when is_binary(Roles) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'receiveTask'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'messageEvent'{name = Name, module = Module, prompt = Prompt, payload = Payload, timeout = Timeout}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - {payload,_} when is_binary(Payload) -> []; - {timeout,_} when is_tuple(Timeout) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'messageEvent'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'boundaryEvent'{name = Name, module = Module, prompt = Prompt, payload = Payload, timeout = Timeout, timeDate = TimeDate, timeDuration = TimeDuration, timeCycle = TimeCycle}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - {payload,_} when is_binary(Payload) -> []; - {timeout,_} when is_tuple(Timeout) -> []; - {timeDate,_} when is_binary(TimeDate) -> []; - {timeDuration,_} when is_binary(TimeDuration) -> []; - {timeCycle,_} when is_binary(TimeCycle) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'boundaryEvent'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'timeoutEvent'{name = Name, module = Module, prompt = Prompt, payload = Payload, timeout = Timeout, timeDate = TimeDate, timeDuration = TimeDuration, timeCycle = TimeCycle}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - {payload,_} when (is_binary(Payload) orelse Payload==[]) -> []; - {timeout,_} when (is_tuple(Timeout) orelse Timeout==[]) -> []; - {timeDate,_} when (is_binary(TimeDate) orelse TimeDate==[]) -> []; - {timeDuration,_} when (is_binary(TimeDuration) orelse TimeDuration==[]) -> []; - {timeCycle,_} when (is_binary(TimeCycle) orelse TimeCycle==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'timeoutEvent'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'beginEvent'{name = Name, module = Module, prompt = Prompt}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'beginEvent'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'endEvent'{name = Name, module = Module, prompt = Prompt}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_atom(Name) orelse Name==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {prompt,_} when is_list(Prompt) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'endEvent'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'sequenceFlow'{source = Source, target = Target}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {source,_} when (is_atom(Source) orelse Source==[]) -> []; - {target,_} when (is_list(Target) orelse is_atom(Target) orelse Target==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'sequenceFlow'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'hist'{id = Id, container = Container, prev = Prev, next = Next, feeds = Feeds, name = Name, task = Task, docs = Docs}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {container,_} when is_atom(Container) -> []; - {feed_id,_} -> []; - {prev,_} when (is_integer(Prev) orelse Prev==[]) -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {feeds,_} when is_list(Feeds) -> []; - {name,_} when (is_binary(Name) orelse Name==[]) -> []; - {task,_} when is_atom(Task) -> []; - {docs,_} when is_list(Docs) -> []; - {time,_} -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'hist'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'process'{id = Id, container = Container, prev = Prev, next = Next, feeds = Feeds, name = Name, roles = Roles, tasks = Tasks, events = Events, flows = Flows, docs = Docs, task = Task, timer = Timer, notifications = Notifications, result = Result, started = Started, beginEvent = BeginEvent, endEvent = EndEvent}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {container,_} when is_atom(Container) -> []; - {feed_id,_} -> []; - {prev,_} when (is_integer(Prev) orelse Prev==[]) -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {feeds,_} when is_list(Feeds) -> []; - {name,_} when (is_binary(Name) orelse Name==[]) -> []; - {roles,_} when is_list(Roles) -> []; - {tasks,_} when is_list(Tasks) -> []; - {events,_} when is_list(Events) -> []; - {flows,_} when is_list(Flows) -> []; - {docs,_} when is_list(Docs) -> []; - {options,_} -> []; - {task,_} when (is_atom(Task) orelse Task==[]) -> []; - {timer,_} when (is_binary(Timer) orelse Timer==[]) -> []; - {notifications,_} when (Notifications==[]) -> []; - {result,_} when (is_binary(Result) orelse Result==[]) -> []; - {started,_} when (is_tuple(Started) orelse Started==[]) -> []; - {beginEvent,_} when (is_atom(BeginEvent) orelse BeginEvent==[]) -> []; - {endEvent,_} when (is_atom(EndEvent) orelse EndEvent==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'process'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'sequenceFlow'))], - Fields = [Flows], - FieldNames = [flows], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'complete'{id = Id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'complete'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'proc'{id = Id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'proc'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'load'{id = Id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'load'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'histo'{id = Id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'histo'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'create'{proc = Proc, docs = Docs}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {proc,_} when (is_binary(Proc) orelse is_record(Proc,'process') orelse Proc==[]) -> []; - {docs,_} when (is_list(Docs) orelse Docs==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'create'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'amend'{id = Id, docs = Docs}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {docs,_} when (is_list(Docs) orelse Docs==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'amend'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'push'{model = Model, type = Type, title = Title, alert = Alert, badge = Badge, sound = Sound}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {model,_} when (Model==[]) -> []; - {type,_} when (is_binary(Type) orelse Type==[]) -> []; - {title,_} when (is_binary(Title) orelse Title==[]) -> []; - {alert,_} when (is_binary(Alert) orelse Alert==[]) -> []; - {badge,_} when (is_integer(Badge) orelse Badge==[]) -> []; - {sound,_} when (is_binary(Sound) orelse Sound==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'push'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Search'{id = Id, ref = Ref, field = Field, type = Type, value = Value, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {RecField, F} of - {id,_} when (is_binary(Id) orelse is_integer(Id)) -> []; - {ref,_} when is_binary(Ref) -> []; - {field,_} when is_binary(Field) -> []; - {type,_} when (Type=='like' orelse Type=='!=' orelse Type=='==') -> []; - {value,_} when is_list(Value) -> []; - {status,_} when (Status=='room' orelse Status=='member' orelse Status=='contact' orelse Status=='roster' orelse Status=='profile') -> []; - _ -> RecField - end || {RecField, F} <- lists:zip(record_info(fields, 'Search'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'p2p'{from = From, to = To}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {from,_} when is_binary(From) -> []; - {to,_} when is_binary(To) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'p2p'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'muc'{name = Name}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when is_binary(Name) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'muc'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'mqi'{feed_id = Feed_id, query = Query, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {RecField, F} of - {feed_id,_} when is_record(Feed_id,'muc') -> []; - {query,_} when (is_binary(Query) orelse Query==[]) -> []; - {status,_} when (Status=='removed' orelse Status=='member' orelse Status=='admin' orelse Status==[]) -> []; - _ -> RecField - end || {RecField, F} <- lists:zip(record_info(fields, 'mqi'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Feature'{id = Id, key = Key, value = Value, group = Group}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_binary(Id) orelse Id==[]) -> []; - {key,_} when is_binary(Key) -> []; - {value,_} when is_binary(Value) -> []; - {group,_} when is_binary(Group) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Feature'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Service'{id = Id, type = Type, login = Login, password = Password, expiration = Expiration, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_binary(Id) orelse Id==[]) -> []; - {type,_} when (Type=='wallet' orelse Type=='aws' orelse Type=='vox' orelse Type=='email') -> []; - {data,_} -> []; - {login,_} when (is_binary(Login) orelse Login==[]) -> []; - {password,_} when (is_binary(Password) orelse Password==[]) -> []; - {expiration,_} when (is_integer(Expiration) orelse Expiration==[]) -> []; - {status,_} when (Status=='remove' orelse Status=='add' orelse Status=='added' orelse Status=='verified' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Service'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Member'{id = Id, container = Container, feed_id = Feed_id, prev = Prev, next = Next, feeds = Feeds, phone_id = Phone_id, avatar = Avatar, names = Names, surnames = Surnames, alias = Alias, reader = Reader, update = Update, settings = Settings, services = Services, presence = Presence, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {container,_} when (Container==[] orelse Container=='cur' orelse Container=='chain') -> []; - {feed_id,_} when (Feed_id==[] orelse is_record(Feed_id,'p2p') orelse is_record(Feed_id,'muc')) -> []; - {prev,_} when (is_integer(Prev) orelse Prev==[]) -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {feeds,_} when is_list(Feeds) -> []; - {phone_id,_} when (is_binary(Phone_id) orelse Phone_id==[]) -> []; - {avatar,_} when (is_binary(Avatar) orelse Avatar==[]) -> []; - {names,_} when (is_binary(Names) orelse Names==[]) -> []; - {surnames,_} when (is_binary(Surnames) orelse Surnames==[]) -> []; - {alias,_} when (is_binary(Alias) orelse Alias==[]) -> []; - {reader,_} when (is_integer(Reader) orelse Reader==[]) -> []; - {update,_} when (is_integer(Update) orelse Update==[]) -> []; - {settings,_} when (is_list(Settings) orelse Settings==[]) -> []; - {services,_} when (is_list(Services) orelse Services==[]) -> []; - {presence,_} when (Presence=='offline' orelse Presence=='online' orelse Presence==[]) -> []; - {status,_} when (Status=='owner' orelse Status=='patch' orelse Status=='removed' orelse Status=='member' orelse Status=='admin' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Member'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Desc'{id = Id, mime = Mime, payload = Payload, parentid = Parentid, data = Data}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_binary(Id) orelse Id==[]) -> []; - {mime,_} when (is_binary(Mime) orelse Mime==[]) -> []; - {payload,_} when (is_binary(Payload) orelse Payload==[]) -> []; - {parentid,_} when (is_binary(Parentid) orelse Parentid==[]) -> []; - {data,_} when is_list(Data) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Desc'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'Feature'))], - Fields = [Data], - FieldNames = [data], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'StickerPack'{id = Id, name = Name, keywords = Keywords, description = Description, author = Author, stickers = Stickers, created = Created, updated = Updated, downloaded = Downloaded}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {name,_} when (is_binary(Name) orelse Name==[]) -> []; - {keywords,_} when is_list(Keywords) -> []; - {description,_} when (is_binary(Description) orelse Description==[]) -> []; - {author,_} when (is_binary(Author) orelse Author==[]) -> []; - {stickers,_} when is_list(Stickers) -> []; - {created,_} when is_integer(Created) -> []; - {updated,_} when is_integer(Updated) -> []; - {downloaded,_} when is_integer(Downloaded) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'StickerPack'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'Desc'))], - Fields = [Stickers], - FieldNames = [stickers], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Message'{id = Id, container = Container, feed_id = Feed_id, prev = Prev, next = Next, msg_id = Msg_id, from = From, to = To, created = Created, files = Files, type = Type, link = Link, seenby = Seenby, repliedby = Repliedby, mentioned = Mentioned, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {container,_} when (Container==[] orelse Container=='cur' orelse Container=='chain') -> []; - {feed_id,_} when (is_record(Feed_id,'p2p') orelse is_record(Feed_id,'muc')) -> []; - {prev,_} when (is_integer(Prev) orelse Prev==[]) -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {msg_id,_} when (is_binary(Msg_id) orelse Msg_id==[]) -> []; - {from,_} when (is_binary(From) orelse From==[]) -> []; - {to,_} when (is_binary(To) orelse To==[]) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - {files,_} when is_list(Files) -> []; - {type,_} when is_list(Type) -> []; - {link,_} when (is_record(Link,'Message') orelse is_integer(Link) orelse Link==[]) -> []; - {seenby,_} when (is_list(Seenby) orelse Seenby==[]) -> []; - {repliedby,_} when (is_list(Repliedby) orelse Repliedby==[]) -> []; - {mentioned,_} when (is_list(Mentioned) orelse Mentioned==[]) -> []; - {status,_} when (Status=='edit' orelse Status=='update' orelse Status=='clear' orelse Status=='delete' orelse Status=='async' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Message'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'Desc'))], - Fields = [Files], - FieldNames = [files], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Link'{id = Id, name = Name, room_id = Room_id, created = Created, type = Type, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_binary(Id) orelse Id==[]) -> []; - {name,_} when (is_binary(Name) orelse Name==[]) -> []; - {room_id,_} when (is_binary(Room_id) orelse Room_id==[]) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - {type,_} when (Type=='channel' orelse Type=='group' orelse Type==[]) -> []; - {status,_} when (Status=='delete' orelse Status=='update' orelse Status=='join' orelse Status=='get' orelse Status=='add' orelse Status=='check' orelse Status=='gen' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Link'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Room'{id = Id, name = Name, links = Links, description = Description, settings = Settings, members = Members, admins = Admins, data = Data, type = Type, tos = Tos, tos_update = Tos_update, unread = Unread, mentions = Mentions, readers = Readers, last_msg = Last_msg, update = Update, created = Created, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {RecField, F} of - {id,_} when (is_binary(Id) orelse Id==[]) -> []; - {name,_} when (is_binary(Name) orelse Name==[]) -> []; - {links,_} when (is_list(Links) orelse Links==[]) -> []; - {description,_} when (is_binary(Description) orelse Description==[]) -> []; - {settings,_} when is_list(Settings) -> []; - {members,_} when is_list(Members) -> []; - {admins,_} when is_list(Admins) -> []; - {data,_} when is_list(Data) -> []; - {type,_} when (Type=='call' orelse Type=='channel' orelse Type=='group' orelse Type==[]) -> []; - {tos,_} when (is_binary(Tos) orelse Tos==[]) -> []; - {tos_update,_} when (is_integer(Tos_update) orelse Tos_update==[]) -> []; - {unread,_} when (is_integer(Unread) orelse Unread==[]) -> []; - {mentions,_} when is_list(Mentions) -> []; - {readers,_} when is_list(Readers) -> []; %% other types are for internal use only - {last_msg,_} when (is_record(Last_msg,'Message') orelse is_integer(Last_msg) orelse Last_msg==[]) -> []; - {update,_} when (is_integer(Update) orelse Update==[]) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - {status,_} when (Status=='unmute' orelse Status=='mute' orelse Status=='last_msg' orelse Status=='delete' orelse Status=='get' orelse Status=='patch' orelse Status=='info' orelse Status=='joined' orelse Status=='join' orelse Status=='removed' orelse Status=='remove' orelse Status=='add' orelse Status=='leave' orelse Status=='create' orelse Status==[]) -> []; - _ -> RecField - end || {RecField, F} <- lists:zip(record_info(fields, 'Room'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'Feature')),?COND_FUN(is_record(Rec, 'Member')),?COND_FUN(is_record(Rec, 'Member')),?COND_FUN(is_record(Rec, 'Desc'))], - Fields = [Settings,Members,Admins,Data], - FieldNames = [settings,members,admins,data], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Tag'{roster_id = Roster_id, name = Name, color = Color, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {roster_id,_} when (is_binary(Roster_id) orelse Roster_id==[]) -> []; - {name,_} when is_binary(Name) -> []; - {color,_} when is_binary(Color) -> []; - {status,_} when (Status=='edit' orelse Status=='remove' orelse Status=='create' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Tag'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Star'{id = Id, client_id = Client_id, roster_id = Roster_id, message = Message, tags = Tags, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {client_id,_} when (is_binary(Client_id) orelse Client_id==[]) -> []; - {roster_id,_} when (is_integer(Roster_id) orelse Roster_id==[]) -> []; - {message,_} when (is_record(Message,'Message') orelse Message==[]) -> []; - {tags,_} when is_list(Tags) -> []; - {status,_} when (Status=='remove' orelse Status=='add' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Star'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'Tag'))], - Fields = [Tags], - FieldNames = [tags], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Typing'{phone_id = Phone_id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {phone_id,_} when is_binary(Phone_id) -> []; - {comments,_} -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Typing'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Contact'{phone_id = Phone_id, avatar = Avatar, names = Names, surnames = Surnames, nick = Nick, reader = Reader, unread = Unread, last_msg = Last_msg, update = Update, created = Created, settings = Settings, services = Services, presence = Presence, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {phone_id,_} when (is_binary(Phone_id) orelse Phone_id==[]) -> []; - {avatar,_} when (is_binary(Avatar) orelse Avatar==[]) -> []; - {names,_} when (is_binary(Names) orelse Names==[]) -> []; - {surnames,_} when (is_binary(Surnames) orelse Surnames==[]) -> []; - {nick,_} when (is_binary(Nick) orelse Nick==[]) -> []; - {reader,_} when (is_list(Reader) orelse is_integer(Reader) orelse Reader==[]) -> []; - {unread,_} when (is_integer(Unread) orelse Unread==[]) -> []; - {last_msg,_} when (is_record(Last_msg,'Message') orelse Last_msg==[]) -> []; - {update,_} when (is_integer(Update) orelse Update==[]) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - {settings,_} when is_list(Settings) -> []; - {services,_} when is_list(Services) -> []; - {presence,_} when (is_binary(Presence) orelse Presence=='offline' orelse Presence=='online' orelse Presence==[]) -> []; - {status,_} when (Status=='deleted' orelse Status=='banned' orelse Status=='ban' orelse Status=='last_msg' orelse Status=='friend' orelse Status=='internal' orelse Status=='ignore' orelse Status=='authorization' orelse Status=='request' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Contact'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'Feature')),?COND_FUN(is_record(Rec, 'Service'))], - Fields = [Settings,Services], - FieldNames = [settings,services], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'ExtendedStar'{star = Star, from = From}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {star,_} when (Star==[] orelse is_record(Star,'Star')) -> []; - {from,_} when (From==[] orelse is_record(From,'Room') orelse is_record(From,'Contact')) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'ExtendedStar'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Auth'{client_id = Client_id, dev_key = Dev_key, user_id = User_id, phone = Phone, token = Token, type = Type, sms_code = Sms_code, attempts = Attempts, services = Services, settings = Settings, push = Push, os = Os, created = Created, last_online = Last_online}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {client_id,_} when (is_binary(Client_id) orelse Client_id==[]) -> []; - {dev_key,_} when (is_binary(Dev_key) orelse Dev_key==[]) -> []; - {user_id,_} when (is_binary(User_id) orelse User_id==[]) -> []; - {phone,_} when (is_tuple(Phone) orelse is_binary(Phone) orelse Phone==[]) -> []; - {token,_} when (is_binary(Token) orelse Token==[]) -> []; - {type,_} when (is_atom(Type) orelse Type==[]) -> []; - {sms_code,_} when (is_binary(Sms_code) orelse Sms_code==[]) -> []; - {attempts,_} when (is_integer(Attempts) orelse Attempts==[]) -> []; - {services,_} when is_list(Services) -> []; - {settings,_} when (is_list(Settings) orelse Settings==[]) -> []; - {push,_} when (is_binary(Push) orelse Push==[]) -> []; - {os,_} when (Os=='web' orelse Os=='android' orelse Os=='ios' orelse Os==[]) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - {last_online,_} when (is_integer(Last_online) orelse Last_online==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Auth'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Roster'{id = Id, names = Names, surnames = Surnames, email = Email, nick = Nick, userlist = Userlist, roomlist = Roomlist, favorite = Favorite, tags = Tags, phone = Phone, avatar = Avatar, update = Update, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse is_binary(Id) orelse Id==[]) -> []; - {names,_} when (is_binary(Names) orelse Names==[]) -> []; - {surnames,_} when (is_binary(Surnames) orelse Surnames==[]) -> []; - {email,_} when (is_binary(Email) orelse Email==[]) -> []; - {nick,_} when (is_binary(Nick) orelse Nick==[]) -> []; - {userlist,_} when is_list(Userlist) -> []; - {roomlist,_} when is_list(Roomlist) -> []; - {favorite,_} when is_list(Favorite) -> []; - {tags,_} when is_list(Tags) -> []; - {phone,_} when (is_binary(Phone) orelse Phone==[]) -> []; - {avatar,_} when (is_binary(Avatar) orelse Avatar==[]) -> []; - {update,_} when (is_integer(Update) orelse Update==[]) -> []; - {status,_} when (Status=='last_msg' orelse Status=='patch' orelse Status=='list' orelse Status=='update' orelse Status=='add' orelse Status=='nick' orelse Status=='remove' orelse Status=='del' orelse Status=='create' orelse Status=='get' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Roster'), tl(tuple_to_list(D)))]), - CondFuns = [?COND_FUN(is_record(Rec, 'Room')),?COND_FUN(is_record(Rec, 'Star')),?COND_FUN(is_record(Rec, 'Tag'))], - Fields = [Roomlist,Favorite,Tags], - FieldNames = [roomlist,favorite,tags], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Profile'{phone = Phone, services = Services, rosters = Rosters, settings = Settings, update = Update, balance = Balance, presence = Presence, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {phone,_} when (is_binary(Phone) orelse Phone==[]) -> []; - {services,_} when (is_list(Services) orelse Services==[]) -> []; - {rosters,_} when (is_list(Rosters) orelse Rosters==[]) -> []; - {settings,_} when (is_list(Settings) orelse Settings==[]) -> []; - {update,_} when is_integer(Update) -> []; - {balance,_} when is_integer(Balance) -> []; - {presence,_} when (is_binary(Presence) orelse Presence=='online' orelse Presence=='offline' orelse Presence==[]) -> []; - {status,_} when (Status=='create' orelse Status=='delete' orelse Status=='update' orelse Status=='patch' orelse Status=='get' orelse Status=='remove' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Profile'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Presence'{uid = Uid, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {uid,_} when is_binary(Uid) -> []; - {status,_} when (is_binary(Status) orelse Status=='online' orelse Status=='offline' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Presence'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Friend'{phone_id = Phone_id, friend_id = Friend_id, settings = Settings, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {phone_id,_} when is_binary(Phone_id) -> []; - {friend_id,_} when is_binary(Friend_id) -> []; - {settings,_} when (is_list(Settings) orelse Settings==[]) -> []; - {status,_} when (Status=='ignore' orelse Status=='update' orelse Status=='confirm' orelse Status=='request' orelse Status=='unban' orelse Status=='ban') -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Friend'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'act'{name = Name, data = Data}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when (is_binary(Name) orelse Name==[]) -> []; - {data,_} when (is_list(Data) orelse is_integer(Data) orelse is_binary(Data)) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'act'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Job'{id = Id, container = Container, feed_id = Feed_id, prev = Prev, next = Next, context = Context, proc = Proc, time = Time, data = Data, events = Events, settings = Settings, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {container,_} when (Container==[] orelse Container=='chain') -> []; - {feed_id,_} when is_record(Feed_id,'act') -> []; - {prev,_} when (is_integer(Prev) orelse Prev==[]) -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {context,_} when (is_binary(Context) orelse is_integer(Context) orelse Context==[]) -> []; - {proc,_} when (is_record(Proc,'process') orelse is_integer(Proc) orelse Proc==[]) -> []; - {time,_} when (is_integer(Time) orelse Time==[]) -> []; - {data,_} when (is_list(Data) orelse is_binary(Data) orelse Data==[]) -> []; - {events,_} when (is_list(Events) orelse Events==[]) -> []; - {settings,_} when (is_list(Settings) orelse Settings==[]) -> []; - {status,_} when (Status=='restart' orelse Status=='complete' orelse Status=='stop' orelse Status=='pending' orelse Status=='delete' orelse Status=='update' orelse Status=='init' orelse Status==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Job'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'History'{roster_id = Roster_id, feed = Feed, size = Size, entity_id = Entity_id, data = Data, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {roster_id,_} when is_binary(Roster_id) -> []; - {feed,_} when (Feed==[] orelse is_record(Feed,'StickerPack') orelse is_record(Feed,'act') orelse is_record(Feed,'muc') orelse is_record(Feed,'p2p')) -> []; - {size,_} when (is_integer(Size) orelse Size==[]) -> []; - {entity_id,_} when (is_integer(Entity_id) orelse Entity_id==[]) -> []; - {data,_} when (is_list(Data) orelse Data==[]) -> []; - {status,_} when (Status=='draft' orelse Status=='text' orelse Status=='location' orelse Status=='contact' orelse Status=='audio' orelse Status=='link' orelse Status=='file' orelse Status=='video' orelse Status=='image' orelse Status=='delete' orelse Status=='double_get' orelse Status=='get_reply' orelse Status=='last_msg' orelse Status=='last_loaded' orelse Status=='update' orelse Status=='get' orelse Status=='updated') -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'History'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Schedule'{id = Id, proc = Proc, data = Data, state = State}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_tuple(Id) orelse is_integer(Id) orelse Id==[]) -> []; - {proc,_} when (is_binary(Proc) orelse is_integer(Proc) orelse Proc==[]) -> []; - {data,_} when (is_list(Data) orelse is_binary(Data)) -> []; - {state,_} when (State==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Schedule'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Index'{id = Id, roster = Roster}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (Id==[]) -> []; - {roster,_} when is_list(Roster) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Index'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Whitelist'{phone = Phone, created = Created}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {phone,_} when (is_binary(Phone) orelse Phone==[]) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Whitelist'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'error'{code = Code}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {code,_} when (is_atom(Code) orelse Code==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'error'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'ok'{code = Code}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {code,_} when (is_binary(Code) orelse Code==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'ok'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'error2'{code = Code, src = Src}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {code,_} when (is_atom(Code) orelse Code==[]) -> []; - {src,_} when (is_integer(Src) orelse is_binary(Src) orelse Src==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'error2'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'ok2'{code = Code, src = Src}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {code,_} when (is_atom(Code) orelse Code==[]) -> []; - {src,_} when (is_binary(Src) orelse is_tuple(Src) orelse Src==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'ok2'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'MessageErr'{feed_id = Feed_id, msg_id = Msg_id, error = Error}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {feed_id,_} when (is_record(Feed_id,'p2p') orelse is_record(Feed_id,'muc')) -> []; - {msg_id,_} when (is_binary(Msg_id) orelse Msg_id==[]) -> []; - {error,_} when (is_record(Error,'error') orelse Error==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'MessageErr'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'io'{code = Code, data = Data}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {code,_} when (is_record(Code,'MessageErr') orelse Code=='transcribe' orelse is_record(Code,'error2') orelse is_record(Code,'ok2') orelse is_record(Code,'error') orelse is_record(Code,'ok') orelse Code==[]) -> []; - {data,_} when (is_tuple(Data) orelse is_record(Data,'Roster') orelse is_binary(Data) orelse Data==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'io'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Ack'{table = Table, id = Id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {table,_} when is_atom(Table) -> []; - {id,_} when (is_binary(Id) orelse Id==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Ack'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'MessageAck'{id = Id, next = Next, feed_id = Feed_id, created = Created, msg_id = Msg_id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {id,_} when (is_integer(Id) orelse Id==[]) -> []; - {next,_} when (is_integer(Next) orelse Next==[]) -> []; - {feed_id,_} when (is_record(Feed_id,'p2p') orelse is_record(Feed_id,'muc')) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - {msg_id,_} when (is_binary(Msg_id) orelse Msg_id==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'MessageAck'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'errors'{code = Code, data = Data}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {code,_} when (is_list(Code) orelse Code==[]) -> []; - {data,_} when (Data==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'errors'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'PushService'{recipients = Recipients, id = Id, ttl = Ttl, module = Module, priority = Priority, payload = Payload}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {recipients,_} when is_list(Recipients) -> []; - {id,_} when (is_binary(Id) orelse Id==[]) -> []; - {ttl,_} when (is_integer(Ttl) orelse Ttl==[]) -> []; - {module,_} when (is_binary(Module) orelse Module==[]) -> []; - {priority,_} when (is_binary(Priority) orelse Priority==[]) -> []; - {payload,_} when (is_binary(Payload) orelse Payload==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'PushService'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'PublishService'{message = Message, topic = Topic, qos = Qos}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {message,_} when (is_binary(Message) orelse Message==[]) -> []; - {topic,_} when (is_binary(Topic) orelse Topic==[]) -> []; - {qos,_} when (is_integer(Qos) orelse Qos==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'PublishService'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'FakeNumbers'{phone = Phone, created = Created}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {phone,_} when (is_binary(Phone) orelse Phone==[]) -> []; - {created,_} when (is_integer(Created) orelse Created==[]) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'FakeNumbers'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'Draft'{data = Data, status = Status}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {data,_} when is_list(Data) -> []; - {status,_} when (Status=='delete' orelse Status=='get' orelse Status=='update') -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'Draft'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'handler'{name = Name, module = Module, group = Group}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {name,_} when is_atom(Name) -> []; - {module,_} when is_atom(Module) -> []; - {class,_} -> []; - {group,_} when is_atom(Group) -> []; - {config,_} -> []; - {state,_} -> []; - {seq,_} -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'handler'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'cx'{handlers = Handlers, actions = Actions, req = Req, module = Module, lang = Lang, path = Path, session = Session, formatter = Formatter, params = Params, node = Node, client_pid = Client_pid, state = State, from = From, vsn = Vsn}, Acc) -> - ErrFields = lists:flatten( - [case {RecField, F} of - {handlers,_} when is_list(Handlers) -> []; - {actions,_} when is_list(Actions) -> []; - {req,_} when (Req==[]) -> []; - {module,_} when (is_atom(Module) orelse Module==[]) -> []; - {lang,_} when (is_atom(Lang) orelse Lang==[]) -> []; - {path,_} when (is_binary(Path) orelse Path==[]) -> []; - {session,_} when (is_binary(Session) orelse Session==[]) -> []; - {formatter,_} when (Formatter=='json' orelse Formatter=='bert') -> []; - {params,_} when (is_list(Params) orelse is_binary(Params) orelse Params==[]) -> []; - {node,_} when (is_atom(Node) orelse Node==[]) -> []; - {client_pid,_} when (Client_pid==[]) -> []; - {state,_} when (State==[]) -> []; - {from,_} when (is_binary(From) orelse From==[]) -> []; - {vsn,_} when (is_binary(Vsn) orelse Vsn==[]) -> []; - _ -> RecField - end || {RecField, F} <- lists:zip(record_info(fields, 'cx'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'mqtt_topic'{topic = Topic, flags = Flags}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {topic,_} when is_binary(Topic) -> []; - {flags,_} when is_list(Flags) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'mqtt_topic'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'mqtt_session'{client_id = Client_id}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {client_id,_} when is_binary(Client_id) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'mqtt_session'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end; -validate(D = #'mqtt_route'{topic = Topic}, Acc) -> - ErrFields = lists:flatten( - [case {Field, F} of - {topic,_} when is_binary(Topic) -> []; - _ -> Field - end || {Field, F} <- lists:zip(record_info(fields, 'mqtt_route'), tl(tuple_to_list(D)))]), - CondFuns = [], - Fields = [], - FieldNames = [], - case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D}|Acc]) of - ok -> validate(lists:zip(FieldNames,Fields), [{ErrFields, D}|Acc]); - Err -> Err - end. +validate(D = #'writer'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id,_} -> []; + {count, Count} when is_integer(Count) -> []; + {cache, Cache} when (is_tuple(Cache) orelse Cache == []) -> []; + {args,_} -> []; + {first, First} when (is_tuple(First) orelse First == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'writer'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'reader'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id,_} -> []; + {pos, Pos} when (is_integer(Pos) orelse Pos == []) -> []; + {cache, Cache} when (is_integer(Cache) orelse Cache == []) -> []; + {args,_} -> []; + {feed,_} -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'reader'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'iter'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {container, Container} when is_atom(Container) -> []; + {feed,_} -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {prev, Prev} when (is_integer(Prev) orelse Prev == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'iter'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'container'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {top, Top} when (is_integer(Top) orelse Top == []) -> []; + {rear, Rear} when (is_integer(Rear) orelse Rear == []) -> []; + {count, Count} when is_integer(Count) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'container'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'iterator'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {container, Container} when is_atom(Container) -> []; + {feed_id,_} -> []; + {prev, Prev} when (is_integer(Prev) orelse Prev == []) -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {feeds, Feeds} when is_list(Feeds) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'iterator'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'task'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + {roles, Roles} when is_binary(Roles) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'task'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'userTask'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + {roles, Roles} when is_binary(Roles) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'userTask'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'serviceTask'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + {roles, Roles} when is_binary(Roles) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'serviceTask'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'receiveTask'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + {roles, Roles} when is_binary(Roles) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'receiveTask'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'messageEvent'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + {payload, Payload} when is_binary(Payload) -> []; + {timeout, Timeout} when is_tuple(Timeout) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'messageEvent'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'boundaryEvent'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + {payload, Payload} when is_binary(Payload) -> []; + {timeout, Timeout} when is_tuple(Timeout) -> []; + {timeDate, TimeDate} when is_binary(TimeDate) -> []; + {timeDuration, TimeDuration} when is_binary(TimeDuration) -> []; + {timeCycle, TimeCycle} when is_binary(TimeCycle) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'boundaryEvent'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'timeoutEvent'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + {payload, Payload} when (is_binary(Payload) orelse Payload == []) -> []; + {timeout, Timeout} when (is_tuple(Timeout) orelse Timeout == []) -> []; + {timeDate, TimeDate} when (is_binary(TimeDate) orelse TimeDate == []) -> []; + {timeDuration, TimeDuration} when (is_binary(TimeDuration) orelse TimeDuration == []) -> []; + {timeCycle, TimeCycle} when (is_binary(TimeCycle) orelse TimeCycle == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'timeoutEvent'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'beginEvent'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'beginEvent'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'endEvent'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_atom(Name) orelse Name == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {prompt, Prompt} when is_list(Prompt) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'endEvent'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'sequenceFlow'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {source, Source} when (is_atom(Source) orelse Source == []) -> []; + {target, Target} when (is_list(Target) orelse is_atom(Target) orelse Target == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'sequenceFlow'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'hist'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {container, Container} when is_atom(Container) -> []; + {feed_id,_} -> []; + {prev, Prev} when (is_integer(Prev) orelse Prev == []) -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {feeds, Feeds} when is_list(Feeds) -> []; + {name, Name} when (is_binary(Name) orelse Name == []) -> []; + {task, Task} when is_atom(Task) -> []; + {docs, Docs} when is_list(Docs) -> []; + {time,_} -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'hist'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'process'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {container, Container} when is_atom(Container) -> []; + {feed_id,_} -> []; + {prev, Prev} when (is_integer(Prev) orelse Prev == []) -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {feeds, Feeds} when is_list(Feeds) -> []; + {name, Name} when (is_binary(Name) orelse Name == []) -> []; + {roles, Roles} when is_list(Roles) -> []; + {tasks, Tasks} when is_list(Tasks) -> []; + {events, Events} when is_list(Events) -> []; + {flows, Flows} when is_list(Flows) -> []; + {docs, Docs} when is_list(Docs) -> []; + {options,_} -> []; + {task, Task} when (is_atom(Task) orelse Task == []) -> []; + {timer, Timer} when (is_binary(Timer) orelse Timer == []) -> []; + {notifications, Notifications} when (Notifications == []) -> []; + {result, Result} when (is_binary(Result) orelse Result == []) -> []; + {started, Started} when (is_tuple(Started) orelse Started == []) -> []; + {beginEvent, BeginEvent} when (is_atom(BeginEvent) orelse BeginEvent == []) -> []; + {endEvent, EndEvent} when (is_atom(EndEvent) orelse EndEvent == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'process'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'sequenceFlow'))], + Fields = [D#'process'.flows], + FieldNames = [flows], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'complete'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'complete'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'proc'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'proc'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'load'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'load'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'histo'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'histo'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'create'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {proc, Proc} when (is_binary(Proc) orelse is_record(Proc, 'process') orelse Proc == []) -> []; + {docs, Docs} when (is_list(Docs) orelse Docs == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'create'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'amend'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {docs, Docs} when (is_list(Docs) orelse Docs == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'amend'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'push'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {model, Model} when (Model == []) -> []; + {type, Type} when (is_binary(Type) orelse Type == []) -> []; + {title, Title} when (is_binary(Title) orelse Title == []) -> []; + {alert, Alert} when (is_binary(Alert) orelse Alert == []) -> []; + {badge, Badge} when (is_integer(Badge) orelse Badge == []) -> []; + {sound, Sound} when (is_binary(Sound) orelse Sound == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'push'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Search'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_binary(Id) orelse is_integer(Id)) -> []; + {ref, Ref} when is_binary(Ref) -> []; + {field, Field} when is_binary(Field) -> []; + {type, Type} when (Type == 'like' orelse Type == '!=' orelse Type == '==') -> []; + {value, Value} when is_list(Value) -> []; + {status, Status} when (Status == 'room' orelse Status == 'member' orelse Status == 'contact' orelse Status == 'roster' orelse Status == 'profile') -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Search'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'p2p'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {from, From} when is_binary(From) -> []; + {to, To} when is_binary(To) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'p2p'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'muc'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when is_binary(Name) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'muc'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'mqi'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {feed_id, Feed_id} when is_record(Feed_id,'muc') -> []; + {query, Query} when (is_binary(Query) orelse Query == []) -> []; + {status, Status} when (Status == 'removed' orelse Status == 'member' orelse Status == 'admin' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'mqi'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Feature'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_binary(Id) orelse Id == []) -> []; + {key, Key} when is_binary(Key) -> []; + {value, Value} when is_binary(Value) -> []; + {group, Group} when is_binary(Group) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Feature'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Service'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_binary(Id) orelse Id == []) -> []; + {type, Type} when (Type == 'wallet' orelse Type == 'aws' orelse Type == 'vox' orelse Type == 'email') -> []; + {data,_} -> []; + {login, Login} when (is_binary(Login) orelse Login == []) -> []; + {password, Password} when (is_binary(Password) orelse Password == []) -> []; + {expiration, Expiration} when (is_integer(Expiration) orelse Expiration == []) -> []; + {status, Status} when (Status == 'remove' orelse Status == 'add' orelse Status == 'added' orelse Status == 'verified' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Service'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Member'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {container, Container} when (Container == [] orelse Container == 'cur' orelse Container == 'chain') -> []; + {feed_id, Feed_id} when (Feed_id == [] orelse is_record(Feed_id, 'p2p') orelse is_record(Feed_id, 'muc')) -> []; + {prev, Prev} when (is_integer(Prev) orelse Prev == []) -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {feeds, Feeds} when is_list(Feeds) -> []; + {phone_id, Phone_id} when (is_binary(Phone_id) orelse Phone_id == []) -> []; + {avatar, Avatar} when (is_binary(Avatar) orelse Avatar == []) -> []; + {names, Names} when (is_binary(Names) orelse Names == []) -> []; + {surnames, Surnames} when (is_binary(Surnames) orelse Surnames == []) -> []; + {alias, Alias} when (is_binary(Alias) orelse Alias == []) -> []; + {reader, Reader} when (is_integer(Reader) orelse Reader == []) -> []; + {update, Update} when (is_integer(Update) orelse Update == []) -> []; + {settings, Settings} when (is_list(Settings) orelse Settings == []) -> []; + {services, Services} when (is_list(Services) orelse Services == []) -> []; + {presence, Presence} when (Presence == 'offline' orelse Presence == 'online' orelse Presence == []) -> []; + {status, Status} when (Status == 'owner' orelse Status == 'patch' orelse Status == 'removed' orelse Status == 'member' orelse Status == 'admin' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Member'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Desc'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_binary(Id) orelse Id == []) -> []; + {mime, Mime} when (is_binary(Mime) orelse Mime == []) -> []; + {payload, Payload} when (is_binary(Payload) orelse Payload == []) -> []; + {parentid, Parentid} when (is_binary(Parentid) orelse Parentid == []) -> []; + {data, Data} when is_list(Data) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Desc'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'Feature'))], + Fields = [D#'Desc'.data], + FieldNames = [data], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'StickerPack'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {name, Name} when (is_binary(Name) orelse Name == []) -> []; + {keywords, Keywords} when is_list(Keywords) -> []; + {description, Description} when (is_binary(Description) orelse Description == []) -> []; + {author, Author} when (is_binary(Author) orelse Author == []) -> []; + {stickers, Stickers} when is_list(Stickers) -> []; + {created, Created} when is_integer(Created) -> []; + {updated, Updated} when is_integer(Updated) -> []; + {downloaded, Downloaded} when is_integer(Downloaded) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'StickerPack'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'Desc'))], + Fields = [D#'StickerPack'.stickers], + FieldNames = [stickers], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Message'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {container, Container} when (Container == [] orelse Container == 'cur' orelse Container == 'chain') -> []; + {feed_id, Feed_id} when (is_record(Feed_id, 'p2p') orelse is_record(Feed_id, 'muc')) -> []; + {prev, Prev} when (is_integer(Prev) orelse Prev == []) -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {msg_id, Msg_id} when (is_binary(Msg_id) orelse Msg_id == []) -> []; + {from, From} when (is_binary(From) orelse From == []) -> []; + {to, To} when (is_binary(To) orelse To == []) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + {files, Files} when is_list(Files) -> []; + {type, Type} when is_list(Type) -> []; + {link, Link} when (is_record(Link, 'Message') orelse is_integer(Link) orelse Link == []) -> []; + {seenby, Seenby} when (is_list(Seenby) orelse Seenby == []) -> []; + {repliedby, Repliedby} when (is_list(Repliedby) orelse Repliedby == []) -> []; + {mentioned, Mentioned} when (is_list(Mentioned) orelse Mentioned == []) -> []; + {status, Status} when (Status == 'edit' orelse Status == 'update' orelse Status == 'clear' orelse Status == 'delete' orelse Status == 'async' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Message'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'Desc'))], + Fields = [D#'Message'.files], + FieldNames = [files], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Link'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_binary(Id) orelse Id == []) -> []; + {name, Name} when (is_binary(Name) orelse Name == []) -> []; + {room_id, Room_id} when (is_binary(Room_id) orelse Room_id == []) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + {type, Type} when (Type == 'channel' orelse Type == 'group' orelse Type == []) -> []; + {status, Status} when (Status == 'delete' orelse Status == 'update' orelse Status == 'join' orelse Status == 'get' orelse Status == 'add' orelse Status == 'check' orelse Status == 'gen' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Link'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Room'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_binary(Id) orelse Id == []) -> []; + {name, Name} when (is_binary(Name) orelse Name == []) -> []; + {links, Links} when (is_list(Links) orelse Links == []) -> []; + {description, Description} when (is_binary(Description) orelse Description == []) -> []; + {settings, Settings} when is_list(Settings) -> []; + {members, Members} when is_list(Members) -> []; + {admins, Admins} when is_list(Admins) -> []; + {data, Data} when is_list(Data) -> []; + {type, Type} when (Type == 'call' orelse Type == 'channel' orelse Type == 'group' orelse Type == []) -> []; + {tos, Tos} when (is_binary(Tos) orelse Tos == []) -> []; + {tos_update, Tos_update} when (is_integer(Tos_update) orelse Tos_update == []) -> []; + {unread, Unread} when (is_integer(Unread) orelse Unread == []) -> []; + {mentions, Mentions} when is_list(Mentions) -> []; + {readers, Readers} when is_list(Readers) -> []; %% other types are for internal use only + {last_msg, Last_msg} when (is_record(Last_msg, 'Message') orelse is_integer(Last_msg) orelse Last_msg == []) -> []; + {update, Update} when (is_integer(Update) orelse Update == []) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + {status, Status} when (Status == 'unmute' orelse Status == 'mute' orelse Status == 'last_msg' orelse Status == 'delete' orelse Status == 'get' orelse Status == 'patch' orelse Status == 'info' orelse Status == 'joined' orelse Status == 'join' orelse Status == 'removed' orelse Status == 'remove' orelse Status == 'add' orelse Status == 'leave' orelse Status == 'create' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Room'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'Feature')), ?COND_FUN(is_record(Rec, 'Member')), ?COND_FUN(is_record(Rec, 'Member')), ?COND_FUN(is_record(Rec, 'Desc'))], + Fields = [D#'Room'.settings, D#'Room'.members, D#'Room'.admins, D#'Room'.data], + FieldNames = [settings, members, admins, data], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Tag'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {roster_id, Roster_id} when (is_binary(Roster_id) orelse Roster_id == []) -> []; + {name, Name} when is_binary(Name) -> []; + {color, Color} when is_binary(Color) -> []; + {status, Status} when (Status == 'edit' orelse Status == 'remove' orelse Status == 'create' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Tag'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Star'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {client_id, Client_id} when (is_binary(Client_id) orelse Client_id == []) -> []; + {roster_id, Roster_id} when (is_integer(Roster_id) orelse Roster_id == []) -> []; + {message, Message} when (is_record(Message, 'Message') orelse Message == []) -> []; + {tags, Tags} when is_list(Tags) -> []; + {status, Status} when (Status == 'remove' orelse Status == 'add' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Star'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'Tag'))], + Fields = [D#'Star'.tags], + FieldNames = [tags], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Typing'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {phone_id, Phone_id} when is_binary(Phone_id) -> []; + {comments,_} -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Typing'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Contact'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {phone_id, Phone_id} when (is_binary(Phone_id) orelse Phone_id == []) -> []; + {avatar, Avatar} when (is_binary(Avatar) orelse Avatar == []) -> []; + {names, Names} when (is_binary(Names) orelse Names == []) -> []; + {surnames, Surnames} when (is_binary(Surnames) orelse Surnames == []) -> []; + {nick, Nick} when (is_binary(Nick) orelse Nick == []) -> []; + {reader, Reader} when (is_list(Reader) orelse is_integer(Reader) orelse Reader == []) -> []; + {unread, Unread} when (is_integer(Unread) orelse Unread == []) -> []; + {last_msg, Last_msg} when (is_record(Last_msg, 'Message') orelse Last_msg == []) -> []; + {update, Update} when (is_integer(Update) orelse Update == []) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + {settings, Settings} when is_list(Settings) -> []; + {services, Services} when is_list(Services) -> []; + {presence, Presence} when (is_binary(Presence) orelse Presence == 'offline' orelse Presence == 'online' orelse Presence == []) -> []; + {status, Status} when (Status == 'deleted' orelse Status == 'banned' orelse Status == 'ban' orelse Status == 'last_msg' orelse Status == 'friend' orelse Status == 'internal' orelse Status == 'ignore' orelse Status == 'authorization' orelse Status == 'request' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Contact'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'Feature')), ?COND_FUN(is_record(Rec, 'Service'))], + Fields = [D#'Contact'.settings, D#'Contact'.services], + FieldNames = [settings, services], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'ExtendedStar'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {star, Star} when (Star == [] orelse is_record(Star, 'Star')) -> []; + {from, From} when (From == [] orelse is_record(From, 'Room') orelse is_record(From, 'Contact')) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'ExtendedStar'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Auth'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {client_id, Client_id} when (is_binary(Client_id) orelse Client_id == []) -> []; + {dev_key, Dev_key} when (is_binary(Dev_key) orelse Dev_key == []) -> []; + {user_id, User_id} when (is_binary(User_id) orelse User_id == []) -> []; + {phone, Phone} when (is_tuple(Phone) orelse is_binary(Phone) orelse Phone == []) -> []; + {token, Token} when (is_binary(Token) orelse Token == []) -> []; + {type, Type} when (is_atom(Type) orelse Type == []) -> []; + {sms_code, Sms_code} when (is_binary(Sms_code) orelse Sms_code == []) -> []; + {attempts, Attempts} when (is_integer(Attempts) orelse Attempts == []) -> []; + {services, Services} when is_list(Services) -> []; + {settings, Settings} when (is_list(Settings) orelse Settings == []) -> []; + {push, Push} when (is_binary(Push) orelse Push == []) -> []; + {os, Os} when (Os == 'web' orelse Os == 'android' orelse Os == 'ios' orelse Os == []) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + {last_online, Last_online} when (is_integer(Last_online) orelse Last_online == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Auth'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Roster'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse is_binary(Id) orelse Id == []) -> []; + {names, Names} when (is_binary(Names) orelse Names == []) -> []; + {surnames, Surnames} when (is_binary(Surnames) orelse Surnames == []) -> []; + {email, Email} when (is_binary(Email) orelse Email == []) -> []; + {nick, Nick} when (is_binary(Nick) orelse Nick == []) -> []; + {userlist, Userlist} when is_list(Userlist) -> []; + {roomlist, Roomlist} when is_list(Roomlist) -> []; + {favorite, Favorite} when is_list(Favorite) -> []; + {tags, Tags} when is_list(Tags) -> []; + {phone, Phone} when (is_binary(Phone) orelse Phone == []) -> []; + {avatar, Avatar} when (is_binary(Avatar) orelse Avatar == []) -> []; + {update, Update} when (is_integer(Update) orelse Update == []) -> []; + {status, Status} when (Status == 'last_msg' orelse Status == 'patch' orelse Status == 'list' orelse Status == 'update' orelse Status == 'add' orelse Status == 'nick' orelse Status == 'remove' orelse Status == 'del' orelse Status == 'create' orelse Status == 'get' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Roster'), tl(tuple_to_list(D)))]), + CondFuns = [?COND_FUN(is_record(Rec, 'Room')), ?COND_FUN(is_record(Rec, 'Star')), ?COND_FUN(is_record(Rec, 'Tag'))], + Fields = [D#'Roster'.roomlist, D#'Roster'.favorite, D#'Roster'.tags], + FieldNames = [roomlist, favorite, tags], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Profile'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {phone, Phone} when (is_binary(Phone) orelse Phone == []) -> []; + {services, Services} when (is_list(Services) orelse Services == []) -> []; + {rosters, Rosters} when (is_list(Rosters) orelse Rosters == []) -> []; + {settings, Settings} when (is_list(Settings) orelse Settings == []) -> []; + {update, Update} when is_integer(Update) -> []; + {balance, Balance} when is_integer(Balance) -> []; + {presence, Presence} when (is_binary(Presence) orelse Presence == 'online' orelse Presence == 'offline' orelse Presence == []) -> []; + {status, Status} when (Status == 'create' orelse Status == 'delete' orelse Status == 'update' orelse Status == 'patch' orelse Status == 'get' orelse Status == 'remove' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Profile'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Presence'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {uid, Uid} when is_binary(Uid) -> []; + {status, Status} when (is_binary(Status) orelse Status == 'online' orelse Status == 'offline' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Presence'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Friend'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {phone_id, Phone_id} when is_binary(Phone_id) -> []; + {friend_id, Friend_id} when is_binary(Friend_id) -> []; + {settings, Settings} when (is_list(Settings) orelse Settings == []) -> []; + {status, Status} when (Status == 'ignore' orelse Status == 'update' orelse Status == 'confirm' orelse Status == 'request' orelse Status == 'unban' orelse Status == 'ban') -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Friend'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'act'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_binary(Name) orelse Name == []) -> []; + {data, Data} when (is_list(Data) orelse is_integer(Data) orelse is_binary(Data)) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'act'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Job'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {container, Container} when (Container == [] orelse Container == 'chain') -> []; + {feed_id, Feed_id} when is_record(Feed_id,'act') -> []; + {prev, Prev} when (is_integer(Prev) orelse Prev == []) -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {context, Context} when (is_binary(Context) orelse is_integer(Context) orelse Context == []) -> []; + {proc, Proc} when (is_record(Proc, 'process') orelse is_integer(Proc) orelse Proc == []) -> []; + {time, Time} when (is_integer(Time) orelse Time == []) -> []; + {data, Data} when (is_list(Data) orelse is_binary(Data) orelse Data == []) -> []; + {events, Events} when (is_list(Events) orelse Events == []) -> []; + {settings, Settings} when (is_list(Settings) orelse Settings == []) -> []; + {status, Status} when (Status == 'restart' orelse Status == 'complete' orelse Status == 'stop' orelse Status == 'pending' orelse Status == 'delete' orelse Status == 'update' orelse Status == 'init' orelse Status == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Job'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'History'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {roster_id, Roster_id} when is_binary(Roster_id) -> []; + {feed, Feed} when (Feed == [] orelse is_record(Feed, 'StickerPack') orelse is_record(Feed, 'act') orelse is_record(Feed, 'muc') orelse is_record(Feed, 'p2p')) -> []; + {size, Size} when (is_integer(Size) orelse Size == []) -> []; + {entity_id, Entity_id} when (is_integer(Entity_id) orelse Entity_id == []) -> []; + {data, Data} when (is_list(Data) orelse Data == []) -> []; + {status, Status} when (Status == 'draft' orelse Status == 'text' orelse Status == 'location' orelse Status == 'contact' orelse Status == 'audio' orelse Status == 'link' orelse Status == 'file' orelse Status == 'video' orelse Status == 'image' orelse Status == 'delete' orelse Status == 'double_get' orelse Status == 'get_reply' orelse Status == 'last_msg' orelse Status == 'last_loaded' orelse Status == 'update' orelse Status == 'get' orelse Status == 'updated') -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'History'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Schedule'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_tuple(Id) orelse is_integer(Id) orelse Id == []) -> []; + {proc, Proc} when (is_binary(Proc) orelse is_integer(Proc) orelse Proc == []) -> []; + {data, Data} when (is_list(Data) orelse is_binary(Data)) -> []; + {state, State} when (State == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Schedule'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Index'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (Id == []) -> []; + {roster, Roster} when is_list(Roster) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Index'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Whitelist'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {phone, Phone} when (is_binary(Phone) orelse Phone == []) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Whitelist'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'error'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {code, Code} when (is_atom(Code) orelse Code == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'error'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'ok'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {code, Code} when (is_binary(Code) orelse Code == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'ok'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'error2'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {code, Code} when (is_atom(Code) orelse Code == []) -> []; + {src, Src} when (is_integer(Src) orelse is_binary(Src) orelse Src == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'error2'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'ok2'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {code, Code} when (is_atom(Code) orelse Code == []) -> []; + {src, Src} when (is_binary(Src) orelse is_tuple(Src) orelse Src == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'ok2'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'MessageErr'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {feed_id, Feed_id} when (is_record(Feed_id, 'p2p') orelse is_record(Feed_id, 'muc')) -> []; + {msg_id, Msg_id} when (is_binary(Msg_id) orelse Msg_id == []) -> []; + {error, Error} when (is_record(Error, 'error') orelse Error == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'MessageErr'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'io'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {code, Code} when (is_record(Code, 'MessageErr') orelse Code == 'transcribe' orelse is_record(Code, 'error2') orelse is_record(Code, 'ok2') orelse is_record(Code, 'error') orelse is_record(Code, 'ok') orelse Code == []) -> []; + {data, Data} when (is_tuple(Data) orelse is_record(Data, 'Roster') orelse is_binary(Data) orelse Data == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'io'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Ack'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {table, Table} when is_atom(Table) -> []; + {id, Id} when (is_binary(Id) orelse Id == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Ack'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'MessageAck'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {id, Id} when (is_integer(Id) orelse Id == []) -> []; + {next, Next} when (is_integer(Next) orelse Next == []) -> []; + {feed_id, Feed_id} when (is_record(Feed_id, 'p2p') orelse is_record(Feed_id, 'muc')) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + {msg_id, Msg_id} when (is_binary(Msg_id) orelse Msg_id == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'MessageAck'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'errors'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {code, Code} when (is_list(Code) orelse Code == []) -> []; + {data, Data} when (Data == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'errors'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'PushService'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {recipients, Recipients} when is_list(Recipients) -> []; + {id, Id} when (is_binary(Id) orelse Id == []) -> []; + {ttl, Ttl} when (is_integer(Ttl) orelse Ttl == []) -> []; + {module, Module} when (is_binary(Module) orelse Module == []) -> []; + {priority, Priority} when (is_binary(Priority) orelse Priority == []) -> []; + {payload, Payload} when (is_binary(Payload) orelse Payload == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'PushService'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'PublishService'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {message, Message} when (is_binary(Message) orelse Message == []) -> []; + {topic, Topic} when (is_binary(Topic) orelse Topic == []) -> []; + {qos, Qos} when (is_integer(Qos) orelse Qos == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'PublishService'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'FakeNumbers'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {phone, Phone} when (is_binary(Phone) orelse Phone == []) -> []; + {created, Created} when (is_integer(Created) orelse Created == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'FakeNumbers'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'Draft'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {data, Data} when is_list(Data) -> []; + {status, Status} when (Status == 'delete' orelse Status == 'get' orelse Status == 'update') -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'Draft'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'handler'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when is_atom(Name) -> []; + {module, Module} when is_atom(Module) -> []; + {class,_} -> []; + {group, Group} when is_atom(Group) -> []; + {config,_} -> []; + {state,_} -> []; + {seq,_} -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'handler'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'pi'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {name, Name} when (is_integer(Name) orelse is_binary(Name) orelse is_atom(Name)) -> []; + {table, Table} when is_atom(Table) -> []; + {sup, Sup} when is_atom(Sup) -> []; + {module, Module} when is_atom(Module) -> []; + {state,_} -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'pi'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'cx'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {handlers, Handlers} when is_list(Handlers) -> []; + {actions, Actions} when is_list(Actions) -> []; + {req, Req} when (Req == []) -> []; + {module, Module} when (is_atom(Module) orelse Module == []) -> []; + {lang, Lang} when (is_atom(Lang) orelse Lang == []) -> []; + {path, Path} when (is_binary(Path) orelse Path == []) -> []; + {session, Session} when (is_binary(Session) orelse Session == []) -> []; + {formatter, Formatter} when (Formatter == 'json' orelse Formatter == 'bert') -> []; + {params, Params} when (is_list(Params) orelse is_binary(Params) orelse Params == []) -> []; + {node, Node} when (is_atom(Node) orelse Node == []) -> []; + {client_pid, Client_pid} when (Client_pid == []) -> []; + {state, State} when (State == []) -> []; + {from, From} when (is_binary(From) orelse From == []) -> []; + {vsn, Vsn} when (is_binary(Vsn) orelse Vsn == []) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'cx'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'mqtt_topic'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {topic, Topic} when is_binary(Topic) -> []; + {flags, Flags} when is_list(Flags) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'mqtt_topic'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'mqtt_session'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {client_id, Client_id} when is_binary(Client_id) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'mqtt_session'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end; +validate(D = #'mqtt_route'{}, Acc) -> + ErrFields = lists:flatten( + [case {RecField, F} of + {topic, Topic} when is_binary(Topic) -> []; + _ -> RecField + end || {RecField, F} <- lists:zip(record_info(fields, 'mqtt_route'), tl(tuple_to_list(D)))]), + CondFuns = [], + Fields = [], + FieldNames = [], + case validate(lists:zip3(CondFuns, FieldNames, Fields), [{ErrFields, D} | Acc]) of + ok -> validate(lists:zip(FieldNames, Fields), [{ErrFields, D} | Acc]); + Err -> Err + end. diff --git a/rebar.lock b/rebar.lock index 31235aeb1..8cd7e0a3b 100644 --- a/rebar.lock +++ b/rebar.lock @@ -9,7 +9,7 @@ 0}, {<<"bert">>, {git,"git://github.com/NYNJA-MC/bert.git", - {ref,"8128d82739b15b3bf80c6d1149fcc48e8172a58b"}}, + {ref,"a31041122d4e02b70f4603ae5c92f7be4164e84e"}}, 0}, {<<"bpe">>, {git,"git://github.com/NYNJA-MC/bpe", -- GitLab