use bytes::Bytes;
use chrono::{DateTime, Datelike, Local, TimeZone, Timelike};
use crate::timer_helper::TimeHelper;
pub trait IBuffWrite {
fn put_u8(&mut self, n: u8);
fn put_u16(&mut self, n: u16) {
for v in n.to_be_bytes() {
self.put_u8(v);
}
}
fn put_u32(&mut self, n: u32) {
for v in n.to_be_bytes() {
self.put_u8(v);
}
}
fn put_u64(&mut self, n: u64) {
for v in n.to_be_bytes() {
self.put_u8(v);
}
}
fn put_slice(&mut self, src: &[u8]) {
for v in src {
self.put_u8(*v);
}
}
fn put(&mut self, src: Bytes)
{
for v in src {
self.put_u8(v);
}
}
fn put_dt_bcd6(&mut self, dt: DateTime<Local>) {
self.put_u8(TimeHelper::i32_to_bcd2(dt.year()));
self.put_u8(TimeHelper::u32_to_bcd2(dt.month()));
self.put_u8(TimeHelper::u32_to_bcd2(dt.day()));
self.put_u8(TimeHelper::u32_to_bcd2(dt.hour()));
self.put_u8(TimeHelper::u32_to_bcd2(dt.minute()));
self.put_u8(TimeHelper::u32_to_bcd2(dt.second()));
}
}
pub trait IBuffRead {
fn get(&self, index: usize) -> Option<&u8>;
fn len(&self) -> usize;
fn get_u64(&mut self) -> u64;
fn get_u32(&mut self) -> u32;
fn get_u16(&mut self) -> u16;
fn get_u8(&mut self) -> u8;
fn split_to(&mut self, at: usize) -> Bytes;
fn to_bytes(&mut self) -> Bytes;
fn get_dt_bcd6(&mut self) -> DateTime<Local> {
Local
.ymd(
2000 + self.get_u8() as i32,
self.get_u8() as u32,
self.get_u8() as u32,
)
.and_hms(
self.get_u8() as u32,
self.get_u8() as u32,
self.get_u8() as u32,
)
}
fn get_dt_bcd6_timestamp(&mut self) -> i64 {
let year = self.get_u8_bcd() as i32;
let month = self.get_u8_bcd() as u32;
let day = self.get_u8_bcd() as u32;
let hour = self.get_u8_bcd() as u32;
let min = self.get_u8_bcd() as u32;
let sec = self.get_u8_bcd() as u32;
if year <= 0 || year > 100 || month > 12 || day > 31 || hour > 24 || min > 60 || sec > 60 {
return 0;
}
Local.ymd(
2000 + year,
month,
day,
)
.and_hms(
hour,
min,
sec,
).timestamp()
}
fn get_u8_bcd(&mut self) -> u8 {
let tmp = self.split_to(1);
let ret = hex::encode(tmp).parse::<u8>().unwrap();
ret
}
}
#[test]
fn ibuff_write_test() {
let tmp = [0x21];
let ret = hex::encode(tmp).parse::<u8>().unwrap();
println!("test {}", ret);
}