use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "snake_case")]
pub enum HostSource {
SshConfig,
#[default]
Manual,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Host {
pub name: String,
pub hostname: String,
#[serde(default = "default_user")]
pub user: String,
#[serde(default = "default_port")]
pub port: u16,
#[serde(skip_serializing_if = "Option::is_none")]
pub identity_file: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_jump: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notes: Option<String>,
#[serde(default)]
pub source: HostSource,
#[serde(skip_serializing_if = "Option::is_none")]
pub original_ssh_host: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key_setup_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_auth_disabled: Option<bool>,
}
fn default_user() -> String {
std::env::var("USER")
.or_else(|_| std::env::var("LOGNAME"))
.unwrap_or_else(|_| String::from("root"))
}
fn default_port() -> u16 {
22
}
impl Default for Host {
fn default() -> Self {
Self {
name: String::new(),
hostname: String::new(),
user: default_user(),
port: default_port(),
identity_file: None,
password: None,
proxy_jump: None,
tags: Vec::new(),
notes: None,
source: HostSource::default(),
original_ssh_host: None,
key_setup_date: None,
password_auth_disabled: None,
}
}
}
impl Host {
pub fn id(&self) -> &str {
&self.name
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub enum ConnectionStatus {
#[default]
Unknown,
Connecting,
Connected,
Failed(String),
}