Current section

Files

Jump to
docsh src docsh_format.erl
Raw

src/docsh_format.erl

-module(docsh_format).
-export([lookup/3,
module_doc_not_available/0,
module_doc_hidden/0,
item_doc_not_available/0,
item_doc_hidden/0]).
-export_type([t/0,
key/0,
kna/0,
kind/0,
kinds/0,
item/0,
error_message/0]).
-type t() :: term().
-type item() :: term().
-type key() :: module() | kna().
-type kna() :: {kind(), atom(), arity() | 'any'}.
-type kind() :: doc | spec | type | moduledoc.
-type kinds() :: [docsh_internal:kind()].
-type error_message() :: binary().
-callback lookup(Docs, Key, Kinds) -> R when
Docs :: docsh_format:t(),
Key :: docsh_format:key(),
Kinds :: docsh_format:kinds(),
R :: {ok, [docsh_format:item()]}
| {not_found, docsh_format:error_message()}.
-spec lookup(t(), key(), kinds()) -> {ok, [item()]} | {not_found, error_message()}.
lookup(Docs, Key, Items) ->
KnownFormats = application:get_env(docsh, extra_docs_chunk_formats, []) ++ default_formats(),
DocsFormat = element(1, Docs),
case lists:keyfind(DocsFormat, 1, KnownFormats) of
{DocsFormat, FormatMod} ->
FormatMod:lookup(Docs, Key, Items);
false ->
erlang:error({unknown_docs_format, DocsFormat}, [Docs, Key, Items])
end.
default_formats() ->
[
{docs_v1, docsh_docs_v1}
].
-spec module_doc_not_available() -> error_message().
module_doc_not_available() ->
<<"Module description is not available.\n">>.
-spec module_doc_hidden() -> error_message().
module_doc_hidden() ->
<<"Module description is hidden.\n">>.
-spec item_doc_not_available() -> error_message().
item_doc_not_available() ->
<<"Item description is not available.\n">>.
-spec item_doc_hidden() -> error_message().
item_doc_hidden() ->
<<"Item description is hidden.\n">>.