Skip to content

Commit cef1dc8

Browse files
committed
b2: Don't base code on old blog posts
I tried an inner function from a vague recollection of https://matklad.github.io/2023/01/26/rusts-ugly-syntax.html But it turns out compilers are good at compiler things: rust-lang/rust#75155
1 parent 40553c1 commit cef1dc8

File tree

1 file changed

+98
-99
lines changed

1 file changed

+98
-99
lines changed

b2/src/lib.rs

Lines changed: 98 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -44,108 +44,107 @@ fn check_response(r: minreq::Response) -> Result<json::Value> {
4444
}
4545

4646
impl Session {
47-
pub fn new<S: Into<String>>(key_id: &str, application_key: &str, bukkit: S) -> Result<Self> {
48-
let inner = |bucket: String| -> Result<Self> {
49-
let creds = String::from(key_id) + ":" + application_key;
50-
let auth = String::from("Basic") + &BASE64_STANDARD.encode(creds);
51-
let v: json::Value = check_response(
52-
minreq::get("https://api.backblazeb2.com/b2api/v3/b2_authorize_account")
53-
.with_header("Authorization", auth)
54-
.send()?,
55-
)?;
56-
57-
let bad = |s| unexpected(s, &v);
58-
59-
let id: String = v["accountId"]
60-
.as_str()
61-
.ok_or_else(|| bad("login response missing authorization token"))?
62-
.to_owned();
63-
64-
let token: String = v["authorizationToken"]
65-
.as_str()
66-
.ok_or_else(|| bad("login response missing authorization token"))?
67-
.to_owned();
68-
69-
let url = v["apiInfo"]["storageApi"]["apiUrl"]
70-
.as_str()
71-
.ok_or_else(|| bad("login response missing API URL"))?
72-
.to_owned();
73-
74-
let capes = v["apiInfo"]["storageApi"]["capabilities"]
75-
.as_array()
76-
.ok_or_else(|| bad("login response missing capabilities"))?;
77-
let capes = capes
78-
.iter()
79-
.map(|v| {
80-
v.as_str()
81-
.ok_or_else(|| bad("login response had malformed capabilities"))
82-
})
83-
.collect::<Result<Vec<&str>>>()?;
84-
85-
if !capes.iter().any(|c| *c == "listKeys") {
86-
return Err(bad("credentials can not list files"));
87-
}
88-
if !capes.iter().any(|c| *c == "readFiles") {
89-
return Err(bad("credentials can not read files"));
90-
}
91-
if !capes.iter().any(|c| *c == "writeFiles") {
92-
return Err(bad("credentials can not write files"));
93-
}
94-
if !capes.iter().any(|c| *c == "deleteFiles") {
95-
return Err(bad("credentials can not delete files"));
96-
}
47+
pub fn new<S: Into<String>>(key_id: &str, application_key: &str, bucket: S) -> Result<Self> {
48+
let bucket = bucket.into();
49+
50+
let creds = String::from(key_id) + ":" + application_key;
51+
let auth = String::from("Basic") + &BASE64_STANDARD.encode(creds);
52+
let v: json::Value = check_response(
53+
minreq::get("https://api.backblazeb2.com/b2api/v3/b2_authorize_account")
54+
.with_header("Authorization", auth)
55+
.send()?,
56+
)?;
57+
58+
let bad = |s| unexpected(s, &v);
59+
60+
let id: String = v["accountId"]
61+
.as_str()
62+
.ok_or_else(|| bad("login response missing authorization token"))?
63+
.to_owned();
64+
65+
let token: String = v["authorizationToken"]
66+
.as_str()
67+
.ok_or_else(|| bad("login response missing authorization token"))?
68+
.to_owned();
69+
70+
let url = v["apiInfo"]["storageApi"]["apiUrl"]
71+
.as_str()
72+
.ok_or_else(|| bad("login response missing API URL"))?
73+
.to_owned();
74+
75+
let capes = v["apiInfo"]["storageApi"]["capabilities"]
76+
.as_array()
77+
.ok_or_else(|| bad("login response missing capabilities"))?;
78+
let capes = capes
79+
.iter()
80+
.map(|v| {
81+
v.as_str()
82+
.ok_or_else(|| bad("login response had malformed capabilities"))
83+
})
84+
.collect::<Result<Vec<&str>>>()?;
9785

98-
let br: json::Value = check_response(
99-
minreq::get(url.clone() + "/b2api/v2/b2_list_buckets")
100-
.with_header("Authorization", &token)
101-
.with_param("accountId", id)
102-
.with_param("bucketName", &bucket)
103-
.send()?,
104-
)?;
105-
106-
let bucket_id = match br["buckets"].as_array() {
107-
Some(bs) => {
108-
match bs
109-
.iter()
110-
.find(|b| b["bucketName"].as_str() == Some(&bucket))
111-
{
112-
Some(mah_bukkit) => mah_bukkit["bucketId"]
113-
.as_str()
114-
.ok_or_else(|| unexpected("bucket was missing ID", &br))?
115-
.to_owned(),
116-
None => return Err(Error::NotFound { what: bucket }),
117-
}
86+
if !capes.iter().any(|c| *c == "listKeys") {
87+
return Err(bad("credentials can not list files"));
88+
}
89+
if !capes.iter().any(|c| *c == "readFiles") {
90+
return Err(bad("credentials can not read files"));
91+
}
92+
if !capes.iter().any(|c| *c == "writeFiles") {
93+
return Err(bad("credentials can not write files"));
94+
}
95+
if !capes.iter().any(|c| *c == "deleteFiles") {
96+
return Err(bad("credentials can not delete files"));
97+
}
98+
99+
let br: json::Value = check_response(
100+
minreq::get(url.clone() + "/b2api/v2/b2_list_buckets")
101+
.with_header("Authorization", &token)
102+
.with_param("accountId", id)
103+
.with_param("bucketName", &bucket)
104+
.send()?,
105+
)?;
106+
107+
let bucket_id = match br["buckets"].as_array() {
108+
Some(bs) => {
109+
match bs
110+
.iter()
111+
.find(|b| b["bucketName"].as_str() == Some(&bucket))
112+
{
113+
Some(mah_bukkit) => mah_bukkit["bucketId"]
114+
.as_str()
115+
.ok_or_else(|| unexpected("bucket was missing ID", &br))?
116+
.to_owned(),
117+
None => return Err(Error::NotFound { what: bucket }),
118118
}
119-
None => return Err(Error::NotFound { what: bucket }),
120-
};
121-
122-
let ur: json::Value = check_response(
123-
minreq::get(url.clone() + "/b2api/v2/b2_get_upload_url")
124-
.with_header("Authorization", &token)
125-
.with_param("bucketId", &bucket_id)
126-
.send()?,
127-
)?;
128-
129-
let upload_url = ur["uploadUrl"]
130-
.as_str()
131-
.ok_or_else(|| unexpected("couldn't get bucket upload URL", &ur))?
132-
.to_owned();
133-
134-
let upload_token = ur["authorizationToken"]
135-
.as_str()
136-
.ok_or_else(|| unexpected("couldn't get bucket upload token", &ur))?
137-
.to_owned();
138-
139-
Ok(Session {
140-
token,
141-
url,
142-
upload_url,
143-
upload_token,
144-
bucket_name: bucket,
145-
bucket_id,
146-
})
119+
}
120+
None => return Err(Error::NotFound { what: bucket }),
147121
};
148-
inner(bukkit.into())
122+
123+
let ur: json::Value = check_response(
124+
minreq::get(url.clone() + "/b2api/v2/b2_get_upload_url")
125+
.with_header("Authorization", &token)
126+
.with_param("bucketId", &bucket_id)
127+
.send()?,
128+
)?;
129+
130+
let upload_url = ur["uploadUrl"]
131+
.as_str()
132+
.ok_or_else(|| unexpected("couldn't get bucket upload URL", &ur))?
133+
.to_owned();
134+
135+
let upload_token = ur["authorizationToken"]
136+
.as_str()
137+
.ok_or_else(|| unexpected("couldn't get bucket upload token", &ur))?
138+
.to_owned();
139+
140+
Ok(Session {
141+
token,
142+
url,
143+
upload_url,
144+
upload_token,
145+
bucket_name: bucket,
146+
bucket_id,
147+
})
149148
}
150149

151150
pub fn list(&self) -> Result<Vec<String>> {

0 commit comments

Comments
 (0)