util

package
v0.4.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 29, 2026 License: MIT Imports: 14 Imported by: 0

Documentation

Overview

Package util provides generic, reusable string and formatting helpers. This file contains pure string-truncation utilities only; session-ID formatting lives in session.go, and secret/security truncation lives in the sanitize package.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ClientAddr added in v0.4.6

func ClientAddr(addr string) string

ClientAddr returns a client-friendly address from a listener address. When the host is a wildcard (empty, 0.0.0.0, ::, or [::]), it substitutes "localhost" so the printed address is usable from a client. Use this when a resolvable hostname is required (e.g. for GH_HOST with the gh CLI). For gateway output URLs where a numeric loopback address is preferred, use ClientHost.

func ClientHost added in v0.4.7

func ClientHost(host string) string

ClientHost returns a client-friendly hostname from a listener host string. When the host is a wildcard (empty, 0.0.0.0, ::, or [::]), it returns "127.0.0.1" so the address is usable in client-facing URLs. Use ClientAddr when you need to operate on a full host:port string.

func CopyTrimmedStringIntMap

func CopyTrimmedStringIntMap(input map[string]int) map[string]int

CopyTrimmedStringIntMap returns a defensive copy of a string→int map with whitespace trimmed from all keys.

func DeduplicateStrings

func DeduplicateStrings(input []string, sorted bool) []string

DeduplicateStrings returns a new slice with whitespace-trimmed, empty, and duplicate entries removed from input. When sorted is true the result is sorted in ascending order. The relative order of first-seen entries is preserved when sorted is false.

func DeepCloneJSON

func DeepCloneJSON(v any) any

DeepCloneJSON creates a deep copy of a JSON-compatible value. It handles the three container types used by encoding/json: map[string]any (JSON objects), []any (JSON arrays), and any other type (JSON scalars: string, float64, bool, nil), which is returned as-is since scalar values are not reference types and need no cloning.

func FormatDuration

func FormatDuration(d time.Duration) string

FormatDuration formats a duration for display like the debug npm package. It provides granular formatting from nanoseconds to hours.

func FormatFutureTime

func FormatFutureTime(t time.Time) string

FormatFutureTime returns a human-readable representation of a future time, combining an RFC3339 timestamp with a relative countdown (e.g. "2026-05-03T12:00:00Z (in 5.0m)"). Returns "unknown" when t is the zero value.

func FormatSessionIDForLog added in v0.4.0

func FormatSessionIDForLog(sessionID string) string

FormatSessionIDForLog returns a log-safe session ID representation. Empty session IDs are rendered as "(none)"; non-empty IDs are truncated to the first 8 bytes with an ellipsis when needed.

func GetStringFromMap

func GetStringFromMap(m map[string]any, keys ...string) string

GetStringFromMap returns the first non-empty string value found for any of the given keys in m. For each key, the value must be present, typed as string, and non-empty to be returned. Returns an empty string when no matching non-empty string value is found, when the map is nil, or when no keys are provided.

With a single key the behaviour is equivalent to `v, _ := m[key].(string)`:

GetStringFromMap(m, "owner")

With multiple keys the function returns the first non-empty match, which is useful for maps that may use either snake_case or camelCase field names:

GetStringFromMap(m, "html_url", "htmlUrl")

func InterfaceToIntString

func InterfaceToIntString(v any) (string, bool)

InterfaceToIntString attempts to convert a JSON-decoded numeric value (float64 or json.Number) to its decimal integer string representation. Returns ("", false) if the value is not a numeric type or is non-integer.

func NormalizeStringCI added in v0.4.6

func NormalizeStringCI(value string) string

NormalizeStringCI trims surrounding whitespace and lowercases a string for case-insensitive comparisons.

func ParseServerIDFromToolName added in v0.4.3

func ParseServerIDFromToolName(toolName string) string

ParseServerIDFromToolName extracts the server ID prefix from a prefixed tool name of the form "<serverID>___<toolName>". If the tool name contains no separator, or the server ID portion is empty, the full toolName is returned.

This is the canonical parser for the prefixed tool-name format defined in the server package. Both middleware and other consumers should use this function instead of duplicating the string-splitting logic.

func RandomBigInt added in v0.4.6

func RandomBigInt(bits uint) (*big.Int, error)

RandomBigInt returns a cryptographically random non-negative integer with the given bit width. The result is guaranteed to be strictly positive (≥ 1). This centralises crypto/rand.Int usage for callers that need a *big.Int (e.g. X.509 certificate serial numbers).

func RandomBytes

func RandomBytes(n int) ([]byte, error)

RandomBytes returns n cryptographically random bytes.

func RandomHex

func RandomHex(n int) (string, error)

RandomHex returns a hex-encoded string of n cryptographically random bytes. The returned string has length 2*n.

func RandomHexWithFallback

func RandomHexWithFallback(n int) string

RandomHexWithFallback returns a hex-encoded string of n random bytes. On the normal path it returns the same output as RandomHex(n) — a string of length 2*n containing cryptographically random hex characters. If crypto/rand is unavailable, it falls back to a hex-encoded pid+nanosecond value that is unique within a single process run. The fallback is non-cryptographic and should only arise in unusual runtime environments; it always produces a 32-character hex string (16 bytes), regardless of n. For the typical call site (n == 16) the fallback output length matches the normal output length.

func SortedSetKeys

func SortedSetKeys(set map[string]struct{}) []string

SortedSetKeys returns the keys of a string set (map[string]struct{}) as a sorted slice. Returns an empty (non-nil) slice when the set is empty.

func StringsToAny

func StringsToAny(input []string) []any

StringsToAny converts a []string to []any.

func Truncate

func Truncate(s string, maxLen int) string

Truncate truncates a string to the specified maximum length. If the string is longer than maxLen, it's truncated and "..." is appended. If maxLen is 0, returns "..." for non-empty strings, empty string for empty strings. If maxLen is negative, the original string is returned.

func TruncateRunes

func TruncateRunes(s string, maxRunes int) string

TruncateRunes truncates s to at most maxRunes Unicode code points (runes). Unlike Truncate, which counts bytes, TruncateRunes is safe for non-ASCII content (e.g. emoji, CJK characters). If maxRunes is 0 or negative, returns an empty string.

Performance: avoids allocating a []rune slice in the common "no truncation needed" case by using a three-stage check:

  1. If len(s) <= maxRunes (bytes), there are definitely <= maxRunes runes (each rune is at least 1 byte), so return s immediately with zero allocation.
  2. Otherwise count runes via utf8.RuneCountInString; if the count fits, return s.
  3. Only when truncation is required, walk the string byte-by-byte to find the cut point, avoiding the O(n) []rune allocation entirely.

func TruncateWithSuffix

func TruncateWithSuffix(s string, maxLen int, suffix string) string

TruncateWithSuffix truncates a string to the specified maximum length with a custom suffix. If the string is longer than maxLen, it's truncated and suffix is appended. If maxLen is 0 or negative, the original string is returned.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL