| |
| package googleapi |
|
|
| import ( |
| "encoding/json" |
| "fmt" |
| "strings" |
| ) |
|
|
| |
| type ErrorResponse struct { |
| Error ErrorDetail `json:"error"` |
| } |
|
|
| |
| type ErrorDetail struct { |
| Code int `json:"code"` |
| Message string `json:"message"` |
| Status string `json:"status"` |
| Details []json.RawMessage `json:"details,omitempty"` |
| } |
|
|
| |
| type ErrorDetailInfo struct { |
| Type string `json:"@type"` |
| Reason string `json:"reason,omitempty"` |
| Domain string `json:"domain,omitempty"` |
| Metadata map[string]string `json:"metadata,omitempty"` |
| } |
|
|
| |
| type ErrorHelp struct { |
| Type string `json:"@type"` |
| Links []HelpLink `json:"links,omitempty"` |
| } |
|
|
| |
| type HelpLink struct { |
| Description string `json:"description"` |
| URL string `json:"url"` |
| } |
|
|
| |
| func ParseError(body string) (*ErrorResponse, error) { |
| var errResp ErrorResponse |
| if err := json.Unmarshal([]byte(body), &errResp); err != nil { |
| return nil, fmt.Errorf("failed to parse error response: %w", err) |
| } |
| return &errResp, nil |
| } |
|
|
| |
| func ExtractActivationURL(body string) string { |
| var errResp ErrorResponse |
| if err := json.Unmarshal([]byte(body), &errResp); err != nil { |
| return "" |
| } |
|
|
| |
| for _, detailRaw := range errResp.Error.Details { |
| |
| var info ErrorDetailInfo |
| if err := json.Unmarshal(detailRaw, &info); err == nil { |
| if info.Metadata != nil { |
| if activationURL, ok := info.Metadata["activationUrl"]; ok && activationURL != "" { |
| return activationURL |
| } |
| } |
| } |
|
|
| |
| var help ErrorHelp |
| if err := json.Unmarshal(detailRaw, &help); err == nil { |
| for _, link := range help.Links { |
| if strings.Contains(link.Description, "activation") || |
| strings.Contains(link.Description, "API activation") || |
| strings.Contains(link.URL, "/apis/api/") { |
| return link.URL |
| } |
| } |
| } |
| } |
|
|
| return "" |
| } |
|
|
| |
| func IsServiceDisabledError(body string) bool { |
| var errResp ErrorResponse |
| if err := json.Unmarshal([]byte(body), &errResp); err != nil { |
| return false |
| } |
|
|
| |
| if errResp.Error.Code != 403 || errResp.Error.Status != "PERMISSION_DENIED" { |
| return false |
| } |
|
|
| for _, detailRaw := range errResp.Error.Details { |
| var info ErrorDetailInfo |
| if err := json.Unmarshal(detailRaw, &info); err == nil { |
| if info.Reason == "SERVICE_DISABLED" { |
| return true |
| } |
| } |
| } |
|
|
| return false |
| } |
|
|