blob: 0a912c406fa87ccb93391483484d85e1dd423edf [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"encoding/json"
"errors"
"fmt"
"os"
"github.com/maruel/subcommands"
"go.fuchsia.dev/infra/cmd/size_check/sizes"
)
func cmdBudgets() *subcommands.Command {
return &subcommands.Command{
UsageLine: "budgets -binary-sizes-json-input <binary-sizes-json-input>",
ShortDesc: "Check if input binary sizes object exceeds one or more budgets.",
LongDesc: "Check if input binary sizes object exceeds one or more budgets.",
CommandRun: func() subcommands.CommandRun {
c := &budgetsRun{}
c.Init()
return c
},
}
}
type budgetsRun struct {
subcommands.CommandRunBase
binarySizesJSONInput string
}
func (c *budgetsRun) Init() {
c.Flags.StringVar(&c.binarySizesJSONInput, "binary-sizes-json-input", "", "Path for input binary sizes object as JSON.")
}
func (c *budgetsRun) Parse() error {
if c.binarySizesJSONInput == "" {
return errors.New("-binary-sizes-json-input is required")
}
return nil
}
func (c *budgetsRun) main() error {
jsonInput, err := os.ReadFile(c.binarySizesJSONInput)
if err != nil {
return err
}
var rawBinarySizes map[string]any
if err := json.Unmarshal(jsonInput, &rawBinarySizes); err != nil {
return err
}
binarySizes, err := sizes.Parse(rawBinarySizes)
if err != nil {
return err
}
for component, metadata := range binarySizes {
if metadata.Size > metadata.Budget {
return fmt.Errorf("%q size exceeds budget by %d bytes", component, metadata.Size-metadata.Budget)
}
}
return nil
}
func (c *budgetsRun) Run(a subcommands.Application, args []string, env subcommands.Env) int {
if err := c.Parse(); err != nil {
fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err)
return 1
}
if err := c.main(); err != nil {
fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err)
return 1
}
return 0
}