Current section

Files

Jump to
temporal_sdk src api temporal_sdk_api_header.erl
Raw

src/api/temporal_sdk_api_header.erl

-module(temporal_sdk_api_header).
% elp:ignore W0012 W0040
-moduledoc false.
-export([
put_sdk/4,
get_sdk/4,
put_marker_sdk/5
]).
-include("proto.hrl").
-spec put_sdk(
RequestWithMaybeUserHeader :: temporal_sdk_client:msg(),
SDKData :: temporal_sdk:term_to_mapstring_payload(),
MsgName :: temporal_sdk_client:msg_name(),
ApiCtx :: temporal_sdk_api:context()
) -> RequestWithSDKData :: map().
put_sdk(#{header := #{fields := #{} = RHF}} = R, #{} = SDKD, MsgName, ApiCtx) when
map_size(SDKD) > 0
->
R#{header := #{fields => maps:merge(RHF, do_map_to(SDKD, MsgName, ApiCtx))}};
put_sdk(#{} = R, #{} = SDKD, MsgName, ApiCtx) when map_size(SDKD) > 0 ->
R#{header => #{fields => do_map_to(SDKD, MsgName, ApiCtx)}};
put_sdk(#{} = R, _SDKData, _MsgName, _ApiCtx) ->
R.
do_map_to(SDKData, MsgName, ApiCtx) ->
temporal_sdk_api:map_to_mapstring_payload(
ApiCtx, MsgName, [header, fields], #{
?TASK_HEADER_KEY_SDK_DATA => erlang:term_to_binary(SDKData)
}
).
-spec get_sdk(
DefaultSDKData :: map(),
Task :: map(),
MsgName :: temporal_sdk_client:msg_name(),
ApiCtx :: temporal_sdk_api:context()
) -> {UserData :: #{header => temporal_sdk:term_from_mapstring_payload()}, SDKHeader :: map()}.
get_sdk(DefaultSDK, Task, MsgName, ApiCtx) ->
{UserHeader, SDKH} = get_sdk(Task, MsgName, ApiCtx),
SDKHeader = maps:merge(DefaultSDK, SDKH),
case map_size(UserHeader) of
0 -> {#{}, SDKHeader};
_ -> {#{header => UserHeader}, SDKHeader}
end.
-spec get_sdk(
Task :: map(),
MsgName :: temporal_sdk_client:msg_name(),
ApiCtx :: temporal_sdk_api:context()
) -> {UserHeader :: temporal_sdk:term_from_mapstring_payload(), SDKHeader :: map()}.
get_sdk(Task, MsgName, ApiCtx) ->
HeaderPayload = maps:get(fields, maps:get(header, Task, #{}), #{}),
Header = temporal_sdk_api:map_from_mapstring_payload(
ApiCtx, MsgName, [header, fields], HeaderPayload
),
{CastedSDKKey, EncSDKHeader} =
temporal_sdk_api_common:get_by_casted_key(?TASK_HEADER_KEY_SDK_DATA, Header, #{}, ApiCtx),
SDKHeader = decode_sdk_data(EncSDKHeader),
UserHeader = maps:without([CastedSDKKey], Header),
{UserHeader, SDKHeader}.
decode_sdk_data(#{} = V) ->
V;
decode_sdk_data(EncHeadersData) ->
try
case erlang:binary_to_term(EncHeadersData) of
M when is_map(M) -> M;
_ -> #{}
end
catch
_Class:_Exception -> #{}
end.
-spec put_marker_sdk(
RequestAttr :: ?TEMPORAL_SPEC:'temporal.api.command.v1.RecordMarkerCommandAttributes'(),
MarkerAttrOpts :: map(),
Type :: temporal_sdk:convertable(),
Decoder ::
none
| list
| dlist
| term
| fun((temporal_sdk:term_from_payloads()) -> term())
| {Module :: module(), Function :: atom()},
ApiCtx :: temporal_sdk_api:context()
) -> RequestAttrWithSDK :: ?TEMPORAL_SPEC:'temporal.api.command.v1.RecordMarkerCommandAttributes'().
put_marker_sdk(RequestAttr, #{mutable := Mutable}, Type, Decoder, ApiCtx) ->
MsgName = 'temporal.api.command.v1.RecordMarkerCommandAttributes',
H1 =
case Type of
none -> #{};
T -> #{type => T}
end,
H2 =
case Mutable of
false -> H1;
Mu -> H1#{mutable => Mu}
end,
H =
case Decoder of
none -> H2;
D -> H2#{decoder => D}
end,
put_sdk(RequestAttr, H, MsgName, ApiCtx).