use crate::WireError;
use crate::codec::{WireDecode, WireEncode};
use crate::responses::users::user_response::UserResponse;
use bytes::BytesMut;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GetUsersResponse {
pub users: Vec<UserResponse>,
}
impl WireEncode for GetUsersResponse {
fn encoded_size(&self) -> usize {
self.users.iter().map(WireEncode::encoded_size).sum()
}
fn encode(&self, buf: &mut BytesMut) {
for user in &self.users {
user.encode(buf);
}
}
}
impl WireDecode for GetUsersResponse {
fn decode(buf: &[u8]) -> Result<(Self, usize), WireError> {
let mut users = Vec::new();
let mut pos = 0;
while pos < buf.len() {
let (user, consumed) = UserResponse::decode(&buf[pos..])?;
pos += consumed;
users.push(user);
}
Ok((Self { users }, pos))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{WireName, WireOptions};
#[test]
fn roundtrip_empty() {
let resp = GetUsersResponse { users: vec![] };
let bytes = resp.to_bytes();
assert!(bytes.is_empty());
let (decoded, consumed) = GetUsersResponse::decode(&bytes).unwrap();
assert_eq!(consumed, 0);
assert_eq!(decoded, resp);
}
#[test]
fn roundtrip_multiple() {
let resp = GetUsersResponse {
users: vec![
UserResponse {
id: 1,
created_at: 100,
status: 1,
username: WireName::new("admin").unwrap(),
options: WireOptions::empty(),
},
UserResponse {
id: 2,
created_at: 200,
status: 2,
username: WireName::new("alice").unwrap(),
options: WireOptions::empty(),
},
],
};
let bytes = resp.to_bytes();
let (decoded, consumed) = GetUsersResponse::decode(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(decoded, resp);
}
}