From 556ad3398ed536479b8a1459d2f4a242865308af Mon Sep 17 00:00:00 2001 From: Kenji Shimizu Date: Mon, 28 Jun 2021 23:13:19 +0900 Subject: [PATCH] improve error handling --- cmd/s3select/main.go | 12 ++++++++---- pkg/cli/errors.go | 7 +++++++ pkg/query/object_selector.go | 9 +++++---- 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 pkg/cli/errors.go diff --git a/cmd/s3select/main.go b/cmd/s3select/main.go index 67aaf6c..236cb9e 100644 --- a/cmd/s3select/main.go +++ b/cmd/s3select/main.go @@ -1,6 +1,7 @@ package main import ( + "errors" "fmt" "os" @@ -15,10 +16,7 @@ const ( // Errors start at 10 ExitCodeError = 10 + iota - ExitCodeParseFlagsError - ExitCodeLoggerError - ExitCodeCloudError - ExitCodeObjectListingError + ExitCodeInitializeError ) func main() { @@ -36,14 +34,20 @@ func run(args []string) int { logger, err := log.New(logLevel) if err != nil { fmt.Fprintf(os.Stderr, "failed to generate logger: %s", err.Error()) + return ExitCodeInitializeError } cliFactory, err := cli.NewFactory(buildVersion, logger) if err != nil { fmt.Fprintf(os.Stderr, "failed to initialize process: %s", err.Error()) + return ExitCodeInitializeError } rootCmd := root.NewCmdRoot(cliFactory, buildVersion, buildDate) if _, err := rootCmd.ExecuteC(); err != nil { + switch { + case errors.Is(err, cli.ValidateConfigError): + // advice for configuration + } fmt.Fprintln(os.Stderr, err.Error()) } diff --git a/pkg/cli/errors.go b/pkg/cli/errors.go new file mode 100644 index 0000000..575a019 --- /dev/null +++ b/pkg/cli/errors.go @@ -0,0 +1,7 @@ +package cli + +import "errors" + +var ( + ValidateConfigError = errors.New("ValidateConfigError") +) diff --git a/pkg/query/object_selector.go b/pkg/query/object_selector.go index c9578e3..12b8f9a 100644 --- a/pkg/query/object_selector.go +++ b/pkg/query/object_selector.go @@ -5,14 +5,15 @@ import ( "io" "github.com/44smkn/s3select/pkg/aws" + "github.com/44smkn/s3select/pkg/cli" "github.com/44smkn/s3select/pkg/config" awssdk "github.com/aws/aws-sdk-go/aws" awsclient "github.com/aws/aws-sdk-go/aws/client" awsrequest "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/service/s3" s3sdk "github.com/aws/aws-sdk-go/service/s3" + "github.com/pkg/errors" "go.uber.org/zap" - "golang.org/x/xerrors" ) type ObjectSelector interface { @@ -64,7 +65,7 @@ func (s defaultObjectSelector) Select(ctx context.Context, meta *ObjectMetadata, r.Handlers.Send.RemoveByName(awsclient.LogHTTPResponseHeaderHandler.Name) }) if err != nil { - return xerrors.Errorf("failed to execute s3api: %w", err) + return errors.Errorf("failed to execute s3api: %w", err) } defer resp.EventStream.Close() @@ -100,7 +101,7 @@ func newInputSerialization(cfg *config.InputSerialization) (*s3sdk.InputSerializ }, }, nil default: - return nil, xerrors.New("choose a input format type from: [json, csv]") + return nil, errors.Errorf("choose a input format type from: [json, csv]: %w", cli.ValidateConfigError) } } @@ -123,6 +124,6 @@ func newOutputSerialization(cfg *config.OutputSerialization) (*s3sdk.OutputSeria }, }, nil default: - return nil, xerrors.New("choose a output format type from: [json, csv]") + return nil, errors.Errorf("choose a output format type from: [json, csv]: %w", cli.ValidateConfigError) } }