-module(gleamdoc@interface). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/gleamdoc/interface.gleam"). -export([lookup/2, lookup_packages/2, format_type/1, search/2, search_packages_filtered/5, search_packages/3, render/1, render_all/1, render_search_results/1, render_packages/1, entries_json/1, packages_json/1]). -export_type([entry/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(" Lookup, search, and rendering for compiler-generated package interfaces.\n"). -type entry() :: {module_entry, gleam@package_interface:package(), binary(), gleam@package_interface:module_()} | {function_entry, gleam@package_interface:package(), binary(), binary(), gleam@package_interface:function_()} | {constant_entry, gleam@package_interface:package(), binary(), binary(), gleam@package_interface:constant()} | {type_entry, gleam@package_interface:package(), binary(), binary(), gleam@package_interface:type_definition()} | {variant_entry, gleam@package_interface:package(), binary(), binary(), integer(), binary(), gleam@package_interface:type_constructor()} | {alias_entry, gleam@package_interface:package(), binary(), binary(), gleam@package_interface:type_alias()}. -file("src/gleamdoc/interface.gleam", 490). -spec qualified(binary(), binary()) -> binary(). qualified(Module, Name) -> <<<>/binary, Name/binary>>. -file("src/gleamdoc/interface.gleam", 501). -spec qualified_name(entry()) -> binary(). qualified_name(Entry) -> case Entry of {module_entry, _, Name, _} -> Name; {function_entry, _, Module, Name@1, _} -> qualified(Module, Name@1); {constant_entry, _, Module@1, Name@2, _} -> qualified(Module@1, Name@2); {type_entry, _, Module@2, Name@3, _} -> qualified(Module@2, Name@3); {variant_entry, _, Module@3, _, _, Name@4, _} -> qualified(Module@3, Name@4); {alias_entry, _, Module@4, Name@5, _} -> qualified(Module@4, Name@5) end. -file("src/gleamdoc/interface.gleam", 216). -spec module_entries( gleam@package_interface:package(), binary(), gleam@package_interface:module_() ) -> list(entry()). module_entries(Package, Module_name, Module) -> {module, _, Type_aliases, Types, Constants, Functions} = Module, Functions@1 = begin _pipe = Functions, _pipe@1 = maps:to_list(_pipe), gleam@list:map( _pipe@1, fun(Pair) -> {Name, Value} = Pair, {function_entry, Package, Module_name, Name, Value} end ) end, Constants@1 = begin _pipe@2 = Constants, _pipe@3 = maps:to_list(_pipe@2), gleam@list:map( _pipe@3, fun(Pair@1) -> {Name@1, Value@1} = Pair@1, {constant_entry, Package, Module_name, Name@1, Value@1} end ) end, Type_pairs = maps:to_list(Types), Type_entries = begin _pipe@4 = Type_pairs, gleam@list:map( _pipe@4, fun(Pair@2) -> {Name@2, Value@2} = Pair@2, {type_entry, Package, Module_name, Name@2, Value@2} end ) end, Variants = begin _pipe@5 = Type_pairs, gleam@list:flat_map( _pipe@5, fun(Pair@3) -> {Type_name, {type_definition, _, _, Parameters, Constructors}} = Pair@3, _pipe@6 = Constructors, gleam@list:map( _pipe@6, fun(Constructor) -> {type_constructor, _, Name@3, _} = Constructor, {variant_entry, Package, Module_name, Type_name, Parameters, Name@3, Constructor} end ) end ) end, Aliases = begin _pipe@7 = Type_aliases, _pipe@8 = maps:to_list(_pipe@7), gleam@list:map( _pipe@8, fun(Pair@4) -> {Name@4, Value@3} = Pair@4, {alias_entry, Package, Module_name, Name@4, Value@3} end ) end, lists:append([Functions@1, Constants@1, Type_entries, Variants, Aliases]). -file("src/gleamdoc/interface.gleam", 203). -spec all_entries(gleam@package_interface:package()) -> list(entry()). all_entries(Package) -> {package, _, _, _, Modules} = Package, _pipe = Modules, _pipe@1 = maps:to_list(_pipe), gleam@list:flat_map( _pipe@1, fun(Pair) -> {Module_name, Module} = Pair, [{module_entry, Package, Module_name, Module} | module_entries(Package, Module_name, Module)] end ). -file("src/gleamdoc/interface.gleam", 39). ?DOC(" Looks up an exact module or qualified symbol in one package.\n"). -spec lookup(gleam@package_interface:package(), binary()) -> list(entry()). lookup(Package, Query) -> {package, _, _, _, Modules} = Package, case gleam_stdlib:map_get(Modules, Query) of {ok, Module} -> [{module_entry, Package, Query, Module}]; {error, nil} -> _pipe = all_entries(Package), gleam@list:filter( _pipe, fun(Entry) -> qualified_name(Entry) =:= Query end ) end. -file("src/gleamdoc/interface.gleam", 836). -spec entry_package_name_from(gleam@package_interface:package()) -> binary(). entry_package_name_from(Package) -> {package, Name, _, _, _} = Package, Name. -file("src/gleamdoc/interface.gleam", 671). -spec entry_package(entry()) -> gleam@package_interface:package(). entry_package(Entry) -> case Entry of {module_entry, Package, _, _} -> Package; {function_entry, Package@1, _, _, _} -> Package@1; {constant_entry, Package@2, _, _, _} -> Package@2; {type_entry, Package@3, _, _, _} -> Package@3; {variant_entry, Package@4, _, _, _, _, _} -> Package@4; {alias_entry, Package@5, _, _, _} -> Package@5 end. -file("src/gleamdoc/interface.gleam", 516). -spec entry_package_name(entry()) -> binary(). entry_package_name(Entry) -> _pipe = Entry, _pipe@1 = entry_package(_pipe), entry_package_name_from(_pipe@1). -file("src/gleamdoc/interface.gleam", 512). -spec package_qualified_name(entry()) -> binary(). package_qualified_name(Entry) -> <<<<(entry_package_name(Entry))/binary, ":"/utf8>>/binary, (qualified_name(Entry))/binary>>. -file("src/gleamdoc/interface.gleam", 520). -spec compare_entries(entry(), entry()) -> gleam@order:order(). compare_entries(A, B) -> gleam@string:compare(package_qualified_name(A), package_qualified_name(B)). -file("src/gleamdoc/interface.gleam", 606). -spec split_package_query(binary()) -> {gleam@option:option(binary()), binary()}. split_package_query(Query) -> case gleam@string:split_once(Query, <<":"/utf8>>) of {ok, {Package, Symbol}} -> {{some, Package}, Symbol}; {error, nil} -> {none, Query} end. -file("src/gleamdoc/interface.gleam", 50). ?DOC(" Looks up an exact, optionally package-qualified symbol across packages.\n"). -spec lookup_packages(list(gleam@package_interface:package()), binary()) -> list(entry()). lookup_packages(Packages, Query) -> {Package_name, Symbol} = split_package_query(Query), _pipe = Packages, _pipe@1 = gleam@list:filter( _pipe, fun(Package) -> {package, Name, _, _, _} = Package, case Package_name of {some, Wanted} -> Name =:= Wanted; none -> true end end ), _pipe@2 = gleam@list:flat_map( _pipe@1, fun(Package@1) -> lookup(Package@1, Symbol) end ), gleam@list:sort(_pipe@2, fun compare_entries/2). -file("src/gleamdoc/interface.gleam", 754). -spec entry_documentation(entry()) -> binary(). entry_documentation(Entry) -> case Entry of {module_entry, _, _, {module, Documentation, _, _, _, _}} -> gleam@string:join(Documentation, <<"\n"/utf8>>); {function_entry, _, _, _, {function, Documentation@1, _, _, _, _}} -> gleam@option:unwrap(Documentation@1, <<""/utf8>>); {constant_entry, _, _, _, {constant, Documentation@2, _, _, _}} -> gleam@option:unwrap(Documentation@2, <<""/utf8>>); {type_entry, _, _, _, {type_definition, Documentation@3, _, _, _}} -> gleam@option:unwrap(Documentation@3, <<""/utf8>>); {variant_entry, _, _, _, _, _, {type_constructor, Documentation@4, _, _}} -> gleam@option:unwrap(Documentation@4, <<""/utf8>>); {alias_entry, _, _, _, {type_alias, Documentation@5, _, _, _}} -> gleam@option:unwrap(Documentation@5, <<""/utf8>>) end. -file("src/gleamdoc/interface.gleam", 494). -spec named_type_name(binary(), binary(), binary()) -> binary(). named_type_name(Name, Package, Module) -> case Package of <<""/utf8>> -> Name; _ -> <<<>/binary, (qualified(Module, Name))/binary>> end. -file("src/gleamdoc/interface.gleam", 486). -spec join_types(list(gleam@package_interface:type())) -> binary(). join_types(Types) -> _pipe = Types, _pipe@1 = gleam@list:map(_pipe, fun format_type/1), gleam@string:join(_pipe@1, <<", "/utf8>>). -file("src/gleamdoc/interface.gleam", 187). ?DOC(" Formats a package-interface type as Gleam source syntax.\n"). -spec format_type(gleam@package_interface:type()) -> binary(). format_type(Type_) -> case Type_ of {tuple, Elements} -> <<<<"#("/utf8, (join_types(Elements))/binary>>/binary, ")"/utf8>>; {fn, Parameters, Return} -> <<<<<<"fn("/utf8, (join_types(Parameters))/binary>>/binary, ") -> "/utf8>>/binary, (format_type(Return))/binary>>; {variable, Id} -> <<"a"/utf8, (erlang:integer_to_binary(Id))/binary>>; {named, Name, Package, Module, Parameters@1} -> Name@1 = named_type_name(Name, Package, Module), case Parameters@1 of [] -> Name@1; _ -> <<<<<>/binary, (join_types(Parameters@1))/binary>>/binary, ")"/utf8>> end end. -file("src/gleamdoc/interface.gleam", 476). -spec parameter_names(integer(), integer()) -> list(binary()). parameter_names(Remaining, Index) -> case Remaining of 0 -> []; _ -> [<<"a"/utf8, (erlang:integer_to_binary(Index))/binary>> | parameter_names(Remaining - 1, Index + 1)] end. -file("src/gleamdoc/interface.gleam", 469). -spec type_parameters(integer()) -> binary(). type_parameters(Count) -> case Count of 0 -> <<""/utf8>>; _ -> <<<<"("/utf8, (begin _pipe = parameter_names(Count, 0), gleam@string:join(_pipe, <<", "/utf8>>) end)/binary>>/binary, ")"/utf8>> end. -file("src/gleamdoc/interface.gleam", 789). -spec format_parameters(list(gleam@package_interface:parameter())) -> binary(). format_parameters(Parameters) -> _pipe = Parameters, _pipe@1 = gleam@list:map( _pipe, fun(Parameter) -> {parameter, Label, Type_} = Parameter, case Label of {some, Label@1} -> <<<>/binary, (format_type(Type_))/binary>>; none -> format_type(Type_) end end ), gleam@string:join(_pipe@1, <<", "/utf8>>). -file("src/gleamdoc/interface.gleam", 777). -spec variant_signature(binary(), list(gleam@package_interface:parameter())) -> binary(). variant_signature(Name, Parameters) -> Parameters@1 = format_parameters(Parameters), <> -> <<""/utf8>>; _ -> <<<<"("/utf8, Parameters@1/binary>>/binary, ")"/utf8>> end)/binary>>. -file("src/gleamdoc/interface.gleam", 682). -spec entry_signature(entry()) -> binary(). entry_signature(Entry) -> case Entry of {module_entry, _, Name, _} -> <<"module "/utf8, Name/binary>>; {function_entry, _, _, Name@1, Value} -> {function, _, _, _, Parameters, Return} = Value, Parameters@1 = format_parameters(Parameters), <<<<<<<<<<"pub fn "/utf8, Name@1/binary>>/binary, "("/utf8>>/binary, Parameters@1/binary>>/binary, ") -> "/utf8>>/binary, (format_type(Return))/binary>>; {constant_entry, _, _, Name@2, {constant, _, _, _, Type_}} -> <<<<<<"pub const "/utf8, Name@2/binary>>/binary, ": "/utf8>>/binary, (format_type(Type_))/binary>>; {type_entry, _, _, Name@3, {type_definition, _, _, Parameters@2, Constructors}} -> <<<<<<<<"pub "/utf8, (case Constructors of [] -> <<"opaque "/utf8>>; _ -> <<""/utf8>> end)/binary>>/binary, "type "/utf8>>/binary, Name@3/binary>>/binary, (type_parameters( Parameters@2 ))/binary>>; {variant_entry, _, _, _, _, Name@4, {type_constructor, _, _, Parameters@3}} -> variant_signature(Name@4, Parameters@3); {alias_entry, _, _, Name@5, {type_alias, _, _, Parameters@4, Alias}} -> <<<<<<<<"pub type "/utf8, Name@5/binary>>/binary, (type_parameters(Parameters@4))/binary>>/binary, " = "/utf8>>/binary, (format_type(Alias))/binary>> end. -file("src/gleamdoc/interface.gleam", 595). -spec search_haystack(entry()) -> binary(). search_haystack(Entry) -> _pipe = (<<<<<<<<(package_qualified_name(Entry))/binary, "\n"/utf8>>/binary, (entry_signature(Entry))/binary>>/binary, "\n"/utf8>>/binary, (entry_documentation(Entry))/binary>>), string:lowercase(_pipe). -file("src/gleamdoc/interface.gleam", 588). -spec search_terms(binary()) -> list(binary()). search_terms(Query) -> _pipe = Query, _pipe@1 = string:lowercase(_pipe), _pipe@2 = gleam@string:split(_pipe@1, <<" "/utf8>>), gleam@list:filter(_pipe@2, fun(Term) -> Term /= <<""/utf8>> end). -file("src/gleamdoc/interface.gleam", 66). ?DOC( " Searches one package by symbol name, module, package name, signature, and\n" " documentation.\n" ). -spec search(gleam@package_interface:package(), binary()) -> list(entry()). search(Package, Query) -> Terms = search_terms(Query), case Terms of [] -> []; _ -> _pipe = all_entries(Package), gleam@list:filter( _pipe, fun(Entry) -> Haystack = search_haystack(Entry), gleam@list:all( Terms, fun(Term) -> gleam_stdlib:contains_string(Haystack, Term) end ) end ) end. -file("src/gleamdoc/interface.gleam", 743). -spec prepend_when(list(binary()), boolean(), binary()) -> list(binary()). prepend_when(Items, Condition, Item) -> case Condition of true -> [Item | Items]; false -> Items end. -file("src/gleamdoc/interface.gleam", 732). -spec implementation_targets(gleam@package_interface:implementations()) -> list(binary()). implementation_targets(Implementations) -> {implementations, _, _, _, Can_run_on_erlang, Can_run_on_javascript} = Implementations, _pipe = [], _pipe@1 = prepend_when(_pipe, Can_run_on_javascript, <<"javascript"/utf8>>), prepend_when(_pipe@1, Can_run_on_erlang, <<"erlang"/utf8>>). -file("src/gleamdoc/interface.gleam", 723). -spec entry_targets(entry()) -> list(binary()). entry_targets(Entry) -> case Entry of {function_entry, _, _, _, {function, _, _, Implementations, _, _}} -> implementation_targets(Implementations); {constant_entry, _, _, _, {constant, _, _, Implementations, _}} -> implementation_targets(Implementations); _ -> [] end. -file("src/gleamdoc/interface.gleam", 584). -spec matches_filter_list(list(binary()), binary()) -> boolean(). matches_filter_list(Values, Filter) -> (Filter =:= <<""/utf8>>) orelse gleam@list:contains(Values, Filter). -file("src/gleamdoc/interface.gleam", 635). -spec entry_kind(entry()) -> binary(). entry_kind(Entry) -> case Entry of {module_entry, _, _, _} -> <<"module"/utf8>>; {function_entry, _, _, _, _} -> <<"fn"/utf8>>; {constant_entry, _, _, _, _} -> <<"const"/utf8>>; {type_entry, _, _, _, _} -> <<"type"/utf8>>; {variant_entry, _, _, _, _, _, _} -> <<"variant"/utf8>>; {alias_entry, _, _, _, _} -> <<"alias"/utf8>> end. -file("src/gleamdoc/interface.gleam", 580). -spec matches_filter(binary(), binary()) -> boolean(). matches_filter(Value, Filter) -> (Filter =:= <<""/utf8>>) orelse (Value =:= Filter). -file("src/gleamdoc/interface.gleam", 573). -spec contains_score(binary(), binary(), integer()) -> integer(). contains_score(Haystack, Needle, Score) -> case gleam_stdlib:contains_string(Haystack, Needle) of true -> Score; false -> 0 end. -file("src/gleamdoc/interface.gleam", 566). -spec prefix_score(binary(), binary(), integer()) -> integer(). prefix_score(Haystack, Needle, Score) -> case gleam_stdlib:string_starts_with(Haystack, Needle) of true -> Score; false -> 0 end. -file("src/gleamdoc/interface.gleam", 559). -spec exact_score(binary(), binary(), integer()) -> integer(). exact_score(Haystack, Needle, Score) -> case Haystack =:= Needle of true -> Score; false -> 0 end. -file("src/gleamdoc/interface.gleam", 624). -spec entry_module(entry()) -> binary(). entry_module(Entry) -> case Entry of {module_entry, _, Name, _} -> Name; {function_entry, _, Module, _, _} -> Module; {constant_entry, _, Module@1, _, _} -> Module@1; {type_entry, _, Module@2, _, _} -> Module@2; {variant_entry, _, Module@3, _, _, _, _} -> Module@3; {alias_entry, _, Module@4, _, _} -> Module@4 end. -file("src/gleamdoc/interface.gleam", 613). -spec entry_name(entry()) -> binary(). entry_name(Entry) -> case Entry of {module_entry, _, Name, _} -> Name; {function_entry, _, _, Name@1, _} -> Name@1; {constant_entry, _, _, Name@2, _} -> Name@2; {type_entry, _, _, Name@3, _} -> Name@3; {variant_entry, _, _, _, _, Name@4, _} -> Name@4; {alias_entry, _, _, Name@5, _} -> Name@5 end. -file("src/gleamdoc/interface.gleam", 533). -spec search_score(entry(), binary()) -> integer(). search_score(Entry, Query) -> Needle = begin _pipe = Query, _pipe@1 = gleam@string:trim(_pipe), string:lowercase(_pipe@1) end, Name = begin _pipe@2 = entry_name(Entry), string:lowercase(_pipe@2) end, Qualified = begin _pipe@3 = qualified_name(Entry), string:lowercase(_pipe@3) end, Package_qualified = begin _pipe@4 = package_qualified_name(Entry), string:lowercase(_pipe@4) end, Module = begin _pipe@5 = entry_module(Entry), string:lowercase(_pipe@5) end, Signature = begin _pipe@6 = entry_signature(Entry), string:lowercase(_pipe@6) end, Docs = begin _pipe@7 = entry_documentation(Entry), string:lowercase(_pipe@7) end, Terms = search_terms(Query), ((((((exact_score(Package_qualified, Needle, 1200) + exact_score( Qualified, Needle, 1100 )) + exact_score(Name, Needle, 1000)) + prefix_score(Name, Needle, 700)) + contains_score(Name, Needle, 500)) + prefix_score(Qualified, Needle, 400)) + contains_score(Module, Needle, 250)) + gleam@list:fold( Terms, 0, fun(Score, Term) -> (((Score + contains_score(Name, Term, 80)) + contains_score( Module, Term, 30 )) + contains_score(Signature, Term, 10)) + contains_score(Docs, Term, 5) end ). -file("src/gleamdoc/interface.gleam", 524). -spec compare_search_entries(binary()) -> fun((entry(), entry()) -> gleam@order:order()). compare_search_entries(Query) -> fun(A, B) -> case gleam@int:compare(search_score(B, Query), search_score(A, Query)) of eq -> compare_entries(A, B); Ordering -> Ordering end end. -file("src/gleamdoc/interface.gleam", 92). ?DOC( " Searches packages with optional entry-kind and runtime-target filters.\n" "\n" " An empty filter matches all entries. Target filters only match functions and\n" " constants because other entries do not have runtime-target metadata.\n" ). -spec search_packages_filtered( list(gleam@package_interface:package()), binary(), integer(), binary(), binary() ) -> list(entry()). search_packages_filtered(Packages, Query, Limit, Kind, Target) -> _pipe = Packages, _pipe@1 = gleam@list:flat_map( _pipe, fun(Package) -> search(Package, Query) end ), _pipe@2 = gleam@list:sort(_pipe@1, compare_search_entries(Query)), _pipe@3 = gleam@list:filter( _pipe@2, fun(Entry) -> matches_filter(entry_kind(Entry), Kind) andalso matches_filter_list( entry_targets(Entry), Target ) end ), gleam@list:take(_pipe@3, Limit). -file("src/gleamdoc/interface.gleam", 80). ?DOC(" Searches packages and returns at most the requested number of ranked entries.\n"). -spec search_packages( list(gleam@package_interface:package()), binary(), integer() ) -> list(entry()). search_packages(Packages, Query, Limit) -> search_packages_filtered(Packages, Query, Limit, <<""/utf8>>, <<""/utf8>>). -file("src/gleamdoc/interface.gleam", 819). -spec documentation_block(binary()) -> binary(). documentation_block(Documentation) -> case gleam@string:trim(Documentation) of <<""/utf8>> -> <<""/utf8>>; Documentation@1 -> <<"\n\n"/utf8, Documentation@1/binary>> end. -file("src/gleamdoc/interface.gleam", 812). -spec optional_documentation(gleam@option:option(binary())) -> binary(). optional_documentation(Documentation) -> case Documentation of {some, Documentation@1} -> documentation_block(Documentation@1); none -> <<""/utf8>> end. -file("src/gleamdoc/interface.gleam", 826). -spec deprecation_block( gleam@option:option(gleam@package_interface:deprecation()) ) -> binary(). deprecation_block(Deprecation) -> case Deprecation of {some, {deprecation, Message}} -> <<"\n\ndeprecated: "/utf8, Message/binary>>; none -> <<""/utf8>> end. -file("src/gleamdoc/interface.gleam", 841). -spec source_block(binary(), binary(), binary(), binary()) -> binary(). source_block(Package, Module, Kind, Name) -> case gleamdoc@index:source_location(Package, Module, Kind, Name) of <<""/utf8>> -> <<""/utf8>>; Location -> <<"\nsource: "/utf8, Location/binary>> end. -file("src/gleamdoc/interface.gleam", 450). -spec package_metadata(gleam@package_interface:package()) -> binary(). package_metadata(Package) -> {package, Name, Version, _, _} = Package, <<<<<<"\n\npackage: "/utf8, Name/binary>>/binary, " "/utf8>>/binary, Version/binary>>. -file("src/gleamdoc/interface.gleam", 422). -spec render_type_alias( gleam@package_interface:package(), binary(), binary(), gleam@package_interface:type_alias() ) -> binary(). render_type_alias(Package, Module, Name, Value) -> {type_alias, Documentation, Deprecation, Parameters, Alias} = Value, <<<<<<<<<<<<<<<<<<(qualified(Module, Name))/binary, "\n\npub type "/utf8>>/binary, Name/binary>>/binary, (type_parameters(Parameters))/binary>>/binary, " = "/utf8>>/binary, (format_type(Alias))/binary>>/binary, (package_metadata(Package))/binary>>/binary, (source_block( entry_package_name_from(Package), Module, <<"alias"/utf8>>, Name ))/binary>>/binary, (deprecation_block(Deprecation))/binary>>/binary, (optional_documentation(Documentation))/binary>>. -file("src/gleamdoc/interface.gleam", 801). -spec variant_type( gleam@package_interface:package(), binary(), binary(), integer() ) -> binary(). variant_type(Package, Module, Type_name, Type_parameter_count) -> {package, Package_name, _, _, _} = Package, <<(named_type_name(Type_name, Package_name, Module))/binary, (type_parameters(Type_parameter_count))/binary>>. -file("src/gleamdoc/interface.gleam", 403). -spec render_variant( gleam@package_interface:package(), binary(), binary(), integer(), binary(), gleam@package_interface:type_constructor() ) -> binary(). render_variant(Package, Module, Type_name, Type_parameter_count, Name, Value) -> {type_constructor, Documentation, _, Parameters} = Value, <<<<<<<<<<<<<<(qualified(Module, Name))/binary, "\n\n"/utf8>>/binary, (variant_signature(Name, Parameters))/binary>>/binary, (package_metadata(Package))/binary>>/binary, "\ntype: "/utf8>>/binary, (variant_type(Package, Module, Type_name, Type_parameter_count))/binary>>/binary, (source_block( entry_package_name_from(Package), Module, <<"variant"/utf8>>, Name ))/binary>>/binary, (optional_documentation(Documentation))/binary>>. -file("src/gleamdoc/interface.gleam", 358). -spec render_type_definition( gleam@package_interface:package(), binary(), binary(), gleam@package_interface:type_definition() ) -> binary(). render_type_definition(Package, Module, Name, Value) -> {type_definition, Documentation, Deprecation, Parameters, Constructors} = Value, Rendered_variants = begin _pipe = Constructors, _pipe@1 = gleam@list:map( _pipe, fun(Constructor) -> {type_constructor, _, Name@1, Parameters@1} = Constructor, Parameters@2 = format_parameters(Parameters@1), <<<<" "/utf8, Name@1/binary>>/binary, (case Parameters@2 of <<""/utf8>> -> <<""/utf8>>; _ -> <<<<"("/utf8, Parameters@2/binary>>/binary, ")"/utf8>> end)/binary>> end ), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, <<<<<<<<<<<<<<<<<<<<(qualified(Module, Name))/binary, "\n\npub "/utf8>>/binary, (case Constructors of [] -> <<"opaque "/utf8>>; _ -> <<""/utf8>> end)/binary>>/binary, "type "/utf8>>/binary, Name/binary>>/binary, (type_parameters(Parameters))/binary>>/binary, (case Rendered_variants of <<""/utf8>> -> <<""/utf8>>; _ -> <<<<" {\n"/utf8, Rendered_variants/binary>>/binary, "\n}"/utf8>> end)/binary>>/binary, (package_metadata(Package))/binary>>/binary, (source_block( entry_package_name_from(Package), Module, <<"type"/utf8>>, Name ))/binary>>/binary, (deprecation_block(Deprecation))/binary>>/binary, (optional_documentation(Documentation))/binary>>. -file("src/gleamdoc/interface.gleam", 455). -spec targets(gleam@package_interface:implementations()) -> binary(). targets(Implementations) -> {implementations, _, _, _, Can_run_on_erlang, Can_run_on_javascript} = Implementations, case {Can_run_on_erlang, Can_run_on_javascript} of {true, true} -> <<"erlang, javascript"/utf8>>; {true, false} -> <<"erlang"/utf8>>; {false, true} -> <<"javascript"/utf8>>; {false, false} -> <<"none"/utf8>> end. -file("src/gleamdoc/interface.gleam", 446). -spec metadata( gleam@package_interface:package(), gleam@package_interface:implementations() ) -> binary(). metadata(Package, Implementations) -> <<<<(package_metadata(Package))/binary, "\ntargets: "/utf8>>/binary, (targets(Implementations))/binary>>. -file("src/gleamdoc/interface.gleam", 335). -spec render_constant( gleam@package_interface:package(), binary(), binary(), gleam@package_interface:constant() ) -> binary(). render_constant(Package, Module, Name, Value) -> {constant, Documentation, Deprecation, Implementations, Type_} = Value, <<<<<<<<<<<<<<<<(qualified(Module, Name))/binary, "\n\npub const "/utf8>>/binary, Name/binary>>/binary, ": "/utf8>>/binary, (format_type(Type_))/binary>>/binary, (metadata(Package, Implementations))/binary>>/binary, (source_block( entry_package_name_from(Package), Module, <<"const"/utf8>>, Name ))/binary>>/binary, (deprecation_block(Deprecation))/binary>>/binary, (optional_documentation(Documentation))/binary>>. -file("src/gleamdoc/interface.gleam", 308). -spec render_function( gleam@package_interface:package(), binary(), binary(), gleam@package_interface:function_() ) -> binary(). render_function(Package, Module, Name, Value) -> {function, Documentation, Deprecation, Implementations, Parameters, Return} = Value, Parameters@1 = format_parameters(Parameters), <<<<<<<<<<<<<<<<<<<<(qualified(Module, Name))/binary, "\n\npub fn "/utf8>>/binary, Name/binary>>/binary, "("/utf8>>/binary, Parameters@1/binary>>/binary, ") -> "/utf8>>/binary, (format_type(Return))/binary>>/binary, (metadata(Package, Implementations))/binary>>/binary, (source_block( entry_package_name_from(Package), Module, <<"fn"/utf8>>, Name ))/binary>>/binary, (deprecation_block(Deprecation))/binary>>/binary, (optional_documentation(Documentation))/binary>>. -file("src/gleamdoc/interface.gleam", 281). -spec render_module( gleam@package_interface:package(), binary(), gleam@package_interface:module_() ) -> binary(). render_module(Package, Name, Module) -> {package, Package_name, Version, _, _} = Package, {module, Documentation, _, _, _, _} = Module, Members = begin _pipe = module_entries(Package, Name, Module), _pipe@1 = gleam@list:sort( _pipe, fun(A, B) -> gleam@string:compare(qualified_name(A), qualified_name(B)) end ), _pipe@2 = gleam@list:map( _pipe@1, fun(Entry) -> <<<<<<" "/utf8, (entry_kind(Entry))/binary>>/binary, " "/utf8>>/binary, (entry_name(Entry))/binary>> end ), gleam@string:join(_pipe@2, <<"\n"/utf8>>) end, Docs = begin _pipe@3 = Documentation, _pipe@4 = gleam@string:join(_pipe@3, <<"\n"/utf8>>), documentation_block(_pipe@4) end, <<<<<<<<<<<<<>/binary, Package_name/binary>>/binary, " "/utf8>>/binary, Version/binary>>/binary, (source_block( Package_name, Name, <<"module"/utf8>>, <<""/utf8>> ))/binary>>/binary, Docs/binary>>/binary, (case Members of <<""/utf8>> -> <<""/utf8>>; _ -> <<"\n\nMembers:\n"/utf8, Members/binary>> end)/binary>>. -file("src/gleamdoc/interface.gleam", 170). ?DOC(" Renders complete documentation for one entry.\n"). -spec render(entry()) -> binary(). render(Entry) -> case Entry of {module_entry, Package, Name, Module} -> render_module(Package, Name, Module); {function_entry, Package@1, Module@1, Name@1, Value} -> render_function(Package@1, Module@1, Name@1, Value); {constant_entry, Package@2, Module@2, Name@2, Value@1} -> render_constant(Package@2, Module@2, Name@2, Value@1); {type_entry, Package@3, Module@3, Name@3, Value@2} -> render_type_definition(Package@3, Module@3, Name@3, Value@2); {variant_entry, Package@4, Module@4, Type_name, Type_parameters, Name@4, Value@3} -> render_variant( Package@4, Module@4, Type_name, Type_parameters, Name@4, Value@3 ); {alias_entry, Package@5, Module@5, Name@5, Value@4} -> render_type_alias(Package@5, Module@5, Name@5, Value@4) end. -file("src/gleamdoc/interface.gleam", 110). ?DOC(" Renders complete documentation for all entries.\n"). -spec render_all(list(entry())) -> binary(). render_all(Entries) -> _pipe = Entries, _pipe@1 = gleam@list:map(_pipe, fun render/1), gleam@string:join(_pipe@1, <<"\n\n"/utf8>>). -file("src/gleamdoc/interface.gleam", 115). ?DOC(" Renders compact, one-line search results.\n"). -spec render_search_results(list(entry())) -> binary(). render_search_results(Entries) -> _pipe = Entries, _pipe@1 = gleam@list:map( _pipe, fun(Entry) -> <<<<(entry_kind(Entry))/binary, " "/utf8>>/binary, (package_qualified_name(Entry))/binary>> end ), gleam@string:join(_pipe@1, <<"\n"/utf8>>). -file("src/gleamdoc/interface.gleam", 124). ?DOC(" Renders package names, versions, and module counts.\n"). -spec render_packages(list(gleam@package_interface:package())) -> binary(). render_packages(Packages) -> _pipe = Packages, _pipe@1 = gleam@list:sort( _pipe, fun(A, B) -> {package, A_name, _, _, _} = A, {package, B_name, _, _, _} = B, gleam@string:compare(A_name, B_name) end ), _pipe@2 = gleam@list:map( _pipe@1, fun(Package) -> {package, Name, Version, _, Modules} = Package, <<<<<<<<<>/binary, Version/binary>>/binary, " "/utf8>>/binary, (erlang:integer_to_binary(maps:size(Modules)))/binary>>/binary, " modules"/utf8>> end ), gleam@string:join(_pipe@2, <<"\n"/utf8>>). -file("src/gleamdoc/interface.gleam", 646). -spec entry_json(entry()) -> gleam@json:json(). entry_json(Entry) -> Package = entry_package(Entry), {package, Package_name, Version, _, _} = Package, Module = entry_module(Entry), Name = entry_name(Entry), Kind = entry_kind(Entry), Source = gleamdoc@index:source_location(Package_name, Module, Kind, Name), gleam@json:object( [{<<"package"/utf8>>, gleam@json:string(Package_name)}, {<<"version"/utf8>>, gleam@json:string(Version)}, {<<"module"/utf8>>, gleam@json:string(Module)}, {<<"kind"/utf8>>, gleam@json:string(Kind)}, {<<"name"/utf8>>, gleam@json:string(Name)}, {<<"qualified_name"/utf8>>, gleam@json:string(qualified_name(Entry))}, {<<"signature"/utf8>>, gleam@json:string(entry_signature(Entry))}, {<<"documentation"/utf8>>, gleam@json:string(entry_documentation(Entry))}, {<<"targets"/utf8>>, gleam@json:array(entry_targets(Entry), fun gleam@json:string/1)}, {<<"source"/utf8>>, case Source of <<""/utf8>> -> gleam@json:null(); Source@1 -> gleam@json:string(Source@1) end}] ). -file("src/gleamdoc/interface.gleam", 144). ?DOC(" Encodes entries in Gleamdoc's versioned JSON response envelope.\n"). -spec entries_json(list(entry())) -> gleam@json:json(). entries_json(Entries) -> gleam@json:object( [{<<"schema_version"/utf8>>, gleam@json:int(1)}, {<<"results"/utf8>>, gleam@json:array(Entries, fun entry_json/1)}] ). -file("src/gleamdoc/interface.gleam", 152). ?DOC(" Encodes package summaries in Gleamdoc's versioned JSON response envelope.\n"). -spec packages_json(list(gleam@package_interface:package())) -> gleam@json:json(). packages_json(Packages) -> gleam@json:object( [{<<"schema_version"/utf8>>, gleam@json:int(1)}, {<<"results"/utf8>>, gleam@json:array( Packages, fun(Package) -> {package, Name, Version, _, Modules} = Package, gleam@json:object( [{<<"name"/utf8>>, gleam@json:string(Name)}, {<<"version"/utf8>>, gleam@json:string(Version)}, {<<"modules"/utf8>>, gleam@json:int(maps:size(Modules))}] ) end )}] ).