From eba2e5816e38dfb5c9446dfd72576619f0995d12 Mon Sep 17 00:00:00 2001 From: vedanshbvb Date: Sun, 8 Mar 2026 19:31:36 +0530 Subject: [PATCH 1/5] new file apperr.go --- apperr/apperr.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 apperr/apperr.go diff --git a/apperr/apperr.go b/apperr/apperr.go new file mode 100644 index 0000000..ab8f331 --- /dev/null +++ b/apperr/apperr.go @@ -0,0 +1,62 @@ +package apperr + +import ( + "fmt" + "runtime" +) + +// Component defines where the error occurred +type Component string + +const ( + DataLayer Component = "DataLayer" + LogicLayer Component = "LogicLayer" + APIClient Component = "APIClient" +) + +// AppError is our custom error type +type AppError struct { + Component Component // Where it failed + PublicMessage string // Safe to show to the end-user + OriginalErr error // The actual error that triggered this + File string // Traceback: File name + Line int // Traceback: Line number +} + +// New creates a new AppError and captures the caller's traceback automatically +func New(comp Component, publicMsg string, err error) *AppError { + // runtime.Caller(1) skips this function and gets the file/line of the caller + _, file, line, ok := runtime.Caller(1) + if !ok { + file = "unknown" + line = 0 + } + + return &AppError{ + Component: comp, + PublicMessage: publicMsg, + OriginalErr: err, + File: file, + Line: line, + } +} + +// Error fulfills the standard Go error interface. +// THIS IS FOR YOUR LOGGER: It prints everything, including the traceback. +func (e *AppError) Error() string { + if e.OriginalErr != nil { + return fmt.Sprintf("[%s] %s:%d - %s: %v", e.Component, e.File, e.Line, e.PublicMessage, e.OriginalErr) + } + return fmt.Sprintf("[%s] %s:%d - %s", e.Component, e.File, e.Line, e.PublicMessage) +} + +// Unwrap allows standard library functions like errors.Is and errors.As to work +// by exposing the underlying wrapped error. +func (e *AppError) Unwrap() error { + return e.OriginalErr +} + +// ClientError provides the safe message for the API/CLI response. +func (e *AppError) ClientError() string { + return e.PublicMessage +} \ No newline at end of file From 3acf3beefa7775750c062588715e73970a538c72 Mon Sep 17 00:00:00 2001 From: vedanshbvb Date: Sun, 8 Mar 2026 21:20:50 +0530 Subject: [PATCH 2/5] returning custom error --- apperr/apperr.go | 7 +------ testing/dockertestx/minio_migrate.go | 7 ++++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apperr/apperr.go b/apperr/apperr.go index ab8f331..38b7455 100644 --- a/apperr/apperr.go +++ b/apperr/apperr.go @@ -11,7 +11,7 @@ type Component string const ( DataLayer Component = "DataLayer" LogicLayer Component = "LogicLayer" - APIClient Component = "APIClient" + APILayer Component = "APILayer" ) // AppError is our custom error type @@ -25,7 +25,6 @@ type AppError struct { // New creates a new AppError and captures the caller's traceback automatically func New(comp Component, publicMsg string, err error) *AppError { - // runtime.Caller(1) skips this function and gets the file/line of the caller _, file, line, ok := runtime.Caller(1) if !ok { file = "unknown" @@ -41,8 +40,6 @@ func New(comp Component, publicMsg string, err error) *AppError { } } -// Error fulfills the standard Go error interface. -// THIS IS FOR YOUR LOGGER: It prints everything, including the traceback. func (e *AppError) Error() string { if e.OriginalErr != nil { return fmt.Sprintf("[%s] %s:%d - %s: %v", e.Component, e.File, e.Line, e.PublicMessage, e.OriginalErr) @@ -50,8 +47,6 @@ func (e *AppError) Error() string { return fmt.Sprintf("[%s] %s:%d - %s", e.Component, e.File, e.Line, e.PublicMessage) } -// Unwrap allows standard library functions like errors.Is and errors.As to work -// by exposing the underlying wrapped error. func (e *AppError) Unwrap() error { return e.OriginalErr } diff --git a/testing/dockertestx/minio_migrate.go b/testing/dockertestx/minio_migrate.go index 7cb35b2..013833a 100644 --- a/testing/dockertestx/minio_migrate.go +++ b/testing/dockertestx/minio_migrate.go @@ -8,6 +8,7 @@ import ( "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" + "github.com/raystack/salt/internal/apperr" ) const waitContainerTimeout = 60 * time.Second @@ -56,7 +57,11 @@ func MigrateMinio(minioHost string, bucketName string, opts ...dockerMigrateMini if dm.pool == nil { dm.pool, err = dockertest.NewPool("") if err != nil { - return fmt.Errorf("could not create dockertest pool: %w", err) + return nil, apperr.New( + apperr.DataLayer, + "Could not create dockertest pool", //for user + err, //for logger + ) } } From b79ac8f08ebd9b9ad0c45e9e0ffbb290cf349a13 Mon Sep 17 00:00:00 2001 From: vedanshbvb Date: Sun, 8 Mar 2026 21:44:13 +0530 Subject: [PATCH 3/5] only return error --- testing/dockertestx/minio_migrate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/dockertestx/minio_migrate.go b/testing/dockertestx/minio_migrate.go index 013833a..e11e807 100644 --- a/testing/dockertestx/minio_migrate.go +++ b/testing/dockertestx/minio_migrate.go @@ -57,7 +57,7 @@ func MigrateMinio(minioHost string, bucketName string, opts ...dockerMigrateMini if dm.pool == nil { dm.pool, err = dockertest.NewPool("") if err != nil { - return nil, apperr.New( + return apperr.New( apperr.DataLayer, "Could not create dockertest pool", //for user err, //for logger From ea152ac5e93e98b171a5ec47b583b909db2a2e8c Mon Sep 17 00:00:00 2001 From: vedanshbvb Date: Sun, 8 Mar 2026 21:50:01 +0530 Subject: [PATCH 4/5] fixed import --- testing/dockertestx/minio_migrate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/dockertestx/minio_migrate.go b/testing/dockertestx/minio_migrate.go index e11e807..8625e19 100644 --- a/testing/dockertestx/minio_migrate.go +++ b/testing/dockertestx/minio_migrate.go @@ -8,7 +8,7 @@ import ( "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" - "github.com/raystack/salt/internal/apperr" + "github.com/raystack/salt/apperr" ) const waitContainerTimeout = 60 * time.Second From 5eb719cb67f6d1db50cf18c88200a2be7a5381f6 Mon Sep 17 00:00:00 2001 From: vedanshbvb Date: Sun, 8 Mar 2026 22:27:49 +0530 Subject: [PATCH 5/5] Spacing --- apperr/apperr.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apperr/apperr.go b/apperr/apperr.go index 38b7455..69d86ea 100644 --- a/apperr/apperr.go +++ b/apperr/apperr.go @@ -9,9 +9,9 @@ import ( type Component string const ( - DataLayer Component = "DataLayer" + DataLayer Component = "DataLayer" LogicLayer Component = "LogicLayer" - APILayer Component = "APILayer" + APILayer Component = "APILayer" ) // AppError is our custom error type