use nodedb_types::Value;
use crate::bridge::envelope::{ErrorCode, Response};
use crate::data::executor::core_loop::CoreLoop;
use crate::data::executor::task::ExecutionTask;
pub(super) fn encode_value_rows(core: &CoreLoop, task: &ExecutionTask, rows: &[Value]) -> Response {
let mut buf: Vec<u8> = Vec::with_capacity(rows.len() * 64);
write_array_header(&mut buf, rows.len());
for row in rows {
match nodedb_types::value_to_msgpack(row) {
Ok(b) => buf.extend_from_slice(&b),
Err(e) => {
return core.response_error(
task,
ErrorCode::Internal {
detail: format!("array response encode: {e}"),
},
);
}
}
}
core.response_with_payload(task, buf)
}
fn write_array_header(buf: &mut Vec<u8>, len: usize) {
if len < 16 {
buf.push(0x90 | len as u8);
} else if len <= u16::MAX as usize {
buf.push(0xDC);
buf.extend_from_slice(&(len as u16).to_be_bytes());
} else {
buf.push(0xDD);
buf.extend_from_slice(&(len as u32).to_be_bytes());
}
}