use crate::fountain::part::Part;
pub const fn max_fragment_len(
max_ur_type: &str,
max_sequence_number: usize,
max_characters: usize,
) -> usize {
let mut non_payload_characters = 0;
non_payload_characters += "ur:".len();
non_payload_characters += max_ur_type.len();
non_payload_characters += "/".len();
non_payload_characters += digit_count(u32::MAX as usize);
non_payload_characters += "-".len();
non_payload_characters += digit_count(max_sequence_number);
non_payload_characters += "/".len();
non_payload_characters += Part::max_encoded_len() * 2;
non_payload_characters += 4 * 2;
(max_characters - non_payload_characters) / 2
}
const fn digit_count(mut v: usize) -> usize {
if v == 0 {
return 1;
}
let mut count = 0;
while v != 0 {
v /= 10;
count += 1;
}
count
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_digit_count() {
assert_eq!(digit_count(9), 1);
assert_eq!(digit_count(99), 2);
assert_eq!(digit_count(999), 3);
assert_eq!(digit_count(9999), 4);
assert_eq!(digit_count(99999), 5);
}
}