| // Copyright 2020 The ChromiumOS Authors |
| // 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) |
| } |