Browse Source

Allow anchor idl fetch to run outside workspace

Signed-off-by: Nikhil B N <nikhilbn365@gmail.com>
Nikhil B N 3 years ago
parent
commit
b643ca8eb8
1 changed files with 18 additions and 2 deletions
  1. 18 2
      cli/src/lib.rs

+ 18 - 2
cli/src/lib.rs

@@ -1397,8 +1397,24 @@ pub enum BinVerificationState {
 
 
 // Fetches an IDL for the given program_id.
 // Fetches an IDL for the given program_id.
 fn fetch_idl(cfg_override: &ConfigOverride, idl_addr: Pubkey) -> Result<Idl> {
 fn fetch_idl(cfg_override: &ConfigOverride, idl_addr: Pubkey) -> Result<Idl> {
-    let cfg = Config::discover(cfg_override)?.expect("Inside a workspace");
-    let url = cluster_url(&cfg);
+    let url = match Config::discover(cfg_override)? {
+        Some(cfg) => cluster_url(&cfg),
+        None => {
+            // If the command is not run inside a workspace,
+            // provider.cluster option has to be provided
+            if let Some(cluster) = cfg_override.cluster.clone() {
+                let is_localnet = cluster == Cluster::Localnet;
+                match is_localnet {
+                    // If Cluster is Localnet, default url will be used
+                    true => "http://localhost:8899".to_string(),
+                    false => cluster.url().to_string(),
+                }
+            } else {
+                return Err(anyhow!("provider.cluster option required"));
+            }
+        }
+    };
+
     let client = RpcClient::new(url);
     let client = RpcClient::new(url);
 
 
     let mut account = client
     let mut account = client