William Murphy
William Murphy

Reputation: 123

How do I iterate over elements of a struct?

I'm writing a small client/server program for encrypted network communications and have the following struct to allow the endpoints to negotiate capabilities.

struct KeyExchangePacket {
    kexinit: u8,
    replay_cookie: [u8; 32],
    kex_algorithms: String,
    kgen_algorithms: String,
    encryption_algorithms: String,
    mac_algorithms: String,
    compression_algorithms: String,
    supported_languages: String,
}

I need to convert the fields into bytes in order to send them over a TcpStream, but I currently have to convert them one at a time.

send_buffer.extend_from_slice(kex_algorithms.as_bytes());
send_buffer.extend_from_slice(kgen_algorithms.as_bytes());
etc...

Is there a way to iterate over the fields and push their byte values into a buffer for sending?

Upvotes: 12

Views: 16696

Answers (2)

dtolnay
dtolnay

Reputation: 10993

Bincode does this.

let packet = KeyExchangePacket { /* ... */ };
let size_limit = bincode::SizeLimit::Infinite;
let encoded: Vec<u8> = bincode::serde::serialize(&packet, size_limit).unwrap();

From the readme:

The encoding (and thus decoding) proceeds unsurprisingly -- primitive types are encoded according to the underlying Writer, tuples and structs are encoded by encoding their fields one-by-one, and enums are encoded by first writing out the tag representing the variant and then the contents.

Upvotes: 4

Shepmaster
Shepmaster

Reputation: 430671

Is there a way to iterate over the fields

No. You have to implement it yourself, or find a macro / compiler plugin that will do it for you.

See How to iterate or map over tuples? for a similar question.

Think about how iterators work. An iterator has to yield a single type for each iteration. What would that type be for your struct composed of at least 3 different types?

Upvotes: 15

Related Questions