use serde::{Deserialize, Serialize};
use std::{fmt::Debug, net::Ipv4Addr};
use crate::error::SyncError;
#[derive(Serialize, Deserialize)]
pub enum Backend {
Podman,
Docker,
}
impl Debug for Backend {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Backend::Podman => write!(f, "podman"),
Backend::Docker => write!(f, "docker"),
}
}
}
#[derive(Serialize, Deserialize)]
pub struct Synchronizer {
pub hosts: Vec<(String, String)>,
pub backend: Backend,
pub file: Option<String>,
}
impl Synchronizer {
pub fn new() -> Self {
Self {
hosts: vec![],
backend: Backend::Docker,
file: None,
}
}
}
pub fn ip(addr: &str) -> Result<Ipv4Addr, SyncError> {
let addr_parts: Vec<_> = addr.split('.').collect();
if addr_parts.len() != 4 {
return Err(SyncError::InvalidIPv4);
}
let addr: Result<Vec<u8>, _> = addr_parts.iter().map(|s| s.parse::<u8>()).collect();
let addr = addr.map_err(|_| SyncError::InvalidIPv4)?;
Ok(Ipv4Addr::new(addr[0], addr[1], addr[2], addr[3]))
}