%%% @doc Module for SurrealDB response types and internal functions about it. -module(surreal_response). -record(server_error, { code :: integer(), message :: string() }). -type server_error() :: #server_error{}. -type response() :: {ok, any()} | {error, string()}. -type result() :: server_error() | response() | list(response()). -export_type([server_error/0, response/0, result/0]). -export([to_response/1]). %%% ------------------------------------------- %%% Following functions are for internal usage. %%% ------------------------------------------- %% @private to_response(#{<<"error">> := #{<<"code">> := Code, <<"message">> := ErrorMsg}}) -> #server_error{ code = Code, message = ErrorMsg }; to_response(#{<<"time">> := _Time, <<"status">> := <<"ERR">>, <<"detail">> := ErrorMsg}) -> {error, ErrorMsg}; to_response(#{<<"time">> := _Time, <<"status">> := <<"OK">>, <<"result">> := Result}) -> {ok, Result}; to_response(#{<<"result">> := null}) -> {ok, null}; to_response(#{<<"result">> := Results}) when is_list(Results) -> lists:map(fun to_response/1, Results); to_response(#{<<"result">> := Result}) when is_map(Result) -> {ok, Result}; to_response(Other) -> {ok, Other}.