I have the following use case, and I don't have enough experience to know how this is usually handled:
I am reading a file which contains some messages; these messages are divided into chunks. A Chunk is:
pub struct Chunk {
device_id: u32,
channel_id: u8,
chunk_id: u16,
payload: Vec<u8>,
}
The payload
is a slice of the actual message, the chunk_id
sets the position of the payload within the message. All chunks with the same device_id
and channel_id
form a single message.
Then a Message is:
pub struct Message {
device_id: u32,
channel_id: u8,
total_payload: Vec<u8>,
}
And I have implemented TryFrom as:
impl TryFrom<Vec<Chunk>> for Message {
type Error = String;
fn try_from(mut chunks: Vec<Chunk>) -> Result<Self, Self::Error> {
// Check a bunch of stuff
// All chunks belong to the same device_id
// All chunks belong to the same channel_id
// etc.
let device_id = chunks[0].device_id;
let channel_id = chunks[0].channel_id;
chunks.sort_unstable_by_key(|c| c.chunk_id);
let total_payload: Vec<u8> = chunks.into_iter().flat_map(|c| c.payload).collect();
Ok(Message {
device_id,
channel_id,
total_payload,
})
}
}
This all works great. Now my question is: How should I handle receiving all the Chunk
s (from multiple device_id
and channel_id
)?
I was thinking about a MultipleMessagesBuilder
with an add_chunk
function, to which I can give it Chunk
s one by one. This will internally "sort" each chunk into an appropriate Vec<Chunk>
depending on the device_id
and channel_id
. Once I have passed all the chunks, I can then call a initialize
method, and it will try to make the messages from the vectors.
Does something like this make sense? How would the public API of this MultipleMessagesBuilder
look like? I can't imagine a reasonable way to then obtain the messages, the errors of the ones that fail, etc.
Aucun commentaire:
Enregistrer un commentaire