[cli][fix]: fix shell '\n' as true '\n' to support run `moon run cmd/validate -- '{"name":"Alice"}' '{"name":"Bob"}\n{"name":"Eve"}'`.

This commit is contained in:
Betterlol 2026-07-07 17:20:16 +08:00
parent ac01dd81d5
commit fbfb8b9b12
1 changed files with 32 additions and 27 deletions

View File

@ -85,19 +85,25 @@ fn main {
}
///|
fn validate(schema : @moon_zod.Schema, data_raw : String) -> Bool {
let is_jsonl = data_raw.contains("\n")
/// CLI 传入的 \n 是字面量反斜杠+n替换为真正换行符以便分割。
fn normalize_sep(data : String) -> String {
data.replace(old="\\n", new="\n")
}
if is_jsonl {
validate_jsonl(schema, data_raw)
///|
fn validate(schema : @moon_zod.Schema, data_raw : String) -> Bool {
let data = normalize_sep(data_raw)
if data.contains("\n") {
validate_lines(schema, data)
} else {
validate_single(schema, data_raw)
validate_one(schema, data)
}
}
///|
fn validate_single(schema : @moon_zod.Schema, data_raw : String) -> Bool {
let data_json = @json.parse(data_raw) catch {
fn validate_one(schema : @moon_zod.Schema, data : String) -> Bool {
let data_json = @json.parse(data) catch {
_ => {
println("ERROR: invalid data JSON")
return false
@ -120,8 +126,8 @@ fn validate_single(schema : @moon_zod.Schema, data_raw : String) -> Bool {
}
///|
fn validate_jsonl(schema : @moon_zod.Schema, data_raw : String) -> Bool {
let lines = data_raw.split("\n")
fn validate_lines(schema : @moon_zod.Schema, data : String) -> Bool {
let lines = data.split("\n")
let mut pass_count = 0
let mut fail_count = 0
let mut line_num = 0
@ -130,26 +136,25 @@ fn validate_jsonl(schema : @moon_zod.Schema, data_raw : String) -> Bool {
line_num = line_num + 1
let trimmed = line.trim()
if trimmed.is_empty() {
// Skip empty lines
} else {
let data_json = @json.parse(trimmed) catch {
_ => {
println("FAIL: line \{line_num} - invalid JSON")
fail_count = fail_count + 1
continue
}
continue
}
let data_json = @json.parse(trimmed) catch {
_ => {
println("FAIL: line \{line_num} — invalid JSON")
fail_count = fail_count + 1
continue
}
match schema.parse(data_json) {
Ok(_) => pass_count = pass_count + 1
Err(errors) => {
println("FAIL: line \{line_num}")
for e in errors {
println(
" [\{e.path}] \{e.message} (got: \{@debug.to_string(e.got)})",
)
}
fail_count = fail_count + 1
}
match schema.parse(data_json) {
Ok(_) => pass_count = pass_count + 1
Err(errors) => {
println("FAIL: line \{line_num}")
for e in errors {
println(
" [\{e.path}] \{e.message} (got: \{@debug.to_string(e.got)})",
)
}
fail_count = fail_count + 1
}
}
}