59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package httpapp
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// parseSizeString parses a human-readable size string to bytes
|
|
func (a *App) parseSizeString(sizeStr string) (uint64, error) {
|
|
sizeStr = strings.TrimSpace(strings.ToUpper(sizeStr))
|
|
if sizeStr == "" {
|
|
return 0, fmt.Errorf("size cannot be empty")
|
|
}
|
|
|
|
// Extract number and unit
|
|
var numStr string
|
|
var unit string
|
|
|
|
for i, r := range sizeStr {
|
|
if r >= '0' && r <= '9' {
|
|
numStr += string(r)
|
|
} else {
|
|
unit = sizeStr[i:]
|
|
break
|
|
}
|
|
}
|
|
|
|
if numStr == "" {
|
|
return 0, fmt.Errorf("invalid size format: no number found")
|
|
}
|
|
|
|
num, err := strconv.ParseUint(numStr, 10, 64)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("invalid size number: %w", err)
|
|
}
|
|
|
|
// Convert to bytes based on unit
|
|
multiplier := uint64(1)
|
|
switch unit {
|
|
case "":
|
|
multiplier = 1
|
|
case "K", "KB":
|
|
multiplier = 1024
|
|
case "M", "MB":
|
|
multiplier = 1024 * 1024
|
|
case "G", "GB":
|
|
multiplier = 1024 * 1024 * 1024
|
|
case "T", "TB":
|
|
multiplier = 1024 * 1024 * 1024 * 1024
|
|
case "P", "PB":
|
|
multiplier = 1024 * 1024 * 1024 * 1024 * 1024
|
|
default:
|
|
return 0, fmt.Errorf("invalid size unit: %s (allowed: K, M, G, T, P)", unit)
|
|
}
|
|
|
|
return num * multiplier, nil
|
|
}
|