gogcli/internal/cmd/gmail_labels_utils.go
2026-01-08 09:34:05 +01:00

97 lines
2.0 KiB
Go

package cmd
import (
"errors"
"net/http"
"strings"
"google.golang.org/api/gmail/v1"
"google.golang.org/api/googleapi"
)
func resolveLabelIDs(labels []string, nameToID map[string]string) []string {
if len(labels) == 0 {
return nil
}
out := make([]string, 0, len(labels))
for _, label := range labels {
trimmed := strings.TrimSpace(label)
if trimmed == "" {
continue
}
if nameToID != nil {
if id, ok := nameToID[strings.ToLower(trimmed)]; ok {
out = append(out, id)
continue
}
}
out = append(out, trimmed)
}
return out
}
func ensureLabelNameAvailable(svc *gmail.Service, name string) error {
idMap, err := fetchLabelNameToID(svc)
if err != nil {
return err
}
if _, ok := idMap[strings.ToLower(name)]; ok {
return usagef("label already exists: %s", name)
}
return nil
}
func mapLabelCreateError(err error, name string) error {
if err == nil {
return nil
}
if isDuplicateLabelError(err) {
return usagef("label already exists: %s", name)
}
return err
}
func isDuplicateLabelError(err error) bool {
var gerr *googleapi.Error
if errors.As(err, &gerr) {
if gerr.Code == http.StatusConflict {
if labelAlreadyExistsMessage(gerr.Message) {
return true
}
for _, item := range gerr.Errors {
if labelAlreadyExistsMessage(item.Message) || labelDuplicateReason(item.Reason) {
return true
}
}
}
if labelAlreadyExistsMessage(gerr.Message) {
return true
}
for _, item := range gerr.Errors {
if labelAlreadyExistsMessage(item.Message) || labelDuplicateReason(item.Reason) {
return true
}
}
}
return labelAlreadyExistsMessage(err.Error())
}
func labelAlreadyExistsMessage(msg string) bool {
low := strings.ToLower(msg)
if !strings.Contains(low, "label") {
return false
}
return strings.Contains(low, "name exists") ||
strings.Contains(low, "already exists") ||
strings.Contains(low, "duplicate")
}
func labelDuplicateReason(reason string) bool {
switch strings.ToLower(strings.TrimSpace(reason)) {
case "duplicate", "alreadyexists":
return true
default:
return false
}
}