[wip] static file cache data structure works

This commit is contained in:
2025-10-22 13:17:39 -07:00
parent 80945de92d
commit 8b938fdd42
4 changed files with 174 additions and 55 deletions
+68
View File
@@ -0,0 +1,68 @@
% @doc
% cache data management
-module(fd_sfc_cache).
-export_type([
cache/0
]).
-export([
new/0, new/1
]).
-include("$zx_include/zx_logger.hrl").
-type cache() :: #{HttpPath :: binary() := Entry :: fd_sfc_entry:entry()}.
-spec new() -> cache().
new() -> #{}.
-spec new(BasePath) -> cache()
when BasePath :: file:filename().
% @doc
% if you give a file path it just takes the parent dir
%
% recursively crawls through file tree and picks
%
% IO errors will be logged but will result in cache misses
new(BasePath) ->
case filelib:is_file(BasePath) of
true -> new2(BasePath);
false ->
tell("~p:new(~p): no such file or directory, returning empty cache", [?MODULE, BasePath]),
#{}
end.
new2(BasePath) ->
BaseDir =
case filelib:is_dir(BasePath) of
true -> filename:absname(BasePath);
false -> filename:absname(filename:dirname(BasePath))
end,
%% hacky, fuck you
RemovePrefix =
fun (Prefix, Size, From) ->
<<Prefix:Size/bytes, Rest/bytes>> = From,
Rest
end,
BBaseDir = unicode:characters_to_binary(BaseDir),
BBS = byte_size(BBaseDir),
HandlePath =
fun(AbsPath, AccCache) ->
BAbsPath = unicode:characters_to_binary(AbsPath),
HttpPath = RemovePrefix(BBaseDir, BBS, BAbsPath),
NewCache =
case fd_sfc_entry:new(AbsPath) of
{found, Entry} -> maps:put(HttpPath, Entry, AccCache);
not_found -> AccCache
end,
NewCache
end,
filelib:fold_files(_dir = BaseDir,
_match = ".+",
_recursive = true,
_fun = HandlePath,
_init_acc = #{}).