use std::fmt;
use crate::arguments::{ArgumentScanner, ExpectArg, FromArgs};
use crate::keyword::RelocateKeyword;
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub struct Relocate<S = String> {
pub hostname: S,
pub port: u16,
pub quiet: bool,
}
impl<S> Relocate<S> {
pub fn map_text<T, F>(self, f: F) -> Relocate<T>
where
F: FnOnce(S) -> T,
{
Relocate {
hostname: f(self.hostname),
port: self.port,
quiet: self.quiet,
}
}
}
impl_into_owned!(Relocate);
impl<S: AsRef<str>> Relocate<S> {
pub fn borrow_text(&self) -> Relocate<&str> {
Relocate {
hostname: self.hostname.as_ref(),
port: self.port,
quiet: self.quiet,
}
}
}
impl_partial_eq!(Relocate);
impl<'a, S: AsRef<str>> FromArgs<'a, S> for Relocate<S> {
fn from_args<A: ArgumentScanner<'a, Decoded = S>>(scanner: A) -> crate::Result<Self> {
let mut scanner = scanner.with_keywords();
let hostname = scanner.get_next()?.expect_some("Hostname")?;
let port = scanner.get_next()?.expect_number()?.expect_some("Port")?;
let keywords = scanner.into_keywords()?;
Ok(Self {
hostname,
port,
quiet: keywords.contains(RelocateKeyword::Quiet),
})
}
}
impl_from_str!(Relocate);
impl<S: AsRef<str>> fmt::Display for Relocate<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let Relocate {
hostname,
port,
quiet,
} = self.borrow_text();
crate::display::ElementFormatter {
name: "RELOCATE",
arguments: &[&hostname, &port],
keywords: &[("QUIET", quiet)],
}
.fmt(f)
}
}