use crate::{builders::*, wire::*, FieldNumber};
#[derive(Default, Debug, Clone, Eq, PartialEq, Hash)]
pub struct MsgBuilder {
pub(crate) lens: Vec<(FieldNumber, i32)>,
pub(crate) len_stack: Vec<LenStackEntry>,
pub(crate) encoder: WireEncoder,
}
impl MsgBuilder {
pub fn new() -> MsgBuilder {
Default::default()
}
pub fn start<'a>(&'a mut self, num_len_values: Option<usize>) -> MsgLenBuilder<'a> {
self.lens.clear();
self.len_stack.clear();
self.encoder.buf.clear();
if let Some(num_len_values) = num_len_values {
self.lens.reserve(num_len_values);
self.len_stack.reserve(num_len_values);
}
MsgLenBuilder {
buf: self,
cur_len: 0,
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub(crate) struct LenStackEntry {
pub(crate) len: i32,
pub(crate) t: LenStackType,
pub(crate) len_index: usize,
pub(crate) field_number: FieldNumber,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub(crate) enum LenStackType {
Msg,
Packed,
}