// Copyright 2026 Google LLC // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package util import ( "errors" "fmt" "net/http" "google.golang.org/api/googleapi" ) type ErrorCategory string const ( CategoryAgent ErrorCategory = "AGENT_ERROR" CategoryServer ErrorCategory = "SERVER_ERROR" ) // ToolboxError is the interface all custom errors must satisfy type ToolboxError interface { error Category() ErrorCategory Error() string Unwrap() error } // Agent Errors return 200 to the sender type AgentError struct { Msg string Cause error } var _ ToolboxError = &AgentError{} func (e *AgentError) Error() string { return e.Msg } func (e *AgentError) Category() ErrorCategory { return CategoryAgent } func (e *AgentError) Unwrap() error { return e.Cause } func NewAgentError(msg string, cause error) *AgentError { return &AgentError{Msg: msg, Cause: cause} } var _ ToolboxError = &AgentError{} // ClientServerError returns 4XX/5XX error code type ClientServerError struct { Msg string Code int Cause error } var _ ToolboxError = &ClientServerError{} func (e *ClientServerError) Error() string { return fmt.Sprintf("%s: %v", e.Msg, e.Cause) } func (e *ClientServerError) Category() ErrorCategory { return CategoryServer } func (e *ClientServerError) Unwrap() error { return e.Cause } func NewClientServerError(msg string, code int, cause error) *ClientServerError { return &ClientServerError{Msg: msg, Code: code, Cause: cause} } func ProecessGcpError(err error) ToolboxError { var gErr *googleapi.Error if errors.As(err, &gErr) { if gErr.Code == 401 { return NewClientServerError( "failed to access GCP resource", http.StatusUnauthorized, err, ) } if gErr.Code == 403 { return NewClientServerError( "failed to access GCP resource", http.StatusForbidden, err, ) } } return NewAgentError("error processing GCP request", err) }