refactor: avoid make when do serde

This commit is contained in:
JimMoen 2024-04-26 10:37:15 +08:00
parent e5bd747b32
commit 28e8131984
No known key found for this signature in database
1 changed files with 26 additions and 18 deletions

View File

@ -102,15 +102,17 @@ delete_schema(NameVsn) ->
-spec decode(schema_name(), encoded_data()) -> {ok, decoded_data()} | {error, any()}. -spec decode(schema_name(), encoded_data()) -> {ok, decoded_data()} | {error, any()}.
decode(SerdeName, RawData) -> decode(SerdeName, RawData) ->
with_serde( with_serde(
"decode_avro_json", ?FUNCTION_NAME,
eval_serde_fun(?FUNCTION_NAME, "bad_avro_binary", SerdeName, [RawData]) SerdeName,
[RawData]
). ).
-spec encode(schema_name(), decoded_data()) -> {ok, encoded_data()} | {error, any()}. -spec encode(schema_name(), decoded_data()) -> {ok, encoded_data()} | {error, any()}.
encode(SerdeName, Data) -> encode(SerdeName, Data) ->
with_serde( with_serde(
"encode_avro_json", ?FUNCTION_NAME,
eval_serde_fun(?FUNCTION_NAME, "bad_avro_data", SerdeName, [Data]) SerdeName,
[Data]
). ).
%%------------------------------------------------------------------------------------------------- %%-------------------------------------------------------------------------------------------------
@ -209,9 +211,11 @@ ensure_serde_absent(Name) ->
async_delete_serdes(Names) -> async_delete_serdes(Names) ->
gen_server:cast(?MODULE, {delete_serdes, Names}). gen_server:cast(?MODULE, {delete_serdes, Names}).
with_serde(WhichOp, Fun) -> with_serde(Op, SerdeName, Args) ->
WhichOp = which_op(Op),
ErrMsg = error_msg(Op),
try try
Fun() eval_serde(Op, ErrMsg, SerdeName, Args)
catch catch
throw:Reason -> throw:Reason ->
?SLOG(error, Reason#{ ?SLOG(error, Reason#{
@ -233,18 +237,16 @@ with_serde(WhichOp, Fun) ->
}} }}
end. end.
eval_serde_fun(Op, ErrMsg, SerdeName, Args) -> eval_serde(Op, ErrMsg, SerdeName, Args) ->
fun() -> case lookup_serde(SerdeName) of
case lookup_serde(SerdeName) of {ok, Serde} ->
{ok, Serde} -> eval_serde(Op, Serde, Args);
eval_serde(Op, Serde, Args); {error, not_found} ->
{error, not_found} -> throw(#{
throw(#{ error_msg => ErrMsg,
error_msg => ErrMsg, reason => plugin_serde_not_found,
reason => plugin_serde_not_found, serde_name => SerdeName
serde_name => SerdeName })
})
end
end. end.
eval_serde(decode, #plugin_schema_serde{name = Name, eval_context = Store}, [Data]) -> eval_serde(decode, #plugin_schema_serde{name = Name, eval_context = Store}, [Data]) ->
@ -255,6 +257,12 @@ eval_serde(encode, #plugin_schema_serde{name = Name, eval_context = Store}, [Dat
eval_serde(_, _, _) -> eval_serde(_, _, _) ->
throw(#{error_msg => "unexpected_plugin_avro_op"}). throw(#{error_msg => "unexpected_plugin_avro_op"}).
which_op(Op) ->
atom_to_list(Op) ++ "_avro_json".
error_msg(Op) ->
atom_to_list(Op) ++ "_avro_data".
read_avsc_file(Path) -> read_avsc_file(Path) ->
case file:read_file(Path) of case file:read_file(Path) of
{ok, Bin} -> {ok, Bin} ->