src/automata@fsevent@entry.erl

-module(automata@fsevent@entry).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/automata/fsevent/entry.gleam").
-export([entry_path/1, entry_kind/1, entry_size/1, entry_mtime/1, entry_mode/1, entry_content_hash/1, entry_file_id/1, entries_content_hash_equal/2, entries_have_both_hashes/2, entry_file/6, entry_directory/4, entry_symlink/4]).
-export_type([entry/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.

-opaque entry() :: {entry,
        automata@fsevent@path:normalized_path(),
        automata@fsevent@ast:entry_kind(),
        integer(),
        integer(),
        integer(),
        gleam@option:option(binary()),
        gleam@option:option(binary())}.

-file("src/automata/fsevent/entry.gleam", 101).
-spec entry_path(entry()) -> automata@fsevent@path:normalized_path().
entry_path(Entry) ->
    erlang:element(2, Entry).

-file("src/automata/fsevent/entry.gleam", 105).
-spec entry_kind(entry()) -> automata@fsevent@ast:entry_kind().
entry_kind(Entry) ->
    erlang:element(3, Entry).

-file("src/automata/fsevent/entry.gleam", 109).
-spec entry_size(entry()) -> integer().
entry_size(Entry) ->
    erlang:element(4, Entry).

-file("src/automata/fsevent/entry.gleam", 113).
-spec entry_mtime(entry()) -> integer().
entry_mtime(Entry) ->
    erlang:element(5, Entry).

-file("src/automata/fsevent/entry.gleam", 117).
-spec entry_mode(entry()) -> integer().
entry_mode(Entry) ->
    erlang:element(6, Entry).

-file("src/automata/fsevent/entry.gleam", 121).
-spec entry_content_hash(entry()) -> gleam@option:option(binary()).
entry_content_hash(Entry) ->
    erlang:element(7, Entry).

-file("src/automata/fsevent/entry.gleam", 125).
-spec entry_file_id(entry()) -> gleam@option:option(binary()).
entry_file_id(Entry) ->
    erlang:element(8, Entry).

-file("src/automata/fsevent/entry.gleam", 133).
?DOC(false).
-spec entries_content_hash_equal(entry(), entry()) -> boolean().
entries_content_hash_equal(A, B) ->
    case {erlang:element(7, A), erlang:element(7, B)} of
        {{some, Left}, {some, Right}} ->
            Left =:= Right;

        {_, _} ->
            false
    end.

-file("src/automata/fsevent/entry.gleam", 143).
?DOC(false).
-spec entries_have_both_hashes(entry(), entry()) -> boolean().
entries_have_both_hashes(A, B) ->
    case {erlang:element(7, A), erlang:element(7, B)} of
        {{some, _}, {some, _}} ->
            true;

        {_, _} ->
            false
    end.

-file("src/automata/fsevent/entry.gleam", 198).
-spec validate_optional_string(binary(), gleam@option:option(binary())) -> {ok,
        nil} |
    {error, automata@fsevent@ast:fsevent_error()}.
validate_optional_string(Field, Value) ->
    case Value of
        none ->
            {ok, nil};

        {some, <<""/utf8>>} ->
            {error, {empty_optional_field, Field}};

        {some, _} ->
            {ok, nil}
    end.

-file("src/automata/fsevent/entry.gleam", 184).
-spec validate_non_negative_bounded(binary(), integer()) -> {ok, nil} |
    {error, automata@fsevent@ast:fsevent_error()}.
validate_non_negative_bounded(Field, Value) ->
    case Value < 0 of
        true ->
            {error, {negative_entry_field, Field, Value}};

        false ->
            case Value > 9007199254740991 of
                true ->
                    {error, {entry_field_overflow, Field, Value}};

                false ->
                    {ok, nil}
            end
    end.

-file("src/automata/fsevent/entry.gleam", 176).
-spec validate_size(integer()) -> {ok, nil} |
    {error, automata@fsevent@ast:fsevent_error()}.
validate_size(Size) ->
    validate_non_negative_bounded(<<"size"/utf8>>, Size).

-file("src/automata/fsevent/entry.gleam", 180).
-spec validate_mtime(integer()) -> {ok, nil} |
    {error, automata@fsevent@ast:fsevent_error()}.
validate_mtime(Mtime) ->
    validate_non_negative_bounded(<<"mtime"/utf8>>, Mtime).

-file("src/automata/fsevent/entry.gleam", 43).
?DOC(
    " Build a `File` entry. `content_hash` and `file_id` are optional; if\n"
    " provided as `Some(_)`, an empty string is rejected.\n"
).
-spec entry_file(
    automata@fsevent@path:normalized_path(),
    integer(),
    integer(),
    integer(),
    gleam@option:option(binary()),
    gleam@option:option(binary())
) -> {ok, entry()} | {error, automata@fsevent@ast:fsevent_error()}.
entry_file(Path, Size, Mtime, Mode, Content_hash, File_id) ->
    case validate_size(Size) of
        {error, Error} ->
            {error, Error};

        {ok, _} ->
            case validate_mtime(Mtime) of
                {error, Error@1} ->
                    {error, Error@1};

                {ok, _} ->
                    case validate_optional_string(
                        <<"content_hash"/utf8>>,
                        Content_hash
                    ) of
                        {error, Error@2} ->
                            {error, Error@2};

                        {ok, _} ->
                            case validate_optional_string(
                                <<"file_id"/utf8>>,
                                File_id
                            ) of
                                {error, Error@3} ->
                                    {error, Error@3};

                                {ok, _} ->
                                    {ok,
                                        {entry,
                                            Path,
                                            file,
                                            Size,
                                            Mtime,
                                            Mode,
                                            Content_hash,
                                            File_id}}
                            end
                    end
            end
    end.

-file("src/automata/fsevent/entry.gleam", 150).
-spec build_non_file(
    automata@fsevent@path:normalized_path(),
    automata@fsevent@ast:entry_kind(),
    integer(),
    integer(),
    gleam@option:option(binary())
) -> {ok, entry()} | {error, automata@fsevent@ast:fsevent_error()}.
build_non_file(Path, Kind, Mtime, Mode, File_id) ->
    case validate_mtime(Mtime) of
        {error, Error} ->
            {error, Error};

        {ok, _} ->
            case validate_optional_string(<<"file_id"/utf8>>, File_id) of
                {error, Error@1} ->
                    {error, Error@1};

                {ok, _} ->
                    {ok, {entry, Path, Kind, 0, Mtime, Mode, none, File_id}}
            end
    end.

-file("src/automata/fsevent/entry.gleam", 81).
?DOC(
    " Build a `Directory` entry. Directories have no meaningful size (the\n"
    " differ never compares `size` for directories), so the field is\n"
    " stored as `0`.\n"
).
-spec entry_directory(
    automata@fsevent@path:normalized_path(),
    integer(),
    integer(),
    gleam@option:option(binary())
) -> {ok, entry()} | {error, automata@fsevent@ast:fsevent_error()}.
entry_directory(Path, Mtime, Mode, File_id) ->
    build_non_file(Path, directory, Mtime, Mode, File_id).

-file("src/automata/fsevent/entry.gleam", 92).
?DOC(
    " Build a `Symlink` entry. Like directories, symlinks carry no\n"
    " meaningful `size` for diffing purposes.\n"
).
-spec entry_symlink(
    automata@fsevent@path:normalized_path(),
    integer(),
    integer(),
    gleam@option:option(binary())
) -> {ok, entry()} | {error, automata@fsevent@ast:fsevent_error()}.
entry_symlink(Path, Mtime, Mode, File_id) ->
    build_non_file(Path, symlink, Mtime, Mode, File_id).