Skip to content
This repository has been archived by the owner on Aug 3, 2023. It is now read-only.

Commit

Permalink
refactor: use KeyList iterator for kv:key list
Browse files Browse the repository at this point in the history
  • Loading branch information
ashleymichal committed Sep 6, 2019
1 parent 0a71245 commit fd1bb02
Showing 1 changed file with 11 additions and 67 deletions.
78 changes: 11 additions & 67 deletions src/commands/kv/key/list.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
extern crate serde_json;

use cloudflare::endpoints::workerskv::list_namespace_keys::ListNamespaceKeys;
use cloudflare::endpoints::workerskv::list_namespace_keys::ListNamespaceKeysParams;
use cloudflare::endpoints::workerskv::Key;
use cloudflare::framework::apiclient::ApiClient;
use serde_json::value::Value as JsonValue;

use crate::commands::kv;
use crate::commands::kv::key::KeyList;
use crate::settings::global_user::GlobalUser;
use crate::settings::project::Project;

Expand All @@ -16,78 +11,27 @@ use crate::settings::project::Project;
pub fn list(
project: &Project,
user: GlobalUser,
id: &str,
namespace_id: &str,
prefix: Option<&str>,
) -> Result<(), failure::Error> {
let client = kv::api_client(user)?;

let params = ListNamespaceKeysParams {
limit: None, // Defaults to 1000 (the maximum)
cursor: None,
prefix: prefix.map(str::to_string),
};

let mut request_params = ListNamespaceKeys {
account_identifier: &project.account_id,
namespace_identifier: id,
params,
};

let mut response = client.request(&request_params);
let key_list = KeyList::fetch(project, client, namespace_id, prefix)?;

print!("["); // Open json list bracket

// Iterate over all pages until no pages of keys are left.
// This is detected when a returned cursor is an empty string.
loop {
let (result, cursor) = match response {
Ok(success) => (
success.result,
get_cursor_from_result_info(success.result_info.clone()),
),
Err(e) => failure::bail!(e),
};

match cursor {
None => {
// Case where we are done iterating through pages (no cursor returned)
print_page(result, true)?;
print!("]"); // Close json list bracket
break;
}
Some(_) => {
// Case where we still have pages to iterate through (a cursor is returned).
print_page(result, false)?;
let mut first_page = true;

// Update cursor in request_params.params, and make another request to Workers KV API.
request_params.params.cursor = cursor;
response = client.request(&request_params);
}
for key in key_list {
if !(first_page) {
print!(",");
} else {
first_page = false;
}
}

Ok(())
}

// Returns Some(cursor) if cursor is non-empty, otherwise returns None.
fn get_cursor_from_result_info(result_info: Option<JsonValue>) -> Option<String> {
let result_info = result_info.unwrap();
let returned_cursor_value = &result_info["cursor"];
let returned_cursor = returned_cursor_value.as_str().unwrap().to_string();
if returned_cursor.is_empty() {
None
} else {
Some(returned_cursor)
print!("{}", serde_json::to_string(&key)?);
}
}
print!("]"); // Close json list bracket

fn print_page(keys: Vec<Key>, last_page: bool) -> Result<(), failure::Error> {
for i in 0..keys.len() {
print!("{}", serde_json::to_string(&keys[i])?);
// if last key on last page, don't print final comma.
if !(last_page && i == keys.len() - 1) {
print!(",");
}
}
Ok(())
}

0 comments on commit fd1bb02

Please sign in to comment.