%% @doc
%% Zstd [1] binding for Erlang.
%%
%% [1]: [http://facebook.github.io/zstd]
-module(ezstd).
-export([
compress/1,
compress/2,
decompress/1,
create_cdict/2,
create_ddict/1,
compress_using_cdict/2,
decompress_using_ddict/2,
get_dict_id_from_frame/1,
get_dict_id_from_ddict/1,
get_dict_id_from_cdict/1
]).
-spec create_cdict(binary(), integer()) -> reference() | {error, any()}.
create_cdict(Binary, CompressionLevel) ->
ezstd_nif:create_cdict(Binary, CompressionLevel).
-spec create_ddict(binary()) -> reference() | {error, any()}.
create_ddict(Binary) ->
ezstd_nif:create_ddict(Binary).
-spec compress_using_cdict(binary(), reference()) -> binary() | {error, any()}.
compress_using_cdict(Binary, CCDict) ->
ezstd_nif:compress_using_cdict(Binary, CCDict).
-spec decompress_using_ddict(binary(), reference()) -> binary() | {error, any()}.
decompress_using_ddict(Binary, DDict) ->
ezstd_nif:decompress_using_ddict(Binary, DDict).
-spec get_dict_id_from_frame(binary()) -> integer().
get_dict_id_from_frame(Binary) ->
returns_integers(ezstd_nif:get_dict_id_from_frame(Binary)).
-spec get_dict_id_from_ddict(reference()) -> integer().
get_dict_id_from_ddict(DDict) ->
returns_integers(ezstd_nif:get_dict_id_from_ddict(DDict)).
-spec get_dict_id_from_cdict(reference()) -> integer().
get_dict_id_from_cdict(CDict) ->
returns_integers(ezstd_nif:get_dict_id_from_cdict(CDict)).
%% @doc Compresses the given binary.
-spec compress(binary()) -> binary() | {error, any()}.
compress(Binary) ->
ezstd_nif:compress(Binary, 1).
%% @doc Compresses the given binary with compression level.
-spec compress(binary(), integer()) -> binary() | {error, any()}.
compress(Binary, CompressionLevel) ->
ezstd_nif:compress(Binary, CompressionLevel).
%% @doc Decompresses the given binary.
-spec decompress(binary()) -> binary() | {error, any()}.
decompress(Binary) ->
ezstd_nif:decompress(Binary).
returns_integers(Value) ->
% the _dict_id functions only return non-integers when
% the preconditions are broken. ie: non-binary or non-reference
% supplied as an argument
% in the case of frame it returns 0 if the frame has no
% dict_id
case Value of
V when is_integer(V) ->
V;
Other ->
error(Other)
end.