use std::process::Command;
use super::{
ArbitraryJobStatus, Change, ExclusiveOption, ForceOperationMode, OriginalChangeListMode,
TakesChangeList, Unselected,
};
#[cfg_attr(
not(feature = "lt2015_2"),
doc = "The remote variant is [`RemoteDeleteMode`]."
)]
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct LocalDeleteMode;
#[cfg(not(feature = "lt2015_2"))]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RemoteDeleteMode {
pub(super) server_id: String,
}
#[cfg_attr(not(feature = "lt2015_2"), doc = "[`RemoteDeleteMode`] form.")]
#[cfg_attr(feature = "lt2015_2", doc = "remote form.")]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DeleteMode<L = LocalDeleteMode> {
pub(super) loc: L,
}
impl ExclusiveOption for LocalDeleteMode {}
#[cfg(not(feature = "lt2015_2"))]
impl ExclusiveOption for RemoteDeleteMode {
fn inject_args(&self, command: &mut Command) {
command.arg("-f");
#[cfg(feature = "lt2022_1")]
command.arg(format!("--server={}", self.server_id));
#[cfg(not(feature = "lt2022_1"))]
command.arg(format!("--serverid={}", self.server_id));
}
}
impl<L: ExclusiveOption> ExclusiveOption for DeleteMode<L> {
fn inject_args(&self, command: &mut Command) {
command.arg("-d");
self.loc.inject_args(command);
}
}
impl<L> TakesChangeList for DeleteMode<L> {}
#[doc(hidden)]
pub trait TransferDeleteMode {}
impl TransferDeleteMode for Unselected {}
impl TransferDeleteMode for ForceOperationMode {}
impl TransferDeleteMode for OriginalChangeListMode {}
#[cfg(not(feature = "lt2015_2"))]
#[doc(hidden)]
pub trait TransferRemoteDeleteMode {}
#[cfg(not(feature = "lt2015_2"))]
impl TransferRemoteDeleteMode for Unselected {}
#[cfg(not(feature = "lt2015_2"))]
impl TransferRemoteDeleteMode for ForceOperationMode {}
impl<O, C> Change<DeleteMode<LocalDeleteMode>, O, C, Unselected> {
pub fn arbitrary_job_status(
self,
) -> Change<DeleteMode<LocalDeleteMode>, O, C, ArbitraryJobStatus> {
Change {
bin: self.bin,
global_opts: self.global_opts,
mode: self.mode,
permission_mode: self.permission_mode,
changelist_mode: self.changelist_mode,
job_status_mode: ArbitraryJobStatus,
}
}
}
impl<C, S> Change<DeleteMode<LocalDeleteMode>, Unselected, C, S> {
pub fn force(self) -> Change<DeleteMode<LocalDeleteMode>, ForceOperationMode, C, S> {
Change {
bin: self.bin,
global_opts: self.global_opts,
mode: self.mode,
permission_mode: ForceOperationMode,
changelist_mode: self.changelist_mode,
job_status_mode: self.job_status_mode,
}
}
}
impl<O, S> Change<DeleteMode<LocalDeleteMode>, O, Unselected, S> {
pub fn original(self) -> Change<DeleteMode<LocalDeleteMode>, O, OriginalChangeListMode, S> {
Change {
bin: self.bin,
global_opts: self.global_opts,
mode: self.mode,
permission_mode: self.permission_mode,
changelist_mode: OriginalChangeListMode,
job_status_mode: self.job_status_mode,
}
}
}
#[cfg(not(feature = "lt2015_2"))]
impl<O: TransferRemoteDeleteMode> Change<DeleteMode<LocalDeleteMode>, O, Unselected, Unselected> {
pub fn server_id(
self,
server_id: impl Into<String>,
) -> Change<DeleteMode<RemoteDeleteMode>, Unselected, Unselected, Unselected> {
Change {
bin: self.bin,
global_opts: self.global_opts,
mode: DeleteMode {
loc: RemoteDeleteMode {
server_id: server_id.into(),
},
},
permission_mode: Unselected,
changelist_mode: Unselected,
job_status_mode: Unselected,
}
}
}