| // Copyright 2020 The Chromium 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 cli |
| |
| import ( |
| "context" |
| "os" |
| |
| "google.golang.org/protobuf/encoding/protojson" |
| |
| "github.com/maruel/subcommands" |
| "go.chromium.org/luci/common/logging" |
| |
| "infra/tools/dirmd" |
| ) |
| |
| // baseCommandRun provides common command run functionality. |
| // All dirmd subcommands must embed it directly or indirectly. |
| type baseCommandRun struct { |
| subcommands.CommandRunBase |
| |
| // out is the filename for the output. |
| // Special value "-" means stdout. |
| out string |
| } |
| |
| func (r *baseCommandRun) RegisterOutputFlag() { |
| r.Flags.StringVar(&r.out, "out", "-", `Path to the output file. If "-", then print the output to stdout`) |
| } |
| |
| func (r *baseCommandRun) done(ctx context.Context, err error) int { |
| if err != nil { |
| logging.Errorf(ctx, "%s", err) |
| return 1 |
| } |
| return 0 |
| } |
| |
| func (r *baseCommandRun) writeMapping(m *dirmd.Mapping) error { |
| data, err := protojson.Marshal(m.Proto()) |
| if err != nil { |
| return err |
| } |
| |
| return r.writeTextOutput(data) |
| } |
| |
| func (r *baseCommandRun) writeTextOutput(data []byte) error { |
| out := os.Stdout |
| if r.out != "-" { |
| var err error |
| if out, err = os.Create(r.out); err != nil { |
| return err |
| } |
| defer out.Close() |
| } |
| if _, err := out.Write(data); err != nil { |
| return err |
| } |
| |
| if len(data) > 0 && data[len(data)-1] != '\n' { |
| out.WriteString("\n") |
| } |
| return nil |
| } |