use crate::{
error::Error,
records::item::ItemBase,
util::{encoding::read_setup_string, read::Reader},
version::Version,
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum DeleteTargetType {
Files,
FilesAndSubdirs,
DirIfEmpty,
}
stable_name_enum!(DeleteTargetType, {
Self::Files => "files",
Self::FilesAndSubdirs => "files_and_subdirs",
Self::DirIfEmpty => "dir_if_empty",
});
#[derive(Clone, Debug)]
pub struct DeleteEntry {
pub name: String,
pub item: ItemBase,
pub target_type: Option<DeleteTargetType>,
pub target_type_raw: u8,
}
impl DeleteEntry {
pub(crate) fn read(reader: &mut Reader<'_>, version: &Version) -> Result<Self, Error> {
let name = read_setup_string(reader, version, "Delete.Name")?;
let item = ItemBase::read(reader, version)?;
let target_type_raw = reader.u8("Delete.Type")?;
Ok(Self {
name,
item,
target_type: decode_delete_type(target_type_raw),
target_type_raw,
})
}
}
fn decode_delete_type(b: u8) -> Option<DeleteTargetType> {
match b {
0 => Some(DeleteTargetType::Files),
1 => Some(DeleteTargetType::FilesAndSubdirs),
2 => Some(DeleteTargetType::DirIfEmpty),
_ => None,
}
}