#[cxx::bridge]
pub mod ffi {
    unsafe extern "C++" {
        include!("LIEF/rust/PE/Import.hpp");

        type PE_DataDirectory = crate::pe::data_directories::ffi::PE_DataDirectory;
        type PE_ImportEntry = crate::pe::import_entry::ffi::PE_ImportEntry;

        type PE_Import;

        fn forwarder_chain(self: &PE_Import) -> u32;
        fn timedatestamp(self: &PE_Import) -> u32;
        fn import_address_table_rva(self: &PE_Import) -> u32;
        fn import_lookup_table_rva(self: &PE_Import) -> u32;
        fn name(self: &PE_Import) -> UniquePtr<CxxString>;
        fn name_rva(self: &PE_Import) -> u32;
        fn directory(self: &PE_Import) -> UniquePtr<PE_DataDirectory>;
        fn iat_directory(self: &PE_Import) -> UniquePtr<PE_DataDirectory>;
        fn entries(self: &PE_Import) -> UniquePtr<PE_Import_it_entries>;
        fn entry_by_name(self: &PE_Import, name: &CxxString) -> UniquePtr<PE_ImportEntry>;
        fn remove_entry_by_name(self: Pin<&mut PE_Import>, name: &CxxString) -> bool;
        fn add_entry_by_name(
            self: Pin<&mut PE_Import>,
            name: &CxxString,
        ) -> UniquePtr<PE_ImportEntry>;
        fn set_name(self: Pin<&mut PE_Import>, name: &CxxString);
        fn remove_entry_by_ordinal(self: Pin<&mut PE_Import>, ord: u32) -> bool;

        type PE_Import_it_entries;

        fn next(self: Pin<&mut PE_Import_it_entries>) -> UniquePtr<PE_ImportEntry>;
        fn size(self: &PE_Import_it_entries) -> u64;
    }

    impl UniquePtr<PE_Import> {}
    impl UniquePtr<PE_Import_it_entries> {}
}