diff options
Diffstat (limited to 'aoc2023/build/packages/simplifile/src/simplifile.erl')
-rw-r--r-- | aoc2023/build/packages/simplifile/src/simplifile.erl | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/aoc2023/build/packages/simplifile/src/simplifile.erl b/aoc2023/build/packages/simplifile/src/simplifile.erl new file mode 100644 index 0000000..0d3818c --- /dev/null +++ b/aoc2023/build/packages/simplifile/src/simplifile.erl @@ -0,0 +1,287 @@ +-module(simplifile). +-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]). + +-export([read/1, write/2, delete/1, delete_all/1, append/2, read_bits/1, write_bits/2, append_bits/2, is_directory/1, create_directory/1, read_directory/1, is_file/1, create_file/1, get_files/1, create_directory_all/1, copy_directory/2, rename_directory/2, copy_file/2, rename_file/2]). +-export_type([file_error/0]). + +-type file_error() :: eacces | + eagain | + ebadf | + ebadmsg | + ebusy | + edeadlk | + edeadlock | + edquot | + eexist | + efault | + efbig | + eftype | + eintr | + einval | + eio | + eisdir | + eloop | + emfile | + emlink | + emultihop | + enametoolong | + enfile | + enobufs | + enodev | + enolck | + enolink | + enoent | + enomem | + enospc | + enosr | + enostr | + enosys | + enotblk | + enotdir | + enotsup | + enxio | + eopnotsupp | + eoverflow | + eperm | + epipe | + erange | + erofs | + espipe | + esrch | + estale | + etxtbsy | + exdev | + not_utf8 | + unknown. + +-spec do_append(binary(), binary()) -> {ok, nil} | {error, file_error()}. +do_append(Content, Filepath) -> + _pipe = Content, + _pipe@1 = gleam_stdlib:identity(_pipe), + simplifile_erl:append_file(_pipe@1, Filepath). + +-spec do_write(binary(), binary()) -> {ok, nil} | {error, file_error()}. +do_write(Content, Filepath) -> + _pipe = Content, + _pipe@1 = gleam_stdlib:identity(_pipe), + simplifile_erl:write_file(_pipe@1, Filepath). + +-spec do_read(binary()) -> {ok, binary()} | {error, file_error()}. +do_read(Filepath) -> + case simplifile_erl:read_file(Filepath) of + {ok, Bits} -> + case gleam@bit_array:to_string(Bits) of + {ok, Str} -> + {ok, Str}; + + _ -> + {error, not_utf8} + end; + + {error, E} -> + {error, E} + end. + +-spec cast_error({ok, FIL} | {error, file_error()}) -> {ok, FIL} | + {error, file_error()}. +cast_error(Input) -> + Input. + +-spec read(binary()) -> {ok, binary()} | {error, file_error()}. +read(Filepath) -> + _pipe = do_read(Filepath), + cast_error(_pipe). + +-spec write(binary(), binary()) -> {ok, nil} | {error, file_error()}. +write(Filepath, Contents) -> + _pipe = do_write(Contents, Filepath), + cast_error(_pipe). + +-spec delete(binary()) -> {ok, nil} | {error, file_error()}. +delete(Path) -> + _pipe = simplifile_erl:recursive_delete(Path), + cast_error(_pipe). + +-spec delete_all(list(binary())) -> {ok, nil} | {error, file_error()}. +delete_all(Paths) -> + case Paths of + [] -> + {ok, nil}; + + [Path | Rest] -> + case delete(Path) of + {ok, nil} -> + delete_all(Rest); + + {error, enoent} -> + delete_all(Rest); + + E -> + E + end + end. + +-spec append(binary(), binary()) -> {ok, nil} | {error, file_error()}. +append(Filepath, Contents) -> + _pipe = do_append(Contents, Filepath), + cast_error(_pipe). + +-spec read_bits(binary()) -> {ok, bitstring()} | {error, file_error()}. +read_bits(Filepath) -> + _pipe = simplifile_erl:read_file(Filepath), + cast_error(_pipe). + +-spec write_bits(binary(), bitstring()) -> {ok, nil} | {error, file_error()}. +write_bits(Filepath, Bits) -> + _pipe = simplifile_erl:write_file(Bits, Filepath), + cast_error(_pipe). + +-spec append_bits(binary(), bitstring()) -> {ok, nil} | {error, file_error()}. +append_bits(Filepath, Bits) -> + _pipe = simplifile_erl:append_file(Bits, Filepath), + cast_error(_pipe). + +-spec is_directory(binary()) -> boolean(). +is_directory(Filepath) -> + filelib:is_dir(Filepath). + +-spec create_directory(binary()) -> {ok, nil} | {error, file_error()}. +create_directory(Filepath) -> + _pipe = simplifile_erl:make_directory(Filepath), + cast_error(_pipe). + +-spec read_directory(binary()) -> {ok, list(binary())} | {error, file_error()}. +read_directory(Path) -> + _pipe = simplifile_erl:list_directory(Path), + cast_error(_pipe). + +-spec is_file(binary()) -> boolean(). +is_file(Filepath) -> + simplifile_erl:is_file(Filepath). + +-spec create_file(binary()) -> {ok, nil} | {error, file_error()}. +create_file(Filepath) -> + case begin + _pipe = Filepath, + is_file(_pipe) + end + orelse begin + _pipe@1 = Filepath, + is_directory(_pipe@1) + end of + true -> + {error, eexist}; + + false -> + write_bits(Filepath, <<>>) + end. + +-spec do_copy_directory(binary(), binary()) -> {ok, nil} | {error, file_error()}. +do_copy_directory(Src, Dest) -> + gleam@result:'try'( + read_directory(Src), + fun(Segments) -> + _pipe = Segments, + gleam@list:each( + _pipe, + fun(Segment) -> + Src_path = <<<<Src/binary, "/"/utf8>>/binary, + Segment/binary>>, + Dest_path = <<<<Dest/binary, "/"/utf8>>/binary, + Segment/binary>>, + case {is_file(Src_path), is_directory(Src_path)} of + {true, false} -> + gleam@result:'try'( + read_bits(Src_path), + fun(Content) -> _pipe@1 = Content, + write_bits(Dest_path, _pipe@1) end + ); + + {false, true} -> + gleam@result:'try'( + create_directory(Dest_path), + fun(_) -> + do_copy_directory(Src_path, Dest_path) + end + ); + + {_, _} -> + erlang:error(#{gleam_error => panic, + message => <<"unreachable"/utf8>>, + module => <<"simplifile"/utf8>>, + function => <<"do_copy_directory"/utf8>>, + line => 341}) + end + end + ), + {ok, nil} + end + ). + +-spec get_files(binary()) -> {ok, list(binary())} | {error, file_error()}. +get_files(Directory) -> + gleam@result:'try'( + read_directory(Directory), + fun(Contents) -> + Paths = gleam@list:map( + Contents, + fun(Segment) -> + <<<<Directory/binary, "/"/utf8>>/binary, Segment/binary>> + end + ), + Files = gleam@list:filter(Paths, fun is_file/1), + case gleam@list:filter(Paths, fun is_directory/1) of + [] -> + {ok, Files}; + + Directories -> + gleam@result:'try'( + gleam@list:try_map(Directories, fun get_files/1), + fun(Nested_files) -> + {ok, + gleam@list:append( + Files, + gleam@list:flatten(Nested_files) + )} + end + ) + end + end + ). + +-spec create_directory_all(binary()) -> {ok, nil} | {error, file_error()}. +create_directory_all(Dirpath) -> + Path = case begin + _pipe = Dirpath, + gleam@string:ends_with(_pipe, <<"/"/utf8>>) + end of + true -> + Dirpath; + + false -> + <<Dirpath/binary, "/"/utf8>> + end, + _pipe@1 = simplifile_erl:create_dir_all(Path), + cast_error(_pipe@1). + +-spec copy_directory(binary(), binary()) -> {ok, nil} | {error, file_error()}. +copy_directory(Src, Dest) -> + gleam@result:'try'( + create_directory_all(Dest), + fun(_) -> do_copy_directory(Src, Dest) end + ). + +-spec rename_directory(binary(), binary()) -> {ok, nil} | {error, file_error()}. +rename_directory(Src, Dest) -> + gleam@result:'try'(copy_directory(Src, Dest), fun(_) -> delete(Src) end). + +-spec copy_file(binary(), binary()) -> {ok, nil} | {error, file_error()}. +copy_file(Src, Dest) -> + _pipe = file:copy(Src, Dest), + _pipe@1 = gleam@result:replace(_pipe, nil), + cast_error(_pipe@1). + +-spec rename_file(binary(), binary()) -> {ok, nil} | {error, file_error()}. +rename_file(Src, Dest) -> + _pipe = simplifile_erl:rename_file(Src, Dest), + cast_error(_pipe). |