mirror of https://git.sr.ht/~stygianentity/bincode
Add derive support for tuple structs
This commit is contained in:
parent
e414cabd33
commit
2d0254405b
|
|
@ -8,6 +8,7 @@ proc-macro = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
quote = "1.0.9"
|
quote = "1.0.9"
|
||||||
|
proc-macro2 = "1.0"
|
||||||
|
|
||||||
[dependencies.syn]
|
[dependencies.syn]
|
||||||
version = "1.0.74"
|
version = "1.0.74"
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,13 @@
|
||||||
use crate::Result;
|
use crate::Result;
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
use quote::{quote, quote_spanned};
|
use proc_macro2::TokenStream as TokenStream2;
|
||||||
use syn::{spanned::Spanned, Generics, Ident};
|
use quote::{quote, quote_spanned, ToTokens};
|
||||||
|
use syn::{spanned::Spanned, Generics, Ident, Index};
|
||||||
|
|
||||||
pub struct DeriveStruct {
|
pub struct DeriveStruct {
|
||||||
name: Ident,
|
name: Ident,
|
||||||
generics: Generics,
|
generics: Generics,
|
||||||
fields: Vec<Ident>,
|
fields: Vec<TokenStream2>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DeriveStruct {
|
impl DeriveStruct {
|
||||||
|
|
@ -15,13 +16,13 @@ impl DeriveStruct {
|
||||||
syn::Fields::Named(fields) => fields
|
syn::Fields::Named(fields) => fields
|
||||||
.named
|
.named
|
||||||
.iter()
|
.iter()
|
||||||
.map(|f| f.ident.clone().unwrap())
|
.map(|f| f.ident.clone().unwrap().to_token_stream())
|
||||||
.collect(),
|
.collect(),
|
||||||
syn::Fields::Unnamed(fields) => fields
|
syn::Fields::Unnamed(fields) => fields
|
||||||
.unnamed
|
.unnamed
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, field)| Ident::new(&i.to_string(), field.ty.span()))
|
.map(|(i, _)| Index::from(i).to_token_stream())
|
||||||
.collect(),
|
.collect(),
|
||||||
syn::Fields::Unit => Vec::new(),
|
syn::Fields::Unit => Vec::new(),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,9 @@ pub struct Test2<T: Decodable> {
|
||||||
c: u32,
|
c: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(bincode::Encodable, bincode::Decodable, PartialEq, Debug, Eq)]
|
||||||
|
pub struct TestTupleStruct(u32, u32, u32);
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_encodable() {
|
fn test_encodable() {
|
||||||
let start = Test {
|
let start = Test {
|
||||||
|
|
@ -38,3 +41,20 @@ fn test_decodable() {
|
||||||
let result: Test2<u32> = bincode::decode(&mut slice).unwrap();
|
let result: Test2<u32> = bincode::decode(&mut slice).unwrap();
|
||||||
assert_eq!(result, start);
|
assert_eq!(result, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_encodable_tuple() {
|
||||||
|
let start = TestTupleStruct(5, 10, 1024);
|
||||||
|
let mut slice = [0u8; 1024];
|
||||||
|
let bytes_written = bincode::encode_into_slice(start, &mut slice).unwrap();
|
||||||
|
assert_eq!(bytes_written, 5);
|
||||||
|
assert_eq!(&slice[..bytes_written], &[5, 10, 251, 0, 4]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decodable_tuple() {
|
||||||
|
let start = TestTupleStruct(5, 10, 1024);
|
||||||
|
let mut slice = [5, 10, 251, 0, 4];
|
||||||
|
let result: TestTupleStruct = bincode::decode(&mut slice).unwrap();
|
||||||
|
assert_eq!(result, start);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue