serialization - Convert vector of enum values into an another vector -


i have following code generates vector of bytes passed vector of enum values:

#[derive(debug, partialeq)] pub enum berttype {     smallinteger(u8),     integer(i32),     float(f64),     string(string),     boolean(bool),     tuple(berttuple), }  #[derive(debug, partialeq)] pub struct berttuple {     pub values: vec<berttype> }  pub struct serializer;  pub trait serialize<t> {     fn to_bert(&self, data: t) -> vec<u8>; }  impl serializer {     fn enum_value_to_binary(&self, enum_value: berttype) -> vec<u8> {         match enum_value {             berttype::smallinteger(value_u8) => self.to_bert(value_u8),             berttype::integer(value_i32) => self.to_bert(value_i32),             berttype::float(value_f64) => self.to_bert(value_f64),             berttype::string(string) => self.to_bert(string),             berttype::boolean(boolean) => self.to_bert(boolean),             berttype::tuple(tuple) => self.to_bert(tuple),         }     } }  // functions serialize bool/integer/etc. vec<u8> // ...  impl serialize<berttuple> serializer {     fn to_bert(&self, data: berttuple) -> vec<u8> {         let mut binary: vec<u8> = data.values             .iter()             .map(|&item| self.enum_value_to_binary(item)) // <-- issue there?             .collect();          let arity = data.values.len();         match arity {             0...255 => self.get_small_tuple(arity u8, binary),             _ => self.get_large_tuple(arity i32, binary),         }     } } 

but when compiling, receive error iterating around map:

error: trait bound `std::vec::vec<u8>: std::iter::fromiterator<std::vec::vec<u8>>` not satisfied [e0277]            .collect();            ^~~~~~~ help: run `rustc --explain e0277` see detailed explanation note: collection of type `std::vec::vec<u8>` cannot built iterator on elements of type `std::vec::vec<u8>` error: aborting due previous error error: not compile `bert-rs`. 

how can fix issue std::iter::fromiterator?

the problem enum_value_to_binary returns vec<u8> each element in values. end iterator<item=vec<u8>> , call collect::<vec<u8>>() on that, doesn't know how flatten nested vectors. if want values flattened 1 vec<u8>, should use flat_map instead of map:

let mut binary: vec<u8> = data.values             .iter()             .flat_map(|item| self.enum_value_to_binary(item).into_iter())              .collect(); 

or, more idiomatic , performant, can have enum_value_to_binary return iterator directly.

also, iter method returns iterator<item=&'a t>, means borrowing elements, self.enum_value_to_binary wants take ownership on value. there's couple of ways fix that. 1 option use into_iter instead of iter, give elements value. if that, you'll move arity variable before binary variable, since creating binary variable take ownership (move) data.values.

the other option change self.enum_value_to_binary take it's argument reference.

also possible meant type of binary vec<vec<u8>>.


Comments