fix: localize toml parse errors
This commit is contained in:
@@ -2,7 +2,6 @@ package agents
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -136,7 +135,7 @@ func parseSimpleTOML(input string) (map[string]string, error) {
|
||||
return values, fmt.Errorf("第 %d 行重复字段名 %q", lineNumber, key)
|
||||
}
|
||||
|
||||
value, err := parseTOMLString(raw, scanner)
|
||||
value, err := parseTOMLString(raw, scanner, lineNumber)
|
||||
if err != nil {
|
||||
return values, err
|
||||
}
|
||||
@@ -167,27 +166,27 @@ func isValidBareKey(key string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func parseTOMLString(raw string, scanner *bufio.Scanner) (string, error) {
|
||||
func parseTOMLString(raw string, scanner *bufio.Scanner, lineNumber int) (string, error) {
|
||||
if strings.HasPrefix(raw, `"""`) {
|
||||
block := strings.TrimPrefix(raw, `"""`)
|
||||
for !strings.Contains(block, `"""`) && scanner.Scan() {
|
||||
block += "\n" + scanner.Text()
|
||||
}
|
||||
if !strings.Contains(block, `"""`) {
|
||||
return "", errors.New("未闭合的多行字符串")
|
||||
return "", fmt.Errorf("第 %d 行未闭合的多行字符串", lineNumber)
|
||||
}
|
||||
value, trailing, _ := strings.Cut(block, `"""`)
|
||||
if strings.TrimSpace(trailing) != "" {
|
||||
return "", errors.New("多行字符串后存在不支持的内容")
|
||||
return "", fmt.Errorf("第 %d 行多行字符串后存在不支持的内容", lineNumber)
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
if !strings.HasPrefix(raw, `"`) {
|
||||
return "", errors.New("仅支持字符串字段")
|
||||
return "", fmt.Errorf("第 %d 行仅支持字符串字段", lineNumber)
|
||||
}
|
||||
value, err := strconv.Unquote(raw)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return "", fmt.Errorf("第 %d 行字符串字段语法无效", lineNumber)
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
|
||||
@@ -70,6 +70,7 @@ func TestListAgentsReportsParseError(t *testing.T) {
|
||||
if got[0].ParseStatus != "invalid" || got[0].ParseError == "" {
|
||||
t.Fatalf("expected invalid parse status, got %#v", got[0])
|
||||
}
|
||||
assertChineseTOMLError(t, got[0].ParseError)
|
||||
}
|
||||
|
||||
func TestListAgentsReportsDuplicateKeyAsParseError(t *testing.T) {
|
||||
|
||||
@@ -21,6 +21,7 @@ func TestValidateInvalidTOMLReturnsInvalidAndDoesNotWrite(t *testing.T) {
|
||||
if len(got.Errors) == 0 {
|
||||
t.Fatalf("expected validation errors: %#v", got)
|
||||
}
|
||||
assertChineseTOMLError(t, got.Errors[0])
|
||||
assertFileContent(t, target, `name = "旧名称"`+"\n")
|
||||
}
|
||||
|
||||
@@ -56,6 +57,7 @@ func TestWriteInvalidTOMLRejectsAndLeavesOriginal(t *testing.T) {
|
||||
if err == nil {
|
||||
t.Fatal("expected invalid TOML write to be rejected")
|
||||
}
|
||||
assertChineseTOMLError(t, err.Error())
|
||||
assertFileContent(t, target, `name = "旧名称"`+"\n")
|
||||
}
|
||||
|
||||
@@ -159,3 +161,13 @@ func assertFileContent(t *testing.T, path string, want string) {
|
||||
t.Fatalf("%s content = %q, want %q", path, string(got), want)
|
||||
}
|
||||
}
|
||||
|
||||
func assertChineseTOMLError(t *testing.T, message string) {
|
||||
t.Helper()
|
||||
if strings.Contains(message, "invalid syntax") {
|
||||
t.Fatalf("TOML error leaked English parser text: %q", message)
|
||||
}
|
||||
if !strings.Contains(message, "字符串字段语法无效") {
|
||||
t.Fatalf("TOML error = %q, want Chinese string syntax error", message)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user