if let Some(ref v) = opts.to_add {
let v = v.iter().map(|s| &s[..]).collect::<Vec<_>>();
- config.shell().status("Owner", format!("adding {:?} to crate {}",
- v, name))?;
- registry.add_owners(&name, &v).map_err(|e| {
- CargoError::from(format!("failed to add owners to crate {}: {}", name, e))
+ let msg = registry.add_owners(&name, &v).map_err(|e| {
+ CargoError::from(format!("failed to invite owners to crate {}: {}", name, e))
})?;
+
+ config.shell().status("Owner", msg)?;
}
if let Some(ref v) = opts.to_remove {
}
#[derive(Deserialize)] struct R { ok: bool }
+#[derive(Deserialize)] struct OwnerResponse { ok: bool, msg: String }
#[derive(Deserialize)] struct ApiErrorList { errors: Vec<ApiError> }
#[derive(Deserialize)] struct ApiError { detail: String }
#[derive(Serialize)] struct OwnersReq<'a> { users: &'a [&'a str] }
}
}
- pub fn add_owners(&mut self, krate: &str, owners: &[&str]) -> Result<()> {
+ pub fn add_owners(&mut self, krate: &str, owners: &[&str]) -> Result<String> {
let body = serde_json::to_string(&OwnersReq { users: owners })?;
let body = self.put(format!("/crates/{}/owners", krate),
body.as_bytes())?;
- assert!(serde_json::from_str::<R>(&body)?.ok);
- Ok(())
+ assert!(serde_json::from_str::<OwnerResponse>(&body)?.ok);
+ Ok(serde_json::from_str::<OwnerResponse>(&body)?.msg)
}
pub fn remove_owners(&mut self, krate: &str, owners: &[&str]) -> Result<()> {
let body = serde_json::to_string(&OwnersReq { users: owners })?;
let body = self.delete(format!("/crates/{}/owners", krate),
Some(body.as_bytes()))?;
- assert!(serde_json::from_str::<R>(&body)?.ok);
+ assert!(serde_json::from_str::<OwnerResponse>(&body)?.ok);
Ok(())
}