-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.