let env_value = match env_key { Some(env_key) => match env::var(format!("ORD_{env_key}")) { Ok(env_value) => Some(env_value), Err(err @ env::VarError::NotUnicode(_)) => return Err(err.into()), Err(env::VarError::NotPresent) => None, }, None => None, }; Ok( arg_value .or(env_value.as_deref()) .or(config_value) .or(default_value) .map(str::to_string), ) } pub(crate) fn auth(&self) -> Result { let config = self.load_config()?; let rpc_user = Options::derive_var( self.bitcoin_rpc_user.as_deref(), Some("BITCOIN_RPC_USER"), config.bitcoin_rpc_user.as_deref(), None, )?; let rpc_pass = Options::derive_var( self.bitcoin_rpc_pass.as_deref(), Some("BITCOIN_RPC_PASS"), config.bitcoin_rpc_pass.as_deref(), None, )?; match (rpc_user, rpc_pass) { (Some(rpc_user), Some(rpc_pass)) => Ok(Auth::UserPass(rpc_user, rpc_pass)), (None, Some(_rpc_pass)) => Err(anyhow!("no bitcoind rpc user specified")),