1use crate::Result;
2
3#[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 #[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 #[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 #[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;