This commit is contained in:
2025-05-23 15:11:03 +04:00
parent c86165f88c
commit 92b9c356b8
83 changed files with 450 additions and 810 deletions

View File

@@ -19,7 +19,7 @@ A Go package for parsing and manipulating parameters from text in a key-value fo
```go
import (
"github.com/freeflowuniverse/heroagent/pkg/paramsparser"
"git.ourworld.tf/herocode/heroagent/pkg/paramsparser"
)
// Create a new parser

View File

@@ -4,7 +4,7 @@ package main
import (
"fmt"
"github.com/freeflowuniverse/heroagent/pkg/heroscript/paramsparser"
"git.ourworld.tf/herocode/heroagent/pkg/heroscript/paramsparser"
)
func main() {

View File

@@ -9,7 +9,7 @@ import (
"strconv"
"strings"
"github.com/freeflowuniverse/heroagent/pkg/tools"
"git.ourworld.tf/herocode/heroagent/pkg/tools"
)
// ParamsParser represents a parameter parser that can handle various parameter sources
@@ -32,12 +32,12 @@ func New() *ParamsParser {
func (p *ParamsParser) Parse(input string) error {
// Normalize line endings
input = strings.ReplaceAll(input, "\r\n", "\n")
// Track the current state
var currentKey string
var currentValue strings.Builder
var inMultilineString bool
// Process each line
lines := strings.Split(input, "\n")
for i := 0; i < len(lines); i++ {
@@ -48,12 +48,12 @@ func (p *ParamsParser) Parse(input string) error {
} else {
line = lines[i]
}
// Skip empty lines unless we're in a multiline string
if line == "" && !inMultilineString {
continue
}
// If we're in a multiline string
if inMultilineString {
// Check if this line ends the multiline string
@@ -71,7 +71,7 @@ func (p *ParamsParser) Parse(input string) error {
}
continue
}
// Process the line to extract key-value pairs
var processedPos int
for processedPos < len(line) {
@@ -79,62 +79,62 @@ func (p *ParamsParser) Parse(input string) error {
for processedPos < len(line) && (line[processedPos] == ' ' || line[processedPos] == '\t') {
processedPos++
}
if processedPos >= len(line) {
break
}
// Find the next key by looking for a colon
keyStart := processedPos
colonPos := -1
for j := processedPos; j < len(line); j++ {
if line[j] == ':' {
colonPos = j
break
}
}
if colonPos == -1 {
// No colon found, skip this part
break
}
// Extract key and use NameFix to standardize it
rawKey := strings.TrimSpace(line[keyStart:colonPos])
key := tools.NameFix(rawKey)
if key == "" {
// Invalid key, move past the colon and continue
processedPos = colonPos + 1
continue
}
// Move position past the colon
processedPos = colonPos + 1
if processedPos >= len(line) {
// End of line reached, store empty value
p.params[key] = ""
break
}
// Skip whitespace after the colon
for processedPos < len(line) && (line[processedPos] == ' ' || line[processedPos] == '\t') {
processedPos++
}
if processedPos >= len(line) {
// End of line reached after whitespace, store empty value
p.params[key] = ""
break
}
// Check if the value is quoted
if line[processedPos] == '\'' {
// This is a quoted string
processedPos++ // Skip the opening quote
// Look for the closing quote
quoteEnd := -1
for j := processedPos; j < len(line); j++ {
@@ -144,7 +144,7 @@ func (p *ParamsParser) Parse(input string) error {
break
}
}
if quoteEnd != -1 {
// Single-line quoted string
value := line[processedPos:quoteEnd]
@@ -167,12 +167,12 @@ func (p *ParamsParser) Parse(input string) error {
// This is an unquoted value
valueStart := processedPos
valueEnd := valueStart
// Find the end of the value (space or end of line)
for valueEnd < len(line) && line[valueEnd] != ' ' && line[valueEnd] != '\t' {
valueEnd++
}
value := line[valueStart:valueEnd]
// For unquoted values, use NameFix to standardize them
// This handles the 'without' keyword and other special cases
@@ -181,12 +181,12 @@ func (p *ParamsParser) Parse(input string) error {
}
}
}
// If we're still in a multiline string at the end, that's an error
if inMultilineString {
return errors.New("unterminated multiline string")
}
return nil
}
@@ -196,7 +196,7 @@ func (p *ParamsParser) Parse(input string) error {
func (p *ParamsParser) ParseString(input string) error {
// Trim the input
input = strings.TrimSpace(input)
// Process the input to extract key-value pairs
var processedPos int
for processedPos < len(input) {
@@ -204,62 +204,62 @@ func (p *ParamsParser) ParseString(input string) error {
for processedPos < len(input) && (input[processedPos] == ' ' || input[processedPos] == '\t') {
processedPos++
}
if processedPos >= len(input) {
break
}
// Find the next key by looking for a colon
keyStart := processedPos
colonPos := -1
for j := processedPos; j < len(input); j++ {
if input[j] == ':' {
colonPos = j
break
}
}
if colonPos == -1 {
// No colon found, skip this part
break
}
// Extract key and use NameFix to standardize it
rawKey := strings.TrimSpace(input[keyStart:colonPos])
key := tools.NameFix(rawKey)
if key == "" {
// Invalid key, move past the colon and continue
processedPos = colonPos + 1
continue
}
// Move position past the colon
processedPos = colonPos + 1
if processedPos >= len(input) {
// End of input reached, store empty value
p.params[key] = ""
break
}
// Skip whitespace after the colon
for processedPos < len(input) && (input[processedPos] == ' ' || input[processedPos] == '\t') {
processedPos++
}
if processedPos >= len(input) {
// End of input reached after whitespace, store empty value
p.params[key] = ""
break
}
// Check if the value is quoted
if input[processedPos] == '\'' {
// This is a quoted string
processedPos++ // Skip the opening quote
// Look for the closing quote
quoteEnd := -1
for j := processedPos; j < len(input); j++ {
@@ -269,11 +269,11 @@ func (p *ParamsParser) ParseString(input string) error {
break
}
}
if quoteEnd == -1 {
return errors.New("unterminated quoted string")
}
value := input[processedPos:quoteEnd]
// For quoted values in ParseString, we can apply NameFix
// since this method doesn't handle multiline strings
@@ -286,12 +286,12 @@ func (p *ParamsParser) ParseString(input string) error {
// This is an unquoted value
valueStart := processedPos
valueEnd := valueStart
// Find the end of the value (space or end of input)
for valueEnd < len(input) && input[valueEnd] != ' ' && input[valueEnd] != '\t' {
valueEnd++
}
value := input[valueStart:valueEnd]
// For unquoted values, use NameFix to standardize them
// This handles the 'without' keyword and other special cases
@@ -299,7 +299,7 @@ func (p *ParamsParser) ParseString(input string) error {
processedPos = valueEnd
}
}
return nil
}
@@ -364,7 +364,7 @@ func (p *ParamsParser) GetBool(key string) bool {
if value == "" {
return false
}
// Check for common boolean string representations
value = strings.ToLower(value)
return value == "true" || value == "yes" || value == "1" || value == "on"
@@ -405,17 +405,17 @@ func (p *ParamsParser) Has(key string) bool {
// GetAll returns all parameters as a map
func (p *ParamsParser) GetAll() map[string]string {
result := make(map[string]string)
// First add defaults
for k, v := range p.defaultParams {
result[k] = v
}
// Then override with actual params
for k, v := range p.params {
result[k] = v
}
return result
}