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 89 90 91
//! The module holding the `User` struct
use crate::get::{get_mapping, get_string};
use serde::{Deserialize, Deserializer};
use serde_yaml::Mapping;
use std::path::PathBuf;
/// A user represents a user that can be used to log in to one of the clusters
/// given in the `Cluster` struct. The mapping of which user can log in to which
/// clusters are maintained in the `Context` set found in the `Config` struct.
///
/// Note: The user struct is flattened when compared to its representation in
/// the yaml file. There is no `user` mapping, the values of the `user`
/// mapping are directly accessible on the `User` struct.
#[derive(Debug, Clone)]
pub struct User {
/// The name given to this user by the user
pub name: String,
pub token: Option<String>,
pub username: Option<String>,
pub password: Option<String>,
/// A `PathBuf` representing the client certificate associated with this
/// user. This is a path to a file on the disk.
pub client_certificate: Option<PathBuf>,
/// A string representing the client certificate associated with this
/// user. This is a base64 encoded string containing the CA data.
pub client_certificate_data: Option<String>,
/// A `PathBuf` representing the client key associated with this
/// user. This is a path to a file on the disk.
pub client_key: Option<PathBuf>,
/// A string representing the client key associated with this
/// user. This is a base64 encoded string containing the CA data.
pub client_key_data: Option<String>,
}
impl<'de> Deserialize<'de> for User {
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 user = get_mapping(map, "user")?;
Ok(User {
name,
token: get_string::<D::Error>(&user, "token").ok(),
username: get_string::<D::Error>(&user, "username").ok(),
password: get_string::<D::Error>(&user, "password").ok(),
client_certificate: get_string::<D::Error>(&user, "client-certificate")
.map(PathBuf::from)
.ok(),
client_certificate_data: get_string::<D::Error>(&user, "client-certificate-data").ok(),
client_key: get_string::<D::Error>(&user, "client-key")
.map(PathBuf::from)
.ok(),
client_key_data: get_string::<D::Error>(&user, "client-key-data").ok(),
})
// User::try_from(map)
}
}
/*
impl TryFrom<Mapping> for User {
type Error = de::Error;
fn try_from(map: Mapping) -> Result<Self, Self::Error> {
let name = get_string(&map, "name")?;
let user = get_mapping(map, "user")?;
Ok(User {
name,
token: get_string::<D::Error>(&user, "token").ok(),
username: get_string::<D::Error>(&user, "username").ok(),
password: get_string::<D::Error>(&user, "password").ok(),
client_certificate: get_string::<D::Error>(&user, "client-certificate")
.map(PathBuf::from)
.ok(),
client_certificate_data: get_string::<D::Error>(&user, "client-certificate-data").ok(),
client_key: get_string::<D::Error>(&user, "client-key")
.map(PathBuf::from)
.ok(),
client_key_data: get_string::<D::Error>(&user, "client-key-data").ok(),
})
}
}
*/