#![cfg_attr(
test,
allow(
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::arithmetic_side_effects,
clippy::indexing_slicing
)
)]
macro_rules! stable_name_enum {
($ty:ty, { $($pat:pat => $name:literal),+ $(,)? }) => {
impl $ty {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
$($pat => $name,)+
}
}
}
impl core::fmt::Display for $ty {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
};
}
macro_rules! stable_flag_enum {
($ty:ty, { $($variant:ident => $name:literal),+ $(,)? }) => {
stable_name_enum!($ty, { $(Self::$variant => $name,)+ });
impl $ty {
pub const ORDER: &'static [Self] = &[$(Self::$variant,)+];
pub const NAME_ORDER: &'static [&'static str] = &[$($name,)+];
#[must_use]
pub fn bit(self) -> u64 {
let shift = Self::ORDER
.iter()
.position(|flag| *flag == self)
.and_then(|idx| u32::try_from(idx).ok());
shift.and_then(|idx| 1_u64.checked_shl(idx)).unwrap_or(0)
}
#[must_use]
pub fn set_to_bits(set: &std::collections::HashSet<Self>) -> u64 {
set.iter().fold(0_u64, |acc, flag| acc | flag.bit())
}
}
};
}
pub mod analysis;
pub mod decompress;
pub mod error;
pub mod extract;
pub mod header;
pub mod installer;
pub mod overlay;
pub mod records;
pub mod version;
pub use ::pascalscript;
mod crypto;
mod util;
pub use error::Error;
pub use extract::FileReader;
pub use header::{
Architecture, AutoNoYes, CompressMethod, EntryCounts, HeaderAnsi, HeaderOption, HeaderString,
HeaderTail, ImageAlphaFormat, LanguageDetectionMethod, PrivilegesRequired,
PrivilegesRequiredOverride, SetupHeader, UninstallLogMode, WizardStyle, YesNoAuto,
};
pub use installer::{Compression, EncryptionInfo, EncryptionMode, InnoInstaller};
pub use overlay::{
OffsetTable, OffsetTableSource, SetupLdrFamily, pe::LocatorMode as PeLocatorMode,
};
pub use records::{
component::{ComponentEntry, ComponentFlag},
dataentry::{DataChecksum, DataEntry, DataFlag, SignMode},
delete::{DeleteEntry, DeleteTargetType},
directory::{DirectoryEntry, DirectoryFlag},
file::{FileEntry, FileEntryType, FileFlag, FileVerification, FileVerificationKind},
icon::{CloseOnExit, IconEntry, IconFlag},
ini::{IniEntry, IniFlag},
isssigkey::ISSigKeyEntry,
language::{LanguageCodepage, LanguageEntry},
message::MessageEntry,
permission::PermissionEntry,
registry::{RegistryEntry, RegistryFlag, RegistryHive, RegistryValueType},
run::{RunEntry, RunFlag, RunWait},
task::{TaskEntry, TaskFlag},
type_::{SetupTypeKind, TypeEntry},
windows::Bitness,
};
pub use version::{Variant, Version, VersionFlags};
const _: fn() = || {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<InnoInstaller<'static>>();
};