use std::path::PathBuf;
use pliantdb_core::networking::fabruic::{Certificate, PrivateKey};
use structopt::StructOpt;
use tokio::io::AsyncReadExt;
use crate::Server;
#[derive(StructOpt, Debug)]
pub enum Command {
InstallSelfSigned {
#[structopt(short = "n", long)]
server_name: String,
#[structopt(short, long)]
overwrite: bool,
},
Install {
private_key: PathBuf,
certificate: PathBuf,
},
}
impl Command {
pub async fn execute(&self, server: Server) -> anyhow::Result<()> {
match self {
Self::InstallSelfSigned {
server_name,
overwrite,
} => {
server
.install_self_signed_certificate(server_name, *overwrite)
.await?;
}
Self::Install {
private_key,
certificate,
} => {
let mut private_key_file = tokio::fs::File::open(&private_key).await?;
let mut private_key = Vec::new();
private_key_file.read_to_end(&mut private_key).await?;
let mut certificate_file = tokio::fs::File::open(&certificate).await?;
let mut certificate = Vec::new();
certificate_file.read_to_end(&mut certificate).await?;
server
.install_certificate(
&Certificate::from_der(certificate)?,
&PrivateKey::from_der(private_key)?,
)
.await?;
}
}
Ok(())
}
}