use std::fmt::Write as FmtWrite;
use crate::e2e::field_access::{FieldResolver, LeafAnchor};
use crate::e2e::fixture::Assertion;
pub(super) fn try_render(
out: &mut String,
assertion: &Assertion,
result_var: &str,
field: &str,
field_resolver: &FieldResolver,
) -> bool {
match field {
"chunks_have_content" => {
let result_var = &zig_chunks_result_var(field_resolver, result_var);
emit_zig_chunks_predicate(
out,
result_var,
assertion.assertion_type.as_str(),
"c.object.get(\"content\")",
"chunks_have_content",
true,
);
true
}
"chunks_have_heading_context" => {
let result_var = &zig_chunks_result_var(field_resolver, result_var);
emit_zig_chunks_heading_context_predicate(
out,
result_var,
assertion.assertion_type.as_str(),
"chunks_have_heading_context",
false,
);
true
}
"first_chunk_starts_with_heading" => {
let result_var = &zig_chunks_result_var(field_resolver, result_var);
emit_zig_chunks_heading_context_predicate(
out,
result_var,
assertion.assertion_type.as_str(),
"first_chunk_starts_with_heading",
true,
);
true
}
"chunks_have_embeddings" => {
let result_var = &zig_chunks_result_var(field_resolver, result_var);
emit_zig_chunks_predicate(
out,
result_var,
assertion.assertion_type.as_str(),
"c.object.get(\"embedding\")",
"chunks_have_embeddings",
false,
);
true
}
_ => false,
}
}
fn zig_chunks_result_var(field_resolver: &FieldResolver, result_var: &str) -> String {
match field_resolver.anchor_leaf(crate::e2e::codegen::assertion_recipes::CHUNKS_RECIPE) {
Some(LeafAnchor::Prefixed(prefix)) => super::json_path_expr(result_var, &prefix, field_resolver),
_ => result_var.to_string(),
}
}
fn emit_zig_chunks_predicate(
out: &mut String,
result_var: &str,
assertion_type: &str,
chunk_field_accessor: &str,
field_name: &str,
require_non_empty_string: bool,
) {
let _ = writeln!(out, " {{");
let _ = writeln!(out, " const _chunks_opt = {result_var}.object.get(\"chunks\");");
let _ = writeln!(out, " var _all: bool = true;");
let _ = writeln!(out, " if (_chunks_opt) |_chunks_val| {{");
let _ = writeln!(out, " if (_chunks_val == .array) {{");
let _ = writeln!(
out,
" if (_chunks_val.array.items.len == 0) _all = false;"
);
let _ = writeln!(out, " for (_chunks_val.array.items) |c| {{");
let _ = writeln!(out, " if (c != .object) {{ _all = false; break; }}");
let _ = writeln!(out, " const _v = {chunk_field_accessor};");
if require_non_empty_string {
let _ = writeln!(
out,
" if (_v == null or _v.? != .string or _v.?.string.len == 0) {{ _all = false; break; }}"
);
} else {
let _ = writeln!(
out,
" if (_v == null or _v.? == .null) {{ _all = false; break; }}"
);
}
let _ = writeln!(out, " }}");
let _ = writeln!(out, " }} else {{ _all = false; }}");
let _ = writeln!(out, " }} else {{ _all = false; }}");
match assertion_type {
"is_true" => {
let _ = writeln!(out, " try testing.expect(_all);");
}
"is_false" => {
let _ = writeln!(out, " try testing.expect(!_all);");
}
_ => {
let _ = writeln!(
out,
" // skipped: unsupported assertion type on synthetic field '{field_name}'"
);
}
}
let _ = writeln!(out, " }}");
}
fn emit_zig_chunks_heading_context_predicate(
out: &mut String,
result_var: &str,
assertion_type: &str,
field_name: &str,
only_first: bool,
) {
let _ = writeln!(out, " {{");
let _ = writeln!(out, " const _chunks_opt = {result_var}.object.get(\"chunks\");");
let _ = writeln!(out, " var _all: bool = true;");
let _ = writeln!(out, " if (_chunks_opt) |_chunks_val| {{");
let _ = writeln!(out, " if (_chunks_val == .array) {{");
let _ = writeln!(
out,
" if (_chunks_val.array.items.len == 0) _all = false;"
);
let _ = writeln!(out, " for (_chunks_val.array.items) |c| {{");
let _ = writeln!(out, " if (c != .object) {{ _all = false; break; }}");
let _ = writeln!(out, " var _has_heading = false;");
let _ = writeln!(out, " if (c.object.get(\"metadata\")) |_meta| {{");
let _ = writeln!(out, " if (_meta == .object) {{");
let _ = writeln!(
out,
" if (_meta.object.get(\"heading_context\")) |_hc| {{"
);
let _ = writeln!(
out,
" if (_hc != .null) {{ _has_heading = true; }}"
);
let _ = writeln!(out, " }}");
let _ = writeln!(out, " }}");
let _ = writeln!(out, " }}");
let _ = writeln!(out, " if (!_has_heading) {{ _all = false; break; }}");
if only_first {
let _ = writeln!(out, " break;");
}
let _ = writeln!(out, " }}");
let _ = writeln!(out, " }} else {{ _all = false; }}");
let _ = writeln!(out, " }} else {{ _all = false; }}");
match assertion_type {
"is_true" => {
let _ = writeln!(out, " try testing.expect(_all);");
}
"is_false" => {
let _ = writeln!(out, " try testing.expect(!_all);");
}
_ => {
let _ = writeln!(
out,
" // skipped: unsupported assertion type on synthetic field '{field_name}'"
);
}
}
let _ = writeln!(out, " }}");
}