pelite\wrap/
mod.rs

1use crate::Result;
2
3/// Wraps 32-bit and 64-bit variants.
4#[derive(Copy, Clone, Debug, Eq, PartialEq)]
5#[cfg_attr(feature = "serde", derive(::serde::Serialize), serde(untagged))]
6pub enum Wrap<T32, T64> {
7	T32(T32),
8	T64(T64),
9}
10
11impl<Iter32: Iterator, Iter64: Iterator> Iterator for Wrap<Iter32, Iter64> {
12	type Item = Wrap<Iter32::Item, Iter64::Item>;
13	#[inline]
14	fn next(&mut self) -> Option<Self::Item> {
15		match self {
16			Wrap::T32(iter32) => iter32.next().map(Wrap::T32),
17			Wrap::T64(iter64) => iter64.next().map(Wrap::T64),
18		}
19	}
20}
21
22impl<T32, T64> Wrap<Result<T32>, Result<T64>> {
23	/// Transposes a wrap of results in a result of a wrap.
24	#[inline]
25	pub fn transpose(self) -> Result<Wrap<T32, T64>> {
26		match self {
27			Wrap::T32(Ok(ok)) => Ok(Wrap::T32(ok)),
28			Wrap::T32(Err(err)) => Err(err),
29			Wrap::T64(Ok(ok)) => Ok(Wrap::T64(ok)),
30			Wrap::T64(Err(err)) => Err(err),
31		}
32	}
33}
34impl<T32, T64> Wrap<Option<T32>, Option<T64>> {
35	/// Transposes a wrap of options in an option of a wrap.
36	#[inline]
37	pub fn transpose(self) -> Option<Wrap<T32, T64>> {
38		match self {
39			Wrap::T32(Some(some)) => Some(Wrap::T32(some)),
40			Wrap::T32(None) => None,
41			Wrap::T64(Some(some)) => Some(Wrap::T64(some)),
42			Wrap::T64(None) => None,
43		}
44	}
45}
46impl<T> Wrap<T, T> {
47	/// Unwraps the wrapped value of equal types.
48	#[inline]
49	pub fn into(self) -> T {
50		match self {
51			Wrap::T32(val) => val,
52			Wrap::T64(val) => val,
53		}
54	}
55}
56
57mod pe;
58mod view;
59mod file;
60mod headers;
61pub(crate) mod sections;
62pub(crate) mod exports;
63pub(crate) mod imports;
64mod load_config;
65mod tls;
66pub(crate) mod debug;
67mod scanner;
68
69pub use self::file::PeFile;
70pub use self::view::PeView;
71pub use self::pe::Align;
72pub(crate) use self::pe::get_section_bytes;