notify.moe/arn/autodocs/Type.go
2024-03-12 12:40:01 +01:00

81 lines
1.6 KiB
Go

package autodocs
import (
"bufio"
"fmt"
"os"
"strings"
)
// Type represents a type in a Go source file.
type Type struct {
Name string
Comment string
LineNumber int
}
// Endpoint returns the REST endpoint for that type.
func (typ *Type) Endpoint() string {
return "/api/" + strings.ToLower(typ.Name)
}
// GitLink returns link to display the type in Git.
func (typ *Type) GitLink() string {
return fmt.Sprintf("https://git.akyoto.dev/web/notify.moe/src/branch/main/arn/%s.go#L%d", typ.Name, typ.LineNumber)
}
// GetTypeDocumentation tries to gather documentation about the given type.
func GetTypeDocumentation(typeName string, filePath string) (*Type, error) {
typ := &Type{
Name: typeName,
}
file, err := os.Open(filePath)
if err != nil {
return typ, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
lineNumber := 0
var comments []string
for scanner.Scan() {
lineNumber++
line := scanner.Text()
line = strings.TrimSpace(line)
isComment := strings.HasPrefix(line, "// ")
if isComment {
comment := strings.TrimPrefix(line, "// ")
comments = append(comments, comment)
continue
}
if strings.HasPrefix(line, "type ") {
definedTypeName := strings.TrimPrefix(line, "type ")
space := strings.Index(definedTypeName, " ")
definedTypeName = definedTypeName[:space]
if definedTypeName == typeName {
typ.Comment = strings.Join(comments, " ")
typ.LineNumber = lineNumber
}
}
if !isComment {
comments = nil
}
}
if err := scanner.Err(); err != nil {
return typ, err
}
return typ, nil
}