-module(filepath). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([join/2, split_unix/1, directory_name/1, is_absolute/1, split_windows/1, split/1, base_name/1, extension/1, strip_extension/1, expand/1]). -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 48). -spec relative(binary()) -> binary(). relative(Path) -> case Path of <<"/"/utf8, Path@1/binary>> -> relative(Path@1); _ -> Path end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 55). -spec remove_trailing_slash(binary()) -> binary(). remove_trailing_slash(Path) -> case gleam@string:ends_with(Path, <<"/"/utf8>>) of true -> gleam@string:drop_end(Path, 1); false -> Path end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 35). -spec join(binary(), binary()) -> binary(). join(Left, Right) -> _pipe@2 = case {Left, Right} of {_, <<"/"/utf8>>} -> Left; {<<""/utf8>>, _} -> relative(Right); {<<"/"/utf8>>, _} -> Right; {_, _} -> _pipe = remove_trailing_slash(Left), _pipe@1 = gleam@string:append(_pipe, <<"/"/utf8>>), gleam@string:append(_pipe@1, relative(Right)) end, remove_trailing_slash(_pipe@2). -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 96). -spec split_unix(binary()) -> list(binary()). split_unix(Path) -> _pipe = case gleam@string:split(Path, <<"/"/utf8>>) of [<<""/utf8>>] -> []; [<<""/utf8>> | Rest] -> [<<"/"/utf8>> | Rest]; Rest@1 -> Rest@1 end, gleam@list:filter(_pipe, fun(X) -> X /= <<""/utf8>> end). -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 261). -spec get_directory_name(list(binary()), binary(), binary()) -> binary(). get_directory_name(Path, Acc, Segment) -> case Path of [<<"/"/utf8>> | Rest] -> get_directory_name( Rest, <>, <<"/"/utf8>> ); [First | Rest@1] -> get_directory_name(Rest@1, Acc, <>); [] -> Acc end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 253). -spec directory_name(binary()) -> binary(). directory_name(Path) -> Path@1 = remove_trailing_slash(Path), case Path@1 of <<"/"/utf8, Rest/binary>> -> get_directory_name( gleam@string:to_graphemes(Rest), <<"/"/utf8>>, <<""/utf8>> ); _ -> get_directory_name( gleam@string:to_graphemes(Path@1), <<""/utf8>>, <<""/utf8>> ) end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 288). -spec is_absolute(binary()) -> boolean(). is_absolute(Path) -> gleam@string:starts_with(Path, <<"/"/utf8>>). -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 332). -spec expand_segments(list(binary()), list(binary())) -> {ok, binary()} | {error, nil}. expand_segments(Path, Base) -> case {Base, Path} of {[<<""/utf8>>], [<<".."/utf8>> | _]} -> {error, nil}; {[], [<<".."/utf8>> | _]} -> {error, nil}; {[_ | Base@1], [<<".."/utf8>> | Path@1]} -> expand_segments(Path@1, Base@1); {_, [<<"."/utf8>> | Path@2]} -> expand_segments(Path@2, Base); {_, [S | Path@3]} -> expand_segments(Path@3, [S | Base]); {_, []} -> {ok, gleam@string:join(lists:reverse(Base), <<"/"/utf8>>)} end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 357). -spec root_slash_to_empty(list(binary())) -> list(binary()). root_slash_to_empty(Segments) -> case Segments of [<<"/"/utf8>> | Rest] -> [<<""/utf8>> | Rest]; _ -> Segments end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 152). -spec pop_windows_drive_specifier(binary()) -> {gleam@option:option(binary()), binary()}. pop_windows_drive_specifier(Path) -> Start = gleam@string:slice(Path, 0, 3), Codepoints = gleam@string:to_utf_codepoints(Start), case gleam@list:map(Codepoints, fun gleam@string:utf_codepoint_to_int/1) of [Drive, Colon, Slash] when (((Slash =:= 47) orelse (Slash =:= 92)) andalso (Colon =:= 58)) andalso (((Drive >= 65) andalso (Drive =< 90)) orelse ((Drive >= 97) andalso (Drive =< 122))) -> Drive_letter = gleam@string:slice(Path, 0, 1), Drive@1 = <<(gleam@string:lowercase(Drive_letter))/binary, ":/"/utf8>>, Path@1 = gleam@string:drop_start(Path, 3), {{some, Drive@1}, Path@1}; _ -> {none, Path} end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 119). -spec split_windows(binary()) -> list(binary()). split_windows(Path) -> {Drive, Path@1} = pop_windows_drive_specifier(Path), Segments = begin _pipe = gleam@string:split(Path@1, <<"/"/utf8>>), gleam@list:flat_map( _pipe, fun(_capture) -> gleam@string:split(_capture, <<"\\"/utf8>>) end ) end, Segments@1 = case Drive of {some, Drive@1} -> [Drive@1 | Segments]; none -> Segments end, case Segments@1 of [<<""/utf8>>] -> []; [<<""/utf8>> | Rest] -> [<<"/"/utf8>> | Rest]; Rest@1 -> Rest@1 end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 76). -spec split(binary()) -> list(binary()). split(Path) -> case filepath_ffi:is_windows() of true -> split_windows(Path); false -> split_unix(Path) end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 234). -spec base_name(binary()) -> binary(). base_name(Path) -> gleam@bool:guard(Path =:= <<"/"/utf8>>, <<""/utf8>>, fun() -> _pipe = Path, _pipe@1 = split(_pipe), _pipe@2 = gleam@list:last(_pipe@1), gleam@result:unwrap(_pipe@2, <<""/utf8>>) end). -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 184). -spec extension(binary()) -> {ok, binary()} | {error, nil}. extension(Path) -> File = base_name(Path), case gleam@string:split(File, <<"."/utf8>>) of [<<""/utf8>>, _] -> {error, nil}; [_, Extension] -> {ok, Extension}; [_ | Rest] -> gleam@list:last(Rest); _ -> {error, nil} end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 213). -spec strip_extension(binary()) -> binary(). strip_extension(Path) -> case extension(Path) of {ok, Extension} -> gleam@string:drop_end(Path, gleam@string:length(Extension) + 1); {error, nil} -> Path end. -file("/Users/louis/src/gleam/filepath/src/filepath.gleam", 318). -spec expand(binary()) -> {ok, binary()} | {error, nil}. expand(Path) -> Is_absolute = is_absolute(Path), Result = begin _pipe = Path, _pipe@1 = split(_pipe), _pipe@2 = root_slash_to_empty(_pipe@1), expand_segments(_pipe@2, []) end, case Is_absolute andalso (Result =:= {ok, <<""/utf8>>}) of true -> {ok, <<"/"/utf8>>}; false -> Result end.