Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binding 在Rust库中处理API键的最惯用方法是什么?_Binding_Rust_Idioms - Fatal编程技术网

Binding 在Rust库中处理API键的最惯用方法是什么?

Binding 在Rust库中处理API键的最惯用方法是什么?,binding,rust,idioms,Binding,Rust,Idioms,我正在为一个接受两个API键的API编写Rust绑定。实现这一点的方法有很多。我特别不想让用户负担像这样的请求 myapi::requestThing(firstApiKey, SecondApiKey,...) 我希望用户只传入一次API密钥,并让它记住它。问题是我试图在功能上做到这一点,而将所有内容都塞进结构似乎也不是最好的方法。您绝对不想拥有某种神奇存储的全局配置。这将防止多个用户在同一进程中同时使用API 我将为API端点构造一个生成器。这可以为API URL提供默认值,还可以从环境变

我正在为一个接受两个API键的API编写Rust绑定。实现这一点的方法有很多。我特别不想让用户负担像这样的请求

myapi::requestThing(firstApiKey, SecondApiKey,...)

我希望用户只传入一次API密钥,并让它记住它。问题是我试图在功能上做到这一点,而将所有内容都塞进结构似乎也不是最好的方法。

您绝对不想拥有某种神奇存储的全局配置。这将防止多个用户在同一进程中同时使用API

我将为API端点构造一个生成器。这可以为API URL提供默认值,还可以从环境变量中获取API键。您还可以通过编程方式重写URL或键

use std::collections::HashMap;

struct ApiEndpoint {
    url: String,
    api_key_1: String,
    api_key_2: String,
}

impl ApiEndpoint {
    fn add_money_to_account(&self, cents: u64) {
        println!("Adding {} cents. Making a request to {} ({}, {})", cents, self.url, self.api_key_1, self.api_key_2);
    }
}

struct ApiBuilder {
    url: Option<String>,
    api_key_1: Option<String>,
    api_key_2: Option<String>,
}

impl ApiBuilder {
    fn new() -> ApiBuilder {
        ApiBuilder {
            url: None,
            api_key_1: None,
            api_key_2: None,
        }
    }

    fn url(mut self, url: &str) -> ApiBuilder {
        self.url = Some(url.into());
        self
    }

    fn api_key_1(mut self, api_key_1: &str) -> ApiBuilder {
        self.api_key_1 = Some(api_key_1.into());
        self
    }

    fn api_key_2(mut self, api_key_2: &str) -> ApiBuilder {
        self.api_key_2 = Some(api_key_2.into());
        self
    }

    fn build(self) -> ApiEndpoint {
        let mut env_vars: HashMap<_, _> = std::env::vars().collect();

        ApiEndpoint {
            url: self.url.unwrap_or_else(|| "http://example.com/default".into()),
            api_key_1: self.api_key_1.or_else(|| env_vars.remove("MYLIB_ENV_VAR_1")).unwrap(),
            api_key_2: self.api_key_2.or_else(|| env_vars.remove("MYLIB_ENV_VAR_2")).unwrap(),
        }
    }
}

fn main() {
    let endpoint =
        ApiBuilder::new()
        .url("https://test.example.com")
        .api_key_1("SEEKRET")
        .api_key_2("PASSWORD")
        .build();

    endpoint.add_money_to_account(500);
}
使用std::collections::HashMap;
结构ApiEndpoint{
url:String,
api_键_1:字符串,
api_密钥_2:字符串,
}
impl-api端点{
fn将钱添加到帐户(&self,美分:u64){
println!(“添加{}美分。向{}({},{})发出请求)”,美分,self.url,self.api_key_1,self.api_key_2);
}
}
结构ApiBuilder{
url:选项,
api_密钥_1:选项,
api_密钥_2:选项,
}
impl ApiBuilder{
fn new()->ApiBuilder{
养蜂人{
网址:无,
api_密钥_1:无,
api_密钥_2:无,
}
}
fn url(mut self,url:&str)->ApiBuilder{
self.url=Some(url.into());
自己
}
fn api密钥1(多个自身、api密钥1:&str)->ApiBuilder{
self.api_key_1=Some(api_key_1.into());
自己
}
fn api_密钥_2(多个自身、api_密钥_2:&str)->ApiBuilder{
self.api_key_2=Some(api_key_2.into());
自己
}
fn构建(自)->API端点{
让mut env_vars:HashMap=std::env::vars().collect();
Apident{
url:self.url.unwrap_或_else(| |“http://example.com/default“.into()),
api_key_1:self.api_key_1.或_else(| | env_vars.remove(“MYLIB_env_VAR_1”))。展开(),
api_key_2:self.api_key_2.或_else(| | env_vars.remove(“MYLIB_env_VAR_2”))。展开(),
}
}
}
fn main(){
让端点=
ApiBuilder::new()
.url(“https://test.example.com")
.api_key_1(“SEEKRET”)
.api_密钥_2(“密码”)
.build();
端点。将钱添加到账户(500);
}
把所有东西塞进结构中似乎也不是最好的方法

我不明白为什么不