mirror of
https://github.com/zap-proto/zip.git
synced 2026-10-19 15:38:57 +00:00
- Add App.RustSDK() for full ZAP-native self-documenting Rust SDK with rustdoc - Add App.CppSDK() for modern C++20 self-documenting SDK with Doxygen - Add App.RustMCP() and App.CppMCP() for native Model Context Protocol tools & servers - Add App.DocsMarkdown() for @hanzo/docs MDX pages with Go/Rust/C++ tabbed snippets - Add cmd/zipgen CLI tool for sdk, mcp, and docs generation
36 lines
748 B
Go
36 lines
748 B
Go
package zip
|
|
|
|
import "strings"
|
|
|
|
func snakeCase(s string) string {
|
|
var b strings.Builder
|
|
runes := []rune(s)
|
|
n := len(runes)
|
|
for i := 0; i < n; i++ {
|
|
r := runes[i]
|
|
if r >= 'A' && r <= 'Z' {
|
|
if i > 0 {
|
|
prev := runes[i-1]
|
|
next := rune(0)
|
|
if i+1 < n {
|
|
next = runes[i+1]
|
|
}
|
|
if (prev >= 'a' && prev <= 'z') || (prev >= '0' && prev <= '9') ||
|
|
(prev >= 'A' && prev <= 'Z' && next >= 'a' && next <= 'z') {
|
|
b.WriteByte('_')
|
|
}
|
|
}
|
|
b.WriteRune(r + ('a' - 'A'))
|
|
} else if r == '-' || r == '.' || r == '/' || r == '_' {
|
|
b.WriteByte('_')
|
|
} else {
|
|
b.WriteRune(r)
|
|
}
|
|
}
|
|
res := b.String()
|
|
for strings.Contains(res, "__") {
|
|
res = strings.ReplaceAll(res, "__", "_")
|
|
}
|
|
return strings.Trim(res, "_")
|
|
}
|