-module(nova_controller).
-moduledoc "Nova Controller behaviour definition".
-export([routes/2]).
-optional_callbacks([routes/2]).
-doc "Returns the routes defined in the module, if any.".
-callback routes(Env :: atom(), Opts :: map()) -> Routes :: [map()].
-doc "Returns the routes defined in the module, if any".
-spec routes(module() | {module(), map()}, Env :: atom()) -> Routes :: [map()].
routes({Module, Opts}, Env) when is_map(Opts) ->
routes(Module, Env, Opts);
routes(Module, Env) ->
routes(Module, Env, #{}).
routes(Module, Env, Opts) ->
%% try to ensure callback module is loaded first
try Module:module_info(module)
catch _:_ -> ok
end,
case erlang:function_exported(Module, routes, 2) of
true ->
Module:routes(Env, Opts);
false ->
[]
end.