| // 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 |
| } |