| use crate::{Tag, Tagged}; |
| |
| #[derive(Debug)] |
| pub struct ConstInt { |
| buffer: [u8; 10], |
| n: usize, |
| } |
| |
| // XXX only ToBer/ToDer trait supported? |
| |
| impl Tagged for ConstInt { |
| const TAG: Tag = Tag::Integer; |
| } |
| |
| #[derive(Debug)] |
| pub struct IntBuilder {} |
| |
| impl IntBuilder { |
| pub const fn build(&self, i: u64) -> ConstInt { |
| let b = i.to_be_bytes(); |
| let mut out = [0u8; 10]; |
| out[0] = 0x4; |
| let src_len = b.len(); |
| let mut src_index = 0; |
| while src_index < src_len && b[src_index] == 0 { |
| src_index += 1; |
| } |
| out[1] = (src_len - src_index) as u8; |
| let mut dst_index = 2; |
| while src_index < src_len { |
| out[dst_index] = b[src_index]; |
| src_index += 1; |
| dst_index += 1; |
| } |
| // XXX will not work: we need to allocate a Vec |
| // also, we cannot just store the bytes (there are extra zeroes at end) |
| // Integer::new(&out[..dst_index]) |
| ConstInt { |
| buffer: out, |
| n: dst_index, |
| } |
| } |
| } |