use bytes_parser::BytesParser;
use crate::errors::KonsumerOffsetsError;
pub(crate) fn parse_str(parser: &mut BytesParser) -> Result<String, KonsumerOffsetsError> {
let group_strlen = parse_i16(parser)?;
if group_strlen < 0 {
return Ok(String::default());
}
parser.parse_str_utf8(group_strlen as usize).map(|s| s.into()).map_err(KonsumerOffsetsError::ByteParsingError)
}
pub(crate) fn parse_vec_bytes(parser: &mut BytesParser) -> Result<Vec<u8>, KonsumerOffsetsError> {
let bytes_array_len = parse_i32(parser)?;
let slice = parser.parse_slice(bytes_array_len as usize).map_err(KonsumerOffsetsError::ByteParsingError)?;
Ok(slice.to_vec())
}
pub(crate) fn parse_i16(parser: &mut BytesParser) -> Result<i16, KonsumerOffsetsError> {
parser.parse_i16().map_err(KonsumerOffsetsError::ByteParsingError)
}
pub(crate) fn parse_i32(parser: &mut BytesParser) -> Result<i32, KonsumerOffsetsError> {
parser.parse_i32().map_err(KonsumerOffsetsError::ByteParsingError)
}
pub(crate) fn parse_i64(parser: &mut BytesParser) -> Result<i64, KonsumerOffsetsError> {
parser.parse_i64().map_err(KonsumerOffsetsError::ByteParsingError)
}
#[cfg(feature = "ts_chrono")]
pub(crate) fn parse_chrono_datetime_utc(
parser: &mut BytesParser,
) -> Result<chrono::DateTime<chrono::Utc>, KonsumerOffsetsError> {
let millis = parse_i64(parser)?;
chrono::DateTime::<chrono::Utc>::from_timestamp_millis(millis)
.ok_or(KonsumerOffsetsError::ChronoDateTimeUtcParsingError(millis))
}
#[cfg(feature = "ts_time")]
pub(crate) fn parse_time_offset_datetime(
parser: &mut BytesParser,
) -> Result<time::OffsetDateTime, KonsumerOffsetsError> {
let millis = parse_i64(parser)?;
time::OffsetDateTime::from_unix_timestamp_nanos(millis as i128 * 1_000_000) .map_err(KonsumerOffsetsError::TimeOffsetDateTimeParsingError)
}
#[cfg(test)]
pub(crate) fn is_thread_safe<T: Sized + Send + Sync + Unpin>() {}