63 lines
2.0 KiB
Rust
63 lines
2.0 KiB
Rust
use std::io::{self, Read};
|
|
|
|
use anyhow::bail;
|
|
|
|
use crate::proto::{CliResponse, DockerCredential};
|
|
use super::{
|
|
CliCredential,
|
|
CliRequest,
|
|
GlobalArgs
|
|
};
|
|
|
|
|
|
pub fn docker_store(global_args: GlobalArgs) -> anyhow::Result<()> {
|
|
let input: DockerCredential = serde_json::from_reader(io::stdin())?;
|
|
|
|
let req = CliRequest::StoreDockerCredential(input);
|
|
|
|
match super::make_request(global_args.server_addr, &req)?? {
|
|
CliResponse::Empty => Ok(()),
|
|
r => bail!("Unexpected response from server: {r}"),
|
|
}
|
|
}
|
|
|
|
|
|
pub fn docker_get(global_args: GlobalArgs) -> anyhow::Result<()> {
|
|
let mut server_url = String::new();
|
|
io::stdin().read_to_string(&mut server_url)?;
|
|
let req = CliRequest::GetDockerCredential {
|
|
server_url: server_url.trim().to_owned()
|
|
};
|
|
|
|
let server_resp = super::make_request(global_args.server_addr, &req)?;
|
|
match server_resp {
|
|
Ok(CliResponse::Credential(CliCredential::Docker(d))) => {
|
|
println!("{}", serde_json::to_string(&d)?);
|
|
},
|
|
Err(e) if e.code == "NoCredentials" => {
|
|
// To indicate credentials are not found, a credential helper *must* print
|
|
// this message to stdout, then exit 1. Any other message/status will cause
|
|
// some builds to fail. This is, of course, not documented anywhere.
|
|
println!("credentials not found in native keychain");
|
|
std::process::exit(1);
|
|
},
|
|
Err(e) => Err(e)?,
|
|
Ok(r) => bail!("Unexpected response from server: {r}"),
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
|
|
pub fn docker_erase(global_args: GlobalArgs) -> anyhow::Result<()> {
|
|
let mut server_url = String::new();
|
|
io::stdin().read_to_string(&mut server_url)?;
|
|
let req = CliRequest::EraseDockerCredential {
|
|
server_url: server_url.trim().to_owned()
|
|
};
|
|
|
|
match super::make_request(global_args.server_addr, &req)?? {
|
|
CliResponse::Empty => Ok(()),
|
|
r => bail!("Unexpected response from server: {r}"),
|
|
}
|
|
}
|