dev/import-beats/docs.go (118 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
package main
import (
"fmt"
"os"
"path/filepath"
"sort"
"strings"
"text/template"
"github.com/pkg/errors"
)
var emptyReadmeTemplate = template.Must(template.New("README.md").Parse("TODO"))
type fieldsTableRecord struct {
name string
description string
aType string
}
type docContent struct {
fileName string
templatePath string
}
func createDocTemplates(packageDocsPath string) ([]docContent, error) {
readmePath := filepath.Join(packageDocsPath, "README.md")
_, err := os.Stat(readmePath)
if err != nil && !os.IsNotExist(err) {
return nil, errors.Wrapf(err, "reading README template failed")
}
if os.IsNotExist(err) {
readmePath = ""
}
return []docContent{
{fileName: "README.md", templatePath: readmePath},
}, nil
}
func renderExportedFields(packageDataStream string, dataStreams dataStreamContentArray) (string, error) {
for _, dataStream := range dataStreams {
if packageDataStream == dataStream.name {
var buffer strings.Builder
buffer.WriteString("**Exported fields**")
buffer.WriteString("\n\n")
collected, err := collectFields(dataStream.fields)
if err != nil {
return "", errors.Wrapf(err, "collecting fields failed")
}
if len(collected) == 0 {
buffer.WriteString("(no fields available)")
return buffer.String(), nil
}
buffer.WriteString("| Field | Description | Type |\n")
buffer.WriteString("|---|---|---|\n")
for _, c := range collected {
description := strings.TrimSpace(strings.ReplaceAll(c.description, "\n", " "))
buffer.WriteString(fmt.Sprintf("| %s | %s | %s |\n", c.name, description, c.aType))
}
return buffer.String(), nil
}
}
return "", fmt.Errorf("missing dataStream: %s", packageDataStream)
}
func collectFields(content fieldsContent) ([]fieldsTableRecord, error) {
var records []fieldsTableRecord
for _, fieldsFile := range content.files {
r, err := collectFieldsFromFile(fieldsFile)
if err != nil {
return nil, errors.Wrapf(err, "collecting fields from file failed")
}
records = append(records, r...)
}
sort.Slice(records, func(i, j int) bool {
return sort.StringsAreSorted([]string{records[i].name, records[j].name})
})
return uniqueTableRecords(records), nil
}
func uniqueTableRecords(records []fieldsTableRecord) []fieldsTableRecord {
fieldNames := make(map[string]bool)
var unique []fieldsTableRecord
for _, r := range records {
if _, ok := fieldNames[r.name]; !ok {
fieldNames[r.name] = true
unique = append(unique, r)
}
}
return unique
}
func collectFieldsFromFile(fieldDefinitions []fieldDefinition) ([]fieldsTableRecord, error) {
var records []fieldsTableRecord
root := fieldDefinitions
var err error
for _, f := range root {
records, err = visitFields("", f, records)
if err != nil {
return nil, errors.Wrapf(err, "visiting fields failed")
}
}
return records, nil
}
func visitFields(namePrefix string, f fieldDefinition, records []fieldsTableRecord) ([]fieldsTableRecord, error) {
var name = namePrefix
if namePrefix != "" {
name += "."
}
name += f.Name
if len(f.Fields) == 0 && f.Type != "group" {
records = append(records, fieldsTableRecord{
name: name,
description: f.Description,
aType: f.Type,
})
return records, nil
}
var err error
for _, fieldEntry := range f.Fields {
records, err = visitFields(name, fieldEntry, records)
if err != nil {
return nil, errors.Wrapf(err, "recursive visiting fields failed (namePrefix: %s)", namePrefix)
}
}
return records, nil
}