Files
tf_provider/TOOLS/ops-generator/main.go
T
“Naeel” 5da22335ae refactor: rename universal_rebuild/ → provider/
- Rename directory
- Update all 9 devops scripts
- Update 4 generator source files
- Rebuild all binaries
2026-07-05 10:20:04 +04:00

107 lines
2.3 KiB
Go

// ops-generator — генератор per-service operations документации.
package main
import (
"fmt"
"io/fs"
"os"
"path/filepath"
"sort"
"strings"
"gopkg.in/yaml.v3"
"ops-generator/internal/docs"
"ops-generator/internal/types"
)
func main() {
repoRoot, err := findRepoRoot()
if err != nil {
panic(err)
}
yamlDir := strings.TrimSpace(os.Getenv("NUBES_OPS_YAML_DIR"))
if yamlDir == "" {
yamlDir = filepath.Join(repoRoot, "resources_ops_yaml")
}
docsDir := strings.TrimSpace(os.Getenv("NUBES_OPS_DOCS_DIR"))
if docsDir == "" {
root := filepath.Dir(repoRoot)
docsDir = filepath.Join(root, "docs", "30_registry", "resources", "operations")
}
if err := os.MkdirAll(docsDir, 0o755); err != nil {
panic(err)
}
entries := []docs.Entry{}
err = filepath.WalkDir(yamlDir, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() || !strings.HasSuffix(d.Name(), ".yaml") {
return nil
}
b, err := os.ReadFile(path)
if err != nil {
return err
}
var spec types.ServiceOpsSpec
if err := yaml.Unmarshal(b, &spec); err != nil {
return err
}
if spec.ServiceID == 0 || spec.Name == "" {
return nil
}
fileName := fmt.Sprintf("%d_%s.md", spec.ServiceID, docs.Name(spec.Name))
outPath := filepath.Join(docsDir, fileName)
if err := docs.ServiceDoc(outPath, spec); err != nil {
return err
}
entries = append(entries, docs.Entry{
ServiceID: spec.ServiceID,
Name: spec.Name,
File: fileName,
Title: docs.Title(spec),
OpCount: len(spec.Operations),
})
return nil
})
if err != nil {
panic(err)
}
sort.Slice(entries, func(i, j int) bool { return entries[i].ServiceID < entries[j].ServiceID })
if err := docs.Index(filepath.Join(docsDir, "index.md"), entries); err != nil {
panic(err)
}
fmt.Printf("Generated %d operations docs in %s\n", len(entries), docsDir)
}
func findRepoRoot() (string, error) {
wd, err := os.Getwd()
if err != nil {
return "", err
}
current := wd
for i := 0; i < 8; i++ {
candidate := filepath.Join(current, "resources_yaml")
info, err := os.Stat(candidate)
if err == nil && info.IsDir() {
return current, nil
}
parent := filepath.Dir(current)
if parent == current {
break
}
current = parent
}
return "", fmt.Errorf("failed to locate provider repo root")
}