blob: ea4e4575a446b1bad5cab2ca5535c11cd0483817 [file] [log] [blame]
// Copyright 2019 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 rust
import (
"bytes"
_ "embed"
"fmt"
"strings"
"text/template"
"go.fuchsia.dev/fuchsia/tools/fidl/gidl/lib/config"
"go.fuchsia.dev/fuchsia/tools/fidl/gidl/lib/ir"
"go.fuchsia.dev/fuchsia/tools/fidl/gidl/lib/mixer"
"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
)
var (
//go:embed benchmarks.tmpl
benchmarkTmplText string
benchmarkTmpl = template.Must(template.New("benchmarkTmpl").Parse(benchmarkTmplText))
)
type benchmarkTmplInput struct {
NumBenchmarks int
CrateSuffix string
Benchmarks []benchmark
}
type benchmark struct {
Name, ChromeperfPath, HandleDefs, Value, ValueType string
IsResource, EnableSendEventBenchmark, EnableEchoCallBenchmark bool
}
// GenerateBenchmarks generates Rust benchmarks.
func GenerateBenchmarks(gidl ir.All, fidl fidlgen.Root, config config.GeneratorConfig) ([]byte, error) {
schema := mixer.BuildSchema(fidl)
var benchmarks []benchmark
nBenchmarks := 0
for _, gidlBenchmark := range gidl.Benchmark {
decl, err := schema.ExtractDeclaration(gidlBenchmark.Value, gidlBenchmark.HandleDefs)
if err != nil {
return nil, fmt.Errorf("benchmark %s: %s", gidlBenchmark.Name, err)
}
value := visit(gidlBenchmark.Value, decl)
benchmarks = append(benchmarks, benchmark{
Name: benchmarkName(gidlBenchmark.Name),
ChromeperfPath: gidlBenchmark.Name,
HandleDefs: buildHandleDefs(gidlBenchmark.HandleDefs),
Value: value,
ValueType: declName(decl),
IsResource: decl.IsResourceType(),
EnableSendEventBenchmark: gidlBenchmark.EnableSendEventBenchmark,
EnableEchoCallBenchmark: gidlBenchmark.EnableEchoCallBenchmark,
})
nBenchmarks += 3
if gidlBenchmark.EnableSendEventBenchmark {
nBenchmarks++
}
if gidlBenchmark.EnableEchoCallBenchmark {
nBenchmarks++
}
}
input := benchmarkTmplInput{
NumBenchmarks: nBenchmarks,
CrateSuffix: config.RustBenchmarksFidlLibrary,
Benchmarks: benchmarks,
}
var buf bytes.Buffer
err := benchmarkTmpl.Execute(&buf, input)
return buf.Bytes(), err
}
func benchmarkName(gidlName string) string {
return fidlgen.ToSnakeCase(strings.ReplaceAll(gidlName, "/", "_"))
}