Current section

Files

Jump to
ssevents src ssevents@validate.erl
Raw

src/ssevents@validate.erl

-module(ssevents@validate).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/ssevents/validate.gleam").
-export([max_data_bytes/2, max_data_bytes_checked/2, validate_event_name/1, validate_id/1, validate_retry/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" Explicit validation helpers for domain values.\n").
-file("src/ssevents/validate.gleam", 34).
-spec max_data_bytes(ssevents@event:event(), integer()) -> {ok,
ssevents@event:event()} |
{error, ssevents@error:sse_error()}.
max_data_bytes(Event, Max) ->
case Max < 0 of
true ->
erlang:error(#{gleam_error => panic,
message => <<"max must be >= 0"/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"ssevents/validate"/utf8>>,
function => <<"max_data_bytes"/utf8>>,
line => 39});
false ->
nil
end,
Data_size = begin
_pipe = ssevents@event:data_of(Event),
_pipe@1 = gleam_stdlib:identity(_pipe),
erlang:byte_size(_pipe@1)
end,
case Data_size > Max of
true ->
{error, {event_too_large, Max}};
false ->
{ok, Event}
end.
-file("src/ssevents/validate.gleam", 59).
?DOC(
" Like `max_data_bytes`, but returns the argument-validation failure\n"
" as a `LimitConfigError` instead of panicking. Use this when `max`\n"
" comes from dynamic input.\n"
"\n"
" The outer `Result` distinguishes argument-validation failures (a\n"
" configuration error the caller can surface up the chain) from\n"
" event-validation failures (the inner `Result(event.Event, SseError)`\n"
" reporting whether the event itself fits the configured limit).\n"
).
-spec max_data_bytes_checked(ssevents@event:event(), integer()) -> {ok,
{ok, ssevents@event:event()} | {error, ssevents@error:sse_error()}} |
{error, ssevents@limit:limit_config_error()}.
max_data_bytes_checked(Event, Max) ->
case Max < 0 of
true ->
{error, {non_positive_limit, <<"max"/utf8>>, Max}};
false ->
{ok, max_data_bytes(Event, Max)}
end.
-file("src/ssevents/validate.gleam", 73).
-spec contains_forbidden_bytes(bitstring()) -> boolean().
contains_forbidden_bytes(Input) ->
case Input of
<<>> ->
false;
<<0, _/binary>> ->
true;
<<10, _/binary>> ->
true;
<<13, _/binary>> ->
true;
<<_, Rest/binary>> ->
contains_forbidden_bytes(Rest);
_ ->
true
end.
-file("src/ssevents/validate.gleam", 69).
-spec contains_forbidden_text_byte(binary()) -> boolean().
contains_forbidden_text_byte(Input) ->
contains_forbidden_bytes(gleam_stdlib:identity(Input)).
-file("src/ssevents/validate.gleam", 17).
-spec validate_no_forbidden_bytes(binary(), binary()) -> {ok, binary()} |
{error, ssevents@error:sse_error()}.
validate_no_forbidden_bytes(Field_name, Value) ->
case contains_forbidden_text_byte(Value) of
true ->
{error, {invalid_field, Field_name}};
false ->
{ok, Value}
end.
-file("src/ssevents/validate.gleam", 9).
-spec validate_event_name(binary()) -> {ok, binary()} |
{error, ssevents@error:sse_error()}.
validate_event_name(Name) ->
validate_no_forbidden_bytes(<<"event"/utf8>>, Name).
-file("src/ssevents/validate.gleam", 13).
-spec validate_id(binary()) -> {ok, binary()} |
{error, ssevents@error:sse_error()}.
validate_id(Id) ->
validate_no_forbidden_bytes(<<"id"/utf8>>, Id).
-file("src/ssevents/validate.gleam", 84).
-spec int_to_string(integer()) -> binary().
int_to_string(Value) ->
erlang:integer_to_binary(Value).
-file("src/ssevents/validate.gleam", 27).
-spec validate_retry(integer()) -> {ok, integer()} |
{error, ssevents@error:sse_error()}.
validate_retry(Milliseconds) ->
case Milliseconds < 0 of
true ->
{error, {invalid_retry, int_to_string(Milliseconds)}};
false ->
{ok, Milliseconds}
end.