Skip to content

Commit 296977b

Browse files
authored
Merge pull request #1 from nuclearcat/list_func
(azure): Add list_files call
2 parents 9e0d12e + 0618556 commit 296977b

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

src/azure.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ use std::sync::Arc;
2727
use tempfile::Builder;
2828
use toml::Table;
2929
use std::fs::read_to_string;
30+
use futures::Stream;
31+
use futures::stream::StreamExt;
32+
use azure_storage_blobs::container::operations::BlobItem;
3033

3134
#[derive(Deserialize)]
3235
struct AzureConfig {
@@ -306,6 +309,33 @@ async fn azure_set_filename_tags(filename: String, user_tags: Vec<(String, Strin
306309
}
307310
}
308311

312+
async fn azure_list_files(directory: String) -> Vec<String> {
313+
let azure_cfg = Arc::new(get_azure_credentials("azure"));
314+
let storage_account = azure_cfg.account.as_str();
315+
let storage_key = azure_cfg.key.clone();
316+
let storage_container = azure_cfg.container.as_str();
317+
let storage_credential = StorageCredentials::access_key(storage_account, storage_key);
318+
let container_r = ClientBuilder::new(storage_account, storage_credential)
319+
.container_client(storage_container);
320+
let listbldr = container_r.list_blobs();
321+
let mut liststream = listbldr.into_stream();
322+
let mut listing = Vec::new();
323+
while let Some(Ok(page)) = liststream.next().await {
324+
let blobs = page.blobs.items;
325+
for blob in blobs {
326+
let blob_name = match blob {
327+
BlobItem::Blob(blob) => blob.name,
328+
BlobItem::BlobPrefix(blob_prefix) => blob_prefix.name,
329+
};
330+
listing.push(blob_name.clone());
331+
332+
}
333+
println!("Listing count: {}", listing.len());
334+
}
335+
//println!("Listing: {:?}", listing);
336+
return listing;
337+
}
338+
309339
/// Implement Driver trait for AzureDriver
310340
impl super::Driver for AzureDriver {
311341
fn write_file(&self, filename: String, data: Vec<u8>, cont_type: String) -> String {
@@ -336,4 +366,12 @@ impl super::Driver for AzureDriver {
336366
});
337367
return received_file;
338368
}
369+
fn list_files(&self, directory: String) -> Vec<String> {
370+
let mut ret = Vec::new();
371+
tokio::task::block_in_place(|| {
372+
let rt = tokio::runtime::Runtime::new().unwrap();
373+
ret = rt.block_on(azure_list_files(directory));
374+
});
375+
return ret;
376+
}
339377
}

src/main.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ trait Driver {
6565
fn write_file(&self, filename: String, data: Vec<u8>, cont_type: String) -> String;
6666
fn get_file(&self, filename: String) -> ReceivedFile;
6767
fn tag_file(&self, filename: String, user_tags: Vec<(String, String)>) -> Result<String, String>;
68+
fn list_files(&self, directory: String) -> Vec<String>;
6869
}
6970

7071
fn init_driver(driver_type: &str) -> Box<dyn Driver> {
@@ -143,6 +144,7 @@ async fn main() {
143144
.route("/v1/file", post(ax_post_file))
144145
.route("/upload", post(ax_post_file))
145146
.route("/*filepath", get(ax_get_file))
147+
.route("/v1/list", get(ax_list_files))
146148
.layer(ServiceBuilder::new().layer(DefaultBodyLimit::max(1024 * 1024 * 1024 * 4)));
147149

148150
/*
@@ -539,3 +541,12 @@ fn verify_auth_hdr(headers: &HeaderMap) -> Result<String, Option<String>> {
539541
return Err(None);
540542
}
541543
}
544+
545+
async fn ax_list_files() -> (StatusCode, String) {
546+
let driver_name = "azure";
547+
let driver = init_driver(driver_name);
548+
let files = driver.list_files("/".to_string());
549+
// generate nice list of files, with one file per line
550+
let files_str = files.join("\n");
551+
return (StatusCode::OK, files_str);
552+
}

0 commit comments

Comments
 (0)