summaryrefslogtreecommitdiff
path: root/policy/butck/butck_fixed_size/src
diff options
context:
space:
mode:
Diffstat (limited to 'policy/butck/butck_fixed_size/src')
-rw-r--r--policy/butck/butck_fixed_size/src/lib.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/policy/butck/butck_fixed_size/src/lib.rs b/policy/butck/butck_fixed_size/src/lib.rs
new file mode 100644
index 0000000..28cabff
--- /dev/null
+++ b/policy/butck/butck_fixed_size/src/lib.rs
@@ -0,0 +1,48 @@
+use std::collections::HashMap;
+
+const DEFAULT_CHUNK_SIZE: usize = 1024 * 1024; // 1MB
+
+fn get_chunk_size(params: &HashMap<&str, &str>) -> usize {
+ params
+ .get("size")
+ .and_then(|s| s.parse().ok())
+ .unwrap_or(DEFAULT_CHUNK_SIZE)
+}
+
+pub async fn chunk_fixed_size(raw_data: &[u8], params: &HashMap<&str, &str>) -> Vec<u32> {
+ let chunk_size = get_chunk_size(params);
+ (chunk_size..raw_data.len())
+ .step_by(chunk_size)
+ .map(|pos| pos as u32)
+ .collect()
+}
+
+#[derive(Default)]
+pub struct FixedSizeStream {
+ processed_bytes: usize,
+}
+
+pub async fn chunk_fixed_size_stream(
+ _current_data: &[u8],
+ len: u32,
+ stream: &mut FixedSizeStream,
+ params: &HashMap<&str, &str>,
+) -> Option<u32> {
+ let chunk_size = get_chunk_size(params);
+ let valid_len = len as usize;
+
+ let prev_chunk = stream.processed_bytes / chunk_size;
+ let new_processed = stream.processed_bytes + valid_len;
+ let new_chunk = new_processed / chunk_size;
+
+ if prev_chunk != new_chunk {
+ // Find chunk boundary in current data, update processed bytes, return position
+ let boundary_in_chunk = chunk_size - (stream.processed_bytes % chunk_size);
+ stream.processed_bytes += boundary_in_chunk;
+ Some(boundary_in_chunk.min(valid_len) as u32)
+ } else {
+ // Update bytes processed
+ stream.processed_bytes = new_processed;
+ None
+ }
+}