src/erldist_filter.erl

%%%-----------------------------------------------------------------------------
%%% Copyright (c) Meta Platforms, Inc. and affiliates.
%%% Copyright (c) WhatsApp LLC
%%%
%%% This source code is licensed under the MIT license found in the
%%% LICENSE.md file in the root directory of this source tree.
%%%
%%% @author Andrew Bennett <potatosaladx@meta.com>
%%% @copyright (c) Meta Platforms, Inc. and affiliates.
%%% @doc
%%%
%%% @end
%%% Created :  20 Sep 2022 by Andrew Bennett <potatosaladx@meta.com>
%%%-----------------------------------------------------------------------------
%%% % @format
-module(erldist_filter).
-compile(warn_missing_spec_all).
-oncall("whatsapp_clr").
-wacov(ignore).

%% Public API
-export([
    handler_get/0,
    handler_set/1
]).

%% Internal API
-export([
    nif_dir/0,
    priv_dir/0
]).

%%%=============================================================================
%%% Public API functions
%%%=============================================================================

-spec handler_get() -> undefined | module().
handler_get() ->
    case persistent_term:get(erldist_filter_handler, undefined) of
        Handler when is_atom(Handler) ->
            Handler;
        _ ->
            undefined
    end.

-spec handler_set(Handler) -> Handler when Handler :: undefined | module().
handler_set(Handler) when is_atom(Handler) ->
    OldHandler = handler_get(),
    ok = persistent_term:put(erldist_filter_handler, Handler),
    OldHandler.

%%%=============================================================================
%%% Internal API functions
%%%=============================================================================

-spec nif_dir() -> file:filename_all().
nif_dir() ->
    PrivDir = priv_dir(),
    FbpkgDir = filename:join([PrivDir, "wa_erldist_filter_nif"]),
    case filelib:is_dir(FbpkgDir) of
        true ->
            FbpkgDir;
        false ->
            PrivDir
    end.

-spec priv_dir() -> file:filename_all().
priv_dir() ->
    case code:priv_dir(?MODULE) of
        {error, bad_name} ->
            case code:which(?MODULE) of
                Filename when is_list(Filename) ->
                    filename:join([filename:dirname(Filename), "../priv"]);
                _ ->
                    "../priv"
            end;
        Dir ->
            Dir
    end.

%%%-----------------------------------------------------------------------------
%%% Internal functions
%%%-----------------------------------------------------------------------------