// Package normalize — утилиты нормализации имён и endpoint'ов. package normalize import "strings" // ServiceName нормализует имя сервиса для использования в именах файлов. func ServiceName(raw string) string { return Identifier(raw) } // OperationName нормализует имя операции в snake_case. func OperationName(raw string) string { return Identifier(raw) } // Identifier конвертирует строку в ASCII snake_case. func Identifier(raw string) string { if strings.TrimSpace(raw) == "" { return "" } var out []rune lastUnderscore := false prevLowerOrDigit := false for _, r := range raw { if r >= 'A' && r <= 'Z' { if prevLowerOrDigit && !lastUnderscore { out = append(out, '_') } out = append(out, r+'a'-'A') lastUnderscore = false prevLowerOrDigit = true continue } if r >= 'a' && r <= 'z' { out = append(out, r) lastUnderscore = false prevLowerOrDigit = true continue } if r >= '0' && r <= '9' { out = append(out, r) lastUnderscore = false prevLowerOrDigit = true continue } if !lastUnderscore && len(out) > 0 { out = append(out, '_') lastUnderscore = true } prevLowerOrDigit = false } result := strings.Trim(string(out), "_") return collapseUnderscores(result) } // APIEndpoint нормализует URL API-эндпоинта (убирает trailing slash). func APIEndpoint(raw string) string { return strings.TrimRight(strings.TrimSpace(raw), "/") } func collapseUnderscores(value string) string { if value == "" { return value } for strings.Contains(value, "__") { value = strings.ReplaceAll(value, "__", "_") } return strings.Trim(value, "_") }