Current section

Files

Jump to
touch_grass src touch_grass@file_system@read_directory.erl
Raw

src/touch_grass@file_system@read_directory.erl

-module(touch_grass@file_system@read_directory).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/touch_grass/file_system/read_directory.gleam").
-export([encode/1]).
-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.
?MODULEDOC(
" Read all the entries in a directory.\n"
" Excludes self `.` and parent `..`\n"
" \n"
" The closest syscall is `getdents` but most other ecosystems use the read directory terminology\n"
" - Node.js `fs.readdirSync`\n"
" - In the browser `directoryHandle.entries()`\n"
" - C standard library readdir\n"
" \n"
" This effect includes status information about the returned entires.\n"
).
-type entry() :: directory | {file, integer()}.
-file("src/touch_grass/file_system/read_directory.gleam", 33).
-spec entry_encode({binary(), entry()}) -> eyg@interpreter@value:value(any(), any()).
entry_encode(Entry) ->
{Name, Entry@1} = Entry,
Type_ = case Entry@1 of
directory ->
{tagged, <<"Directory"/utf8>>, eyg@interpreter@value:unit()};
{file, Size} ->
{tagged,
<<"File"/utf8>>,
{record, maps:from_list([{<<"size"/utf8>>, {integer, Size}}])}}
end,
{record,
maps:from_list(
[{<<"name"/utf8>>, {string, Name}}, {<<"type"/utf8>>, Type_}]
)}.
-file("src/touch_grass/file_system/read_directory.gleam", 26).
-spec encode({ok, list({binary(), entry()})} | {error, binary()}) -> eyg@interpreter@value:value(any(), any()).
encode(Result) ->
case Result of
{ok, Entries} ->
eyg@interpreter@value:ok(
{linked_list, gleam@list:map(Entries, fun entry_encode/1)}
);
{error, Reason} ->
eyg@interpreter@value:error({string, Reason})
end.