Skip to content

Commit 923d7c4

Browse files
committed
Modify the Encodable API to mirror core functionality form Decodable
- `encode` now takes a `Bufferfish` and writes directly to it - `encode_value` is a new function that writes a raw value, without encoding it as a "packet"; eg. it will not encode a header - `to_bufferfish` remains the same
1 parent 6e2a218 commit 923d7c4

File tree

5 files changed

+36
-33
lines changed

5 files changed

+36
-33
lines changed

rust/bufferfish-core/src/decodable.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ use crate::{Bufferfish, BufferfishError};
44

55
/// Types implementing this trait are able to be decoded from a `Bufferfish`.
66
pub trait Decodable: Sized {
7-
/// Decode the type from a `Bufferfish`.
7+
/// Decode the type from a given `Bufferfish`.
88
fn decode(bf: &mut Bufferfish) -> Result<Self, BufferfishError>;
99

10-
/// Creates a checked generic type from a `Bufferfish`.
10+
/// Creates a checked, generic type from a `Bufferfish`.
1111
///
1212
/// If the `Bufferfish` does not contain enough bytes to properly
1313
/// decode the type, an error is returned.

rust/bufferfish-core/src/encodable.rs

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,100 +4,104 @@ use crate::{Bufferfish, BufferfishError};
44

55
/// Types implementing this trait are able to be encoded to a `Bufferfish`.
66
pub trait Encodable: Sized {
7-
/// Encode the type into a given `Bufferfish`.
8-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError>;
7+
/// Encode this type into a given `Bufferfish`.
8+
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
9+
self.encode_value(bf)
10+
}
11+
12+
/// Encodes a raw value into a given `Bufferfish`.
13+
///
14+
/// Note: This is generally not what you want to call on types
15+
/// implementing `Encodable`, as it will not encode the header value.
16+
/// Instead, use `encode` to encode an entire type.
17+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError>;
918

1019
/// Encode the type into a new `Bufferfish`.
20+
///
21+
/// Note: As this allocates a new `Bufferfish`, consider using
22+
/// `encode` instead and reusing a previously allocated `Bufferfish`.
1123
fn to_bufferfish(&self) -> Result<Bufferfish, BufferfishError> {
1224
let mut bf = Bufferfish::new();
1325
self.encode(&mut bf)?;
1426

1527
Ok(bf)
1628
}
17-
18-
/// Encode this type into a provided `Bufferfish` buffer.
19-
///
20-
/// This is useful when you want to reuse an existing buffer to avoid
21-
/// allocations.
22-
fn encode_into(self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
23-
self.encode(bf)
24-
}
2529
}
2630

2731
impl Encodable for u8 {
28-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
32+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
2933
bf.write_u8(*self)
3034
}
3135
}
3236

3337
impl Encodable for u16 {
34-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
38+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
3539
bf.write_u16(*self)
3640
}
3741
}
3842

3943
impl Encodable for u32 {
40-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
44+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
4145
bf.write_u32(*self)
4246
}
4347
}
4448

4549
impl Encodable for u64 {
46-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
50+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
4751
bf.write_u64(*self)
4852
}
4953
}
5054

5155
impl Encodable for u128 {
52-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
56+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
5357
bf.write_u128(*self)
5458
}
5559
}
5660

5761
impl Encodable for i8 {
58-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
62+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
5963
bf.write_i8(*self)
6064
}
6165
}
6266

6367
impl Encodable for i16 {
64-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
68+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
6569
bf.write_i16(*self)
6670
}
6771
}
6872

6973
impl Encodable for i32 {
70-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
74+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
7175
bf.write_i32(*self)
7276
}
7377
}
7478

7579
impl Encodable for i64 {
76-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
80+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
7781
bf.write_i64(*self)
7882
}
7983
}
8084

8185
impl Encodable for i128 {
82-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
86+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
8387
bf.write_i128(*self)
8488
}
8589
}
8690

8791
impl Encodable for bool {
88-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
92+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
8993
bf.write_bool(*self)
9094
}
9195
}
9296

9397
impl Encodable for String {
94-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
98+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
9599
bf.write_string(self)
96100
}
97101
}
98102

99103
impl<T: Encodable> Encodable for Vec<T> {
100-
fn encode(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
104+
fn encode_value(&self, bf: &mut Bufferfish) -> Result<(), BufferfishError> {
101105
bf.write_array(self)
102106
}
103107
}

rust/bufferfish-core/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ impl Bufferfish {
366366
self.write_u16(vec.len() as u16)?;
367367

368368
for item in vec {
369-
item.encode(self)?;
369+
item.encode_value(self)?;
370370
}
371371

372372
Ok(())

rust/bufferfish-derive/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,22 @@ pub fn bufferfish_impl_encodable(input: proc_macro::TokenStream) -> proc_macro::
5555

5656
let generated = quote! {
5757
impl bufferfish::Encodable for #name {
58-
fn encode(&self, bf: &mut bufferfish::Bufferfish) -> Result<(), bufferfish::BufferfishError> {
58+
fn encode_value(&self, bf: &mut bufferfish::Bufferfish) -> Result<(), bufferfish::BufferfishError> {
5959
#(#encoded_snippets)*
6060
Ok(())
6161
}
6262

6363
fn to_bufferfish(&self) -> Result<bufferfish::Bufferfish, bufferfish::BufferfishError> {
6464
let mut bf = bufferfish::Bufferfish::new();
65-
#packet_id_snippet
6665
self.encode(&mut bf)?;
6766

6867
Ok(bf)
6968
}
7069

71-
fn encode_into(self, bf: &mut bufferfish::Bufferfish) -> Result<(), bufferfish::BufferfishError>
70+
fn encode(&self, bf: &mut bufferfish::Bufferfish) -> Result<(), bufferfish::BufferfishError>
7271
{
7372
#packet_id_snippet
74-
self.encode(bf)
73+
self.encode_value(bf)
7574
}
7675
}
7776
};

rust/bufferfish/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ mod tests {
689689
};
690690
let packet = JoinPacket { user };
691691

692-
packet.encode_into(&mut bf).unwrap();
692+
packet.encode(&mut bf).unwrap();
693693

694694
assert_eq!(
695695
bf.as_ref(),
@@ -722,7 +722,7 @@ mod tests {
722722
];
723723

724724
let mut bf = Bufferfish::new();
725-
users.encode_into(&mut bf).unwrap();
725+
users.encode(&mut bf).unwrap();
726726

727727
assert_eq!(
728728
bf.as_ref(),
@@ -776,7 +776,7 @@ mod tests {
776776
class: Class::Warrior,
777777
};
778778

779-
packet.encode_into(&mut bf).unwrap();
779+
packet.encode(&mut bf).unwrap();
780780

781781
assert_eq!(bf.as_ref(), &[0, 0, 0]);
782782
}

0 commit comments

Comments
 (0)