package aiprovider import ( "errors" "github.com/descrybe/descrybe-v2/apps/api/internal/security" ) // clientError is a validation message safe to return to API clients. type clientError struct { msg string } func (e *clientError) Error() string { return e.msg } // ClientMsg marks a message as safe to expose in HTTP 4xx responses. func ClientMsg(msg string) error { return &clientError{msg: msg} } // ClientError reports whether err is a known client-facing AI provider error. func ClientError(err error) (msg string, ok bool) { if err == nil { return "", false } var ce *clientError if errors.As(err, &ce) { return ce.msg, true } switch { case errors.Is(err, ErrNotConfigured), errors.Is(err, ErrInvalidMode), errors.Is(err, ErrInvalidPopular), errors.Is(err, ErrMissingAPIKey), errors.Is(err, ErrMissingModel), errors.Is(err, ErrMissingURL): return err.Error(), true case errors.Is(err, security.ErrInvalidURL), errors.Is(err, security.ErrBlockedURL), errors.Is(err, security.ErrBlockedHost): return "invalid base_url", true default: return "", false } }