spogo/internal/app/errors.go
2026-01-03 01:02:42 +01:00

68 lines
996 B
Go

package app
import (
"errors"
"fmt"
"net"
"github.com/alecthomas/kong"
"github.com/steipete/spogo/internal/spotify"
)
type ExitError struct {
Code int
Err error
}
func (e ExitError) Error() string {
if e.Err == nil {
return fmt.Sprintf("exit %d", e.Code)
}
return e.Err.Error()
}
func (e ExitError) Unwrap() error {
return e.Err
}
func WrapExit(code int, err error) error {
if err == nil {
return nil
}
return ExitError{Code: code, Err: err}
}
func ExitCode(err error) int {
if err == nil {
return 0
}
var exitErr ExitError
if errors.As(err, &exitErr) {
if exitErr.Code != 0 {
return exitErr.Code
}
}
var parseErr *kong.ParseError
if errors.As(err, &parseErr) {
return 2
}
var apiErr spotify.APIError
if errors.As(err, &apiErr) {
switch apiErr.Status {
case 401, 403:
return 3
default:
return 1
}
}
if isNetErr(err) {
return 4
}
return 1
}
func isNetErr(err error) bool {
var netErr net.Error
return errors.As(err, &netErr)
}