github.com/nikron/prototool@v1.3.0/internal/exec/exec.go (about)

     1  // Copyright (c) 2018 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  // Package exec brings all the functionality of Prototool together in a format
    22  // easily consumable by CLI libraries. It is effectively the glue between
    23  // internal/cmd and all other packages.
    24  package exec
    25  
    26  import (
    27  	"io"
    28  
    29  	"go.uber.org/zap"
    30  )
    31  
    32  // ExitError is an error that signals to exit with a certain code.
    33  type ExitError struct {
    34  	Code    int
    35  	Message string
    36  }
    37  
    38  // Error implements error.
    39  func (e *ExitError) Error() string {
    40  	return e.Message
    41  }
    42  
    43  // Runner runs commands.
    44  //
    45  // The args given are the args from the command line.
    46  // Each additional parameter generally refers to a command-specific flag.
    47  type Runner interface {
    48  	Init(args []string, uncomment bool) error
    49  	Create(args []string, pkg string) error
    50  	Version() error
    51  	Download() error
    52  	Clean() error
    53  	Files(args []string) error
    54  	Compile(args []string, dryRun bool) error
    55  	Gen(args []string, dryRun bool) error
    56  	DescriptorProto(args []string) error
    57  	FieldDescriptorProto(args []string) error
    58  	ServiceDescriptorProto(args []string) error
    59  	Lint(args []string, listAllLinters bool, listLinters bool) error
    60  	ListLintGroup(group string) error
    61  	ListAllLintGroups() error
    62  	Format(args []string, overwrite, diffMode, lintMode, fix bool) error
    63  	BinaryToJSON(args []string) error
    64  	JSONToBinary(args []string) error
    65  	All(args []string, disableFormat, disableLint, fix bool) error
    66  	GRPC(args, headers []string, address, method, data, callTimeout, connectTimeout, keepaliveTime string, stdin bool) error
    67  }
    68  
    69  // RunnerOption is an option for a new Runner.
    70  type RunnerOption func(*runner)
    71  
    72  // RunnerWithLogger returns a RunnerOption that uses the given logger.
    73  //
    74  // The default is to use zap.NewNop().
    75  func RunnerWithLogger(logger *zap.Logger) RunnerOption {
    76  	return func(runner *runner) {
    77  		runner.logger = logger
    78  	}
    79  }
    80  
    81  // RunnerWithCachePath returns a RunnerOption that uses the given cache path.
    82  func RunnerWithCachePath(cachePath string) RunnerOption {
    83  	return func(runner *runner) {
    84  		runner.cachePath = cachePath
    85  	}
    86  }
    87  
    88  // RunnerWithConfigData returns a RunnerOption that uses the given config path.
    89  func RunnerWithConfigData(configData string) RunnerOption {
    90  	return func(runner *runner) {
    91  		runner.configData = configData
    92  	}
    93  }
    94  
    95  // RunnerWithJSON returns a RunnerOption that will print failures as JSON.
    96  func RunnerWithJSON() RunnerOption {
    97  	return func(runner *runner) {
    98  		runner.json = true
    99  	}
   100  }
   101  
   102  // RunnerWithPrintFields returns a RunnerOption that uses the given colon-separated
   103  // print fields. The default is filename:line:column:message.
   104  func RunnerWithPrintFields(printFields string) RunnerOption {
   105  	return func(runner *runner) {
   106  		runner.printFields = printFields
   107  	}
   108  }
   109  
   110  // RunnerWithProtocBinPath returns a RunnerOption that uses the given protoc binary path.
   111  func RunnerWithProtocBinPath(protocBinPath string) RunnerOption {
   112  	return func(runner *runner) {
   113  		runner.protocBinPath = protocBinPath
   114  	}
   115  }
   116  
   117  // RunnerWithProtocWKTPath returns a RunnerOption that uses the given path to include the well-known types.
   118  func RunnerWithProtocWKTPath(protocWKTPath string) RunnerOption {
   119  	return func(runner *runner) {
   120  		runner.protocWKTPath = protocWKTPath
   121  	}
   122  }
   123  
   124  // RunnerWithProtocURL returns a RunnerOption that uses the given protoc zip file URL.
   125  func RunnerWithProtocURL(protocURL string) RunnerOption {
   126  	return func(runner *runner) {
   127  		runner.protocURL = protocURL
   128  	}
   129  }
   130  
   131  // NewRunner returns a new Runner.
   132  //
   133  // workDirPath should generally be the current directory.
   134  // input and output generally refer to stdin and stdout.
   135  func NewRunner(workDirPath string, input io.Reader, output io.Writer, options ...RunnerOption) Runner {
   136  	return newRunner(workDirPath, input, output, options...)
   137  }