blob: be581304b24ace41ea4f8af39fca6689ad0f1ead [file] [log] [blame]
// Copyright 2018 The Fuchsia 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"
"log"
"os"
"strings"
"fidl/compiler/backend/cmdline"
"fidl/compiler/backend/cpp_libfuzzer"
"fidl/compiler/backend/types"
)
type GenerateFidl interface {
GenerateFidl(fidl types.Root, config *types.Config) error
}
var generators = map[string]GenerateFidl{
"libfuzzer": cpp_libfuzzer.NewFidlGenerator(),
}
func main() {
baseFlags := cmdline.BaseFlags()
validGenerators := make([]string, 0, len(generators))
for name := range generators {
validGenerators = append(validGenerators, name)
}
var generatorNames CommaSeparatedList
flag.Var(&generatorNames, "generators",
fmt.Sprintf(`comma-separated list of names of generators to run
valid generators: %s
for Dart, use the fidlgen_dart executable
for Go, use the fidlgen_go executable
for LLCPP, use the fidlgen_llcpp executable
for Rust, use the fidlgen_rust executable`,
strings.Join(validGenerators, ", ")))
flag.Parse()
if !flag.Parsed() || !baseFlags.Valid() {
flag.PrintDefaults()
os.Exit(1)
}
fidl, err := types.ReadJSONIr(*baseFlags.JsonPath)
if err != nil {
log.Fatal(err)
}
config := baseFlags.Config()
running := 0
results := make(chan error)
didError := false
generatorNames = []string(generatorNames)
for _, generatorName := range generatorNames {
if generator, ok := generators[generatorName]; ok {
running++
go func() {
results <- generator.GenerateFidl(fidl, &config)
}()
} else {
log.Printf("Error: generator %s not found", generatorName)
didError = true
}
}
for running > 0 {
err := <-results
if err != nil {
log.Printf("Error running generator: %v", err)
didError = true
}
running--
}
if didError {
os.Exit(1)
}
}