Current section

Files

Jump to
mist src mist_ffi.erl
Raw

src/mist_ffi.erl

-module(mist_ffi).
-export([binary_match/2, decode_packet/3, decode_atom/1,file_open/1, string_to_int/2, hpack_decode/2,
hpack_encode/2, hpack_new_max_table_size/2, ets_lookup_element/3, get_path_and_query/1,
file_close/1, now/0]).
now() ->
Timestamp = os:system_time(microsecond),
{Date, Time} = calendar:system_time_to_universal_time(Timestamp, microsecond),
Weekday = calendar:day_of_the_week(Date),
{Weekday, Date, Time}.
decode_packet(Type, Packet, Opts) ->
case erlang:decode_packet(Type, Packet, Opts) of
{ok, http_eoh, Rest} ->
{ok, {end_of_headers, Rest}};
{ok, {http_request, <<"PRI">>, '*', {2, 0}}, Rest} ->
{ok, {http2_upgrade, Rest}};
{ok, Binary, Rest} ->
{ok, {binary_data, Binary, Rest}};
{more, undefined} ->
{ok, {more_data, none}};
{more, Length} ->
{ok, {more_data, {some, Length}}};
{error, Reason} ->
{error, Reason}
end.
binary_match(Source, Pattern) ->
case binary:match(Source, Pattern) of
{Before, After} ->
{ok, {Before, After}};
nomatch ->
{error, nil}
end.
string_to_int(String, Base) ->
try
{ok, erlang:list_to_integer(String, Base)}
catch
error:badarg ->
{error, nil}
end.
file_open(Path) ->
case file:open(Path, [raw, binary]) of
{ok, Fd} ->
{ok, Fd};
{error, enoent} ->
{error, no_entry};
{error, eacces} ->
{error, no_access};
{error, eisdir} ->
{error, is_dir};
_ ->
{error, unknown_file_error}
end.
file_close(File) ->
case file:close(File) of
ok ->
{ok, nil};
{error, enoent} ->
{error, no_entry};
{error, eacces} ->
{error, no_access};
{error, eisdir} ->
{error, is_dir};
_ ->
{error, unknown_file_error}
end.
hpack_decode(Context, Bin) ->
case hpack:decode(Bin, Context) of
{ok, {Headers, NewContext}} ->
{ok, {Headers, NewContext}};
{error, compression_error} ->
{error, {hpack_error, compression}};
{error, {compression_error, {bad_header_packet, Binary}}} ->
{error, {hpack_error, {bad_header_packet, Binary}}}
end.
hpack_encode(Context, Headers) ->
hpack:encode(Headers, Context).
hpack_new_max_table_size(Context, Size) ->
hpack:new_max_table_size(Size, Context).
ets_lookup_element(Table, Key, Position) ->
try
{ok, ets:lookup_element(Table, Key, Position)}
catch
error:badarg ->
{error, nil}
end.
get_path_and_query(String) ->
case uri_string:parse(String) of
{error, Value, Term} ->
{error, {Value, Term}};
UriMap ->
Query =
case maps:find(query, UriMap) of
error ->
{error, nil};
Ok -> Ok
end,
{ok, {maps:get(path, UriMap), Query}}
end.
decode_atom(Value) when is_atom(Value) -> {ok, Value};
decode_atom(_Value) -> {error, nil}.