Skip to main content

src/yum@yaml@parser@scalar.erl

-module(yum@yaml@parser@scalar).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/yum/yaml/parser/scalar.gleam").
-export([parse/1, parser/0, block_plain_parser/1]).
-export_type([plain_line/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 plain_line() :: {plain_line, binary(), yum@yaml@node:span()}.

-file("src/yum/yaml/parser/scalar.gleam", 194).
?DOC(false).
-spec normalize_exponent_float(binary()) -> binary().
normalize_exponent_float(Input) ->
    case gleam_stdlib:contains_string(Input, <<"."/utf8>>) of
        true ->
            Input;

        false ->
            _pipe = Input,
            _pipe@1 = gleam@string:replace(_pipe, <<"e"/utf8>>, <<".0e"/utf8>>),
            gleam@string:replace(_pipe@1, <<"E"/utf8>>, <<".0E"/utf8>>)
    end.

-file("src/yum/yaml/parser/scalar.gleam", 187).
?DOC(false).
-spec parse_float_value(binary()) -> {ok, float()} | {error, nil}.
parse_float_value(Input) ->
    case Input of
        <<"+"/utf8, Unsigned/binary>> ->
            _pipe = Unsigned,
            _pipe@1 = normalize_exponent_float(_pipe),
            gleam_stdlib:parse_float(_pipe@1);

        _ ->
            _pipe@2 = Input,
            _pipe@3 = normalize_exponent_float(_pipe@2),
            gleam_stdlib:parse_float(_pipe@3)
    end.

-file("src/yum/yaml/parser/scalar.gleam", 223).
?DOC(false).
-spec has_decimal_digit(binary()) -> boolean().
has_decimal_digit(Input) ->
    case Input of
        <<""/utf8>> ->
            false;

        <<"0"/utf8, _/binary>> ->
            true;

        <<"1"/utf8, _/binary>> ->
            true;

        <<"2"/utf8, _/binary>> ->
            true;

        <<"3"/utf8, _/binary>> ->
            true;

        <<"4"/utf8, _/binary>> ->
            true;

        <<"5"/utf8, _/binary>> ->
            true;

        <<"6"/utf8, _/binary>> ->
            true;

        <<"7"/utf8, _/binary>> ->
            true;

        <<"8"/utf8, _/binary>> ->
            true;

        <<"9"/utf8, _/binary>> ->
            true;

        _ ->
            case gleam_stdlib:string_pop_grapheme(Input) of
                {ok, {_, Rest}} ->
                    has_decimal_digit(Rest);

                {error, _} ->
                    false
            end
    end.

-file("src/yum/yaml/parser/scalar.gleam", 181).
?DOC(false).
-spec looks_like_float(binary()) -> boolean().
looks_like_float(Input) ->
    (gleam_stdlib:contains_string(Input, <<"."/utf8>>) orelse gleam_stdlib:contains_string(
        Input,
        <<"e"/utf8>>
    ))
    orelse gleam_stdlib:contains_string(Input, <<"E"/utf8>>).

-file("src/yum/yaml/parser/scalar.gleam", 170).
?DOC(false).
-spec parse_float(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_float(Input) ->
    case {looks_like_float(Input), has_decimal_digit(Input)} of
        {true, true} ->
            _pipe = Input,
            _pipe@1 = parse_float_value(_pipe),
            _pipe@2 = gleam@option:from_result(_pipe@1),
            gleam@option:map(_pipe@2, fun(Field@0) -> {float, Field@0} end);

        {_, _} ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 212).
?DOC(false).
-spec parse_nan(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_nan(Input) ->
    case Input of
        <<".nan"/utf8>> ->
            {some, nan};

        <<".NaN"/utf8>> ->
            {some, nan};

        <<".NAN"/utf8>> ->
            {some, nan};

        _ ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 204).
?DOC(false).
-spec parse_inf(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_inf(Input) ->
    case Input of
        <<".inf"/utf8>> ->
            {some, pos_inf};

        <<".Inf"/utf8>> ->
            {some, pos_inf};

        <<".INF"/utf8>> ->
            {some, pos_inf};

        <<"+.inf"/utf8>> ->
            {some, pos_inf};

        <<"+.Inf"/utf8>> ->
            {some, pos_inf};

        <<"+.INF"/utf8>> ->
            {some, pos_inf};

        <<"-.inf"/utf8>> ->
            {some, neg_inf};

        <<"-.Inf"/utf8>> ->
            {some, neg_inf};

        <<"-.INF"/utf8>> ->
            {some, neg_inf};

        _ ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 276).
?DOC(false).
-spec all_hexadecimal_digits(binary()) -> boolean().
all_hexadecimal_digits(Input) ->
    case Input of
        <<""/utf8>> ->
            true;

        <<"0"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"1"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"2"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"3"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"4"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"5"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"6"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"7"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"8"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"9"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"a"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"b"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"c"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"d"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"e"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"f"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"A"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"B"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"C"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"D"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"E"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        <<"F"/utf8, Rest/binary>> ->
            all_hexadecimal_digits(Rest);

        _ ->
            false
    end.

-file("src/yum/yaml/parser/scalar.gleam", 219).
?DOC(false).
-spec has_digits(binary()) -> boolean().
has_digits(Input) ->
    not gleam@string:is_empty(Input).

-file("src/yum/yaml/parser/scalar.gleam", 156).
?DOC(false).
-spec parse_hexadecimal(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_hexadecimal(Input) ->
    case Input of
        <<"0x"/utf8, Digits/binary>> ->
            case {has_digits(Digits), all_hexadecimal_digits(Digits)} of
                {true, true} ->
                    _pipe = gleam@int:base_parse(Digits, 16),
                    _pipe@1 = gleam@option:from_result(_pipe),
                    gleam@option:map(
                        _pipe@1,
                        fun(Field@0) -> {int, Field@0} end
                    );

                {_, _} ->
                    none
            end;

        _ ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 261).
?DOC(false).
-spec all_octal_digits(binary()) -> boolean().
all_octal_digits(Input) ->
    case Input of
        <<""/utf8>> ->
            true;

        <<"0"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        <<"1"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        <<"2"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        <<"3"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        <<"4"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        <<"5"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        <<"6"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        <<"7"/utf8, Rest/binary>> ->
            all_octal_digits(Rest);

        _ ->
            false
    end.

-file("src/yum/yaml/parser/scalar.gleam", 142).
?DOC(false).
-spec parse_octal(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_octal(Input) ->
    case Input of
        <<"0o"/utf8, Digits/binary>> ->
            case {has_digits(Digits), all_octal_digits(Digits)} of
                {true, true} ->
                    _pipe = gleam@int:base_parse(Digits, 8),
                    _pipe@1 = gleam@option:from_result(_pipe),
                    gleam@option:map(
                        _pipe@1,
                        fun(Field@0) -> {int, Field@0} end
                    );

                {_, _} ->
                    none
            end;

        _ ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 244).
?DOC(false).
-spec all_decimal_digits(binary()) -> boolean().
all_decimal_digits(Input) ->
    case Input of
        <<""/utf8>> ->
            true;

        <<"0"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"1"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"2"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"3"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"4"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"5"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"6"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"7"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"8"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        <<"9"/utf8, Rest/binary>> ->
            all_decimal_digits(Rest);

        _ ->
            false
    end.

-file("src/yum/yaml/parser/scalar.gleam", 130).
?DOC(false).
-spec parse_decimal_int(binary(), fun((integer()) -> integer())) -> gleam@option:option(yum@yaml@node:kind()).
parse_decimal_int(Input, Sign) ->
    case {has_digits(Input), all_decimal_digits(Input)} of
        {true, true} ->
            _pipe = Input,
            _pipe@1 = gleam_stdlib:parse_int(_pipe),
            _pipe@2 = gleam@result:map(_pipe@1, Sign),
            _pipe@3 = gleam@result:map(
                _pipe@2,
                fun(Field@0) -> {int, Field@0} end
            ),
            gleam@option:from_result(_pipe@3);

        {_, _} ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 122).
?DOC(false).
-spec parse_int(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_int(Input) ->
    case Input of
        <<"+"/utf8, Digits/binary>> ->
            parse_decimal_int(Digits, fun(N) -> N end);

        <<"-"/utf8, Digits@1/binary>> ->
            parse_decimal_int(Digits@1, fun gleam@int:negate/1);

        _ ->
            parse_decimal_int(Input, fun(N@1) -> N@1 end)
    end.

-file("src/yum/yaml/parser/scalar.gleam", 114).
?DOC(false).
-spec parse_bool(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_bool(Input) ->
    case Input of
        <<"true"/utf8>> ->
            {some, {bool, true}};

        <<"True"/utf8>> ->
            {some, {bool, true}};

        <<"TRUE"/utf8>> ->
            {some, {bool, true}};

        <<"false"/utf8>> ->
            {some, {bool, false}};

        <<"False"/utf8>> ->
            {some, {bool, false}};

        <<"FALSE"/utf8>> ->
            {some, {bool, false}};

        _ ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 107).
?DOC(false).
-spec parse_null(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse_null(Input) ->
    case Input of
        <<"null"/utf8>> ->
            {some, null};

        <<"Null"/utf8>> ->
            {some, null};

        <<"NULL"/utf8>> ->
            {some, null};

        <<"~"/utf8>> ->
            {some, null};

        _ ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 94).
?DOC(false).
-spec parse(binary()) -> gleam@option:option(yum@yaml@node:kind()).
parse(Value) ->
    _pipe = Value,
    _pipe@1 = parse_null(_pipe),
    _pipe@2 = gleam@option:'or'(_pipe@1, parse_bool(Value)),
    _pipe@3 = gleam@option:'or'(_pipe@2, parse_int(Value)),
    _pipe@4 = gleam@option:'or'(_pipe@3, parse_octal(Value)),
    _pipe@5 = gleam@option:'or'(_pipe@4, parse_hexadecimal(Value)),
    _pipe@6 = gleam@option:'or'(_pipe@5, parse_inf(Value)),
    _pipe@7 = gleam@option:'or'(_pipe@6, parse_nan(Value)),
    _pipe@8 = gleam@option:'or'(_pipe@7, parse_float(Value)),
    gleam@option:'or'(_pipe@8, {some, {string, Value}}).

-file("src/yum/yaml/parser/scalar.gleam", 82).
?DOC(false).
-spec parsed_token(yum@yaml@token:token()) -> gleam@option:option({yum@yaml@node:kind(),
    yum@yaml@node:style()}).
parsed_token(Tok) ->
    case Tok of
        {single_quoted_scalar, Value} ->
            _pipe = parse(Value),
            gleam@option:map(
                _pipe,
                fun(Kind) -> {Kind, single_quoted_scalar} end
            );

        {plain_scalar, Value@1} ->
            _pipe@1 = parse(Value@1),
            gleam@option:map(_pipe@1, fun(Kind@1) -> {Kind@1, plain_scalar} end);

        _ ->
            none
    end.

-file("src/yum/yaml/parser/scalar.gleam", 18).
?DOC(false).
-spec parser() -> nibble:parser(yum@yaml@node:node_(), yum@yaml@token:token(), yum@yaml@lexer@context:context()).
parser() ->
    nibble:do(
        nibble:take_map(<<"Expected a value"/utf8>>, fun parsed_token/1),
        fun(Parsed) ->
            nibble:do(
                nibble:span(),
                fun(Token_span) ->
                    {Kind, Style} = Parsed,
                    _pipe = yum@yaml@node:new(
                        Kind,
                        yum@yaml@parser@span:from_lexer(Token_span),
                        Style
                    ),
                    nibble:return(_pipe)
                end
            )
        end
    ).

-file("src/yum/yaml/parser/scalar.gleam", 75).
?DOC(false).
-spec enclosing_span(yum@yaml@node:span(), yum@yaml@node:span()) -> yum@yaml@node:span().
enclosing_span(First, Last) ->
    {span, Start, _} = First,
    {span, _, End} = Last,
    {span, Start, End}.

-file("src/yum/yaml/parser/scalar.gleam", 60).
?DOC(false).
-spec plain_line_parser() -> nibble:parser(plain_line(), yum@yaml@token:token(), yum@yaml@lexer@context:context()).
plain_line_parser() ->
    nibble:do(
        nibble:take_map(
            <<"Expected a plain scalar"/utf8>>,
            fun(Tok) -> case Tok of
                    {plain_scalar, Value} ->
                        {some, Value};

                    _ ->
                        none
                end end
        ),
        fun(Value@1) ->
            nibble:do(
                nibble:span(),
                fun(Token_span) ->
                    _pipe = {plain_line,
                        Value@1,
                        yum@yaml@parser@span:from_lexer(Token_span)},
                    nibble:return(_pipe)
                end
            )
        end
    ).

-file("src/yum/yaml/parser/scalar.gleam", 53).
?DOC(false).
-spec plain_continuation_parser(integer()) -> nibble:parser(plain_line(), yum@yaml@token:token(), yum@yaml@lexer@context:context()).
plain_continuation_parser(Parent_indent) ->
    nibble:do(
        yum@yaml@parser@indentation:greater_than_parser(Parent_indent),
        fun(_) -> plain_line_parser() end
    ).

-file("src/yum/yaml/parser/scalar.gleam", 27).
?DOC(false).
-spec block_plain_parser(integer()) -> nibble:parser(yum@yaml@node:node_(), yum@yaml@token:token(), yum@yaml@lexer@context:context()).
block_plain_parser(Parent_indent) ->
    nibble:do(
        plain_line_parser(),
        fun(First) ->
            nibble:do(
                nibble:many(
                    nibble:backtrackable(
                        plain_continuation_parser(Parent_indent)
                    )
                ),
                fun(Rest) ->
                    {plain_line, Value, First_span} = First,
                    Lines = [Value |
                        gleam@list:map(
                            Rest,
                            fun(Line) -> erlang:element(2, Line) end
                        )],
                    Last_span = case gleam@list:last(Rest) of
                        {ok, {plain_line, _, Span}} ->
                            Span;

                        {error, _} ->
                            First_span
                    end,
                    Kind = begin
                        _pipe = Lines,
                        _pipe@1 = gleam@string:join(_pipe, <<" "/utf8>>),
                        _pipe@2 = parse(_pipe@1),
                        gleam@option:unwrap(_pipe@2, {string, <<""/utf8>>})
                    end,
                    _pipe@3 = yum@yaml@node:new(
                        Kind,
                        enclosing_span(First_span, Last_span),
                        plain_scalar
                    ),
                    nibble:return(_pipe@3)
                end
            )
        end
    ).