tealr_doc_gen 0.4.0

A cli tool to create online documentation for apis made with tealr
<%
function render(str)
%><%-str-%><%
end
function render_nl(str)
%>
<%-str%>
<%
end

local renderer = get_type_renderer(render)
local toString = get_type_renderer(function(a) return a end)
local extended_renderer = function(extend_with) return get_type_renderer(render, nil, extend_with) end

function render_function(func, generics)
    renderer["function"](func, {generics = generics})
end
function render_type(ty, generics)
    type_to_string(ty,renderer, {generics = generics})
end

local macroRenderer = getMacroRenderer(render, render_function,render_type)
function renderTealTypeOf(ty_name, with, maybe_extend_with)
    render(with)
    render(" ")
    local renderer_to_use = renderer
    if maybe_extend_with then
        renderer_to_use = extended_renderer(maybe_extend_with)
    end
    type_to_string(ty_name, renderer_to_use, {})
end

function render_macroexpr(macro, generics)
    if macro.is_meta_method then
        render("metamethod ")
    end
    render(macro.name)
    render(": ")
    macroRenderer(macro, generics)
end

function render_member(member, generics)
    
    if member.params then
        render("        ")
        render(member.name)
        render(":")
        renderer["function"](member, {generics = generics})
    else
        local ty = member.ty
        local res = type_to_string(ty, toString, {generics = generics})
        if startsWith(res, "\"") and endsWith(res, "\"") then
            local withoutQuotes = string.sub(res, 2, #res-1)
            local typeName = withoutQuotes.."Tag"
            render("enum ")
            render_nl(typeName)
            render_nl(res)
            render_nl("end")
            res = typeName
        end
        render("        ")
        render(member.name)
        render(":")
        render(res)
    end
    render_nl("")
end

function render_macros(macros,doc, existing_generics)
    for _,macro in ipairs(macros) do
        local docs = doc[macro.name]
        if docs then
            render_nl("    --"..string.gsub(docs, "\n", "\n        --"))
        end
        render_macroexpr(macro, map(existing_generics, function(a) return a end))
    end
end

function render_members(members,doc, existing_generics)
    for _,member in ipairs(members) do
        local docs = doc[member.name]
        if docs then
            render_nl("    --"..string.gsub(docs, "\n", "\n        --"))
        end
        render_member(member, map(existing_generics, function(a) return a end))
    end
end

%>

<%- global_or_local %> record <%- name %>
    <% 
        for _, teal_type in ipairs(module.given_types) do 
            
            local enum = teal_type:GetEnumOrNil()
            if enum then
                renderTealTypeOf(enum.ty,"enum ")
                render_nl("")
                for _, variant in ipairs(enum.variants) do
                    render("        \"")
                    render(variant.."\"")
                    render_nl""
                end
    %>
    end
    <%
            end
            local record = teal_type:GetRecordOrNil()
            if record then
                local generics =  get_missing_generics({record.ty},{})
                if not record.should_be_inlined then
    %>

    <% 
        renderTealTypeOf(record.ty,"interface ")
    %>
        <%=(record.is_user_data and "is userdata") or ""%>
    <%
                    for _,v in ipairs(record.implements) do
                        render("    is ")
                        type_to_string(v, renderer, {generics = map(generics, function(a) return a end)})
                        render_nl("")
                    end
                    if record.tag ~= nil then
                        render("where " .. record.tag)
                    end
                end
                local ty = record.ty:GetSingleOrNil()
                render_nl("--"..string.gsub(record.type_doc, "\n", "\n        --"))
                render_members(record.fields,record.documentation, generics)
                render_members(record.static_fields,record.documentation, generics)
                render_members(record.methods,record.documentation, generics)
                render_members(record.mut_methods,record.documentation, generics)
                render_members(record.functions,record.documentation, generics)
                render_members(record.mut_functions,record.documentation, generics)
                render_members(record.meta_method,record.documentation, generics)
                render_members(record.meta_method_mut,record.documentation, generics)
                render_members(record.meta_function,record.documentation, generics)
                render_members(record.meta_function_mut,record.documentation, generics)
                render_macros(record.macro_expressions, record.documentation, generics)
                if not record.should_be_inlined then 
    %>
    end
    <%
                end

            end
        end
    %>
end
<%

for _, global_instance in ipairs(module.global_instances_off) do
    if (not global_instance.doc) or global_instance.doc == "" then  
        render("--"..string.gsub(global_instance.doc, "\n", "\n        --"))
    end
    render_nl("--")
    renderTealTypeOf(global_instance.ty, "global " .. global_instance.name .. " : ", name)
end
%>

return <%- name %>