changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / rust/lib/net/src/coding.rs

changeset 17: c7165d93a9eb
author: ellis <ellis@rwest.io>
date: Sun, 22 Oct 2023 23:03:15 -0400
permissions: -rw-r--r--
description: add obj and net src
1 use crate::{Error::UnexpectedEnd, Result};
2 use bytes::{Buf, BufMut};
3 use std::net::{Ipv4Addr, Ipv6Addr};
4 
5 pub trait Codec: Sized {
6  fn decode<B: Buf>(buf: &mut B) -> Result<Self>;
7  fn encode<B: BufMut>(&self, buf: &mut B);
8 }
9 
10 impl Codec for u8 {
11  fn decode<B: Buf>(buf: &mut B) -> Result<u8> {
12  if buf.remaining() < 1 {
13  return Err(UnexpectedEnd);
14  }
15  Ok(buf.get_u8())
16  }
17  fn encode<B: BufMut>(&self, buf: &mut B) {
18  buf.put_u8(*self);
19  }
20 }
21 
22 impl Codec for u16 {
23  fn decode<B: Buf>(buf: &mut B) -> Result<u16> {
24  if buf.remaining() < 2 {
25  return Err(UnexpectedEnd);
26  }
27  Ok(buf.get_u16())
28  }
29  fn encode<B: BufMut>(&self, buf: &mut B) {
30  buf.put_u16(*self);
31  }
32 }
33 
34 impl Codec for u32 {
35  fn decode<B: Buf>(buf: &mut B) -> Result<u32> {
36  if buf.remaining() < 4 {
37  return Err(UnexpectedEnd);
38  }
39  Ok(buf.get_u32())
40  }
41  fn encode<B: BufMut>(&self, buf: &mut B) {
42  buf.put_u32(*self);
43  }
44 }
45 
46 impl Codec for u64 {
47  fn decode<B: Buf>(buf: &mut B) -> Result<u64> {
48  if buf.remaining() < 8 {
49  return Err(UnexpectedEnd);
50  }
51  Ok(buf.get_u64())
52  }
53  fn encode<B: BufMut>(&self, buf: &mut B) {
54  buf.put_u64(*self);
55  }
56 }
57 
58 impl Codec for Ipv4Addr {
59  fn decode<B: Buf>(buf: &mut B) -> Result<Ipv4Addr> {
60  if buf.remaining() < 4 {
61  return Err(UnexpectedEnd);
62  }
63  let mut octets = [0; 4];
64  buf.copy_to_slice(&mut octets);
65  Ok(octets.into())
66  }
67  fn encode<B: BufMut>(&self, buf: &mut B) {
68  buf.put_slice(&self.octets());
69  }
70 }
71 
72 impl Codec for Ipv6Addr {
73  fn decode<B: Buf>(buf: &mut B) -> Result<Ipv6Addr> {
74  if buf.remaining() < 16 {
75  return Err(UnexpectedEnd);
76  }
77  let mut octets = [0; 16];
78  buf.copy_to_slice(&mut octets);
79  Ok(octets.into())
80  }
81  fn encode<B: BufMut>(&self, buf: &mut B) {
82  buf.put_slice(&self.octets());
83  }
84 }
85 
86 pub trait BufExt {
87  fn get<T: Codec>(&mut self) -> Result<T>;
88 }
89 
90 impl<T: Buf> BufExt for T {
91  fn get<U: Codec>(&mut self) -> Result<U> {
92  U::decode(self)
93  }
94 }
95 
96 pub trait BufMutExt {
97  fn write<T: Codec>(&mut self, x: T);
98 }
99 
100 impl<T: BufMut> BufMutExt for T {
101  fn write<U: Codec>(&mut self, x: U) {
102  x.encode(self);
103  }
104 }