-module(oaspec@internal@codegen@guards). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/internal/codegen/guards.gleam"). -export([schema_has_validator/2, generate/1]). -export_type([parsed_chunk/0, constraint_types/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. ?MODULEDOC(false). -type parsed_chunk() :: {parsed_chunk, binary(), binary(), binary(), binary(), binary(), binary()}. -type constraint_types() :: {constraint_types, boolean(), boolean(), boolean(), boolean(), boolean(), boolean(), boolean()}. -file("src/oaspec/internal/codegen/guards.gleam", 281). ?DOC(false). -spec rsplit_once_on_close_brace(binary()) -> {ok, {binary(), binary()}} | {error, nil}. rsplit_once_on_close_brace(S) -> Needle = <<"\n}\n"/utf8>>, case gleam@string:split(S, Needle) of [_] -> {error, nil}; Parts -> case lists:reverse(Parts) of [] -> {error, nil}; [Last_part | Rev_rest] -> Body = begin _pipe = lists:reverse(Rev_rest), gleam@string:join(_pipe, Needle) end, {ok, {Body, Last_part}} end end. -file("src/oaspec/internal/codegen/guards.gleam", 251). ?DOC(false). -spec parse_function_chunk_strict(binary()) -> {ok, parsed_chunk()} | {error, nil}. parse_function_chunk_strict(Chunk) -> gleam@result:'try'( gleam@string:split_once(Chunk, <<"("/utf8>>), fun(_use0) -> {Name, After_open_paren} = _use0, gleam@result:'try'( gleam@string:split_once(After_open_paren, <<") -> "/utf8>>), fun(_use0@1) -> {Param_decl, After_arrow} = _use0@1, gleam@result:'try'( gleam@string:split_once(After_arrow, <<" {\n"/utf8>>), fun(_use0@2) -> {Return_type, After_open_brace} = _use0@2, gleam@result:'try'( rsplit_once_on_close_brace(After_open_brace), fun(_use0@3) -> {Body, Trailing} = _use0@3, {ok, {parsed_chunk, Name, Param_decl, Return_type, Body, Trailing, Chunk}} end ) end ) end ) end ). -file("src/oaspec/internal/codegen/guards.gleam", 233). ?DOC(false). -spec parse_function_chunk(binary()) -> parsed_chunk(). parse_function_chunk(Chunk) -> Fallback = {parsed_chunk, <<""/utf8>>, <<""/utf8>>, <<""/utf8>>, <<""/utf8>>, <<""/utf8>>, Chunk}, _pipe = parse_function_chunk_strict(Chunk), gleam@result:unwrap(_pipe, Fallback). -file("src/oaspec/internal/codegen/guards.gleam", 348). ?DOC(false). -spec per_field_validator_suffixes() -> list(binary()). per_field_validator_suffixes() -> [<<"_length"/utf8>>, <<"_pattern"/utf8>>, <<"_range"/utf8>>, <<"_exclusive"/utf8>>, <<"_multiple_of"/utf8>>, <<"_count"/utf8>>, <<"_unique"/utf8>>]. -file("src/oaspec/internal/codegen/guards.gleam", 338). ?DOC(false). -spec is_dedupable(parsed_chunk()) -> boolean(). is_dedupable(Chunk) -> gleam@bool:guard( not gleam_stdlib:string_starts_with( erlang:element(2, Chunk), <<"validate_"/utf8>> ), false, fun() -> gleam@list:any( per_field_validator_suffixes(), fun(Suffix) -> gleam_stdlib:string_ends_with( erlang:element(2, Chunk), Suffix ) end ) end ). -file("src/oaspec/internal/codegen/guards.gleam", 314). ?DOC(false). -spec build_body_to_canonical_name_map(list(parsed_chunk())) -> gleam@dict:dict(binary(), binary()). build_body_to_canonical_name_map(Parsed) -> gleam@list:fold( Parsed, maps:new(), fun(Acc, Chunk) -> case is_dedupable(Chunk) of false -> Acc; true -> case gleam_stdlib:map_get(Acc, erlang:element(5, Chunk)) of {error, nil} -> gleam@dict:insert( Acc, erlang:element(5, Chunk), erlang:element(2, Chunk) ); {ok, Existing} -> case gleam@string:compare( erlang:element(2, Chunk), Existing ) of lt -> gleam@dict:insert( Acc, erlang:element(5, Chunk), erlang:element(2, Chunk) ); _ -> Acc end end end end ). -file("src/oaspec/internal/codegen/guards.gleam", 376). ?DOC(false). -spec emit_delegator(parsed_chunk(), binary()) -> binary(). emit_delegator(Chunk, Canonical_name) -> <<<<<<<<<<<<<<<<(erlang:element(2, Chunk))/binary, "("/utf8>>/binary, (erlang:element(3, Chunk))/binary>>/binary, ") -> "/utf8>>/binary, (erlang:element(4, Chunk))/binary>>/binary, " {\n "/utf8>>/binary, Canonical_name/binary>>/binary, "(value)\n}\n"/utf8>>/binary, (erlang:element(6, Chunk))/binary>>. -file("src/oaspec/internal/codegen/guards.gleam", 358). ?DOC(false). -spec rewrite_chunk_if_duplicate( parsed_chunk(), gleam@dict:dict(binary(), binary()) ) -> binary(). rewrite_chunk_if_duplicate(Chunk, Canonical_by_body) -> case gleam_stdlib:map_get(Canonical_by_body, erlang:element(5, Chunk)) of {error, nil} -> erlang:element(7, Chunk); {ok, Canonical_name} -> case Canonical_name =:= erlang:element(2, Chunk) of true -> erlang:element(7, Chunk); false -> emit_delegator(Chunk, Canonical_name) end end. -file("src/oaspec/internal/codegen/guards.gleam", 177). ?DOC(false). -spec dedupe_field_validator_definitions(binary()) -> binary(). dedupe_field_validator_definitions(Source) -> case gleam@string:split(Source, <<"\npub fn "/utf8>>) of [] -> Source; [_] -> Source; [Head | Raw_chunks] -> Parsed = gleam@list:map(Raw_chunks, fun parse_function_chunk/1), Canonical_by_body = build_body_to_canonical_name_map(Parsed), Rewritten = gleam@list:map( Parsed, fun(P) -> rewrite_chunk_if_duplicate(P, Canonical_by_body) end ), <
<<"\npub fn "/utf8, C/binary>> end ) ))/binary>> end. -file("src/oaspec/internal/codegen/guards.gleam", 744). ?DOC(false). -spec character_word(integer()) -> binary(). character_word(N) -> case N of 1 -> <<"character"/utf8>>; _ -> <<"characters"/utf8>> end. -file("src/oaspec/internal/codegen/guards.gleam", 1390). ?DOC(false). -spec guard_function_name(binary(), binary(), binary()) -> binary(). guard_function_name(Schema_name, Prop_name, Constraint) -> Base = oaspec@internal@util@naming:to_snake_case(Schema_name), case Prop_name of <<""/utf8>> -> <<<<<<"validate_"/utf8, Base/binary>>/binary, "_"/utf8>>/binary, Constraint/binary>>; _ -> <<<<<<<<<<"validate_"/utf8, Base/binary>>/binary, "_"/utf8>>/binary, (oaspec@internal@util@naming:to_snake_case(Prop_name))/binary>>/binary, "_"/utf8>>/binary, Constraint/binary>> end. -file("src/oaspec/internal/codegen/guards.gleam", 1409). ?DOC(false). -spec field_label(binary()) -> binary(). field_label(Prop_name) -> case Prop_name of <<""/utf8>> -> <<""/utf8>>; _ -> <<"."/utf8, Prop_name/binary>> end. -file("src/oaspec/internal/codegen/guards.gleam", 1417). ?DOC(false). -spec gleam_string_literal(binary()) -> binary(). gleam_string_literal(Value) -> Escaped = begin _pipe = Value, _pipe@1 = gleam@string:replace(_pipe, <<"\\"/utf8>>, <<"\\\\"/utf8>>), _pipe@2 = gleam@string:replace(_pipe@1, <<"\""/utf8>>, <<"\\\""/utf8>>), _pipe@3 = gleam@string:replace(_pipe@2, <<"\n"/utf8>>, <<"\\n"/utf8>>), _pipe@4 = gleam@string:replace(_pipe@3, <<"\r"/utf8>>, <<"\\r"/utf8>>), gleam@string:replace(_pipe@4, <<"\t"/utf8>>, <<"\\t"/utf8>>) end, <<<<"\""/utf8, Escaped/binary>>/binary, "\""/utf8>>. -file("src/oaspec/internal/codegen/guards.gleam", 1432). ?DOC(false). -spec emit_validation_failure_type(gleam@string_tree:string_tree()) -> gleam@string_tree:string_tree(). emit_validation_failure_type(Sb) -> _pipe = Sb, _pipe@1 = oaspec@internal@util@string_extra:doc_comment( _pipe, <<"A single field-level validation failure."/utf8>> ), _pipe@2 = oaspec@internal@util@string_extra:doc_comment( _pipe@1, <<"Composite validators return `List(ValidationFailure)` so callers can build structured 422 bodies and clients can branch per-field instead of parsing prose messages. `field` is the JSON property name (empty for top-level constraints), `code` is a JSON Schema keyword like `minLength` / `maximum` / `pattern`, and `message` is human-readable."/utf8>> ), _pipe@3 = oaspec@internal@util@string_extra:line( _pipe@2, <<"pub type ValidationFailure {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 1, <<"ValidationFailure(field: String, code: String, message: String)"/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:line(_pipe@4, <<"}"/utf8>>), _pipe@6 = oaspec@internal@util@string_extra:blank_line(_pipe@5), _pipe@7 = oaspec@internal@util@string_extra:doc_comment( _pipe@6, <<"Encode a `ValidationFailure` as JSON for emitting 422 response bodies."/utf8>> ), _pipe@8 = oaspec@internal@util@string_extra:line( _pipe@7, <<"pub fn validation_failure_to_json(failure: ValidationFailure) -> json.Json {"/utf8>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 1, <<"json.object(["/utf8>> ), _pipe@10 = oaspec@internal@util@string_extra:indent( _pipe@9, 2, <<"#(\"field\", json.string(failure.field)),"/utf8>> ), _pipe@11 = oaspec@internal@util@string_extra:indent( _pipe@10, 2, <<"#(\"code\", json.string(failure.code)),"/utf8>> ), _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 2, <<"#(\"message\", json.string(failure.message)),"/utf8>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 1, <<"])"/utf8>> ), _pipe@14 = oaspec@internal@util@string_extra:line(_pipe@13, <<"}"/utf8>>), oaspec@internal@util@string_extra:blank_line(_pipe@14). -file("src/oaspec/internal/codegen/guards.gleam", 1462). ?DOC(false). -spec validation_failure_literal(binary(), binary(), binary()) -> binary(). validation_failure_literal(Field, Code, Message) -> <<<<<<<<<<<<"Error(ValidationFailure(field: "/utf8, (gleam_string_literal(Field))/binary>>/binary, ", code: "/utf8>>/binary, (gleam_string_literal(Code))/binary>>/binary, ", message: "/utf8>>/binary, (gleam_string_literal(Message))/binary>>/binary, "))"/utf8>>. -file("src/oaspec/internal/codegen/guards.gleam", 752). ?DOC(false). -spec generate_string_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(integer()), gleam@option:option(integer()) ) -> gleam@string_tree:string_tree(). generate_string_guard(Sb, Schema_name, Prop_name, Min_length, Max_length) -> case {Min_length, Max_length} of {none, none} -> Sb; {_, _} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"length"/utf8>> ), Min_failure = fun(Min) -> validation_failure_literal( Prop_name, <<"minLength"/utf8>>, <<<<<<"must be at least "/utf8, (erlang:integer_to_binary(Min))/binary>>/binary, " "/utf8>>/binary, (character_word(Min))/binary>> ) end, Max_failure = fun(Max) -> validation_failure_literal( Prop_name, <<"maxLength"/utf8>>, <<<<<<"must be at most "/utf8, (erlang:integer_to_binary(Max))/binary>>/binary, " "/utf8>>/binary, (character_word(Max))/binary>> ) end, Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate string length for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ) end, Sb@2 = begin _pipe@1 = Sb@1, oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: String) -> Result(String, ValidationFailure) {"/utf8>> ) end, Sb@3 = begin _pipe@2 = Sb@2, oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<"let len = string.length(value)"/utf8>> ) end, Sb@4 = case {Min_length, Max_length} of {{some, Min@1}, {some, Max@1}} -> _pipe@3 = Sb@3, _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 1, <<<<"case len < "/utf8, (erlang:integer_to_binary(Min@1))/binary>>/binary, " {"/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"True -> "/utf8, (Min_failure(Min@1))/binary>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 2, <<"False ->"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 3, <<<<"case len > "/utf8, (erlang:integer_to_binary(Max@1))/binary>>/binary, " {"/utf8>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, 4, <<"True -> "/utf8, (Max_failure(Max@1))/binary>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 4, <<"False -> Ok(value)"/utf8>> ), _pipe@10 = oaspec@internal@util@string_extra:indent( _pipe@9, 3, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@10, 1, <<"}"/utf8>> ); {{some, Min@2}, none} -> _pipe@11 = Sb@3, _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 1, <<<<"case len < "/utf8, (erlang:integer_to_binary(Min@2))/binary>>/binary, " {"/utf8>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 2, <<"True -> "/utf8, (Min_failure(Min@2))/binary>> ), _pipe@14 = oaspec@internal@util@string_extra:indent( _pipe@13, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@14, 1, <<"}"/utf8>> ); {none, {some, Max@2}} -> _pipe@15 = Sb@3, _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, 1, <<<<"case len > "/utf8, (erlang:integer_to_binary(Max@2))/binary>>/binary, " {"/utf8>> ), _pipe@17 = oaspec@internal@util@string_extra:indent( _pipe@16, 2, <<"True -> "/utf8, (Max_failure(Max@2))/binary>> ), _pipe@18 = oaspec@internal@util@string_extra:indent( _pipe@17, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@18, 1, <<"}"/utf8>> ); {none, none} -> Sb@3 end, _pipe@19 = Sb@4, _pipe@20 = oaspec@internal@util@string_extra:line( _pipe@19, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@20) end. -file("src/oaspec/internal/codegen/guards.gleam", 829). ?DOC(false). -spec generate_integer_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(integer()), gleam@option:option(integer()) ) -> gleam@string_tree:string_tree(). generate_integer_guard(Sb, Schema_name, Prop_name, Minimum, Maximum) -> case {Minimum, Maximum} of {none, none} -> Sb; {_, _} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"range"/utf8>> ), Min_failure = fun(Min) -> validation_failure_literal( Prop_name, <<"minimum"/utf8>>, <<"must be at least "/utf8, (erlang:integer_to_binary(Min))/binary>> ) end, Max_failure = fun(Max) -> validation_failure_literal( Prop_name, <<"maximum"/utf8>>, <<"must be at most "/utf8, (erlang:integer_to_binary(Max))/binary>> ) end, Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate integer range for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ) end, Sb@2 = begin _pipe@1 = Sb@1, oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: Int) -> Result(Int, ValidationFailure) {"/utf8>> ) end, Sb@3 = case {Minimum, Maximum} of {{some, Min@1}, {some, Max@1}} -> _pipe@2 = Sb@2, _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<<<"case value < "/utf8, (erlang:integer_to_binary(Min@1))/binary>>/binary, " {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 2, <<"True -> "/utf8, (Min_failure(Min@1))/binary>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"False ->"/utf8>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 3, <<<<"case value > "/utf8, (erlang:integer_to_binary(Max@1))/binary>>/binary, " {"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 4, <<"True -> "/utf8, (Max_failure(Max@1))/binary>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, 4, <<"False -> Ok(value)"/utf8>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 3, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@9, 1, <<"}"/utf8>> ); {{some, Min@2}, none} -> _pipe@10 = Sb@2, _pipe@11 = oaspec@internal@util@string_extra:indent( _pipe@10, 1, <<<<"case value < "/utf8, (erlang:integer_to_binary(Min@2))/binary>>/binary, " {"/utf8>> ), _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 2, <<"True -> "/utf8, (Min_failure(Min@2))/binary>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@13, 1, <<"}"/utf8>> ); {none, {some, Max@2}} -> _pipe@14 = Sb@2, _pipe@15 = oaspec@internal@util@string_extra:indent( _pipe@14, 1, <<<<"case value > "/utf8, (erlang:integer_to_binary(Max@2))/binary>>/binary, " {"/utf8>> ), _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, 2, <<"True -> "/utf8, (Max_failure(Max@2))/binary>> ), _pipe@17 = oaspec@internal@util@string_extra:indent( _pipe@16, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@17, 1, <<"}"/utf8>> ); {none, none} -> Sb@2 end, _pipe@18 = Sb@3, _pipe@19 = oaspec@internal@util@string_extra:line( _pipe@18, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@19) end. -file("src/oaspec/internal/codegen/guards.gleam", 902). ?DOC(false). -spec generate_float_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(float()), gleam@option:option(float()) ) -> gleam@string_tree:string_tree(). generate_float_guard(Sb, Schema_name, Prop_name, Minimum, Maximum) -> case {Minimum, Maximum} of {none, none} -> Sb; {_, _} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"range"/utf8>> ), Min_failure = fun(Min) -> validation_failure_literal( Prop_name, <<"minimum"/utf8>>, <<"must be at least "/utf8, (gleam_stdlib:float_to_string(Min))/binary>> ) end, Max_failure = fun(Max) -> validation_failure_literal( Prop_name, <<"maximum"/utf8>>, <<"must be at most "/utf8, (gleam_stdlib:float_to_string(Max))/binary>> ) end, Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate float range for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ) end, Sb@2 = begin _pipe@1 = Sb@1, oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: Float) -> Result(Float, ValidationFailure) {"/utf8>> ) end, Sb@3 = case {Minimum, Maximum} of {{some, Min@1}, {some, Max@1}} -> _pipe@2 = Sb@2, _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<<<"case value <. "/utf8, (gleam_stdlib:float_to_string(Min@1))/binary>>/binary, " {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 2, <<"True -> "/utf8, (Min_failure(Min@1))/binary>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"False ->"/utf8>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 3, <<<<"case value >. "/utf8, (gleam_stdlib:float_to_string(Max@1))/binary>>/binary, " {"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 4, <<"True -> "/utf8, (Max_failure(Max@1))/binary>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, 4, <<"False -> Ok(value)"/utf8>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 3, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@9, 1, <<"}"/utf8>> ); {{some, Min@2}, none} -> _pipe@10 = Sb@2, _pipe@11 = oaspec@internal@util@string_extra:indent( _pipe@10, 1, <<<<"case value <. "/utf8, (gleam_stdlib:float_to_string(Min@2))/binary>>/binary, " {"/utf8>> ), _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 2, <<"True -> "/utf8, (Min_failure(Min@2))/binary>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@13, 1, <<"}"/utf8>> ); {none, {some, Max@2}} -> _pipe@14 = Sb@2, _pipe@15 = oaspec@internal@util@string_extra:indent( _pipe@14, 1, <<<<"case value >. "/utf8, (gleam_stdlib:float_to_string(Max@2))/binary>>/binary, " {"/utf8>> ), _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, 2, <<"True -> "/utf8, (Max_failure(Max@2))/binary>> ), _pipe@17 = oaspec@internal@util@string_extra:indent( _pipe@16, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@17, 1, <<"}"/utf8>> ); {none, none} -> Sb@2 end, _pipe@18 = Sb@3, _pipe@19 = oaspec@internal@util@string_extra:line( _pipe@18, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@19) end. -file("src/oaspec/internal/codegen/guards.gleam", 975). ?DOC(false). -spec generate_integer_exclusive_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(integer()), gleam@option:option(integer()) ) -> gleam@string_tree:string_tree(). generate_integer_exclusive_guard( Sb, Schema_name, Prop_name, Exclusive_minimum, Exclusive_maximum ) -> case {Exclusive_minimum, Exclusive_maximum} of {none, none} -> Sb; {_, _} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"exclusive_range"/utf8>> ), Min_failure = fun(Min) -> validation_failure_literal( Prop_name, <<"exclusiveMinimum"/utf8>>, <<"must be greater than "/utf8, (erlang:integer_to_binary(Min))/binary>> ) end, Max_failure = fun(Max) -> validation_failure_literal( Prop_name, <<"exclusiveMaximum"/utf8>>, <<"must be less than "/utf8, (erlang:integer_to_binary(Max))/binary>> ) end, Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate integer exclusive range for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ) end, Sb@2 = begin _pipe@1 = Sb@1, oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: Int) -> Result(Int, ValidationFailure) {"/utf8>> ) end, Sb@3 = case {Exclusive_minimum, Exclusive_maximum} of {{some, Min@1}, {some, Max@1}} -> _pipe@2 = Sb@2, _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<<<"case value > "/utf8, (erlang:integer_to_binary(Min@1))/binary>>/binary, " {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 2, <<"False -> "/utf8, (Min_failure(Min@1))/binary>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"True ->"/utf8>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 3, <<<<"case value < "/utf8, (erlang:integer_to_binary(Max@1))/binary>>/binary, " {"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 4, <<"False -> "/utf8, (Max_failure(Max@1))/binary>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, 4, <<"True -> Ok(value)"/utf8>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 3, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@9, 1, <<"}"/utf8>> ); {{some, Min@2}, none} -> _pipe@10 = Sb@2, _pipe@11 = oaspec@internal@util@string_extra:indent( _pipe@10, 1, <<<<"case value > "/utf8, (erlang:integer_to_binary(Min@2))/binary>>/binary, " {"/utf8>> ), _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 2, <<"False -> "/utf8, (Min_failure(Min@2))/binary>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 2, <<"True -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@13, 1, <<"}"/utf8>> ); {none, {some, Max@2}} -> _pipe@14 = Sb@2, _pipe@15 = oaspec@internal@util@string_extra:indent( _pipe@14, 1, <<<<"case value < "/utf8, (erlang:integer_to_binary(Max@2))/binary>>/binary, " {"/utf8>> ), _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, 2, <<"False -> "/utf8, (Max_failure(Max@2))/binary>> ), _pipe@17 = oaspec@internal@util@string_extra:indent( _pipe@16, 2, <<"True -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@17, 1, <<"}"/utf8>> ); {none, none} -> Sb@2 end, _pipe@18 = Sb@3, _pipe@19 = oaspec@internal@util@string_extra:line( _pipe@18, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@19) end. -file("src/oaspec/internal/codegen/guards.gleam", 1049). ?DOC(false). -spec generate_integer_multiple_of_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(integer()) ) -> gleam@string_tree:string_tree(). generate_integer_multiple_of_guard(Sb, Schema_name, Prop_name, Multiple_of) -> case Multiple_of of none -> Sb; {some, M} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"multiple_of"/utf8>> ), Failure = validation_failure_literal( Prop_name, <<"multipleOf"/utf8>>, <<"must be a multiple of "/utf8, (erlang:integer_to_binary(M))/binary>> ), _pipe = Sb, _pipe@1 = oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate integer multipleOf for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ), _pipe@2 = oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: Int) -> Result(Int, ValidationFailure) {"/utf8>> ), _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<<<"case value % "/utf8, (erlang:integer_to_binary(M))/binary>>/binary, " == 0 {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 2, <<"False -> "/utf8, Failure/binary>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"True -> Ok(value)"/utf8>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 1, <<"}"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:line( _pipe@6, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@7) end. -file("src/oaspec/internal/codegen/guards.gleam", 1088). ?DOC(false). -spec generate_float_exclusive_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(float()), gleam@option:option(float()) ) -> gleam@string_tree:string_tree(). generate_float_exclusive_guard( Sb, Schema_name, Prop_name, Exclusive_minimum, Exclusive_maximum ) -> case {Exclusive_minimum, Exclusive_maximum} of {none, none} -> Sb; {_, _} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"exclusive_range"/utf8>> ), Min_failure = fun(Min) -> validation_failure_literal( Prop_name, <<"exclusiveMinimum"/utf8>>, <<"must be greater than "/utf8, (gleam_stdlib:float_to_string(Min))/binary>> ) end, Max_failure = fun(Max) -> validation_failure_literal( Prop_name, <<"exclusiveMaximum"/utf8>>, <<"must be less than "/utf8, (gleam_stdlib:float_to_string(Max))/binary>> ) end, Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate float exclusive range for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ) end, Sb@2 = begin _pipe@1 = Sb@1, oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: Float) -> Result(Float, ValidationFailure) {"/utf8>> ) end, Sb@3 = case {Exclusive_minimum, Exclusive_maximum} of {{some, Min@1}, {some, Max@1}} -> _pipe@2 = Sb@2, _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<<<"case value >. "/utf8, (gleam_stdlib:float_to_string(Min@1))/binary>>/binary, " {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 2, <<"False -> "/utf8, (Min_failure(Min@1))/binary>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"True ->"/utf8>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 3, <<<<"case value <. "/utf8, (gleam_stdlib:float_to_string(Max@1))/binary>>/binary, " {"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 4, <<"False -> "/utf8, (Max_failure(Max@1))/binary>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, 4, <<"True -> Ok(value)"/utf8>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 3, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@9, 1, <<"}"/utf8>> ); {{some, Min@2}, none} -> _pipe@10 = Sb@2, _pipe@11 = oaspec@internal@util@string_extra:indent( _pipe@10, 1, <<<<"case value >. "/utf8, (gleam_stdlib:float_to_string(Min@2))/binary>>/binary, " {"/utf8>> ), _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 2, <<"False -> "/utf8, (Min_failure(Min@2))/binary>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 2, <<"True -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@13, 1, <<"}"/utf8>> ); {none, {some, Max@2}} -> _pipe@14 = Sb@2, _pipe@15 = oaspec@internal@util@string_extra:indent( _pipe@14, 1, <<<<"case value <. "/utf8, (gleam_stdlib:float_to_string(Max@2))/binary>>/binary, " {"/utf8>> ), _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, 2, <<"False -> "/utf8, (Max_failure(Max@2))/binary>> ), _pipe@17 = oaspec@internal@util@string_extra:indent( _pipe@16, 2, <<"True -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@17, 1, <<"}"/utf8>> ); {none, none} -> Sb@2 end, _pipe@18 = Sb@3, _pipe@19 = oaspec@internal@util@string_extra:line( _pipe@18, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@19) end. -file("src/oaspec/internal/codegen/guards.gleam", 1162). ?DOC(false). -spec generate_float_multiple_of_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(float()) ) -> gleam@string_tree:string_tree(). generate_float_multiple_of_guard(Sb, Schema_name, Prop_name, Multiple_of) -> case Multiple_of of none -> Sb; {some, M} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"multiple_of"/utf8>> ), Failure = validation_failure_literal( Prop_name, <<"multipleOf"/utf8>>, <<"must be a multiple of "/utf8, (gleam_stdlib:float_to_string(M))/binary>> ), _pipe = Sb, _pipe@1 = oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate float multipleOf for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ), _pipe@2 = oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: Float) -> Result(Float, ValidationFailure) {"/utf8>> ), _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<<<<<"let remainder = value -. float.truncate(value /. "/utf8, (gleam_stdlib:float_to_string(M))/binary>>/binary, " |> int.to_float) *. "/utf8>>/binary, (gleam_stdlib:float_to_string(M))/binary>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 1, <<"case remainder == 0.0 || remainder == -0.0 {"/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"False -> "/utf8, Failure/binary>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 2, <<"True -> Ok(value)"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 1, <<"}"/utf8>> ), _pipe@8 = oaspec@internal@util@string_extra:line( _pipe@7, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@8) end. -file("src/oaspec/internal/codegen/guards.gleam", 1208). ?DOC(false). -spec generate_list_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(integer()), gleam@option:option(integer()) ) -> gleam@string_tree:string_tree(). generate_list_guard(Sb, Schema_name, Prop_name, Min_items, Max_items) -> case {Min_items, Max_items} of {none, none} -> Sb; {_, _} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"length"/utf8>> ), Min_failure = fun(Min) -> validation_failure_literal( Prop_name, <<"minItems"/utf8>>, <<<<"must have at least "/utf8, (erlang:integer_to_binary(Min))/binary>>/binary, " items"/utf8>> ) end, Max_failure = fun(Max) -> validation_failure_literal( Prop_name, <<"maxItems"/utf8>>, <<<<"must have at most "/utf8, (erlang:integer_to_binary(Max))/binary>>/binary, " items"/utf8>> ) end, Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate list length for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ) end, Sb@2 = begin _pipe@1 = Sb@1, oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: List(a)) -> Result(List(a), ValidationFailure) {"/utf8>> ) end, Sb@3 = begin _pipe@2 = Sb@2, oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<"let len = list.length(value)"/utf8>> ) end, Sb@4 = case {Min_items, Max_items} of {{some, Min@1}, {some, Max@1}} -> _pipe@3 = Sb@3, _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 1, <<<<"case len < "/utf8, (erlang:integer_to_binary(Min@1))/binary>>/binary, " {"/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"True -> "/utf8, (Min_failure(Min@1))/binary>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 2, <<"False ->"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 3, <<<<"case len > "/utf8, (erlang:integer_to_binary(Max@1))/binary>>/binary, " {"/utf8>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, 4, <<"True -> "/utf8, (Max_failure(Max@1))/binary>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 4, <<"False -> Ok(value)"/utf8>> ), _pipe@10 = oaspec@internal@util@string_extra:indent( _pipe@9, 3, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@10, 1, <<"}"/utf8>> ); {{some, Min@2}, none} -> _pipe@11 = Sb@3, _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 1, <<<<"case len < "/utf8, (erlang:integer_to_binary(Min@2))/binary>>/binary, " {"/utf8>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 2, <<"True -> "/utf8, (Min_failure(Min@2))/binary>> ), _pipe@14 = oaspec@internal@util@string_extra:indent( _pipe@13, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@14, 1, <<"}"/utf8>> ); {none, {some, Max@2}} -> _pipe@15 = Sb@3, _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, 1, <<<<"case len > "/utf8, (erlang:integer_to_binary(Max@2))/binary>>/binary, " {"/utf8>> ), _pipe@17 = oaspec@internal@util@string_extra:indent( _pipe@16, 2, <<"True -> "/utf8, (Max_failure(Max@2))/binary>> ), _pipe@18 = oaspec@internal@util@string_extra:indent( _pipe@17, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@18, 1, <<"}"/utf8>> ); {none, none} -> Sb@3 end, _pipe@19 = Sb@4, _pipe@20 = oaspec@internal@util@string_extra:line( _pipe@19, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@20) end. -file("src/oaspec/internal/codegen/guards.gleam", 1284). ?DOC(false). -spec generate_unique_items_guard( gleam@string_tree:string_tree(), binary(), binary(), boolean() ) -> gleam@string_tree:string_tree(). generate_unique_items_guard(Sb, Schema_name, Prop_name, Unique_items) -> gleam@bool:guard( not Unique_items, Sb, fun() -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"unique"/utf8>> ), Failure = validation_failure_literal( Prop_name, <<"uniqueItems"/utf8>>, <<"items must be unique"/utf8>> ), _pipe = Sb, _pipe@1 = oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate unique items for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ), _pipe@2 = oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: List(a)) -> Result(List(a), ValidationFailure) {"/utf8>> ), _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<"case list.length(value) == list.length(list.unique(value)) {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 2, <<"True -> Ok(value)"/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"False -> "/utf8, Failure/binary>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 1, <<"}"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:line( _pipe@6, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@7) end ). -file("src/oaspec/internal/codegen/guards.gleam", 1318). ?DOC(false). -spec generate_properties_count_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(integer()), gleam@option:option(integer()) ) -> gleam@string_tree:string_tree(). generate_properties_count_guard( Sb, Schema_name, Prop_name, Min_properties, Max_properties ) -> case {Min_properties, Max_properties} of {none, none} -> Sb; {_, _} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"properties"/utf8>> ), Min_failure = fun(Min) -> validation_failure_literal( Prop_name, <<"minProperties"/utf8>>, <<<<"must have at least "/utf8, (erlang:integer_to_binary(Min))/binary>>/binary, " properties"/utf8>> ) end, Max_failure = fun(Max) -> validation_failure_literal( Prop_name, <<"maxProperties"/utf8>>, <<<<"must have at most "/utf8, (erlang:integer_to_binary(Max))/binary>>/binary, " properties"/utf8>> ) end, Sb@1 = begin _pipe = Sb, _pipe@1 = oaspec@internal@util@string_extra:line( _pipe, <<<<<<"/// Validate property count for "/utf8, Schema_name/binary>>/binary, (field_label(Prop_name))/binary>>/binary, "."/utf8>> ), _pipe@2 = oaspec@internal@util@string_extra:line( _pipe@1, <<<<"pub fn "/utf8, Fn_name/binary>>/binary, "(value: Dict(k, v)) -> Result(Dict(k, v), ValidationFailure) {"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@2, 1, <<"let count = dict.size(value)"/utf8>> ) end, Sb@2 = case {Min_properties, Max_properties} of {{some, Min@1}, {some, Max@1}} -> _pipe@3 = Sb@1, _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, 1, <<<<"case count < "/utf8, (erlang:integer_to_binary(Min@1))/binary>>/binary, " {"/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, 2, <<"True -> "/utf8, (Min_failure(Min@1))/binary>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, 2, <<"False ->"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, 3, <<<<"case count > "/utf8, (erlang:integer_to_binary(Max@1))/binary>>/binary, " {"/utf8>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, 4, <<"True -> "/utf8, (Max_failure(Max@1))/binary>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, 4, <<"False -> Ok(value)"/utf8>> ), _pipe@10 = oaspec@internal@util@string_extra:indent( _pipe@9, 3, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@10, 1, <<"}"/utf8>> ); {{some, Min@2}, none} -> _pipe@11 = Sb@1, _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, 1, <<<<"case count < "/utf8, (erlang:integer_to_binary(Min@2))/binary>>/binary, " {"/utf8>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, 2, <<"True -> "/utf8, (Min_failure(Min@2))/binary>> ), _pipe@14 = oaspec@internal@util@string_extra:indent( _pipe@13, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@14, 1, <<"}"/utf8>> ); {none, {some, Max@2}} -> _pipe@15 = Sb@1, _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, 1, <<<<"case count > "/utf8, (erlang:integer_to_binary(Max@2))/binary>>/binary, " {"/utf8>> ), _pipe@17 = oaspec@internal@util@string_extra:indent( _pipe@16, 2, <<"True -> "/utf8, (Max_failure(Max@2))/binary>> ), _pipe@18 = oaspec@internal@util@string_extra:indent( _pipe@17, 2, <<"False -> Ok(value)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@18, 1, <<"}"/utf8>> ); {none, none} -> Sb@1 end, _pipe@19 = Sb@2, _pipe@20 = oaspec@internal@util@string_extra:line( _pipe@19, <<"}"/utf8>> ), oaspec@internal@util@string_extra:blank_line(_pipe@20) end. -file("src/oaspec/internal/codegen/guards.gleam", 1480). ?DOC(false). -spec validation_failure_dynamic(binary(), binary(), binary()) -> binary(). validation_failure_dynamic(Field, Code, Message_expr) -> <<<<<<<<<<<<"Error(ValidationFailure(field: "/utf8, (gleam_string_literal(Field))/binary>>/binary, ", code: "/utf8>>/binary, (gleam_string_literal(Code))/binary>>/binary, ", message: "/utf8>>/binary, Message_expr/binary>>/binary, "))"/utf8>>. -file("src/oaspec/internal/codegen/guards.gleam", 689). ?DOC(false). -spec generate_string_pattern_guard( gleam@string_tree:string_tree(), binary(), binary(), gleam@option:option(binary()) ) -> gleam@string_tree:string_tree(). generate_string_pattern_guard(Sb, Schema_name, Prop_name, Pattern) -> case Pattern of none -> Sb; {some, Pattern@1} -> Fn_name = guard_function_name( Schema_name, Prop_name, <<"pattern"/utf8>> ), Pattern_literal = gleam_string_literal(Pattern@1), Invalid_pattern_prefix = gleam_string_literal( <<<<"invalid pattern: "/utf8, Pattern@1/binary>>/binary, ": "/utf8>> ), Mismatch_failure = validation_failure_literal( Prop_name, <<"pattern"/utf8>>, <<"must match pattern: "/utf8, Pattern@1/binary>> ), Invalid_pattern_failure = validation_failure_dynamic( Prop_name, <<"invalidPattern"/utf8>>, <