Packages

Complete, safe, ergonomic file operations for all Gleam targets

Current section

Files

Jump to
fio src fio@types.erl
Raw

src/fio@types.erl

-module(fio@types).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/fio/types.gleam").
-export([file_info_type/1, file_info_permissions_octal/1, octal_to_file_permissions/1, file_info_permissions/1, file_permissions_to_octal/1]).
-export_type([file_info/0, file_type/0, hash_algorithm/0, permission/0, file_permissions/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.
-type file_info() :: {file_info,
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()}.
-type file_type() :: file | directory | symlink | other.
-type hash_algorithm() :: sha256 | sha512 | md5.
-type permission() :: read | write | execute.
-type file_permissions() :: {file_permissions,
gleam@set:set(permission()),
gleam@set:set(permission()),
gleam@set:set(permission())}.
-file("src/fio/types.gleam", 107).
-spec permissions_to_integer(gleam@set:set(permission())) -> integer().
permissions_to_integer(Perms) ->
R = case gleam@set:contains(Perms, read) of
true ->
8#4;
false ->
0
end,
W = case gleam@set:contains(Perms, write) of
true ->
8#2;
false ->
0
end,
X = case gleam@set:contains(Perms, execute) of
true ->
8#1;
false ->
0
end,
(R + W) + X.
-file("src/fio/types.gleam", 67).
?DOC(" Extract the file type from a FileInfo value.\n").
-spec file_info_type(file_info()) -> file_type().
file_info_type(Info) ->
Masked = erlang:'band'(erlang:element(3, Info), 8#170000),
case Masked of
8#100000 ->
file;
8#40000 ->
directory;
8#120000 ->
symlink;
_ ->
other
end.
-file("src/fio/types.gleam", 79).
?DOC(" Extract permissions octal from FileInfo.\n").
-spec file_info_permissions_octal(file_info()) -> integer().
file_info_permissions_octal(Info) ->
erlang:'band'(erlang:element(3, Info), 8#777).
-file("src/fio/types.gleam", 123).
-spec integer_to_permissions(integer()) -> gleam@set:set(permission()).
integer_to_permissions(N) ->
Base = gleam@set:new(),
Base@1 = case erlang:'band'(N, 8#4) > 0 of
true ->
gleam@set:insert(Base, read);
false ->
Base
end,
Base@2 = case erlang:'band'(N, 8#2) > 0 of
true ->
gleam@set:insert(Base@1, write);
false ->
Base@1
end,
case erlang:'band'(N, 8#1) > 0 of
true ->
gleam@set:insert(Base@2, execute);
false ->
Base@2
end.
-file("src/fio/types.gleam", 89).
?DOC(" Convert octal permissions integer to FilePermissions.\n").
-spec octal_to_file_permissions(integer()) -> file_permissions().
octal_to_file_permissions(Octal) ->
User = integer_to_permissions(erlang:'bsr'(Octal, 6)),
Group = integer_to_permissions(erlang:'bsr'(erlang:'band'(Octal, 8#70), 3)),
Other = integer_to_permissions(erlang:'band'(Octal, 8#7)),
{file_permissions, User, Group, Other}.
-file("src/fio/types.gleam", 84).
?DOC(" Extract FilePermissions from FileInfo.\n").
-spec file_info_permissions(file_info()) -> file_permissions().
file_info_permissions(Info) ->
octal_to_file_permissions(file_info_permissions_octal(Info)).
-file("src/fio/types.gleam", 98).
?DOC(" Convert FilePermissions to octal integer.\n").
-spec file_permissions_to_octal(file_permissions()) -> integer().
file_permissions_to_octal(Permissions) ->
User = permissions_to_integer(erlang:element(2, Permissions)),
Group = permissions_to_integer(erlang:element(3, Permissions)),
Other = permissions_to_integer(erlang:element(4, Permissions)),
(erlang:'bsl'(User, 6) + erlang:'bsl'(Group, 3)) + Other.