diff --git a/crates/pile-dataset/src/dataset.rs b/crates/pile-dataset/src/dataset.rs index e54720f..0fd9756 100644 --- a/crates/pile-dataset/src/dataset.rs +++ b/crates/pile-dataset/src/dataset.rs @@ -40,6 +40,13 @@ pub enum Dataset { } impl Dataset { + pub fn len(&self) -> usize { + match self { + Self::Dir(ds) => ds.len(), + Self::S3(ds) => ds.len(), + } + } + pub async fn get(&self, key: &str) -> Option { match self { Self::Dir(ds) => ds.get(key).await.ok().flatten(), diff --git a/crates/pile-value/src/source/dir.rs b/crates/pile-value/src/source/dir.rs index 06e8505..a44899d 100644 --- a/crates/pile-value/src/source/dir.rs +++ b/crates/pile-value/src/source/dir.rs @@ -112,6 +112,11 @@ impl DirDataSource { } impl DataSource for Arc { + #[expect(clippy::expect_used)] + fn len(&self) -> usize { + self.index.get().expect("index should be initialized").len() + } + #[expect(clippy::expect_used)] async fn get(&self, key: &str) -> Result, std::io::Error> { return Ok(self diff --git a/crates/pile-value/src/source/mod.rs b/crates/pile-value/src/source/mod.rs index 86894d3..b600f30 100644 --- a/crates/pile-value/src/source/mod.rs +++ b/crates/pile-value/src/source/mod.rs @@ -8,6 +8,9 @@ pub mod misc; /// A read-only set of [Item]s. pub trait DataSource { + /// Get the number of items in this source + fn len(&self) -> usize; + /// Get an item from this datasource fn get( &self, diff --git a/crates/pile-value/src/source/s3.rs b/crates/pile-value/src/source/s3.rs index bbe8fa8..58e43d3 100644 --- a/crates/pile-value/src/source/s3.rs +++ b/crates/pile-value/src/source/s3.rs @@ -163,6 +163,11 @@ impl S3DataSource { } impl DataSource for Arc { + #[expect(clippy::expect_used)] + fn len(&self) -> usize { + self.index.get().expect("index should be initialized").len() + } + #[expect(clippy::expect_used)] async fn get(&self, key: &str) -> Result, std::io::Error> { return Ok(self