46577a6e3e
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
171 lines
4.4 KiB
Go
171 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"fn-registry/registry"
|
|
)
|
|
|
|
// renderFunctionMarkdown returns a markdown card for a Function:
|
|
// frontmatter-ish header + description + signature + code block.
|
|
func renderFunctionMarkdown(f *registry.Function) string {
|
|
var b strings.Builder
|
|
fmt.Fprintf(&b, "# %s\n\n", f.ID)
|
|
fmt.Fprintf(&b, "- name: %s\n", f.Name)
|
|
fmt.Fprintf(&b, "- kind: %s\n", f.Kind)
|
|
fmt.Fprintf(&b, "- lang: %s\n", f.Lang)
|
|
fmt.Fprintf(&b, "- domain: %s\n", f.Domain)
|
|
fmt.Fprintf(&b, "- purity: %s\n", f.Purity)
|
|
if f.Version != "" {
|
|
fmt.Fprintf(&b, "- version: %s\n", f.Version)
|
|
}
|
|
if f.Signature != "" {
|
|
fmt.Fprintf(&b, "- signature: `%s`\n", f.Signature)
|
|
}
|
|
if len(f.Returns) > 0 {
|
|
fmt.Fprintf(&b, "- returns: %s\n", strings.Join(f.Returns, ", "))
|
|
}
|
|
if f.ErrorType != "" {
|
|
fmt.Fprintf(&b, "- error_type: %s\n", f.ErrorType)
|
|
}
|
|
if len(f.UsesFunctions) > 0 {
|
|
fmt.Fprintf(&b, "- uses_functions: %s\n", strings.Join(f.UsesFunctions, ", "))
|
|
}
|
|
if len(f.UsesTypes) > 0 {
|
|
fmt.Fprintf(&b, "- uses_types: %s\n", strings.Join(f.UsesTypes, ", "))
|
|
}
|
|
if len(f.Tags) > 0 {
|
|
fmt.Fprintf(&b, "- tags: %s\n", strings.Join(f.Tags, ", "))
|
|
}
|
|
if f.FilePath != "" {
|
|
fmt.Fprintf(&b, "- file_path: %s\n", f.FilePath)
|
|
}
|
|
b.WriteString("\n")
|
|
|
|
if f.Description != "" {
|
|
b.WriteString(f.Description)
|
|
b.WriteString("\n\n")
|
|
}
|
|
if f.ParamsSchema != "" {
|
|
b.WriteString("## params\n\n```json\n")
|
|
b.WriteString(f.ParamsSchema)
|
|
b.WriteString("\n```\n\n")
|
|
}
|
|
if f.Documentation != "" {
|
|
b.WriteString(f.Documentation)
|
|
b.WriteString("\n\n")
|
|
}
|
|
if f.Code != "" {
|
|
fmt.Fprintf(&b, "## code\n\n```%s\n%s\n```\n", langFence(f.Lang), f.Code)
|
|
}
|
|
if f.Example != "" {
|
|
fmt.Fprintf(&b, "\n## example\n\n```%s\n%s\n```\n", langFence(f.Lang), f.Example)
|
|
}
|
|
if f.Notes != "" {
|
|
fmt.Fprintf(&b, "\n## notes\n\n%s\n", f.Notes)
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// renderTypeMarkdown returns a markdown card for a Type.
|
|
func renderTypeMarkdown(t *registry.Type) string {
|
|
var b strings.Builder
|
|
fmt.Fprintf(&b, "# %s (type)\n\n", t.ID)
|
|
fmt.Fprintf(&b, "- name: %s\n", t.Name)
|
|
fmt.Fprintf(&b, "- lang: %s\n", t.Lang)
|
|
fmt.Fprintf(&b, "- domain: %s\n", t.Domain)
|
|
fmt.Fprintf(&b, "- algebraic: %s\n", t.Algebraic)
|
|
if t.Definition != "" {
|
|
fmt.Fprintf(&b, "- definition: `%s`\n", t.Definition)
|
|
}
|
|
if len(t.UsesTypes) > 0 {
|
|
fmt.Fprintf(&b, "- uses_types: %s\n", strings.Join(t.UsesTypes, ", "))
|
|
}
|
|
if len(t.Tags) > 0 {
|
|
fmt.Fprintf(&b, "- tags: %s\n", strings.Join(t.Tags, ", "))
|
|
}
|
|
if t.FilePath != "" {
|
|
fmt.Fprintf(&b, "- file_path: %s\n", t.FilePath)
|
|
}
|
|
b.WriteString("\n")
|
|
|
|
if t.Description != "" {
|
|
b.WriteString(t.Description)
|
|
b.WriteString("\n\n")
|
|
}
|
|
if t.Documentation != "" {
|
|
b.WriteString(t.Documentation)
|
|
b.WriteString("\n\n")
|
|
}
|
|
if t.Code != "" {
|
|
fmt.Fprintf(&b, "## code\n\n```%s\n%s\n```\n", langFence(t.Lang), t.Code)
|
|
}
|
|
if t.Examples != "" {
|
|
fmt.Fprintf(&b, "\n## examples\n\n%s\n", t.Examples)
|
|
}
|
|
if t.Notes != "" {
|
|
fmt.Fprintf(&b, "\n## notes\n\n%s\n", t.Notes)
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// renderModuleMarkdown returns a markdown card for a Module.
|
|
func renderModuleMarkdown(m *registry.Module) string {
|
|
var b strings.Builder
|
|
fmt.Fprintf(&b, "# %s (module)\n\n", m.ID)
|
|
fmt.Fprintf(&b, "- name: %s\n", m.Name)
|
|
fmt.Fprintf(&b, "- version: %s\n", m.Version)
|
|
fmt.Fprintf(&b, "- lang: %s\n", m.Lang)
|
|
if len(m.Members) > 0 {
|
|
fmt.Fprintf(&b, "- members: %s\n", strings.Join(m.Members, ", "))
|
|
}
|
|
if len(m.Tags) > 0 {
|
|
fmt.Fprintf(&b, "- tags: %s\n", strings.Join(m.Tags, ", "))
|
|
}
|
|
if m.DirPath != "" {
|
|
fmt.Fprintf(&b, "- dir_path: %s\n", m.DirPath)
|
|
}
|
|
if m.RepoURL != "" {
|
|
fmt.Fprintf(&b, "- repo_url: %s\n", m.RepoURL)
|
|
}
|
|
b.WriteString("\n")
|
|
|
|
if m.Description != "" {
|
|
b.WriteString(m.Description)
|
|
b.WriteString("\n\n")
|
|
}
|
|
if m.Documentation != "" {
|
|
b.WriteString(m.Documentation)
|
|
b.WriteString("\n\n")
|
|
}
|
|
if m.Notes != "" {
|
|
fmt.Fprintf(&b, "\n## notes\n\n%s\n", m.Notes)
|
|
}
|
|
return b.String()
|
|
}
|
|
|
|
// langFence maps registry lang codes to markdown fence labels.
|
|
func langFence(lang string) string {
|
|
switch lang {
|
|
case "py":
|
|
return "python"
|
|
case "ts":
|
|
return "typescript"
|
|
case "bash", "sh":
|
|
return "bash"
|
|
case "ps":
|
|
return "powershell"
|
|
default:
|
|
return lang
|
|
}
|
|
}
|
|
|
|
// truncate caps a string to n bytes, appending an ellipsis marker.
|
|
func truncate(s string, n int) string {
|
|
if len(s) <= n {
|
|
return s
|
|
}
|
|
return s[:n] + "\n... [truncated " + fmt.Sprintf("%d bytes]", len(s)-n)
|
|
}
|