From 42f770aed956250ec1d90fabf776c309aaf503fb Mon Sep 17 00:00:00 2001 From: quexeky Date: Wed, 28 May 2025 22:31:56 +1000 Subject: [PATCH] feat: Add file start and end to read_file function Signed-off-by: quexeky --- Cargo.toml | 2 +- src/file_utils.rs | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a3142c3..ae2a3ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ time-macros = "0.2.22" time = "0.3.41" webpki = "0.22.4" ring = "0.17.14" -tokio = { version = "1.45.1", features = ["fs"] } +tokio = { version = "1.45.1", features = ["fs", "io-util"] } tokio-util = { version = "0.7.15", features = ["codec"] } [dependencies.x509-parser] diff --git a/src/file_utils.rs b/src/file_utils.rs index bd4d126..1f437f7 100644 --- a/src/file_utils.rs +++ b/src/file_utils.rs @@ -2,7 +2,7 @@ use std::os::unix::fs::PermissionsExt; use std::{ fs::{self, metadata, File}, - io::{self, BufReader, ErrorKind, Read}, + io::{self, BufReader, ErrorKind, Read, Seek}, path::{Path, PathBuf}, task::Poll, }; @@ -11,6 +11,7 @@ use napi::{ bindgen_prelude::*, tokio_stream::{Stream, StreamExt}, }; +use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeekExt, Take}; use tokio_util::{ bytes::BytesMut, codec::{BytesCodec, FramedRead}, @@ -134,6 +135,8 @@ pub fn read_file( path: String, sub_path: String, env: &Env, + start: Option, + end: Option ) -> Option>> { let path = Path::new(&path); let backend = create_backend_for_path(path).unwrap(); @@ -142,14 +145,27 @@ pub fn read_file( permission: 0, // Shouldn't matter }; // Use `?` operator for cleaner error propagation from `Option` - let reader = backend.reader(&version_file)?; + let mut reader = backend.reader(&version_file)?; + // Can't do this in tokio because it requires a .await, which we can't do here + if let Some(start) = start { + reader.seek(io::SeekFrom::Start(start as u64)).unwrap(); + } + // Convert std::fs::File to tokio::fs::File for async operations let reader = tokio::fs::File::from_std(reader); + + let boxed_reader: Box = match end { + Some(end_val) => Box::new(reader.take(end_val as u64)), + None => Box::new(reader), + }; + + + // Create a FramedRead stream with BytesCodec for chunking - let stream = FramedRead::new(reader, BytesCodec::new()) + let stream = FramedRead::new(boxed_reader, BytesCodec::new()) // Use StreamExt::map to transform each Result item .map(|result_item| { result_item