blob: 4cc3b5bee9fe615b2386917602d93e501163d65a [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"path"
"strings"
"go.chromium.org/luci/lucicfg/docgen"
)
// Returns a func which returns the contents of a Starlark module relative to
// starlarkRoot.
//
// Some modules are skipped, e.g. "@stdlib" modules.
func getSourceFn(starlarkRoot string) func(string) (string, error) {
return func(module string) (string, error) {
if strings.HasPrefix(module, "@stdlib") || strings.HasPrefix(module, "@proto") {
log.Printf("Skipping module %v", module)
return "", nil
}
if !strings.HasPrefix(module, "//") {
return "", fmt.Errorf("Expected module to start with '//', actual %v", module)
}
log.Printf("Reading module %v\n", module)
fileBytes, err := ioutil.ReadFile(
path.Join(
starlarkRoot,
strings.TrimLeft(module, "/"),
),
)
if err != nil {
return "", err
}
return string(fileBytes), nil
}
}
func main() {
template := flag.String("template", "", "Path to a markdown template file. Required.")
output := flag.String("output", "", "Path to output a markdown file to. Required.")
starlarkRoot := flag.String(
"starlarkRoot",
"",
"Path to the root of the Starlark package. This is the directory "+
"load statements are relative to, i.e. if //config/util/liba.star "+
"is pointing to ~/chromiumos/src/config/util/liba.star, "+
"starlarkRoot is ~/chromiumos/src. Required.",
)
flag.Parse()
if len(*template) == 0 {
log.Fatalln("template must be specified.")
}
if len(*output) == 0 {
log.Fatalln("output must be specified.")
}
if len(*starlarkRoot) == 0 {
log.Fatalln("starlarkRoot must be specified.")
}
templateBytes, err := ioutil.ReadFile(*template)
if err != nil {
log.Fatalln(err)
}
generator := &docgen.Generator{Starlark: getSourceFn(*starlarkRoot)}
outputBytes, err := generator.Render(string(templateBytes))
if err != nil {
log.Fatalln(err)
}
if err = ioutil.WriteFile(*output, outputBytes, 0640); err != nil {
log.Fatalln(err)
}
log.Printf("Wrote output to %v\n", *output)
}