pub const WT_VARINT: u32 = 0;
pub const WT_I64: u32 = 1;
pub const WT_LEN: u32 = 2;
pub const WT_START_GROUP: u32 = 3;
pub const WT_END_GROUP: u32 = 4;
pub const WT_I32: u32 = 5;
#[inline]
pub fn write_varint(value: u64, buf: &mut Vec<u8>) {
let mut v = value;
loop {
let b = (v & 0x7f) as u8;
v >>= 7;
if v != 0 {
buf.push(b | 0x80);
} else {
buf.push(b);
break;
}
}
}
#[inline]
pub fn write_tag(field_number: u32, wire_type: u32, buf: &mut Vec<u8>) {
write_varint(((field_number as u64) << 3) | (wire_type as u64), buf);
}
#[inline]
pub fn write_varint_field(field_number: u32, value: u64, buf: &mut Vec<u8>) {
write_tag(field_number, WT_VARINT, buf);
write_varint(value, buf);
}
#[inline]
pub fn write_bool_field(field_number: u32, value: bool, buf: &mut Vec<u8>) {
if value {
write_tag(field_number, WT_VARINT, buf);
buf.push(1u8);
}
}
#[inline]
pub fn write_opt_varint_field(field_number: u32, value: Option<u64>, buf: &mut Vec<u8>) {
if let Some(v) = value {
write_varint_field(field_number, v, buf);
}
}
#[inline]
pub fn write_len_field(field_number: u32, data: &[u8], buf: &mut Vec<u8>) {
write_tag(field_number, WT_LEN, buf);
write_varint(data.len() as u64, buf);
buf.extend_from_slice(data);
}
pub fn write_fixed32_field(field_number: u32, value: u32, buf: &mut Vec<u8>) {
write_tag(field_number, WT_I32, buf);
buf.extend_from_slice(&value.to_le_bytes());
}
pub fn write_fixed64_field(field_number: u32, value: u64, buf: &mut Vec<u8>) {
write_tag(field_number, WT_I64, buf);
buf.extend_from_slice(&value.to_le_bytes());
}