-module(aws@internal@text_scan). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/aws/internal/text_scan.gleam"). -export([xml_tag_text/2, json_string_after_key/2]). -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( " Tiny text-extraction helpers shared by the credential providers\n" " and the runtime's error parser. Both shapes — XML `X`\n" " and JSON `\"key\": \"value\"` — appear in places where dragging in a\n" " full XML / JSON parser would be over-investment.\n" "\n" " `xml_tag_text` and `json_string_after_key` each scan once with two\n" " `split_once` calls; neither validates the surrounding document. Use\n" " them only on inputs whose structure you trust (STS / SSO responses,\n" " error envelopes), never on arbitrary user-supplied text.\n" ). -file("src/aws/internal/text_scan.gleam", 18). ?DOC( " Pull the text content between the first `` and its matching\n" " ``. Returns `Error(Nil)` if either tag is absent. Used by the\n" " STS providers (`...`) and the runtime's\n" " restXml error path (`NoSuchBucket`).\n" ). -spec xml_tag_text(binary(), binary()) -> {ok, binary()} | {error, nil}. xml_tag_text(Text, Tag) -> Open = <<<<"<"/utf8, Tag/binary>>/binary, ">"/utf8>>, Close = <<<<">/binary, ">"/utf8>>, gleam@result:'try'( gleam@string:split_once(Text, Open), fun(_use0) -> {_, After_open} = _use0, gleam@result:'try'( gleam@string:split_once(After_open, Close), fun(_use0@1) -> {Content, _} = _use0@1, {ok, Content} end ) end ). -file("src/aws/internal/text_scan.gleam", 35). ?DOC( " Pull the string value that follows a quoted JSON `\"key\"`. Skips the\n" " first quote after the key (i.e. tolerates `\"key\": \"value\"`,\n" " `\"key\":\"value\"`, `\"key\" : \"value\"`), then reads the next two\n" " quotes as the value's delimiters. Returns `Error(Nil)` if the key\n" " is absent or the value isn't a string-typed JSON field.\n" "\n" " The function deliberately doesn't unescape backslash sequences in\n" " the value — callers either don't expect them (STS tokens, error\n" " codes) or do their own decoding.\n" ). -spec json_string_after_key(binary(), binary()) -> {ok, binary()} | {error, nil}. json_string_after_key(Text, Key) -> Needle = <<<<"\""/utf8, Key/binary>>/binary, "\""/utf8>>, gleam@result:'try'( gleam@string:split_once(Text, Needle), fun(_use0) -> {_, After_key} = _use0, gleam@result:'try'( gleam@string:split_once(After_key, <<"\""/utf8>>), fun(_use0@1) -> {_, After_first_quote} = _use0@1, gleam@result:'try'( gleam@string:split_once( After_first_quote, <<"\""/utf8>> ), fun(_use0@2) -> {Value, _} = _use0@2, {ok, Value} end ) end ) end ).