use super::get_put::{Get2Args, GetArgs, Put2Args, PutArgs};
use super::misc_fs::{CreateDirectoryArgs, ListArgs, SetMetadataArgs};
use crate::protocol::prelude::*;
#[allow(unused_imports, reason = "needed for docs")]
use crate::protocol::session::Response;
use crate::util::time::SystemTimeExt as _;
use int_enum::IntEnum;
use std::time::SystemTime;
#[allow(unused_imports, reason = "needed for docs")]
use super::file_transfer::{FileHeader, FileTrailer};
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone, strum_macros::Display)]
pub enum Command {
Get(GetArgs),
Put(PutArgs),
Get2(Get2Args),
Put2(Put2Args),
CreateDirectory(CreateDirectoryArgs),
SetMetadata(SetMetadataArgs),
List(ListArgs),
}
impl ProtocolMessage for Command {}
#[derive(PartialEq, Eq, Debug, Clone, Copy, IntEnum, Default, strum_macros::Display)]
#[repr(u64)]
#[non_exhaustive]
pub enum CommandParam {
#[default]
Invalid,
PreserveMetadata,
Recurse,
}
impl DataTag for CommandParam {}
#[derive(
Serialize,
Deserialize,
PartialEq,
Eq,
Clone,
Copy,
Debug,
IntEnum,
Default,
strum_macros::Display,
)]
#[repr(u64)]
#[non_exhaustive]
pub enum MetadataAttr {
#[default]
Invalid,
ModeBits,
AccessTime,
ModificationTime,
}
impl DataTag for MetadataAttr {
fn debug_data(&self, data: &Variant) -> String {
match self {
MetadataAttr::ModeBits => match data {
Variant::Unsigned(mode) => format!("0{:0>3o}", mode.0), _ => format!("{data:?}"),
},
_ => format!("{data:?}"),
}
}
}
impl MetadataAttr {
#[must_use]
pub fn new_atime(t: SystemTime) -> TaggedData<MetadataAttr> {
Self::AccessTime.with_unsigned(t.to_unix())
}
#[must_use]
pub fn new_mode(m: u32) -> TaggedData<MetadataAttr> {
Self::ModeBits.with_unsigned(m)
}
#[must_use]
pub fn new_mtime(t: SystemTime) -> TaggedData<MetadataAttr> {
Self::ModificationTime.with_unsigned(t.to_unix())
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod test {
use super::Command;
use crate::protocol::session::prelude::*;
use pretty_assertions::assert_eq;
#[test]
fn serialize() {
let cmd = Command::Get(super::GetArgs {
filename: "myfile".to_string(),
});
let wire = cmd.to_vec().unwrap();
let deser = Command::from_slice(&wire).unwrap();
assert_eq!(cmd, deser);
}
#[test]
fn metadata_debug_render() {
let t = MetadataAttr::ModeBits.with_unsigned(0o644u32);
let s = format!("{t:?}");
eprintln!("case 1: {s}");
assert!(s.contains("MetadataAttr::ModeBits"));
assert!(s.contains("data: 0644"));
let t = TaggedData::<MetadataAttr>::new_raw(99999);
let s = format!("{t:?}");
eprintln!("case 2: {s}");
assert!(s.contains("MetadataAttr::UNKNOWN_99999"));
assert!(s.contains("data: Empty"));
}
}