diff --git a/src/commands/kv/bucket/sync.rs b/src/commands/kv/bucket/sync.rs index ae3583d6a..01cfbedcd 100644 --- a/src/commands/kv/bucket/sync.rs +++ b/src/commands/kv/bucket/sync.rs @@ -19,6 +19,8 @@ pub fn sync( path: &Path, verbose: bool, ) -> Result<(), failure::Error> { + kv::validate_target(target)?; + // First, upload all existing files in given directory if verbose { message::info("Preparing to upload updated files..."); diff --git a/src/commands/kv/bulk/delete.rs b/src/commands/kv/bulk/delete.rs index d8a9e6379..c34dfa049 100644 --- a/src/commands/kv/bulk/delete.rs +++ b/src/commands/kv/bulk/delete.rs @@ -20,6 +20,8 @@ pub fn delete( namespace_id: &str, filename: &Path, ) -> Result<(), failure::Error> { + kv::validate_target(target)?; + match kv::interactive_delete(&format!( "Are you sure you want to delete all keys in {}?", filename.display() diff --git a/src/commands/kv/bulk/put.rs b/src/commands/kv/bulk/put.rs index cbb49dc09..fa962705e 100644 --- a/src/commands/kv/bulk/put.rs +++ b/src/commands/kv/bulk/put.rs @@ -20,6 +20,8 @@ pub fn put( namespace_id: &str, filename: &Path, ) -> Result<(), failure::Error> { + kv::validate_target(target)?; + let pairs: Result, failure::Error> = match &metadata(filename) { Ok(file_type) if file_type.is_file() => { let data = fs::read_to_string(filename)?; diff --git a/src/commands/kv/key/delete.rs b/src/commands/kv/key/delete.rs index 738f9f6b5..3e53749b9 100644 --- a/src/commands/kv/key/delete.rs +++ b/src/commands/kv/key/delete.rs @@ -12,6 +12,7 @@ pub fn delete( id: &str, key: &str, ) -> Result<(), failure::Error> { + kv::validate_target(target)?; let client = kv::api_client(user)?; match kv::interactive_delete(&format!("Are you sure you want to delete key \"{}\"?", key)) { diff --git a/src/commands/kv/key/get.rs b/src/commands/kv/key/get.rs index a5ad131b9..877888f70 100644 --- a/src/commands/kv/key/get.rs +++ b/src/commands/kv/key/get.rs @@ -11,6 +11,7 @@ use crate::settings::global_user::GlobalUser; use crate::settings::target::Target; pub fn get(target: &Target, user: GlobalUser, id: &str, key: &str) -> Result<(), failure::Error> { + kv::validate_target(target)?; let api_endpoint = format!( "https://api.cloudflare.com/client/v4/accounts/{}/storage/kv/namespaces/{}/values/{}", target.account_id, diff --git a/src/commands/kv/key/list.rs b/src/commands/kv/key/list.rs index ae66f90e8..58e2d4154 100644 --- a/src/commands/kv/key/list.rs +++ b/src/commands/kv/key/list.rs @@ -14,6 +14,7 @@ pub fn list( namespace_id: &str, prefix: Option<&str>, ) -> Result<(), failure::Error> { + kv::validate_target(target)?; let key_list = KeyList::new(target, user, namespace_id, prefix)?; print!("["); // Open json list bracket diff --git a/src/commands/kv/key/put.rs b/src/commands/kv/key/put.rs index e73317162..2e43021e3 100644 --- a/src/commands/kv/key/put.rs +++ b/src/commands/kv/key/put.rs @@ -24,6 +24,8 @@ pub fn put( expiration: Option<&str>, expiration_ttl: Option<&str>, ) -> Result<(), failure::Error> { + kv::validate_target(target)?; + let api_endpoint = format!( "https://api.cloudflare.com/client/v4/accounts/{}/storage/kv/namespaces/{}/values/{}", target.account_id, diff --git a/src/commands/kv/mod.rs b/src/commands/kv/mod.rs index cf588ad5e..1d3bbddd6 100644 --- a/src/commands/kv/mod.rs +++ b/src/commands/kv/mod.rs @@ -121,6 +121,9 @@ fn give_status_code_context(status_code: StatusCode) { fn help(error_code: u16) -> &'static str { // https://api.cloudflare.com/#workers-kv-namespace-errors match error_code { + 7003 | 7000 => { + "Your wrangler.toml is likely missing the field \"account_id\", which is required to write to Workers KV." + } // namespace errors 10010 | 10011 | 10012 | 10013 | 10014 | 10018 => { "Run `wrangler kv:namespace list` to see your existing namespaces with IDs" @@ -138,6 +141,23 @@ fn help(error_code: u16) -> &'static str { } } +pub fn validate_target(target: &Target) -> Result<(), failure::Error> { + let mut missing_fields = Vec::new(); + + if target.account_id.is_empty() { + missing_fields.push("account_id") + }; + + if !missing_fields.is_empty() { + failure::bail!( + "Your wrangler.toml is missing the following field(s): {:?}", + missing_fields + ) + } else { + Ok(()) + } +} + #[cfg(test)] mod tests { use crate::commands::kv; diff --git a/src/commands/kv/namespace/create.rs b/src/commands/kv/namespace/create.rs index 631365125..2ccbc88e3 100644 --- a/src/commands/kv/namespace/create.rs +++ b/src/commands/kv/namespace/create.rs @@ -13,6 +13,8 @@ pub fn create( user: GlobalUser, binding: &str, ) -> Result<(), failure::Error> { + kv::validate_target(target)?; + let client = kv::api_client(user)?; if !validate_binding(binding) { diff --git a/src/commands/kv/namespace/delete.rs b/src/commands/kv/namespace/delete.rs index 315680027..6c3c2fc4b 100644 --- a/src/commands/kv/namespace/delete.rs +++ b/src/commands/kv/namespace/delete.rs @@ -7,6 +7,7 @@ use crate::settings::target::Target; use crate::terminal::message; pub fn delete(target: &Target, user: GlobalUser, id: &str) -> Result<(), failure::Error> { + kv::validate_target(target)?; let client = kv::api_client(user)?; match kv::interactive_delete(&format!( diff --git a/src/commands/kv/namespace/list.rs b/src/commands/kv/namespace/list.rs index f34e3d01c..270546dfa 100644 --- a/src/commands/kv/namespace/list.rs +++ b/src/commands/kv/namespace/list.rs @@ -6,6 +6,7 @@ use crate::settings::global_user::GlobalUser; use crate::settings::target::Target; pub fn list(target: &Target, user: GlobalUser) -> Result<(), failure::Error> { + kv::validate_target(target)?; let client = kv::api_client(user)?; let response = client.request(&ListNamespaces { diff --git a/src/commands/kv/namespace/site.rs b/src/commands/kv/namespace/site.rs index 0ae627202..cd255b06a 100644 --- a/src/commands/kv/namespace/site.rs +++ b/src/commands/kv/namespace/site.rs @@ -11,6 +11,7 @@ use crate::settings::target::Target; use crate::terminal::message; pub fn site(target: &Target, user: &GlobalUser) -> Result { + kv::validate_target(target)?; let client = kv::api_client(user.to_owned())?; let title = format!("__{}-{}", target.name, "workers_sites_assets");