mod cluster;
mod consumer_groups;
mod consumer_offsets;
mod messages;
mod partitions;
mod personal_access_tokens;
mod segments;
mod streams;
mod system;
mod topics;
mod users;
pub use messages::decode_send_confirmations;
use crate::IggyError;
use crate::http::users::defaults::{
MAX_PASSWORD_LENGTH, MAX_USERNAME_LENGTH, MIN_PASSWORD_LENGTH, MIN_USERNAME_LENGTH,
};
use crate::{BinaryClient, ClientState};
use iggy_binary_protocol::WireDecode;
use iggy_binary_protocol::{ClientVersionInfo, IGGY_PROTOCOL_VERSION, WireName};
pub(crate) const RUST_SDK_NAME: &str = "rust-sdk";
pub(crate) fn rust_sdk_version_info(sdk_version: &str) -> Result<ClientVersionInfo, IggyError> {
Ok(ClientVersionInfo {
protocol_version: IGGY_PROTOCOL_VERSION,
sdk_name: WireName::new(RUST_SDK_NAME).expect("RUST_SDK_NAME is 1-255 bytes"),
sdk_version: WireName::new(sdk_version).map_err(|_| IggyError::InvalidFormat)?,
})
}
pub(crate) async fn logout_before_relogin<B: BinaryClient>(client: &B) -> Result<(), IggyError> {
if client.get_state().await == ClientState::Authenticated {
client.logout_user().await?;
}
Ok(())
}
pub(crate) fn validate_password(password: &str) -> Result<(), IggyError> {
if !(MIN_PASSWORD_LENGTH..=MAX_PASSWORD_LENGTH).contains(&password.len()) {
return Err(IggyError::InvalidPassword);
}
Ok(())
}
pub(crate) fn validate_username(username: &str) -> Result<(), IggyError> {
if !(MIN_USERNAME_LENGTH..=MAX_USERNAME_LENGTH).contains(&username.len()) {
return Err(IggyError::InvalidUsername);
}
Ok(())
}
pub(crate) fn decode_response<T: WireDecode>(response: &[u8]) -> Result<T, IggyError> {
T::decode_from(response).map_err(|e| {
tracing::warn!("failed to decode {}: {e}", std::any::type_name::<T>());
IggyError::InvalidFormat
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn validate_password_enforces_server_bounds() {
assert!(validate_password(&"a".repeat(MIN_PASSWORD_LENGTH - 1)).is_err());
assert!(validate_password(&"a".repeat(MIN_PASSWORD_LENGTH)).is_ok());
assert!(validate_password(&"a".repeat(MAX_PASSWORD_LENGTH)).is_ok());
assert!(validate_password(&"a".repeat(MAX_PASSWORD_LENGTH + 1)).is_err());
}
#[test]
fn validate_username_enforces_server_bounds() {
assert!(validate_username(&"a".repeat(MIN_USERNAME_LENGTH - 1)).is_err());
assert!(validate_username(&"a".repeat(MIN_USERNAME_LENGTH)).is_ok());
assert!(validate_username(&"a".repeat(MAX_USERNAME_LENGTH)).is_ok());
assert!(validate_username(&"a".repeat(MAX_USERNAME_LENGTH + 1)).is_err());
}
}