Current section
Files
Jump to
Current section
Files
src/grpc/temporal_sdk_grpc_codec.erl
-module(temporal_sdk_grpc_codec).
% elp:ignore W0012 W0040
-moduledoc """
gRPC Protocol Buffers (protobuf) codec behaviour module.
""".
-export([
encode_msg/4,
decode_msg/5,
from_json/4,
to_json/4
]).
-callback encode_msg(
Msg :: temporal_sdk_grpc:msg(),
RequestInfo :: temporal_sdk_grpc:request_info(),
Opts :: term()
) -> {ok, binary()} | {error, {codec_error, term()}}.
-callback decode_msg(
Bin :: binary(),
RequestInfo :: temporal_sdk_grpc:request_info(),
HContentType :: binary() | atom(),
Opts :: term()
) -> {ok, temporal_sdk_grpc:msg()} | {error, {codec_error, term()}}.
-callback from_json(
Json :: map(),
MsgName :: temporal_sdk_grpc:msg_name(),
Opts :: term()
) -> {ok, temporal_sdk_grpc:msg()} | {error, {codec_error, term()}}.
-callback to_json(
Msg :: temporal_sdk_grpc:msg(),
MsgName :: temporal_sdk_grpc:msg_name(),
Opts :: term()
) -> {ok, map()} | {error, {codec_error, term()}}.
-callback cast(TermToEncode :: term()) -> EncodedTerm :: term().
-optional_callbacks([
cast/1
]).
-doc false.
-spec encode_msg(
Codec :: module(),
Msg :: temporal_sdk_grpc:msg(),
RequestInfo :: temporal_sdk_grpc:request_info(),
Opts :: term()
) -> {ok, binary()} | {error, {codec_error, term()}}.
encode_msg(Codec, Msg, RequestInfo, Opts) ->
try Codec:encode_msg(Msg, RequestInfo, Opts) of
{ok, R} when is_binary(R) -> {ok, R};
{error, {codec_error, Reason}} -> {error, {codec_error, Reason}};
{error, Reason} -> {error, {codec_error, Reason}};
{error, Error, Reason} -> {error, {codec_error, {Error, Reason}}};
Invalid -> {error, {codec_error, Invalid}}
catch
error:Reason:Stacktrace ->
{error, {codec_error, {Reason, Stacktrace}}}
end.
-doc false.
-spec decode_msg(
Codec :: module(),
Msg :: binary(),
RequestInfo :: temporal_sdk_grpc:request_info(),
HContentType :: binary() | atom(),
Opts :: term()
) -> {ok, temporal_sdk_grpc:msg()} | {error, {codec_error, term()}}.
decode_msg(Codec, Msg, RequestInfo, HContentType, Opts) ->
try Codec:decode_msg(Msg, RequestInfo, HContentType, Opts) of
{ok, R} when is_map(R) -> {ok, R};
{error, {codec_error, Reason}} -> {error, {codec_error, Reason}};
{error, Reason} -> {error, {codec_error, Reason}};
{error, Error, Reason} -> {error, {codec_error, {Error, Reason}}};
Invalid -> {error, {codec_error, Invalid}}
catch
error:Reason:Stacktrace ->
{error, {codec_error, {Reason, Stacktrace}}}
end.
-doc false.
-spec from_json(
Codec :: module(),
Json :: map(),
MsgName :: temporal_sdk_grpc:msg_name(),
Opts :: term()
) ->
{ok, temporal_sdk_grpc:msg()} | {error, Reason :: term()}.
from_json(Codec, Json, MsgName, Opts) ->
try Codec:from_json(Json, MsgName, Opts) of
{ok, R} when is_map(R) -> {ok, R};
{error, {codec_error, Reason}} -> {error, {codec_error, Reason}};
{error, Reason} -> {error, {codec_error, Reason}};
{error, Error, Reason} -> {error, {codec_error, {Error, Reason}}};
Invalid -> {error, {codec_error, Invalid}}
catch
error:Reason:Stacktrace ->
{error, {codec_error, {Reason, Stacktrace}}}
end.
-doc false.
-spec to_json(
Codec :: module(),
Msg :: temporal_sdk_grpc:msg(),
MsgName :: temporal_sdk_grpc:msg_name(),
Opts :: term()
) ->
{ok, map()} | {error, Reason :: term()}.
to_json(Codec, Msg, MsgName, Opts) ->
try Codec:to_json(Msg, MsgName, Opts) of
{ok, R} when is_map(R) -> {ok, R};
{error, {codec_error, Reason}} -> {error, {codec_error, Reason}};
{error, Reason} -> {error, {codec_error, Reason}};
{error, Error, Reason} -> {error, {codec_error, {Error, Reason}}};
Invalid -> {error, {codec_error, Invalid}}
catch
error:Reason:Stacktrace ->
{error, {codec_error, {Reason, Stacktrace}}}
end.