use super::{ApiLinks, ApiMeta};
use super::{HasPagination, HasResponse, HasValue};
use {ROOT_URL, STATIC_URL_ERROR};
use chrono::{DateTime, Utc};
use method::{Create, Delete, Get, List};
use request::CertificateRequest;
use request::Request;
use serde::Serialize;
use std::fmt::Display;
use url::Url;
const CERTIFICATES_SEGMENT: &'static str = "certificates";
#[derive(Deserialize, Serialize, Debug, Clone, Getters, Setters)]
pub struct Certificate {
#[get = "pub"]
id: String,
#[get = "pub"]
name: String,
#[get = "pub"]
not_after: DateTime<Utc>,
#[get = "pub"]
sha1_fingerprint: String,
#[get = "pub"]
created_at: DateTime<Utc>,
}
impl Certificate {
pub fn create<S>(
name: S,
private_key: S,
leaf_certificate: S,
) -> CertificateRequest<Create, Certificate>
where
S: AsRef<str> + Serialize + Display,
{
let mut url = ROOT_URL.clone();
url.path_segments_mut().expect(STATIC_URL_ERROR).push(
CERTIFICATES_SEGMENT,
);
let mut req = Request::new(url);
req.set_body(json!({
"name": name,
"private_key": private_key,
"leaf_certificate": leaf_certificate,
}));
req
}
pub fn list() -> CertificateRequest<List, Vec<Certificate>> {
let mut url = ROOT_URL.clone();
url.path_segments_mut().expect(STATIC_URL_ERROR).push(
CERTIFICATES_SEGMENT,
);
Request::new(url)
}
pub fn get<N>(id: N) -> CertificateRequest<Get, Certificate>
where
N: AsRef<str> + Display,
{
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(CERTIFICATES_SEGMENT)
.push(id.as_ref());
Request::new(url)
}
pub fn delete<N>(id: N) -> CertificateRequest<Delete, ()>
where
N: AsRef<str> + Display,
{
let mut url = ROOT_URL.clone();
url.path_segments_mut()
.expect(STATIC_URL_ERROR)
.push(CERTIFICATES_SEGMENT)
.push(id.as_ref());
Request::new(url)
}
}
impl CertificateRequest<Create, Certificate> {
pub fn certificate_chain<S>(mut self, val: S) -> Self
where
S: AsRef<str> + Serialize + Display,
{
self.body_mut()["certificate_chain"] = json!(val);
self
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct CertificateResponse {
certificate: Certificate,
}
impl HasResponse for Certificate {
type Response = CertificateResponse;
}
impl HasValue for CertificateResponse {
type Value = Certificate;
fn value(self) -> Certificate {
self.certificate
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct CertificateListResponse {
certificates: Vec<Certificate>,
links: ApiLinks,
meta: ApiMeta,
}
impl HasResponse for Vec<Certificate> {
type Response = CertificateListResponse;
}
impl HasPagination for CertificateListResponse {
fn next_page(&self) -> Option<Url> {
self.links.next()
}
}
impl HasValue for CertificateListResponse {
type Value = Vec<Certificate>;
fn value(self) -> Vec<Certificate> {
self.certificates
}
}