use crate::query;
use super::next::j_next;
use super::J;
pub(crate) fn sections_to_json(
query_str: &str,
candidates: &[J],
answers: &[&str],
next: &[Vec<String>],
outcome: query::Outcome,
) -> String {
debug_assert_eq!(
candidates.len(),
answers.len(),
"every candidate carries exactly one answer"
);
let mut out = String::from("{\"schema_version\":");
out.push_str(&query::SCHEMA_VERSION.to_string());
out.push_str(",\"status\":\"sections\",\"query\":");
out.push_str(&J::Str(query_str.to_string()).to_json_string());
out.push_str(",\"sections\":[");
for (i, (candidate, answer)) in candidates.iter().zip(answers).enumerate() {
debug_assert!(
answer.starts_with('{') && answer.ends_with('}'),
"a section answer must be exactly one top-level object: {answer}"
);
if i > 0 {
out.push(',');
}
out.push_str("{\"pick\":");
out.push_str(&(i + 1).to_string());
out.push_str(",\"candidate\":");
out.push_str(&candidate.to_json_string());
out.push_str(",\"answer\":");
out.push_str(answer);
out.push('}');
}
out.push_str("],\"next\":");
out.push_str(&j_next(next).to_json_string());
out.push_str(",\"outcome\":");
out.push_str(&J::Str(outcome.as_str().to_string()).to_json_string());
out.push('}');
out
}