1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
//! The module holding the `Cluster` struct
use crate::get::{get_bool, get_mapping, get_string};
use serde::{Deserialize, Deserializer};
use serde_yaml::Mapping;
use std::path::PathBuf;
/// A cluster represents a cluster that the user knows how to connect to.
///
/// Note: The cluster struct is flattened when compared to its representation in
/// the yaml file. There is no `cluster` mapping, the values of the `cluster`
/// mapping are directly accessible on the `Cluster` struct.
#[derive(Debug, Clone)]
pub struct Cluster {
/// The name given to the cluster by the user
pub name: String,
/// The HTTP address to the server, including protocol
pub server: String,
/// A `PathBuf` representing the certificate authority associated with this
/// cluster. This is a path to a file on the disk.
pub certificate_authority: Option<PathBuf>,
/// A string representing the certificate authority associated with this
/// cluster. This is a base64 encoded string containing the CA data.
pub certificate_authority_data: Option<String>,
/// When set to true this is a signal that any certificate checking should
/// be bypassed by the user agent.
pub insecure_skip_tls_verify: bool,
}
impl<'de> Deserialize<'de> for Cluster {
fn deserialize<D>(d: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let map: Mapping = Deserialize::deserialize(d)?;
let name = get_string(&map, "name")?;
let cluster = get_mapping(map, "cluster")?;
Ok(Cluster {
name,
server: get_string::<D::Error>(&cluster, "server")?,
certificate_authority: get_string::<D::Error>(&cluster, "certificate-authority")
.map(PathBuf::from)
.ok(),
certificate_authority_data: get_string::<D::Error>(
&cluster,
"certificate-authority-data",
)
.ok(),
insecure_skip_tls_verify: get_bool::<D::Error>(&cluster, "insecure-skip-tls-verify")
.unwrap_or_default(),
})
// Cluster::try_from(map)
}
}
/*
TODO Write a working TryFrom impl
impl TryFrom<Mapping> for Cluster {
type Error = de::Error:
fn try_from(map: Mapping) -> Result<Self, Self::Error> {
// let cluster = get_map(map, "cluster");
let name = get_string(&map, "name")?;
let cluster = get_mapping(map, "cluster")?;
Ok(Cluster {
name,
server: get_string::<D::Error>(&cluster, "server")?,
certificate_authority: get_string::<D::Error>(&cluster, "certificate-authority")
.map(PathBuf::from)
.ok(),
certificate_authority_data: get_string::<D::Error>(
&cluster,
"certificate-authority-data",
)
.ok(),
insecure_skip_tls_verify: get_bool::<D::Error>(&cluster, "insecure-skip-tls-verify")
.unwrap_or_default(),
})
}
}
*/