%%%--------------------------------------------------------------------- %%% @copyright 2023 William Fank Thomé %%% @author William Fank Thomé %%% @doc Core module. %%% %%% Copyright 2023 William Fank Thomé %%% %%% Licensed under the Apache License, Version 2.0 (the "License"); %%% you may not use this file except in compliance with the License. %%% You may obtain a copy of the License at %%% %%% http://www.apache.org/licenses/LICENSE-2.0 %%% %%% Unless required by applicable law or agreed to in writing, software %%% distributed under the License is distributed on an "AS IS" BASIS, %%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %%% See the License for the specific language governing permissions and %%% limitations under the License. %%% %%% @end %%%--------------------------------------------------------------------- -module(euneus). -compile({ inline, do_encode_to_bin/1 }). %% API functions -export([ encode/1 ]). -export([ encode/2 ]). -export([ encode_to_binary/1 ]). -export([ encode_to_binary/2 ]). -export([ parse_encode_opts/1 ]). -export([ encode_parsed/2 ]). -export([ encode_parsed_to_binary/2 ]). -export([ encode_js/1 ]). -export([ encode_js_to_binary/1 ]). -export([ encode_html/1 ]). -export([ encode_html_to_binary/1 ]). -export([ encode_unicode/1 ]). -export([ encode_unicode_to_binary/1 ]). -export([ decode/1 ]). -export([ decode/2 ]). -export([ parse_decode_opts/1 ]). -export([ decode_parsed/2 ]). -export([ minify/1 ]). -export([ minify_to_binary/1 ]). -export([ prettify/1 ]). -export([ prettify_to_binary/1 ]). -export([ format/2 ]). -export([ format_to_binary/2 ]). -export([ parse_format_opts/1 ]). -export([ format_parsed/2 ]). -export([ format_parsed_to_binary/2 ]). %% Types -export_type([ encode_input/0 ]). -export_type([ encode_parsed_opts/0 ]). -export_type([ encode_result/0 ]). -export_type([ encode_to_bin_result/0 ]). -export_type([ decode_input/0 ]). -export_type([ decode_parsed_opts/0 ]). -export_type([ decode_result/0 ]). -export_type([ format_input/0 ]). -export_type([ format_opts/0 ]). -export_type([ format_result/0 ]). -type encode_input() :: euneus_encoder:input(). -type encode_opts() :: euneus_encoder:options(). -type encode_parsed_opts() :: euneus_encoder:parsed_options(). -type encode_result() :: euneus_encoder:result(). -type encode_to_bin_result() :: {ok, binary()} | {error, euneus_encoder:error_reason()}. -type decode_input() :: euneus_decoder:input(). -type decode_opts() :: euneus_decoder:options(). -type decode_parsed_opts() :: euneus_decoder:parsed_options(). -type decode_result() :: euneus_decoder:result(). -type format_input() :: euneus_formatter:input(). -type format_opts() :: euneus_formatter:options(). -type format_parsed_opts() :: euneus_formatter:parsed_options(). -type format_result() :: euneus_formatter:result(). %%%===================================================================== %%% API functions %%%===================================================================== %%%--------------------------------------------------------------------- %%% Encode %%%--------------------------------------------------------------------- %%---------------------------------------------------------------------- %% @doc Generates a JSON from Erlang term. %% %% @equiv euneus_encoder:encode/2 %% %% @see euneus_encoder:encode/2 %% %% @end %%---------------------------------------------------------------------- -spec encode(Input, Opts) -> Return when Input :: encode_input(), Opts :: encode_opts(), Return :: encode_result(). encode(Input, Opts) -> euneus_encoder:encode(Input, Opts). %%---------------------------------------------------------------------- %% @doc Generates a JSON as {@link erlang:binary()} from Erlang term. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_encoder:encode/2 %% %% @end %%---------------------------------------------------------------------- -spec encode_to_binary(Input, Opts) -> Return when Input :: encode_input(), Opts :: encode_opts(), Return :: encode_to_bin_result(). encode_to_binary(Input, Opts) -> do_encode_to_bin(encode(Input, Opts)). %%---------------------------------------------------------------------- %% @doc Parses {@link euneus_encoder:options()} to {@link euneus_encoder:parsed_options()}. %% %% @equiv euneus_encoder:parse_opts/1 %% %% @see euneus_encoder:parse_opts/1 %% @see euneus_encoder:encode_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec parse_encode_opts(Opts) -> Result when Opts :: encode_opts(), Result :: encode_parsed_opts(). parse_encode_opts(Opts) -> euneus_encoder:parse_opts(Opts). %%---------------------------------------------------------------------- %% @doc Generates a JSON from Erlang term. %% %% @equiv euneus_encoder:encode_parsed/2 %% %% @see euneus_encoder:encode_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec encode_parsed(Input, ParsedOpts) -> Result when Input :: encode_input(), ParsedOpts :: encode_parsed_opts(), Result :: encode_result(). encode_parsed(Input, ParsedOpts) -> euneus_encoder:encode_parsed(Input, ParsedOpts). %%---------------------------------------------------------------------- %% @doc Generates a JSON as {@link erlang:binary()} from Erlang term. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_encoder:encode_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec encode_parsed_to_binary(Input, ParsedOpts) -> Result when Input :: encode_input(), ParsedOpts :: encode_parsed_opts(), Result :: encode_to_bin_result(). encode_parsed_to_binary(Input, ParsedOpts) -> do_encode_to_bin(encode_parsed(Input, ParsedOpts)). %%%--------------------------------------------------------------------- %%% Encode JSON %%%--------------------------------------------------------------------- %%---------------------------------------------------------------------- %% @doc Generates a JSON from Erlang term. %% %% Uses JSON encoder. %% %% @equiv euneus_encoder_smart_json:encode/1 %% %% @see euneus_encoder_smart_json:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode(Input) -> Return when Input :: encode_input(), Return :: encode_result(). encode(Input) -> euneus_encoder_smart_json:encode(Input). %%---------------------------------------------------------------------- %% @doc Generates a JSON as {@link erlang:binary()} from Erlang term. %% %% Uses JSON encoder. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_encoder_smart_json:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode_to_binary(Input) -> Return when Input :: encode_input(), Return :: encode_to_bin_result(). encode_to_binary(Input) -> do_encode_to_bin(encode(Input)). %%%--------------------------------------------------------------------- %%% Encode JS %%%--------------------------------------------------------------------- %%---------------------------------------------------------------------- %% @doc Generates a JSON from Erlang term. %% %% Uses Javascript encoder. %% %% @equiv euneus_encoder_smart_javascript:encode/1 %% %% @see euneus_encoder_smart_javascript:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode_js(Input) -> Return when Input :: encode_input(), Return :: encode_result(). encode_js(Input) -> euneus_encoder_smart_javascript:encode(Input). %%---------------------------------------------------------------------- %% @doc Generates a JSON as {@link erlang:binary()} from Erlang term. %% %% Uses Javascript encoder. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_encoder_smart_javascript:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode_js_to_binary(Input) -> Return when Input :: encode_input(), Return :: encode_to_bin_result(). encode_js_to_binary(Input) -> do_encode_to_bin(encode_js(Input)). %%%--------------------------------------------------------------------- %%% Encode HTML %%%--------------------------------------------------------------------- %%---------------------------------------------------------------------- %% @doc Generates a JSON from Erlang term. %% %% Uses HTML encoder. %% %% @equiv euneus_encoder_smart_html:encode/1 %% %% @see euneus_encoder_smart_html:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode_html(Input) -> Return when Input :: encode_input(), Return :: encode_result(). encode_html(Input) -> euneus_encoder_smart_html:encode(Input). %%---------------------------------------------------------------------- %% @doc Generates a JSON as {@link erlang:binary()} from Erlang term. %% %% Uses HTML encoder. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_encoder_smart_html:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode_html_to_binary(Input) -> Return when Input :: encode_input(), Return :: encode_to_bin_result(). encode_html_to_binary(Input) -> do_encode_to_bin(encode_html(Input)). %%%--------------------------------------------------------------------- %%% Encode Unicode %%%--------------------------------------------------------------------- %%---------------------------------------------------------------------- %% @doc Generates a JSON from Erlang term. %% %% Uses Unicode encoder. %% %% @equiv euneus_encoder_smart_unicode:encode/1 %% %% @see euneus_encoder_smart_unicode:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode_unicode(Input) -> Return when Input :: encode_input(), Return :: encode_result(). encode_unicode(Input) -> euneus_encoder_smart_unicode:encode(Input). %%---------------------------------------------------------------------- %% @doc Generates a JSON as {@link erlang:binary()} from Erlang term. %% %% Uses Unicode encoder. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_encoder_smart_unicode:encode/1 %% %% @end %%---------------------------------------------------------------------- -spec encode_unicode_to_binary(Input) -> Return when Input :: encode_input(), Return :: encode_to_bin_result(). encode_unicode_to_binary(Input) -> do_encode_to_bin(encode_unicode(Input)). %%%--------------------------------------------------------------------- %%% Decode %%%--------------------------------------------------------------------- %%---------------------------------------------------------------------- %% @doc Parses JSON to Erlang term. %% %% @equiv euneus_decoder_smart:decode/1 %% %% @see euneus_decoder_smart:decode/1 %% %% @end %%---------------------------------------------------------------------- -spec decode(Input) -> Result when Input :: decode_input(), Result :: decode_result(). decode(Input) -> euneus_decoder_smart:decode(Input). %%---------------------------------------------------------------------- %% @doc Parses JSON to Erlang term. %% %% @equiv euneus_decoder:decode/2 %% %% @see euneus_decoder:decode/2 %% %% @end %%---------------------------------------------------------------------- -spec decode(Input, Opts) -> Result when Input :: decode_input(), Opts :: decode_opts(), Result :: decode_result(). decode(Input, Opts) -> euneus_decoder:decode(Input, Opts). %%---------------------------------------------------------------------- %% @doc Parses {@link euneus_decoder:options()} to {@link euneus_decoder:parsed_options()}. %% %% @equiv euneus_decoder:parse_opts/1 %% %% @see euneus_decoder:parse_opts/1 %% @see euneus_decoder:decode_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec parse_decode_opts(Opts) -> Result when Opts :: decode_opts(), Result :: decode_parsed_opts(). parse_decode_opts(Opts) -> euneus_decoder:parse_opts(Opts). %%---------------------------------------------------------------------- %% @doc Parses JSON to Erlang term. %% %% @equiv euneus_decoder:decode_parsed/2 %% %% @see euneus_decoder:decode_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec decode_parsed(Input, ParsedOpts) -> Result when Input :: decode_input(), ParsedOpts :: decode_parsed_opts(), Result :: decode_result(). decode_parsed(Input, ParsedOpts) -> euneus_decoder:decode_parsed(Input, ParsedOpts). %%%--------------------------------------------------------------------- %%% Format %%%--------------------------------------------------------------------- %%---------------------------------------------------------------------- %% @doc Remove extra spaces and line feeds from JSON. %% %% @equiv euneus_formatter:minify/1 %% %% @see euneus_formatter:minify/1 %% %% @end %%---------------------------------------------------------------------- -spec minify(Input) -> Result when Input :: format_input(), Result :: format_result(). minify(Input) -> euneus_formatter:minify(Input). %%---------------------------------------------------------------------- %% @doc Remove extra spaces and line feeds from JSON. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_formatter:minify/1 %% %% @end %%---------------------------------------------------------------------- -spec minify_to_binary(Input) -> Result when Input :: format_input(), Result :: binary(). minify_to_binary(Input) -> iolist_to_binary(minify(Input)). %%---------------------------------------------------------------------- %% @doc Format JSON for printing. %% %% @equiv euneus_formatter:prettify/1 %% %% @see euneus_formatter:prettify/1 %% %% @end %%---------------------------------------------------------------------- -spec prettify(Input) -> Result when Input :: format_input(), Result :: format_result(). prettify(Input) -> euneus_formatter:prettify(Input). %%---------------------------------------------------------------------- %% @doc Format JSON for printing. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_formatter:prettify/1 %% %% @end %%---------------------------------------------------------------------- -spec prettify_to_binary(Input) -> Result when Input :: format_input(), Result :: binary(). prettify_to_binary(Input) -> iolist_to_binary(prettify(Input)). %%---------------------------------------------------------------------- %% @doc Format JSON. %% %% @equiv euneus_formatter:format/2 %% %% @see euneus_formatter:format/2 %% %% @end %%---------------------------------------------------------------------- -spec format(Input, Opts) -> Result when Input :: format_input(), Opts :: format_opts(), Result :: format_result(). format(Input, Opts) -> euneus_formatter:format(Input, Opts). %%---------------------------------------------------------------------- %% @doc Format JSON. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_formatter:format/2 %% %% @end %%---------------------------------------------------------------------- -spec format_to_binary(Input, Opts) -> Result when Input :: format_input(), Opts :: format_opts(), Result :: binary(). format_to_binary(Input, Opts) -> iolist_to_binary(format(Input, Opts)). %%---------------------------------------------------------------------- %% @doc Parses {@link euneus_formatter:options()} to {@link euneus_formatter:parsed_options()}. %% %% @equiv euneus_formatter:parse_opts/1 %% %% @see euneus_formatter:parse_opts/1 %% @see euneus_formatter:format_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec parse_format_opts(Opts) -> Result when Opts :: format_opts(), Result :: format_parsed_opts(). parse_format_opts(Opts) -> euneus_formatter:parse_opts(Opts). %%---------------------------------------------------------------------- %% @doc Format JSON. %% %% @equiv euneus_formatter:format_parsed/2 %% %% @see euneus_formatter:format_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec format_parsed(Input, Opts) -> Result when Input :: format_input(), Opts :: format_parsed_opts(), Result :: format_result(). format_parsed(Input, Opts) -> euneus_formatter:format_parsed(Input, Opts). %%---------------------------------------------------------------------- %% @doc Format JSON. %% %% @returns {@link erlang:binary()}. %% %% @see euneus_formatter:format_parsed/2 %% %% @end %%---------------------------------------------------------------------- -spec format_parsed_to_binary(Input, Opts) -> Result when Input :: format_input(), Opts :: format_parsed_opts(), Result :: binary(). format_parsed_to_binary(Input, Opts) -> iolist_to_binary(format_parsed(Input, Opts)). %%%===================================================================== %%% Internal functions %%%===================================================================== do_encode_to_bin({ok, Result}) -> {ok, iolist_to_binary(Result)}; do_encode_to_bin({error, Reason}) -> {error, Reason}.