Current section
Files
Jump to
Current section
Files
src/blush.erl
-module(blush).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/blush.gleam").
-export([encode/2]).
-export_type([encoding_error/0, image_data/0, components/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type encoding_error() :: {invalid_components_size, binary()} |
{invalid_image_size, binary()} |
{invalid_pixel_array_size, binary()} |
{invalid_pixel_value, binary()}.
-type image_data() :: {image_data, integer(), integer(), list(integer())}.
-type components() :: {components, integer(), integer()}.
-file("src/blush.gleam", 64).
-spec validate_component_size(integer(), binary()) -> {ok, nil} |
{error, encoding_error()}.
validate_component_size(Value, Label) ->
case Value of
Valid when (Valid > 0) andalso (Valid < 10) ->
{ok, nil};
_ ->
Message = <<<<"Invalid component size: "/utf8, Label/binary>>/binary,
". Expected an integer value that's between 1 and 9 inclusive."/utf8>>,
{error, {invalid_components_size, Message}}
end.
-file("src/blush.gleam", 57).
-spec validate_components(components()) -> {ok, nil} | {error, encoding_error()}.
validate_components(Components) ->
gleam@result:'try'(
validate_component_size(erlang:element(2, Components), <<"x"/utf8>>),
fun(_) ->
gleam@result:'try'(
validate_component_size(
erlang:element(3, Components),
<<"y"/utf8>>
),
fun(_) -> {ok, nil} end
)
end
).
-file("src/blush.gleam", 94).
-spec validate_image_size(integer(), binary()) -> {ok, nil} |
{error, encoding_error()}.
validate_image_size(Value, Label) ->
case Value of
Valid when Valid > 0 ->
{ok, nil};
_ ->
Message = <<<<"Invalid image size. Expected "/utf8, Label/binary>>/binary,
" to be greater than zero."/utf8>>,
{error, {invalid_image_size, Message}}
end.
-file("src/blush.gleam", 129).
-spec validate_pixel_values(image_data()) -> {ok, nil} |
{error, encoding_error()}.
validate_pixel_values(Image) ->
Offending_pixel_value = gleam@list:find(
erlang:element(4, Image),
fun(Value) -> case Value of
Valid when (Valid >= 0) andalso (Valid =< 255) ->
false;
_ ->
true
end end
),
case Offending_pixel_value of
{ok, Pixel} ->
Message = <<<<"All pixel values must be integers between 0 and 255 inclusive. Encountered pixel with value "/utf8,
(erlang:integer_to_binary(Pixel))/binary>>/binary,
" which is not valid."/utf8>>,
{error, {invalid_pixel_value, Message}};
_ ->
{ok, nil}
end.
-file("src/blush.gleam", 106).
-spec validate_pixels(image_data()) -> {ok, nil} | {error, encoding_error()}.
validate_pixels(Image) ->
Expected_items = (erlang:element(2, Image) * erlang:element(3, Image)) * 3,
Actual_items = erlang:length(erlang:element(4, Image)),
case Actual_items =:= Expected_items of
false ->
Message = <<<<<<<<<<<<<<<<"Expected "/utf8,
(erlang:integer_to_binary(
erlang:element(2, Image)
))/binary>>/binary,
" * "/utf8>>/binary,
(erlang:integer_to_binary(
erlang:element(3, Image)
))/binary>>/binary,
" * 3 (r, g, b) = "/utf8>>/binary,
(erlang:integer_to_binary(Expected_items))/binary>>/binary,
" items in the pixel array, but the pixel array size contains "/utf8>>/binary,
(erlang:integer_to_binary(Actual_items))/binary>>/binary,
" items instead."/utf8>>,
{error, {invalid_pixel_array_size, Message}};
true ->
validate_pixel_values(Image)
end.
-file("src/blush.gleam", 81).
-spec validate_image_data(image_data()) -> {ok, nil} | {error, encoding_error()}.
validate_image_data(Image) ->
gleam@result:'try'(
validate_image_size(erlang:element(2, Image), <<"width"/utf8>>),
fun(_) ->
gleam@result:'try'(
validate_image_size(erlang:element(3, Image), <<"height"/utf8>>),
fun(_) ->
gleam@result:'try'(
validate_pixels(Image),
fun(_) ->
_pipe = [validate_image_size(
erlang:element(2, Image),
<<"width"/utf8>>
),
validate_image_size(
erlang:element(3, Image),
<<"height"/utf8>>
)],
_pipe@1 = gleam@result:all(_pipe),
gleam@result:replace(_pipe@1, nil)
end
)
end
)
end
).
-file("src/blush.gleam", 28).
?DOC(" Encodes the provided image into a BlurHash - that can be later decoded into thumbnail image or used with other BlurHash-compatible libraries.\n").
-spec encode(image_data(), components()) -> {ok, binary()} |
{error, encoding_error()}.
encode(Image, Components) ->
gleam@result:'try'(
validate_components(Components),
fun(_) ->
gleam@result:'try'(
validate_image_data(Image),
fun(_) ->
Blurhash = 'Elixir.BlurHash':encode(
erlang:element(4, Image),
erlang:element(2, Image),
erlang:element(3, Image),
erlang:element(2, Components),
erlang:element(3, Components)
),
{ok, Blurhash}
end
)
end
).