RPM package file: Rust parsing library

An RPM package consists of the lead, the signature (contains digests and signatures), the header (contains the package metadata) and the payload (a compressed archive of the package files).

This structure is shared by all package format versions supported by this Kaitai Struct implementation:

The versions differ mainly in the tags they use: v6 packages store all sizes as 64-bit integers, carry only cryptographic data in the signature and always use the stripped-down cpio archive format (see the payload instance).

The formats before v3, as well as the abandoned rpm5 fork, are not covered by this implementation.

Application

RPM Package Manager

File extension

["rpm", "srpm", "src.rpm", "drpm"]

KS implementation details

License: CC0-1.0
Minimal Kaitai Struct required: 0.11

References

This page hosts a formal specification of RPM package file using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

Rust source code to parse RPM package file

rpm.rs

// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild

#![allow(unused_imports)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
#![allow(irrefutable_let_patterns)]
#![allow(unused_comparisons)]

extern crate kaitai;
use kaitai::*;
use std::convert::{TryFrom, TryInto};
use std::cell::{Ref, Cell, RefCell};
use std::rc::{Rc, Weak};

/**
 * An RPM package consists of the lead, the signature (contains digests and
 * signatures), the header (contains the package metadata) and the payload (a
 * compressed archive of the package files).
 * 
 * This structure is shared by all package format versions supported by this
 * Kaitai Struct implementation:
 * 
 * * v3, written by RPM 2.1 to 3.x.
 * * v4, written by RPM 4.x, and by RPM 6.x when the `%_rpmformat` macro is set
 *   to 4 - see
 *   <https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/man/rpmbuild-config.5.scd?plain=1#L189-L192>.
 *   For example, Fedora 43 and 44 patch RPM 6.0 to keep producing v4 packages by
 *   default - see
 *   <https://src.fedoraproject.org/rpms/rpm/blob/7099d81c3b5ecf1777a43095be429cb198bcc566/f/rpm-6.0-rpmformat.patch>.
 * * v6, written by upstream RPM 6.0 by default - see
 *   <https://github.com/rpm-software-management/rpm/commit/99d80a22d3d299bdc4418f7e61cd491731626d37>.
 * 
 * The versions differ mainly in the tags they use: v6 packages store all sizes
 * as 64-bit integers, carry only cryptographic data in the signature and always
 * use the stripped-down cpio archive format (see the `payload` instance).
 * 
 * The formats before v3, as well as the abandoned rpm5 fork, are not covered by
 * this implementation.
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v6.md Source
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v4.md Source
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v3.md Source
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/signatures_digests.md Source
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/large_files.md Source
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/tags.md Source
 * \sa https://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/pkgformat.html Source
 * \sa https://ftp.osuosl.org/pub/rpm/max-rpm/ Source
 */

#[derive(Default, Debug, Clone)]
pub struct Rpm {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm>,
    pub _self: SharedType<Self>,
    lead: RefCell<OptRc<Rpm_Lead>>,
    signature: RefCell<OptRc<Rpm_Header>>,
    signature_padding: RefCell<Vec<u8>>,
    unnamed3: RefCell<Vec<u8>>,
    header: RefCell<OptRc<Rpm_Header>>,
    unnamed5: RefCell<Vec<u8>>,
    signature_tags_steps: RefCell<Vec<OptRc<Rpm_SignatureTagsStep>>>,
    header_tags_steps: RefCell<Vec<OptRc<Rpm_HeaderTagsStep>>>,
    _io: RefCell<BytesReader>,
    f_has_header_payload_size_tag: Cell<bool>,
    has_header_payload_size_tag: RefCell<bool>,
    f_has_payload: Cell<bool>,
    has_payload: RefCell<bool>,
    f_has_signature_long_size_tag: Cell<bool>,
    has_signature_long_size_tag: RefCell<bool>,
    f_has_signature_size_tag: Cell<bool>,
    has_signature_size_tag: RefCell<bool>,
    f_header_payload_size_tag: Cell<bool>,
    header_payload_size_tag: RefCell<OptRc<Rpm_HeaderIndexRecord>>,
    f_len_header: Cell<bool>,
    len_header: RefCell<i32>,
    f_len_payload: Cell<bool>,
    len_payload: RefCell<i32>,
    f_ofs_header: Cell<bool>,
    ofs_header: RefCell<i32>,
    f_ofs_payload: Cell<bool>,
    ofs_payload: RefCell<i32>,
    f_payload: Cell<bool>,
    payload: RefCell<Vec<u8>>,
    f_signature_long_size_tag: Cell<bool>,
    signature_long_size_tag: RefCell<OptRc<Rpm_HeaderIndexRecord>>,
    f_signature_size_tag: Cell<bool>,
    signature_size_tag: RefCell<OptRc<Rpm_HeaderIndexRecord>>,
}
impl KStruct for Rpm {
    type Root = Rpm;
    type Parent = Rpm;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        let t = Self::read_into::<_, Rpm_Lead>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()))?.into();
        *self_rc.lead.borrow_mut() = t;
        let f = |t : &mut Rpm_Header| Ok(t.set_params(true));
        let t = Self::read_into_with_init::<_, Rpm_Header>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()), &f)?.into();
        *self_rc.signature.borrow_mut() = t;
        *self_rc.signature_padding.borrow_mut() = _io.read_bytes(modulo(-(_io.pos()) as i64, 8 as i64) as usize)?.into();
        if ((*self_rc.ofs_header()? as i32) < (0 as i32)) {
            *self_rc.unnamed3.borrow_mut() = _io.read_bytes(0 as usize)?.into();
        }
        let f = |t : &mut Rpm_Header| Ok(t.set_params(false));
        let t = Self::read_into_with_init::<_, Rpm_Header>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()), &f)?.into();
        *self_rc.header.borrow_mut() = t;
        if ((*self_rc.ofs_payload()? as i32) < (0 as i32)) {
            *self_rc.unnamed5.borrow_mut() = _io.read_bytes(0 as usize)?.into();
        }
        *self_rc.signature_tags_steps.borrow_mut() = Vec::new();
        let l_signature_tags_steps = *self_rc.signature().header_record().num_index_records();
        for _i in 0..l_signature_tags_steps {
            let f = |t : &mut Rpm_SignatureTagsStep| Ok(t.set_params((_i).try_into().map_err(|_| KError::CastError)?, (if ((_i as i32) != (0 as i32)) { *self_rc.signature_tags_steps()[((_i as i32) - (1 as i32)) as usize].size_tag_idx()? } else { -1 }).try_into().map_err(|_| KError::CastError)?, (if ((_i as i32) != (0 as i32)) { *self_rc.signature_tags_steps()[((_i as i32) - (1 as i32)) as usize].long_size_tag_idx()? } else { -1 }).try_into().map_err(|_| KError::CastError)?));
            let t = Self::read_into_with_init::<_, Rpm_SignatureTagsStep>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()), &f)?.into();
            self_rc.signature_tags_steps.borrow_mut().push(t);
        }
        *self_rc.header_tags_steps.borrow_mut() = Vec::new();
        let l_header_tags_steps = *self_rc.header().header_record().num_index_records();
        for _i in 0..l_header_tags_steps {
            let f = |t : &mut Rpm_HeaderTagsStep| Ok(t.set_params((_i).try_into().map_err(|_| KError::CastError)?, (if ((_i as i32) != (0 as i32)) { *self_rc.header_tags_steps()[((_i as i32) - (1 as i32)) as usize].payload_size_tag_idx()? } else { -1 }).try_into().map_err(|_| KError::CastError)?));
            let t = Self::read_into_with_init::<_, Rpm_HeaderTagsStep>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()), &f)?.into();
            self_rc.header_tags_steps.borrow_mut().push(t);
        }
        Ok(())
    }
}
impl Rpm {
    pub fn has_header_payload_size_tag(
        &self
    ) -> KResult<Ref<'_, bool>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_has_header_payload_size_tag.get() {
            return Ok(self.has_header_payload_size_tag.borrow());
        }
        self.f_has_header_payload_size_tag.set(true);
        *self.has_header_payload_size_tag.borrow_mut() = (*self.header_tags_steps().last().ok_or(KError::EmptyIterator)?.payload_size_tag_idx()? != -1) as bool;
        Ok(self.has_header_payload_size_tag.borrow())
    }
    pub fn has_payload(
        &self
    ) -> KResult<Ref<'_, bool>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_has_payload.get() {
            return Ok(self.has_payload.borrow());
        }
        self.f_has_payload.set(true);
        *self.has_payload.borrow_mut() = ( ((*self.has_header_payload_size_tag()?) || (*self.has_signature_long_size_tag()?) || (*self.has_signature_size_tag()?)) ) as bool;
        Ok(self.has_payload.borrow())
    }
    pub fn has_signature_long_size_tag(
        &self
    ) -> KResult<Ref<'_, bool>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_has_signature_long_size_tag.get() {
            return Ok(self.has_signature_long_size_tag.borrow());
        }
        self.f_has_signature_long_size_tag.set(true);
        *self.has_signature_long_size_tag.borrow_mut() = (*self.signature_tags_steps().last().ok_or(KError::EmptyIterator)?.long_size_tag_idx()? != -1) as bool;
        Ok(self.has_signature_long_size_tag.borrow())
    }
    pub fn has_signature_size_tag(
        &self
    ) -> KResult<Ref<'_, bool>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_has_signature_size_tag.get() {
            return Ok(self.has_signature_size_tag.borrow());
        }
        self.f_has_signature_size_tag.set(true);
        *self.has_signature_size_tag.borrow_mut() = (*self.signature_tags_steps().last().ok_or(KError::EmptyIterator)?.size_tag_idx()? != -1) as bool;
        Ok(self.has_signature_size_tag.borrow())
    }
    pub fn header_payload_size_tag(
        &self
    ) -> KResult<Ref<'_, OptRc<Rpm_HeaderIndexRecord>>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_header_payload_size_tag.get() {
            return Ok(self.header_payload_size_tag.borrow());
        }
        if *self.has_header_payload_size_tag()? {
            *self.header_payload_size_tag.borrow_mut() = self.header().index_records()[*self.header_tags_steps().last().ok_or(KError::EmptyIterator)?.payload_size_tag_idx()? as usize].clone();
        }
        Ok(self.header_payload_size_tag.borrow())
    }
    pub fn len_header(
        &self
    ) -> KResult<Ref<'_, i32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_len_header.get() {
            return Ok(self.len_header.borrow());
        }
        self.f_len_header.set(true);
        *self.len_header.borrow_mut() = (((*self.ofs_payload()? as i32) - (*self.ofs_header()? as i32))) as i32;
        Ok(self.len_header.borrow())
    }

    /**
     * Size of the (compressed) payload in bytes. v6 packages store it in
     * `header_tags::payload_size`, v4/v3 packages in `signature_tags::size`
     * (which also includes the size of the header).
     * 
     * If the header and payload together or the uncompressed payload reach
     * 4 GiB, v4 packages use `signature_tags::long_size` instead - see
     * <https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/lib/signature.cc#L182-L212>.
     * 
     * RPM never writes both (so this is just a hypothetical scenario), but if
     * both are present, `signature_tags::long_size` takes precedence over
     * `signature_tags::size`, just like in RPM's `printSize()` function:
     * <https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/lib/signature.cc#L36-L43>
     */
    pub fn len_payload(
        &self
    ) -> KResult<Ref<'_, i32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_len_payload.get() {
            return Ok(self.len_payload.borrow());
        }
        self.f_len_payload.set(true);
        if *self.has_payload()? {
            *self.len_payload.borrow_mut() = (if *self.has_header_payload_size_tag()? { Into::<OptRc<Rpm_RecordTypeUint64>>::into(&*self.header_payload_size_tag()?.body()?.as_ref().unwrap()).values()[0 as usize] } else { if *self.has_signature_long_size_tag()? { ((Into::<OptRc<Rpm_RecordTypeUint64>>::into(&*self.signature_long_size_tag()?.body()?.as_ref().unwrap()).values()[0 as usize] as i32) - (*self.len_header()? as i32)) } else { ((Into::<OptRc<Rpm_RecordTypeUint32>>::into(&*self.signature_size_tag()?.body()?.as_ref().unwrap()).values()[0 as usize] as i32) - (*self.len_header()? as i32)) } }) as i32;
        }
        Ok(self.len_payload.borrow())
    }
    pub fn ofs_header(
        &self
    ) -> KResult<Ref<'_, i32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_ofs_header.get() {
            return Ok(self.ofs_header.borrow());
        }
        self.f_ofs_header.set(true);
        *self.ofs_header.borrow_mut() = (_io.pos()) as i32;
        Ok(self.ofs_header.borrow())
    }
    pub fn ofs_payload(
        &self
    ) -> KResult<Ref<'_, i32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_ofs_payload.get() {
            return Ok(self.ofs_payload.borrow());
        }
        self.f_ofs_payload.set(true);
        *self.ofs_payload.borrow_mut() = (_io.pos()) as i32;
        Ok(self.ofs_payload.borrow())
    }

    /**
     * Archive of the package files, compressed using the method specified by
     * `header_tags::payload_compressor`. If this tag is missing, it's almost
     * certainly uncompressed (except for some very old v3 packages built by RPM
     * 3.0.3 or earlier, which didn't use the tag because the payload was always
     * gzipped; RPM 3.0.5 added support for bzip2 payloads and started writing
     * the tag). However, RPM reads the payload as gzip by default - see
     * <https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/lib/rpmte.cc#L643-L645>.
     * Since zlib's gzip reader passes data that is not in gzip format through
     * unchanged (see
     * <https://github.com/madler/zlib/blob/da607da739fa6047df13e66a2af6b8bec7c2a498/zlib.h#L1386-L1389>),
     * this also works for uncompressed payloads.
     * 
     * The archive format is given by `header_tags::payload_format`, which is
     * `"cpio"` for regular packages. In v4/v3 packages, it's a SVR4 cpio archive
     * without a checksum (the `070701` variant) - the [v4 format
     * documentation](https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v4.md?plain=1#L106-L107)
     * claims "with a CRC checksum", but that's not true since RPM 2.4.4
     * (released in 1997).
     * 
     * v6 packages and v4 packages with a file over 4 GiB use a stripped-down
     * variant of cpio with the magic `07070X`. Its file headers only hold the
     * index of the file in the file lists of the RPM header, which is the only
     * place where the file names, sizes and other metadata are stored.
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v6.md#payload Source
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v4.md#payload Source
     */
    pub fn payload(
        &self
    ) -> KResult<Ref<'_, Vec<u8>>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_payload.get() {
            return Ok(self.payload.borrow());
        }
        self.f_payload.set(true);
        if *self.has_payload()? {
            let _pos = _io.pos();
            _io.seek(*self.ofs_payload()? as usize)?;
            *self.payload.borrow_mut() = _io.read_bytes(*self.len_payload()? as usize)?.into();
            _io.seek(_pos)?;
        }
        Ok(self.payload.borrow())
    }
    pub fn signature_long_size_tag(
        &self
    ) -> KResult<Ref<'_, OptRc<Rpm_HeaderIndexRecord>>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_signature_long_size_tag.get() {
            return Ok(self.signature_long_size_tag.borrow());
        }
        if *self.has_signature_long_size_tag()? {
            *self.signature_long_size_tag.borrow_mut() = self.signature().index_records()[*self.signature_tags_steps().last().ok_or(KError::EmptyIterator)?.long_size_tag_idx()? as usize].clone();
        }
        Ok(self.signature_long_size_tag.borrow())
    }
    pub fn signature_size_tag(
        &self
    ) -> KResult<Ref<'_, OptRc<Rpm_HeaderIndexRecord>>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_signature_size_tag.get() {
            return Ok(self.signature_size_tag.borrow());
        }
        if *self.has_signature_size_tag()? {
            *self.signature_size_tag.borrow_mut() = self.signature().index_records()[*self.signature_tags_steps().last().ok_or(KError::EmptyIterator)?.size_tag_idx()? as usize].clone();
        }
        Ok(self.signature_size_tag.borrow())
    }
}
impl Rpm {
    pub fn lead(&self) -> Ref<'_, OptRc<Rpm_Lead>> {
        self.lead.borrow()
    }
}
impl Rpm {
    pub fn signature(&self) -> Ref<'_, OptRc<Rpm_Header>> {
        self.signature.borrow()
    }
}
impl Rpm {
    pub fn signature_padding(&self) -> Ref<'_, Vec<u8>> {
        self.signature_padding.borrow()
    }
}
impl Rpm {
    pub fn unnamed3(&self) -> Ref<'_, Vec<u8>> {
        self.unnamed3.borrow()
    }
}
impl Rpm {
    pub fn header(&self) -> Ref<'_, OptRc<Rpm_Header>> {
        self.header.borrow()
    }
}
impl Rpm {
    pub fn unnamed5(&self) -> Ref<'_, Vec<u8>> {
        self.unnamed5.borrow()
    }
}
impl Rpm {
    pub fn signature_tags_steps(&self) -> Ref<'_, Vec<OptRc<Rpm_SignatureTagsStep>>> {
        self.signature_tags_steps.borrow()
    }
}
impl Rpm {
    pub fn header_tags_steps(&self) -> Ref<'_, Vec<OptRc<Rpm_HeaderTagsStep>>> {
        self.header_tags_steps.borrow()
    }
}
impl Rpm {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}
#[derive(Debug, PartialEq, Clone)]
pub enum Rpm_Architectures {

    /**
     * Since RPM 6.0, `archnum` and `osnum` are no longer populated when
     * writing the lead, so they are left zeroed - see
     * <https://github.com/rpm-software-management/rpm/commit/5a685fb5eb085d5bc37723ec29ce72434db6bd4e>.
     * This applies to both v4 and v6 packages.
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v6.md#lead Source
     */
    NotSet,

    /**
     * x86 or x86_64
     */
    X86,

    /**
     * Alpha or Sparc64
     * \sa https://github.com/eclipse/packager/blob/51ccdd3/rpm/src/main/java/org/eclipse/packager/rpm/Architecture.java#L24 Source
     * \sa https://github.com/file/file/blob/9b2538d/magic/Magdir/rpm#L14 Source
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/rpmrc.in#L207-L216 Source
     */
    Alpha,
    Sparc,
    Mips,
    Ppc,
    M68k,

    /**
     * SGI Inhouse Processors (IP)
     * \sa https://github.com/file/file/blob/9b2538d/magic/Magdir/rpm#L19 Source
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/rpmrc.in#L238 Source
     */
    Sgi,
    Rs6000,
    Ia64,
    Sparc64,
    Mips64,
    Arm,
    M68kMint,
    S390,
    S390x,
    Ppc64,
    Sh,
    Xtensa,
    Aarch64,
    MipsR6,
    Mips64R6,
    Riscv,
    Loongarch64,
    E2k,

    /**
     * can be installed on any architecture
     * \sa https://github.com/file/file/blob/9b2538d/magic/Magdir/rpm#L31 Source
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/lib/rpmrc.cc#L1507 Source
     */
    NoArch,
    Unknown(i64),
}

impl TryFrom<i64> for Rpm_Architectures {
    type Error = KError;
    fn try_from(flag: i64) -> KResult<Rpm_Architectures> {
        match flag {
            0 => Ok(Rpm_Architectures::NotSet),
            1 => Ok(Rpm_Architectures::X86),
            2 => Ok(Rpm_Architectures::Alpha),
            3 => Ok(Rpm_Architectures::Sparc),
            4 => Ok(Rpm_Architectures::Mips),
            5 => Ok(Rpm_Architectures::Ppc),
            6 => Ok(Rpm_Architectures::M68k),
            7 => Ok(Rpm_Architectures::Sgi),
            8 => Ok(Rpm_Architectures::Rs6000),
            9 => Ok(Rpm_Architectures::Ia64),
            10 => Ok(Rpm_Architectures::Sparc64),
            11 => Ok(Rpm_Architectures::Mips64),
            12 => Ok(Rpm_Architectures::Arm),
            13 => Ok(Rpm_Architectures::M68kMint),
            14 => Ok(Rpm_Architectures::S390),
            15 => Ok(Rpm_Architectures::S390x),
            16 => Ok(Rpm_Architectures::Ppc64),
            17 => Ok(Rpm_Architectures::Sh),
            18 => Ok(Rpm_Architectures::Xtensa),
            19 => Ok(Rpm_Architectures::Aarch64),
            20 => Ok(Rpm_Architectures::MipsR6),
            21 => Ok(Rpm_Architectures::Mips64R6),
            22 => Ok(Rpm_Architectures::Riscv),
            23 => Ok(Rpm_Architectures::Loongarch64),
            24 => Ok(Rpm_Architectures::E2k),
            255 => Ok(Rpm_Architectures::NoArch),
            _ => Ok(Rpm_Architectures::Unknown(flag)),
        }
    }
}

impl From<&Rpm_Architectures> for i64 {
    fn from(v: &Rpm_Architectures) -> Self {
        match *v {
            Rpm_Architectures::NotSet => 0,
            Rpm_Architectures::X86 => 1,
            Rpm_Architectures::Alpha => 2,
            Rpm_Architectures::Sparc => 3,
            Rpm_Architectures::Mips => 4,
            Rpm_Architectures::Ppc => 5,
            Rpm_Architectures::M68k => 6,
            Rpm_Architectures::Sgi => 7,
            Rpm_Architectures::Rs6000 => 8,
            Rpm_Architectures::Ia64 => 9,
            Rpm_Architectures::Sparc64 => 10,
            Rpm_Architectures::Mips64 => 11,
            Rpm_Architectures::Arm => 12,
            Rpm_Architectures::M68kMint => 13,
            Rpm_Architectures::S390 => 14,
            Rpm_Architectures::S390x => 15,
            Rpm_Architectures::Ppc64 => 16,
            Rpm_Architectures::Sh => 17,
            Rpm_Architectures::Xtensa => 18,
            Rpm_Architectures::Aarch64 => 19,
            Rpm_Architectures::MipsR6 => 20,
            Rpm_Architectures::Mips64R6 => 21,
            Rpm_Architectures::Riscv => 22,
            Rpm_Architectures::Loongarch64 => 23,
            Rpm_Architectures::E2k => 24,
            Rpm_Architectures::NoArch => 255,
            Rpm_Architectures::Unknown(v) => v
        }
    }
}

impl Default for Rpm_Architectures {
    fn default() -> Self { Rpm_Architectures::Unknown(0) }
}

#[derive(Debug, PartialEq, Clone)]
pub enum Rpm_HeaderTags {
    Signatures,
    HeaderImmutable,
    I18nTable,

    /**
     * Specifies the name of the package.
     */
    Name,

    /**
     * Specifies the version of the package.
     */
    Version,

    /**
     * Specifies the release of the package.
     */
    Release,
    Epoch,

    /**
     * Specifies the summary description of the package. The summary
     * value pointed to by this index record contains a one line
     * description of the package.
     */
    Summary,

    /**
     * Specifies the description of the package. The description value
     * pointed to by this index record contains a full description of
     * the package.
     */
    Description,

    /**
     * Specifies the time as seconds since the epoch
     * at which the package was built.
     */
    BuildTime,

    /**
     * Specifies the hostname of the system on which the package was built.
     */
    BuildHost,
    InstallTime,

    /**
     * Specifies the sum of the sizes of the regular files in the archive.
     */
    Size,

    /**
     * Contains the name of the distribution on which the package was built.
     */
    Distribution,

    /**
     * Contains the name of the organization that produced the package.
     */
    Vendor,
    GifObsolete,
    XpmObsolete,

    /**
     * Specifies the license which applies to this package.
     */
    License,

    /**
     * Identifies the tool used to build the package.
     */
    Packager,

    /**
     * Specifies the administrative group to which this package belongs.
     */
    Group,
    ChangelogInternal,
    Source,
    Patch,

    /**
     * Generic package information URL.
     */
    Url,

    /**
     * Specifies the OS of the package.
     */
    Os,

    /**
     * Specifies the architecture of the package.
     */
    Arch,

    /**
     * Specifies the preinstall scriptlet. If present, then
     * `::pre_install_interpreter` shall also be present.
     */
    PreInstallScriptlet,

    /**
     * Specifies the postinstall scriptlet. If present, then
     * `::post_install_interpreter` shall also be present.
     */
    PostInstallScriptlet,

    /**
     * Specifies the preuninstall scriptlet. If present, then
     * `::pre_uninstall_interpreter` shall also be present.
     */
    PreUninstallScriptlet,

    /**
     * Specifies the postuninstall scriptlet. If present, then
     * `::post_uninstall_interpreter` shall also be present.
     */
    PostUninstallScriptlet,
    OldFileNamesObsolete,

    /**
     * Specifies the size of each file in the archive.
     */
    FileSizes,
    FileStates,

    /**
     * The mode of each file in the archive.
     */
    FileModes,
    FileUidsInternal,
    FileGidsInternal,

    /**
     * The device number from which the file was copied.
     */
    DeviceNumber,

    /**
     * The modification time in seconds since the epoch
     * of each file in the archive.
     */
    Mtimes,

    /**
     * The ASCII representation of the MD5 sum of the corresponding
     * file contents. This value is empty if the corresponding archive
     * entry is not a regular file.
     */
    FileDigests,

    /**
     * The target for a symlink, otherwise NULL.
     */
    LinkTos,

    /**
     * Specifies the bit(s) to classify and control how files
     * are to be installed.
     */
    FileFlags,
    RootInternal,

    /**
     * Specifies the owner of the corresponding file.
     */
    FileOwner,

    /**
     * Specifies the group of the corresponding file.
     */
    FileGroup,
    ExcludeInternal,
    ExclusiveInternal,
    IconObsolete,

    /**
     * Specifies the name of the source RPM.
     */
    SourceRpm,

    /**
     * Specifies the bit(s) to control how files are to be verified
     * after install, specifying which checks should be performed.
     */
    FileVerifyFlags,

    /**
     * Specifies the uncompressed size of the Payload archive,
     * including the cpio headers.
     */
    ArchiveSize,

    /**
     * The name of the dependency provided by this package.
     */
    ProvideName,

    /**
     * Bits(s) to specify the dependency range and context.
     */
    RequireFlags,

    /**
     * Indicates the dependencies for this package.
     */
    RequireName,

    /**
     * Indicates the versions associated with the values found
     * in the require_name index.
     */
    RequireVersion,
    NoSource,
    NoPatch,

    /**
     * Bits(s) to specify the conflict range and context.
     */
    ConflictFlags,

    /**
     * Indicates the conflicting dependencies for this package.
     */
    ConflictName,

    /**
     * Indicates the versions associated with the
     * values found in the conflict_name index.
     */
    ConflictVersion,
    DefaultPrefixInternal,
    BuildRootInternal,
    InstallPrefixInternal,
    ExcludeArch,
    ExcludeOs,
    ExclusiveArch,
    ExclusiveOs,
    AutoreqprovInternal,

    /**
     * Indicates the version of RPM tool used to build this package.
     */
    RpmVersion,
    TriggerScripts,
    TriggerName,
    TriggerVersion,
    TriggerFlags,
    TriggerIndex,
    VerifyScript,

    /**
     * Specifies the Unix time in seconds since the epoch
     * associated with each entry in the Changelog file.
     */
    ChangelogTime,

    /**
     * Specifies the name of who made a change to this package.
     */
    ChangelogName,

    /**
     * Specifies the changes associated with a changelog entry.
     */
    ChangelogText,
    BrokenMd5Internal,
    PrereqInternal,

    /**
     * Specifies the name of the interpreter to which the preinstall
     * scriptlet will be passed. The interpreter pointed to by this
     * index record shall be `/bin/sh`.
     */
    PreInstallInterpreter,

    /**
     * Specifies the name of the interpreter to which the postinstall
     * scriptlet will be passed. The interpreter pointed to by this
     * index record shall be `/bin/sh`.
     */
    PostInstallInterpreter,

    /**
     * Specifies the name of the interpreter to which the preuninstall
     * scriptlet will be passed. The interpreter pointed to by this index
     * record shall be `/bin/sh`.
     */
    PreUninstallInterpreter,

    /**
     * Specifies the name of the interpreter to which the postuninstall
     * scriptlet will be passed. The interpreter pointed to by this index
     * record shall be `/bin/sh`.
     */
    PostUninstallInterpreter,
    BuildArchs,

    /**
     * Indicates the obsoleted dependencies for this package.
     */
    ObsoleteName,
    VerifyScriptProg,
    TriggerScriptProg,
    DocDirInternal,

    /**
     * Contains an opaque string whose contents are undefined.
     */
    Cookie,

    /**
     * Specifies the 16 bit device number from which the file was copied.
     */
    FileDevices,

    /**
     * Specifies the inode value from the original file system
     * on the the system on which it was built.
     */
    FileInodes,

    /**
     * Specifies a per-file locale marker used to install only locale
     * specific subsets of files when the package is installed.
     */
    FileLangs,
    Prefixes,
    InstallPrefixes,
    TriggerInstallInternal,
    TriggerUninstallInternal,
    TriggerPostUninstallInternal,
    AutoreqInternal,
    AutoprovInternal,
    CapabilityInternal,
    SourcePackage,
    OldOrigFilenamesInternal,
    BuildPrereqInternal,
    BuildRequiresInternal,
    BuildConflictsInternal,
    BuildMacrosInternal,

    /**
     * Bits(s) to specify the conflict range and context.
     */
    ProvideFlags,

    /**
     * Indicates the versions associated with the values found
     * in the provide_name index.
     */
    ProvideVersion,
    ObsoleteFlags,
    ObsoleteVersion,
    DirIndexes,
    BaseNames,
    DirNames,
    OrigDirIndexes,
    OrigBaseNames,
    OrigDirNames,
    OptFlags,
    DistUrl,
    PayloadFormat,
    PayloadCompressor,
    PayloadFlags,
    InstallColor,
    InstallTid,
    RemoveTidObsolete,
    Sha1RhnInternal,
    RhnPlatformInternal,
    Platform,
    PatchesNameObsolete,
    PatchesFlagsObsolete,
    PatchesVersionObsolete,
    CacheCtimeInternal,
    CachePkgPathInternal,
    CachePkgSizeInternal,
    CachePkgMtimeInternal,
    FileColors,
    FileClass,
    ClassDict,

    /**
     * Index into `::depends_dict` denoting start of this file's dependencies.
     */
    FileDependsIdx,

    /**
     * Number of file dependencies in `::depends_dict`, starting from `::file_depends_idx`
     */
    FileDependsNum,
    DependsDict,

    /**
     * MD5 digest (16 bytes) of the header and payload of the source package
     * this binary package was built from, i.e. the value of
     * `signature_tags::md5` in that source package.
     * 
     * Only present in binary packages built in the same `rpmbuild` run as
     * their source package (e.g. `rpmbuild -ba`). Never present in v6
     * packages, because RPM does not calculate the MD5 digest for them.
     * 
     * Before RPM 6.0, this tag was called `RPMTAG_SOURCEPKGID` - see
     * <https://github.com/rpm-software-management/rpm/commit/79ba4a3c41702e46edd5a4ce7e17a1f3361eb0e7>.
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/build/pack.cc#L901-L902 Source
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/build/pack.cc#L799-L801 Source
     */
    SourceSigMd5,
    FileContextsObsolete,
    FsContextsObsolete,
    ReContextsObsolete,
    Policies,
    PreTrans,
    PostTrans,
    PreTransProg,
    PostTransProg,
    DistTag,
    OldSuggestsNameObsolete,
    OldSuggestsVersionObsolete,
    OldSuggestsFlagsObsolete,
    OldEnhancesNameObsolete,
    OldEnhancesVersionObsolete,
    OldEnhancesFlagsObsolete,
    PriorityUnimplemented,
    CvsidUnimplemented,
    BlinkPkgidUnimplemented,
    BlinkHdridUnimplemented,
    BlinkNevraUnimplemented,
    FlinkPkgidUnimplemented,
    FlinkHdridUnimplemented,
    FlinkNevraUnimplemented,
    PackageOriginUnimplemented,
    TriggerPreInstallInternal,
    BuildSuggestsUnimplemented,
    BuildEnhancesUnimplemented,
    ScriptStatesUnimplemented,
    ScriptMetricsUnimplemented,
    BuildCpuClockUnimplemented,
    FileDigestAlgosUnimplemented,
    VariantsUnimplemented,
    XmajorUnimplemented,
    XminorUnimplemented,
    RepoTagUnimplemented,
    KeywordsUnimplemented,
    BuildPlatformsUnimplemented,
    PackageColorUnimplemented,
    PackagePrefColorUnimplemented,
    XattrsDictUnimplemented,
    FilexAttrsxUnimplemented,
    DepAttrsDictUnimplemented,
    ConflictAttrsxUnimplemented,
    ObsoleteAttrsxUnimplemented,
    ProvideAttrsxUnimplemented,
    RequireAttrsxUnimplemented,
    BuildProvidesUnimplemented,
    BuildObsoletesUnimplemented,
    DbInstance,
    Nvra,
    FileNames,
    FileProvide,
    FileRequire,
    FsNamesUnimplemented,
    FsSizesUnimplemented,
    TriggerConds,
    TriggerType,
    OrigFileNames,
    LongFileSizes,
    LongSize,
    FileCaps,

    /**
     * File digest algorithm
     */
    FileDigestAlgo,
    BugUrl,
    Evr,
    Nvr,
    Nevr,
    Nevra,
    HeaderColor,
    Verbose,
    EpochNum,
    PreInstallFlags,
    PostInstallFlags,
    PreUninstallFlags,
    PostUninstallFlags,
    PreTransFlags,
    PostTransFlags,
    VerifyScriptFlags,
    TriggerScriptFlags,
    CollectionsUnimplemented,
    PolicyNames,
    PolicyTypes,
    PolicyTypesIndexes,
    PolicyFlags,
    Vcs,
    OrderName,
    OrderVersion,
    OrderFlags,
    MssfManifestUnimplemented,
    MssfDomainUnimplemented,
    InstFileNames,
    RequireNevrs,
    ProvideNevrs,
    ObsoleteNevrs,
    ConflictNevrs,
    FileNlinks,
    RecommendName,
    RecommendVersion,
    RecommendFlags,
    SuggestName,
    SuggestVersion,
    SuggestFlags,
    SupplementName,
    SupplementVersion,
    SupplementFlags,
    EnhanceName,
    EnhanceVersion,
    EnhanceFlags,
    RecommendNevrs,
    SuggestNevrs,
    SupplementNevrs,
    EnhanceNevrs,
    Encoding,
    FileTriggerInstallInternal,
    FileTriggerUninstallInternal,
    FileTriggerPostUninstallInternal,
    FileTriggerScripts,
    FileTriggerScriptProg,
    FileTriggerScriptFlags,
    FileTriggerName,
    FileTriggerIndex,
    FileTriggerVersion,
    FileTriggerFlags,
    TransFileTriggerInstallInternal,
    TransFileTriggerUninstallInternal,
    TransFileTriggerPostUninstallInternal,
    TransFileTriggerScripts,
    TransFileTriggerScriptProg,
    TransFileTriggerScriptFlags,
    TransFileTriggerName,
    TransFileTriggerIndex,
    TransFileTriggerVersion,
    TransFileTriggerFlags,
    RemovePathPostfixesInternal,
    FileTriggerPriorities,
    TransFileTriggerPriorities,
    FileTriggerConds,
    FileTriggerType,
    TransFileTriggerConds,
    TransFileTriggerType,
    FileSignatures,
    FileSignatureLength,

    /**
     * SHA-256 digest of the compressed payload.
     * 
     * Before RPM 6.0, this tag was called `RPMTAG_PAYLOADDIGEST` - see
     * <https://github.com/rpm-software-management/rpm/commit/f14557cd521ddf95994aa6518f006eeb3fc58d87>.
     */
    PayloadSha256,

    /**
     * OpenPGP hash algorithm ID of `header_tags::payload_sha256`. Always 8
     * (SHA2-256), which makes this tag redundant. Not written to v6 packages.
     * 
     * Before RPM 6.0, this tag was called `RPMTAG_PAYLOADDIGESTALGO` - see
     * <https://github.com/rpm-software-management/rpm/commit/f14557cd521ddf95994aa6518f006eeb3fc58d87>.
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/build/pack.cc#L492-L495 Source
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/include/rpm/rpmcrypto.h#L26 Source
     */
    PayloadSha256AlgoObsolete,
    AutoInstalledUnimplemented,
    IdentityUnimplemented,
    ModularityLabel,

    /**
     * SHA-256 digest of the uncompressed payload.
     * 
     * Before RPM 6.0, this tag was called `RPMTAG_PAYLOADDIGESTALT` - see
     * <https://github.com/rpm-software-management/rpm/commit/f14557cd521ddf95994aa6518f006eeb3fc58d87>.
     */
    PayloadSha256Alt,
    ArchSuffix,
    Spec,
    TranslationUrl,
    UpstreamReleases,
    SourceLicenseInternal,
    PreUntrans,
    PostUntrans,
    PreUntransProg,
    PostUntransProg,
    PreUntransFlags,
    PostUntransFlags,
    SysUsers,
    BuildSystemInternal,
    BuildOptionInternal,

    /**
     * Size of the compressed payload in bytes (only v6).
     */
    PayloadSize,

    /**
     * Size of the uncompressed payload in bytes (only v6).
     */
    PayloadSizeAlt,

    /**
     * RPM package format version (only present in v6 packages).
     */
    RpmFormat,

    /**
     * Index into `header_tags::mime_dict` (only v6).
     */
    FileMimeIndex,

    /**
     * Dictionary of MIME types (only v6).
     */
    MimeDict,
    FileMimes,

    /**
     * Package digests calculated during verification.
     */
    PackageDigests,

    /**
     * Algorithms used for `header_tags::package_digests`.
     */
    PackageDigestAlgos,

    /**
     * Source RPM NEVR.
     */
    SourceNevr,

    /**
     * SHA-512 digest of the compressed payload.
     */
    PayloadSha512,

    /**
     * SHA-512 digest of the uncompressed payload.
     */
    PayloadSha512Alt,

    /**
     * SHA3-256 digest of the compressed payload.
     */
    PayloadSha3256,

    /**
     * SHA3-256 digest of the uncompressed payload.
     */
    PayloadSha3256Alt,
    Unknown(i64),
}

impl TryFrom<i64> for Rpm_HeaderTags {
    type Error = KError;
    fn try_from(flag: i64) -> KResult<Rpm_HeaderTags> {
        match flag {
            62 => Ok(Rpm_HeaderTags::Signatures),
            63 => Ok(Rpm_HeaderTags::HeaderImmutable),
            100 => Ok(Rpm_HeaderTags::I18nTable),
            1000 => Ok(Rpm_HeaderTags::Name),
            1001 => Ok(Rpm_HeaderTags::Version),
            1002 => Ok(Rpm_HeaderTags::Release),
            1003 => Ok(Rpm_HeaderTags::Epoch),
            1004 => Ok(Rpm_HeaderTags::Summary),
            1005 => Ok(Rpm_HeaderTags::Description),
            1006 => Ok(Rpm_HeaderTags::BuildTime),
            1007 => Ok(Rpm_HeaderTags::BuildHost),
            1008 => Ok(Rpm_HeaderTags::InstallTime),
            1009 => Ok(Rpm_HeaderTags::Size),
            1010 => Ok(Rpm_HeaderTags::Distribution),
            1011 => Ok(Rpm_HeaderTags::Vendor),
            1012 => Ok(Rpm_HeaderTags::GifObsolete),
            1013 => Ok(Rpm_HeaderTags::XpmObsolete),
            1014 => Ok(Rpm_HeaderTags::License),
            1015 => Ok(Rpm_HeaderTags::Packager),
            1016 => Ok(Rpm_HeaderTags::Group),
            1017 => Ok(Rpm_HeaderTags::ChangelogInternal),
            1018 => Ok(Rpm_HeaderTags::Source),
            1019 => Ok(Rpm_HeaderTags::Patch),
            1020 => Ok(Rpm_HeaderTags::Url),
            1021 => Ok(Rpm_HeaderTags::Os),
            1022 => Ok(Rpm_HeaderTags::Arch),
            1023 => Ok(Rpm_HeaderTags::PreInstallScriptlet),
            1024 => Ok(Rpm_HeaderTags::PostInstallScriptlet),
            1025 => Ok(Rpm_HeaderTags::PreUninstallScriptlet),
            1026 => Ok(Rpm_HeaderTags::PostUninstallScriptlet),
            1027 => Ok(Rpm_HeaderTags::OldFileNamesObsolete),
            1028 => Ok(Rpm_HeaderTags::FileSizes),
            1029 => Ok(Rpm_HeaderTags::FileStates),
            1030 => Ok(Rpm_HeaderTags::FileModes),
            1031 => Ok(Rpm_HeaderTags::FileUidsInternal),
            1032 => Ok(Rpm_HeaderTags::FileGidsInternal),
            1033 => Ok(Rpm_HeaderTags::DeviceNumber),
            1034 => Ok(Rpm_HeaderTags::Mtimes),
            1035 => Ok(Rpm_HeaderTags::FileDigests),
            1036 => Ok(Rpm_HeaderTags::LinkTos),
            1037 => Ok(Rpm_HeaderTags::FileFlags),
            1038 => Ok(Rpm_HeaderTags::RootInternal),
            1039 => Ok(Rpm_HeaderTags::FileOwner),
            1040 => Ok(Rpm_HeaderTags::FileGroup),
            1041 => Ok(Rpm_HeaderTags::ExcludeInternal),
            1042 => Ok(Rpm_HeaderTags::ExclusiveInternal),
            1043 => Ok(Rpm_HeaderTags::IconObsolete),
            1044 => Ok(Rpm_HeaderTags::SourceRpm),
            1045 => Ok(Rpm_HeaderTags::FileVerifyFlags),
            1046 => Ok(Rpm_HeaderTags::ArchiveSize),
            1047 => Ok(Rpm_HeaderTags::ProvideName),
            1048 => Ok(Rpm_HeaderTags::RequireFlags),
            1049 => Ok(Rpm_HeaderTags::RequireName),
            1050 => Ok(Rpm_HeaderTags::RequireVersion),
            1051 => Ok(Rpm_HeaderTags::NoSource),
            1052 => Ok(Rpm_HeaderTags::NoPatch),
            1053 => Ok(Rpm_HeaderTags::ConflictFlags),
            1054 => Ok(Rpm_HeaderTags::ConflictName),
            1055 => Ok(Rpm_HeaderTags::ConflictVersion),
            1056 => Ok(Rpm_HeaderTags::DefaultPrefixInternal),
            1057 => Ok(Rpm_HeaderTags::BuildRootInternal),
            1058 => Ok(Rpm_HeaderTags::InstallPrefixInternal),
            1059 => Ok(Rpm_HeaderTags::ExcludeArch),
            1060 => Ok(Rpm_HeaderTags::ExcludeOs),
            1061 => Ok(Rpm_HeaderTags::ExclusiveArch),
            1062 => Ok(Rpm_HeaderTags::ExclusiveOs),
            1063 => Ok(Rpm_HeaderTags::AutoreqprovInternal),
            1064 => Ok(Rpm_HeaderTags::RpmVersion),
            1065 => Ok(Rpm_HeaderTags::TriggerScripts),
            1066 => Ok(Rpm_HeaderTags::TriggerName),
            1067 => Ok(Rpm_HeaderTags::TriggerVersion),
            1068 => Ok(Rpm_HeaderTags::TriggerFlags),
            1069 => Ok(Rpm_HeaderTags::TriggerIndex),
            1079 => Ok(Rpm_HeaderTags::VerifyScript),
            1080 => Ok(Rpm_HeaderTags::ChangelogTime),
            1081 => Ok(Rpm_HeaderTags::ChangelogName),
            1082 => Ok(Rpm_HeaderTags::ChangelogText),
            1083 => Ok(Rpm_HeaderTags::BrokenMd5Internal),
            1084 => Ok(Rpm_HeaderTags::PrereqInternal),
            1085 => Ok(Rpm_HeaderTags::PreInstallInterpreter),
            1086 => Ok(Rpm_HeaderTags::PostInstallInterpreter),
            1087 => Ok(Rpm_HeaderTags::PreUninstallInterpreter),
            1088 => Ok(Rpm_HeaderTags::PostUninstallInterpreter),
            1089 => Ok(Rpm_HeaderTags::BuildArchs),
            1090 => Ok(Rpm_HeaderTags::ObsoleteName),
            1091 => Ok(Rpm_HeaderTags::VerifyScriptProg),
            1092 => Ok(Rpm_HeaderTags::TriggerScriptProg),
            1093 => Ok(Rpm_HeaderTags::DocDirInternal),
            1094 => Ok(Rpm_HeaderTags::Cookie),
            1095 => Ok(Rpm_HeaderTags::FileDevices),
            1096 => Ok(Rpm_HeaderTags::FileInodes),
            1097 => Ok(Rpm_HeaderTags::FileLangs),
            1098 => Ok(Rpm_HeaderTags::Prefixes),
            1099 => Ok(Rpm_HeaderTags::InstallPrefixes),
            1100 => Ok(Rpm_HeaderTags::TriggerInstallInternal),
            1101 => Ok(Rpm_HeaderTags::TriggerUninstallInternal),
            1102 => Ok(Rpm_HeaderTags::TriggerPostUninstallInternal),
            1103 => Ok(Rpm_HeaderTags::AutoreqInternal),
            1104 => Ok(Rpm_HeaderTags::AutoprovInternal),
            1105 => Ok(Rpm_HeaderTags::CapabilityInternal),
            1106 => Ok(Rpm_HeaderTags::SourcePackage),
            1107 => Ok(Rpm_HeaderTags::OldOrigFilenamesInternal),
            1108 => Ok(Rpm_HeaderTags::BuildPrereqInternal),
            1109 => Ok(Rpm_HeaderTags::BuildRequiresInternal),
            1110 => Ok(Rpm_HeaderTags::BuildConflictsInternal),
            1111 => Ok(Rpm_HeaderTags::BuildMacrosInternal),
            1112 => Ok(Rpm_HeaderTags::ProvideFlags),
            1113 => Ok(Rpm_HeaderTags::ProvideVersion),
            1114 => Ok(Rpm_HeaderTags::ObsoleteFlags),
            1115 => Ok(Rpm_HeaderTags::ObsoleteVersion),
            1116 => Ok(Rpm_HeaderTags::DirIndexes),
            1117 => Ok(Rpm_HeaderTags::BaseNames),
            1118 => Ok(Rpm_HeaderTags::DirNames),
            1119 => Ok(Rpm_HeaderTags::OrigDirIndexes),
            1120 => Ok(Rpm_HeaderTags::OrigBaseNames),
            1121 => Ok(Rpm_HeaderTags::OrigDirNames),
            1122 => Ok(Rpm_HeaderTags::OptFlags),
            1123 => Ok(Rpm_HeaderTags::DistUrl),
            1124 => Ok(Rpm_HeaderTags::PayloadFormat),
            1125 => Ok(Rpm_HeaderTags::PayloadCompressor),
            1126 => Ok(Rpm_HeaderTags::PayloadFlags),
            1127 => Ok(Rpm_HeaderTags::InstallColor),
            1128 => Ok(Rpm_HeaderTags::InstallTid),
            1129 => Ok(Rpm_HeaderTags::RemoveTidObsolete),
            1130 => Ok(Rpm_HeaderTags::Sha1RhnInternal),
            1131 => Ok(Rpm_HeaderTags::RhnPlatformInternal),
            1132 => Ok(Rpm_HeaderTags::Platform),
            1133 => Ok(Rpm_HeaderTags::PatchesNameObsolete),
            1134 => Ok(Rpm_HeaderTags::PatchesFlagsObsolete),
            1135 => Ok(Rpm_HeaderTags::PatchesVersionObsolete),
            1136 => Ok(Rpm_HeaderTags::CacheCtimeInternal),
            1137 => Ok(Rpm_HeaderTags::CachePkgPathInternal),
            1138 => Ok(Rpm_HeaderTags::CachePkgSizeInternal),
            1139 => Ok(Rpm_HeaderTags::CachePkgMtimeInternal),
            1140 => Ok(Rpm_HeaderTags::FileColors),
            1141 => Ok(Rpm_HeaderTags::FileClass),
            1142 => Ok(Rpm_HeaderTags::ClassDict),
            1143 => Ok(Rpm_HeaderTags::FileDependsIdx),
            1144 => Ok(Rpm_HeaderTags::FileDependsNum),
            1145 => Ok(Rpm_HeaderTags::DependsDict),
            1146 => Ok(Rpm_HeaderTags::SourceSigMd5),
            1147 => Ok(Rpm_HeaderTags::FileContextsObsolete),
            1148 => Ok(Rpm_HeaderTags::FsContextsObsolete),
            1149 => Ok(Rpm_HeaderTags::ReContextsObsolete),
            1150 => Ok(Rpm_HeaderTags::Policies),
            1151 => Ok(Rpm_HeaderTags::PreTrans),
            1152 => Ok(Rpm_HeaderTags::PostTrans),
            1153 => Ok(Rpm_HeaderTags::PreTransProg),
            1154 => Ok(Rpm_HeaderTags::PostTransProg),
            1155 => Ok(Rpm_HeaderTags::DistTag),
            1156 => Ok(Rpm_HeaderTags::OldSuggestsNameObsolete),
            1157 => Ok(Rpm_HeaderTags::OldSuggestsVersionObsolete),
            1158 => Ok(Rpm_HeaderTags::OldSuggestsFlagsObsolete),
            1159 => Ok(Rpm_HeaderTags::OldEnhancesNameObsolete),
            1160 => Ok(Rpm_HeaderTags::OldEnhancesVersionObsolete),
            1161 => Ok(Rpm_HeaderTags::OldEnhancesFlagsObsolete),
            1162 => Ok(Rpm_HeaderTags::PriorityUnimplemented),
            1163 => Ok(Rpm_HeaderTags::CvsidUnimplemented),
            1164 => Ok(Rpm_HeaderTags::BlinkPkgidUnimplemented),
            1165 => Ok(Rpm_HeaderTags::BlinkHdridUnimplemented),
            1166 => Ok(Rpm_HeaderTags::BlinkNevraUnimplemented),
            1167 => Ok(Rpm_HeaderTags::FlinkPkgidUnimplemented),
            1168 => Ok(Rpm_HeaderTags::FlinkHdridUnimplemented),
            1169 => Ok(Rpm_HeaderTags::FlinkNevraUnimplemented),
            1170 => Ok(Rpm_HeaderTags::PackageOriginUnimplemented),
            1171 => Ok(Rpm_HeaderTags::TriggerPreInstallInternal),
            1172 => Ok(Rpm_HeaderTags::BuildSuggestsUnimplemented),
            1173 => Ok(Rpm_HeaderTags::BuildEnhancesUnimplemented),
            1174 => Ok(Rpm_HeaderTags::ScriptStatesUnimplemented),
            1175 => Ok(Rpm_HeaderTags::ScriptMetricsUnimplemented),
            1176 => Ok(Rpm_HeaderTags::BuildCpuClockUnimplemented),
            1177 => Ok(Rpm_HeaderTags::FileDigestAlgosUnimplemented),
            1178 => Ok(Rpm_HeaderTags::VariantsUnimplemented),
            1179 => Ok(Rpm_HeaderTags::XmajorUnimplemented),
            1180 => Ok(Rpm_HeaderTags::XminorUnimplemented),
            1181 => Ok(Rpm_HeaderTags::RepoTagUnimplemented),
            1182 => Ok(Rpm_HeaderTags::KeywordsUnimplemented),
            1183 => Ok(Rpm_HeaderTags::BuildPlatformsUnimplemented),
            1184 => Ok(Rpm_HeaderTags::PackageColorUnimplemented),
            1185 => Ok(Rpm_HeaderTags::PackagePrefColorUnimplemented),
            1186 => Ok(Rpm_HeaderTags::XattrsDictUnimplemented),
            1187 => Ok(Rpm_HeaderTags::FilexAttrsxUnimplemented),
            1188 => Ok(Rpm_HeaderTags::DepAttrsDictUnimplemented),
            1189 => Ok(Rpm_HeaderTags::ConflictAttrsxUnimplemented),
            1190 => Ok(Rpm_HeaderTags::ObsoleteAttrsxUnimplemented),
            1191 => Ok(Rpm_HeaderTags::ProvideAttrsxUnimplemented),
            1192 => Ok(Rpm_HeaderTags::RequireAttrsxUnimplemented),
            1193 => Ok(Rpm_HeaderTags::BuildProvidesUnimplemented),
            1194 => Ok(Rpm_HeaderTags::BuildObsoletesUnimplemented),
            1195 => Ok(Rpm_HeaderTags::DbInstance),
            1196 => Ok(Rpm_HeaderTags::Nvra),
            5000 => Ok(Rpm_HeaderTags::FileNames),
            5001 => Ok(Rpm_HeaderTags::FileProvide),
            5002 => Ok(Rpm_HeaderTags::FileRequire),
            5003 => Ok(Rpm_HeaderTags::FsNamesUnimplemented),
            5004 => Ok(Rpm_HeaderTags::FsSizesUnimplemented),
            5005 => Ok(Rpm_HeaderTags::TriggerConds),
            5006 => Ok(Rpm_HeaderTags::TriggerType),
            5007 => Ok(Rpm_HeaderTags::OrigFileNames),
            5008 => Ok(Rpm_HeaderTags::LongFileSizes),
            5009 => Ok(Rpm_HeaderTags::LongSize),
            5010 => Ok(Rpm_HeaderTags::FileCaps),
            5011 => Ok(Rpm_HeaderTags::FileDigestAlgo),
            5012 => Ok(Rpm_HeaderTags::BugUrl),
            5013 => Ok(Rpm_HeaderTags::Evr),
            5014 => Ok(Rpm_HeaderTags::Nvr),
            5015 => Ok(Rpm_HeaderTags::Nevr),
            5016 => Ok(Rpm_HeaderTags::Nevra),
            5017 => Ok(Rpm_HeaderTags::HeaderColor),
            5018 => Ok(Rpm_HeaderTags::Verbose),
            5019 => Ok(Rpm_HeaderTags::EpochNum),
            5020 => Ok(Rpm_HeaderTags::PreInstallFlags),
            5021 => Ok(Rpm_HeaderTags::PostInstallFlags),
            5022 => Ok(Rpm_HeaderTags::PreUninstallFlags),
            5023 => Ok(Rpm_HeaderTags::PostUninstallFlags),
            5024 => Ok(Rpm_HeaderTags::PreTransFlags),
            5025 => Ok(Rpm_HeaderTags::PostTransFlags),
            5026 => Ok(Rpm_HeaderTags::VerifyScriptFlags),
            5027 => Ok(Rpm_HeaderTags::TriggerScriptFlags),
            5029 => Ok(Rpm_HeaderTags::CollectionsUnimplemented),
            5030 => Ok(Rpm_HeaderTags::PolicyNames),
            5031 => Ok(Rpm_HeaderTags::PolicyTypes),
            5032 => Ok(Rpm_HeaderTags::PolicyTypesIndexes),
            5033 => Ok(Rpm_HeaderTags::PolicyFlags),
            5034 => Ok(Rpm_HeaderTags::Vcs),
            5035 => Ok(Rpm_HeaderTags::OrderName),
            5036 => Ok(Rpm_HeaderTags::OrderVersion),
            5037 => Ok(Rpm_HeaderTags::OrderFlags),
            5038 => Ok(Rpm_HeaderTags::MssfManifestUnimplemented),
            5039 => Ok(Rpm_HeaderTags::MssfDomainUnimplemented),
            5040 => Ok(Rpm_HeaderTags::InstFileNames),
            5041 => Ok(Rpm_HeaderTags::RequireNevrs),
            5042 => Ok(Rpm_HeaderTags::ProvideNevrs),
            5043 => Ok(Rpm_HeaderTags::ObsoleteNevrs),
            5044 => Ok(Rpm_HeaderTags::ConflictNevrs),
            5045 => Ok(Rpm_HeaderTags::FileNlinks),
            5046 => Ok(Rpm_HeaderTags::RecommendName),
            5047 => Ok(Rpm_HeaderTags::RecommendVersion),
            5048 => Ok(Rpm_HeaderTags::RecommendFlags),
            5049 => Ok(Rpm_HeaderTags::SuggestName),
            5050 => Ok(Rpm_HeaderTags::SuggestVersion),
            5051 => Ok(Rpm_HeaderTags::SuggestFlags),
            5052 => Ok(Rpm_HeaderTags::SupplementName),
            5053 => Ok(Rpm_HeaderTags::SupplementVersion),
            5054 => Ok(Rpm_HeaderTags::SupplementFlags),
            5055 => Ok(Rpm_HeaderTags::EnhanceName),
            5056 => Ok(Rpm_HeaderTags::EnhanceVersion),
            5057 => Ok(Rpm_HeaderTags::EnhanceFlags),
            5058 => Ok(Rpm_HeaderTags::RecommendNevrs),
            5059 => Ok(Rpm_HeaderTags::SuggestNevrs),
            5060 => Ok(Rpm_HeaderTags::SupplementNevrs),
            5061 => Ok(Rpm_HeaderTags::EnhanceNevrs),
            5062 => Ok(Rpm_HeaderTags::Encoding),
            5063 => Ok(Rpm_HeaderTags::FileTriggerInstallInternal),
            5064 => Ok(Rpm_HeaderTags::FileTriggerUninstallInternal),
            5065 => Ok(Rpm_HeaderTags::FileTriggerPostUninstallInternal),
            5066 => Ok(Rpm_HeaderTags::FileTriggerScripts),
            5067 => Ok(Rpm_HeaderTags::FileTriggerScriptProg),
            5068 => Ok(Rpm_HeaderTags::FileTriggerScriptFlags),
            5069 => Ok(Rpm_HeaderTags::FileTriggerName),
            5070 => Ok(Rpm_HeaderTags::FileTriggerIndex),
            5071 => Ok(Rpm_HeaderTags::FileTriggerVersion),
            5072 => Ok(Rpm_HeaderTags::FileTriggerFlags),
            5073 => Ok(Rpm_HeaderTags::TransFileTriggerInstallInternal),
            5074 => Ok(Rpm_HeaderTags::TransFileTriggerUninstallInternal),
            5075 => Ok(Rpm_HeaderTags::TransFileTriggerPostUninstallInternal),
            5076 => Ok(Rpm_HeaderTags::TransFileTriggerScripts),
            5077 => Ok(Rpm_HeaderTags::TransFileTriggerScriptProg),
            5078 => Ok(Rpm_HeaderTags::TransFileTriggerScriptFlags),
            5079 => Ok(Rpm_HeaderTags::TransFileTriggerName),
            5080 => Ok(Rpm_HeaderTags::TransFileTriggerIndex),
            5081 => Ok(Rpm_HeaderTags::TransFileTriggerVersion),
            5082 => Ok(Rpm_HeaderTags::TransFileTriggerFlags),
            5083 => Ok(Rpm_HeaderTags::RemovePathPostfixesInternal),
            5084 => Ok(Rpm_HeaderTags::FileTriggerPriorities),
            5085 => Ok(Rpm_HeaderTags::TransFileTriggerPriorities),
            5086 => Ok(Rpm_HeaderTags::FileTriggerConds),
            5087 => Ok(Rpm_HeaderTags::FileTriggerType),
            5088 => Ok(Rpm_HeaderTags::TransFileTriggerConds),
            5089 => Ok(Rpm_HeaderTags::TransFileTriggerType),
            5090 => Ok(Rpm_HeaderTags::FileSignatures),
            5091 => Ok(Rpm_HeaderTags::FileSignatureLength),
            5092 => Ok(Rpm_HeaderTags::PayloadSha256),
            5093 => Ok(Rpm_HeaderTags::PayloadSha256AlgoObsolete),
            5094 => Ok(Rpm_HeaderTags::AutoInstalledUnimplemented),
            5095 => Ok(Rpm_HeaderTags::IdentityUnimplemented),
            5096 => Ok(Rpm_HeaderTags::ModularityLabel),
            5097 => Ok(Rpm_HeaderTags::PayloadSha256Alt),
            5098 => Ok(Rpm_HeaderTags::ArchSuffix),
            5099 => Ok(Rpm_HeaderTags::Spec),
            5100 => Ok(Rpm_HeaderTags::TranslationUrl),
            5101 => Ok(Rpm_HeaderTags::UpstreamReleases),
            5102 => Ok(Rpm_HeaderTags::SourceLicenseInternal),
            5103 => Ok(Rpm_HeaderTags::PreUntrans),
            5104 => Ok(Rpm_HeaderTags::PostUntrans),
            5105 => Ok(Rpm_HeaderTags::PreUntransProg),
            5106 => Ok(Rpm_HeaderTags::PostUntransProg),
            5107 => Ok(Rpm_HeaderTags::PreUntransFlags),
            5108 => Ok(Rpm_HeaderTags::PostUntransFlags),
            5109 => Ok(Rpm_HeaderTags::SysUsers),
            5110 => Ok(Rpm_HeaderTags::BuildSystemInternal),
            5111 => Ok(Rpm_HeaderTags::BuildOptionInternal),
            5112 => Ok(Rpm_HeaderTags::PayloadSize),
            5113 => Ok(Rpm_HeaderTags::PayloadSizeAlt),
            5114 => Ok(Rpm_HeaderTags::RpmFormat),
            5115 => Ok(Rpm_HeaderTags::FileMimeIndex),
            5116 => Ok(Rpm_HeaderTags::MimeDict),
            5117 => Ok(Rpm_HeaderTags::FileMimes),
            5118 => Ok(Rpm_HeaderTags::PackageDigests),
            5119 => Ok(Rpm_HeaderTags::PackageDigestAlgos),
            5120 => Ok(Rpm_HeaderTags::SourceNevr),
            5121 => Ok(Rpm_HeaderTags::PayloadSha512),
            5122 => Ok(Rpm_HeaderTags::PayloadSha512Alt),
            5123 => Ok(Rpm_HeaderTags::PayloadSha3256),
            5124 => Ok(Rpm_HeaderTags::PayloadSha3256Alt),
            _ => Ok(Rpm_HeaderTags::Unknown(flag)),
        }
    }
}

impl From<&Rpm_HeaderTags> for i64 {
    fn from(v: &Rpm_HeaderTags) -> Self {
        match *v {
            Rpm_HeaderTags::Signatures => 62,
            Rpm_HeaderTags::HeaderImmutable => 63,
            Rpm_HeaderTags::I18nTable => 100,
            Rpm_HeaderTags::Name => 1000,
            Rpm_HeaderTags::Version => 1001,
            Rpm_HeaderTags::Release => 1002,
            Rpm_HeaderTags::Epoch => 1003,
            Rpm_HeaderTags::Summary => 1004,
            Rpm_HeaderTags::Description => 1005,
            Rpm_HeaderTags::BuildTime => 1006,
            Rpm_HeaderTags::BuildHost => 1007,
            Rpm_HeaderTags::InstallTime => 1008,
            Rpm_HeaderTags::Size => 1009,
            Rpm_HeaderTags::Distribution => 1010,
            Rpm_HeaderTags::Vendor => 1011,
            Rpm_HeaderTags::GifObsolete => 1012,
            Rpm_HeaderTags::XpmObsolete => 1013,
            Rpm_HeaderTags::License => 1014,
            Rpm_HeaderTags::Packager => 1015,
            Rpm_HeaderTags::Group => 1016,
            Rpm_HeaderTags::ChangelogInternal => 1017,
            Rpm_HeaderTags::Source => 1018,
            Rpm_HeaderTags::Patch => 1019,
            Rpm_HeaderTags::Url => 1020,
            Rpm_HeaderTags::Os => 1021,
            Rpm_HeaderTags::Arch => 1022,
            Rpm_HeaderTags::PreInstallScriptlet => 1023,
            Rpm_HeaderTags::PostInstallScriptlet => 1024,
            Rpm_HeaderTags::PreUninstallScriptlet => 1025,
            Rpm_HeaderTags::PostUninstallScriptlet => 1026,
            Rpm_HeaderTags::OldFileNamesObsolete => 1027,
            Rpm_HeaderTags::FileSizes => 1028,
            Rpm_HeaderTags::FileStates => 1029,
            Rpm_HeaderTags::FileModes => 1030,
            Rpm_HeaderTags::FileUidsInternal => 1031,
            Rpm_HeaderTags::FileGidsInternal => 1032,
            Rpm_HeaderTags::DeviceNumber => 1033,
            Rpm_HeaderTags::Mtimes => 1034,
            Rpm_HeaderTags::FileDigests => 1035,
            Rpm_HeaderTags::LinkTos => 1036,
            Rpm_HeaderTags::FileFlags => 1037,
            Rpm_HeaderTags::RootInternal => 1038,
            Rpm_HeaderTags::FileOwner => 1039,
            Rpm_HeaderTags::FileGroup => 1040,
            Rpm_HeaderTags::ExcludeInternal => 1041,
            Rpm_HeaderTags::ExclusiveInternal => 1042,
            Rpm_HeaderTags::IconObsolete => 1043,
            Rpm_HeaderTags::SourceRpm => 1044,
            Rpm_HeaderTags::FileVerifyFlags => 1045,
            Rpm_HeaderTags::ArchiveSize => 1046,
            Rpm_HeaderTags::ProvideName => 1047,
            Rpm_HeaderTags::RequireFlags => 1048,
            Rpm_HeaderTags::RequireName => 1049,
            Rpm_HeaderTags::RequireVersion => 1050,
            Rpm_HeaderTags::NoSource => 1051,
            Rpm_HeaderTags::NoPatch => 1052,
            Rpm_HeaderTags::ConflictFlags => 1053,
            Rpm_HeaderTags::ConflictName => 1054,
            Rpm_HeaderTags::ConflictVersion => 1055,
            Rpm_HeaderTags::DefaultPrefixInternal => 1056,
            Rpm_HeaderTags::BuildRootInternal => 1057,
            Rpm_HeaderTags::InstallPrefixInternal => 1058,
            Rpm_HeaderTags::ExcludeArch => 1059,
            Rpm_HeaderTags::ExcludeOs => 1060,
            Rpm_HeaderTags::ExclusiveArch => 1061,
            Rpm_HeaderTags::ExclusiveOs => 1062,
            Rpm_HeaderTags::AutoreqprovInternal => 1063,
            Rpm_HeaderTags::RpmVersion => 1064,
            Rpm_HeaderTags::TriggerScripts => 1065,
            Rpm_HeaderTags::TriggerName => 1066,
            Rpm_HeaderTags::TriggerVersion => 1067,
            Rpm_HeaderTags::TriggerFlags => 1068,
            Rpm_HeaderTags::TriggerIndex => 1069,
            Rpm_HeaderTags::VerifyScript => 1079,
            Rpm_HeaderTags::ChangelogTime => 1080,
            Rpm_HeaderTags::ChangelogName => 1081,
            Rpm_HeaderTags::ChangelogText => 1082,
            Rpm_HeaderTags::BrokenMd5Internal => 1083,
            Rpm_HeaderTags::PrereqInternal => 1084,
            Rpm_HeaderTags::PreInstallInterpreter => 1085,
            Rpm_HeaderTags::PostInstallInterpreter => 1086,
            Rpm_HeaderTags::PreUninstallInterpreter => 1087,
            Rpm_HeaderTags::PostUninstallInterpreter => 1088,
            Rpm_HeaderTags::BuildArchs => 1089,
            Rpm_HeaderTags::ObsoleteName => 1090,
            Rpm_HeaderTags::VerifyScriptProg => 1091,
            Rpm_HeaderTags::TriggerScriptProg => 1092,
            Rpm_HeaderTags::DocDirInternal => 1093,
            Rpm_HeaderTags::Cookie => 1094,
            Rpm_HeaderTags::FileDevices => 1095,
            Rpm_HeaderTags::FileInodes => 1096,
            Rpm_HeaderTags::FileLangs => 1097,
            Rpm_HeaderTags::Prefixes => 1098,
            Rpm_HeaderTags::InstallPrefixes => 1099,
            Rpm_HeaderTags::TriggerInstallInternal => 1100,
            Rpm_HeaderTags::TriggerUninstallInternal => 1101,
            Rpm_HeaderTags::TriggerPostUninstallInternal => 1102,
            Rpm_HeaderTags::AutoreqInternal => 1103,
            Rpm_HeaderTags::AutoprovInternal => 1104,
            Rpm_HeaderTags::CapabilityInternal => 1105,
            Rpm_HeaderTags::SourcePackage => 1106,
            Rpm_HeaderTags::OldOrigFilenamesInternal => 1107,
            Rpm_HeaderTags::BuildPrereqInternal => 1108,
            Rpm_HeaderTags::BuildRequiresInternal => 1109,
            Rpm_HeaderTags::BuildConflictsInternal => 1110,
            Rpm_HeaderTags::BuildMacrosInternal => 1111,
            Rpm_HeaderTags::ProvideFlags => 1112,
            Rpm_HeaderTags::ProvideVersion => 1113,
            Rpm_HeaderTags::ObsoleteFlags => 1114,
            Rpm_HeaderTags::ObsoleteVersion => 1115,
            Rpm_HeaderTags::DirIndexes => 1116,
            Rpm_HeaderTags::BaseNames => 1117,
            Rpm_HeaderTags::DirNames => 1118,
            Rpm_HeaderTags::OrigDirIndexes => 1119,
            Rpm_HeaderTags::OrigBaseNames => 1120,
            Rpm_HeaderTags::OrigDirNames => 1121,
            Rpm_HeaderTags::OptFlags => 1122,
            Rpm_HeaderTags::DistUrl => 1123,
            Rpm_HeaderTags::PayloadFormat => 1124,
            Rpm_HeaderTags::PayloadCompressor => 1125,
            Rpm_HeaderTags::PayloadFlags => 1126,
            Rpm_HeaderTags::InstallColor => 1127,
            Rpm_HeaderTags::InstallTid => 1128,
            Rpm_HeaderTags::RemoveTidObsolete => 1129,
            Rpm_HeaderTags::Sha1RhnInternal => 1130,
            Rpm_HeaderTags::RhnPlatformInternal => 1131,
            Rpm_HeaderTags::Platform => 1132,
            Rpm_HeaderTags::PatchesNameObsolete => 1133,
            Rpm_HeaderTags::PatchesFlagsObsolete => 1134,
            Rpm_HeaderTags::PatchesVersionObsolete => 1135,
            Rpm_HeaderTags::CacheCtimeInternal => 1136,
            Rpm_HeaderTags::CachePkgPathInternal => 1137,
            Rpm_HeaderTags::CachePkgSizeInternal => 1138,
            Rpm_HeaderTags::CachePkgMtimeInternal => 1139,
            Rpm_HeaderTags::FileColors => 1140,
            Rpm_HeaderTags::FileClass => 1141,
            Rpm_HeaderTags::ClassDict => 1142,
            Rpm_HeaderTags::FileDependsIdx => 1143,
            Rpm_HeaderTags::FileDependsNum => 1144,
            Rpm_HeaderTags::DependsDict => 1145,
            Rpm_HeaderTags::SourceSigMd5 => 1146,
            Rpm_HeaderTags::FileContextsObsolete => 1147,
            Rpm_HeaderTags::FsContextsObsolete => 1148,
            Rpm_HeaderTags::ReContextsObsolete => 1149,
            Rpm_HeaderTags::Policies => 1150,
            Rpm_HeaderTags::PreTrans => 1151,
            Rpm_HeaderTags::PostTrans => 1152,
            Rpm_HeaderTags::PreTransProg => 1153,
            Rpm_HeaderTags::PostTransProg => 1154,
            Rpm_HeaderTags::DistTag => 1155,
            Rpm_HeaderTags::OldSuggestsNameObsolete => 1156,
            Rpm_HeaderTags::OldSuggestsVersionObsolete => 1157,
            Rpm_HeaderTags::OldSuggestsFlagsObsolete => 1158,
            Rpm_HeaderTags::OldEnhancesNameObsolete => 1159,
            Rpm_HeaderTags::OldEnhancesVersionObsolete => 1160,
            Rpm_HeaderTags::OldEnhancesFlagsObsolete => 1161,
            Rpm_HeaderTags::PriorityUnimplemented => 1162,
            Rpm_HeaderTags::CvsidUnimplemented => 1163,
            Rpm_HeaderTags::BlinkPkgidUnimplemented => 1164,
            Rpm_HeaderTags::BlinkHdridUnimplemented => 1165,
            Rpm_HeaderTags::BlinkNevraUnimplemented => 1166,
            Rpm_HeaderTags::FlinkPkgidUnimplemented => 1167,
            Rpm_HeaderTags::FlinkHdridUnimplemented => 1168,
            Rpm_HeaderTags::FlinkNevraUnimplemented => 1169,
            Rpm_HeaderTags::PackageOriginUnimplemented => 1170,
            Rpm_HeaderTags::TriggerPreInstallInternal => 1171,
            Rpm_HeaderTags::BuildSuggestsUnimplemented => 1172,
            Rpm_HeaderTags::BuildEnhancesUnimplemented => 1173,
            Rpm_HeaderTags::ScriptStatesUnimplemented => 1174,
            Rpm_HeaderTags::ScriptMetricsUnimplemented => 1175,
            Rpm_HeaderTags::BuildCpuClockUnimplemented => 1176,
            Rpm_HeaderTags::FileDigestAlgosUnimplemented => 1177,
            Rpm_HeaderTags::VariantsUnimplemented => 1178,
            Rpm_HeaderTags::XmajorUnimplemented => 1179,
            Rpm_HeaderTags::XminorUnimplemented => 1180,
            Rpm_HeaderTags::RepoTagUnimplemented => 1181,
            Rpm_HeaderTags::KeywordsUnimplemented => 1182,
            Rpm_HeaderTags::BuildPlatformsUnimplemented => 1183,
            Rpm_HeaderTags::PackageColorUnimplemented => 1184,
            Rpm_HeaderTags::PackagePrefColorUnimplemented => 1185,
            Rpm_HeaderTags::XattrsDictUnimplemented => 1186,
            Rpm_HeaderTags::FilexAttrsxUnimplemented => 1187,
            Rpm_HeaderTags::DepAttrsDictUnimplemented => 1188,
            Rpm_HeaderTags::ConflictAttrsxUnimplemented => 1189,
            Rpm_HeaderTags::ObsoleteAttrsxUnimplemented => 1190,
            Rpm_HeaderTags::ProvideAttrsxUnimplemented => 1191,
            Rpm_HeaderTags::RequireAttrsxUnimplemented => 1192,
            Rpm_HeaderTags::BuildProvidesUnimplemented => 1193,
            Rpm_HeaderTags::BuildObsoletesUnimplemented => 1194,
            Rpm_HeaderTags::DbInstance => 1195,
            Rpm_HeaderTags::Nvra => 1196,
            Rpm_HeaderTags::FileNames => 5000,
            Rpm_HeaderTags::FileProvide => 5001,
            Rpm_HeaderTags::FileRequire => 5002,
            Rpm_HeaderTags::FsNamesUnimplemented => 5003,
            Rpm_HeaderTags::FsSizesUnimplemented => 5004,
            Rpm_HeaderTags::TriggerConds => 5005,
            Rpm_HeaderTags::TriggerType => 5006,
            Rpm_HeaderTags::OrigFileNames => 5007,
            Rpm_HeaderTags::LongFileSizes => 5008,
            Rpm_HeaderTags::LongSize => 5009,
            Rpm_HeaderTags::FileCaps => 5010,
            Rpm_HeaderTags::FileDigestAlgo => 5011,
            Rpm_HeaderTags::BugUrl => 5012,
            Rpm_HeaderTags::Evr => 5013,
            Rpm_HeaderTags::Nvr => 5014,
            Rpm_HeaderTags::Nevr => 5015,
            Rpm_HeaderTags::Nevra => 5016,
            Rpm_HeaderTags::HeaderColor => 5017,
            Rpm_HeaderTags::Verbose => 5018,
            Rpm_HeaderTags::EpochNum => 5019,
            Rpm_HeaderTags::PreInstallFlags => 5020,
            Rpm_HeaderTags::PostInstallFlags => 5021,
            Rpm_HeaderTags::PreUninstallFlags => 5022,
            Rpm_HeaderTags::PostUninstallFlags => 5023,
            Rpm_HeaderTags::PreTransFlags => 5024,
            Rpm_HeaderTags::PostTransFlags => 5025,
            Rpm_HeaderTags::VerifyScriptFlags => 5026,
            Rpm_HeaderTags::TriggerScriptFlags => 5027,
            Rpm_HeaderTags::CollectionsUnimplemented => 5029,
            Rpm_HeaderTags::PolicyNames => 5030,
            Rpm_HeaderTags::PolicyTypes => 5031,
            Rpm_HeaderTags::PolicyTypesIndexes => 5032,
            Rpm_HeaderTags::PolicyFlags => 5033,
            Rpm_HeaderTags::Vcs => 5034,
            Rpm_HeaderTags::OrderName => 5035,
            Rpm_HeaderTags::OrderVersion => 5036,
            Rpm_HeaderTags::OrderFlags => 5037,
            Rpm_HeaderTags::MssfManifestUnimplemented => 5038,
            Rpm_HeaderTags::MssfDomainUnimplemented => 5039,
            Rpm_HeaderTags::InstFileNames => 5040,
            Rpm_HeaderTags::RequireNevrs => 5041,
            Rpm_HeaderTags::ProvideNevrs => 5042,
            Rpm_HeaderTags::ObsoleteNevrs => 5043,
            Rpm_HeaderTags::ConflictNevrs => 5044,
            Rpm_HeaderTags::FileNlinks => 5045,
            Rpm_HeaderTags::RecommendName => 5046,
            Rpm_HeaderTags::RecommendVersion => 5047,
            Rpm_HeaderTags::RecommendFlags => 5048,
            Rpm_HeaderTags::SuggestName => 5049,
            Rpm_HeaderTags::SuggestVersion => 5050,
            Rpm_HeaderTags::SuggestFlags => 5051,
            Rpm_HeaderTags::SupplementName => 5052,
            Rpm_HeaderTags::SupplementVersion => 5053,
            Rpm_HeaderTags::SupplementFlags => 5054,
            Rpm_HeaderTags::EnhanceName => 5055,
            Rpm_HeaderTags::EnhanceVersion => 5056,
            Rpm_HeaderTags::EnhanceFlags => 5057,
            Rpm_HeaderTags::RecommendNevrs => 5058,
            Rpm_HeaderTags::SuggestNevrs => 5059,
            Rpm_HeaderTags::SupplementNevrs => 5060,
            Rpm_HeaderTags::EnhanceNevrs => 5061,
            Rpm_HeaderTags::Encoding => 5062,
            Rpm_HeaderTags::FileTriggerInstallInternal => 5063,
            Rpm_HeaderTags::FileTriggerUninstallInternal => 5064,
            Rpm_HeaderTags::FileTriggerPostUninstallInternal => 5065,
            Rpm_HeaderTags::FileTriggerScripts => 5066,
            Rpm_HeaderTags::FileTriggerScriptProg => 5067,
            Rpm_HeaderTags::FileTriggerScriptFlags => 5068,
            Rpm_HeaderTags::FileTriggerName => 5069,
            Rpm_HeaderTags::FileTriggerIndex => 5070,
            Rpm_HeaderTags::FileTriggerVersion => 5071,
            Rpm_HeaderTags::FileTriggerFlags => 5072,
            Rpm_HeaderTags::TransFileTriggerInstallInternal => 5073,
            Rpm_HeaderTags::TransFileTriggerUninstallInternal => 5074,
            Rpm_HeaderTags::TransFileTriggerPostUninstallInternal => 5075,
            Rpm_HeaderTags::TransFileTriggerScripts => 5076,
            Rpm_HeaderTags::TransFileTriggerScriptProg => 5077,
            Rpm_HeaderTags::TransFileTriggerScriptFlags => 5078,
            Rpm_HeaderTags::TransFileTriggerName => 5079,
            Rpm_HeaderTags::TransFileTriggerIndex => 5080,
            Rpm_HeaderTags::TransFileTriggerVersion => 5081,
            Rpm_HeaderTags::TransFileTriggerFlags => 5082,
            Rpm_HeaderTags::RemovePathPostfixesInternal => 5083,
            Rpm_HeaderTags::FileTriggerPriorities => 5084,
            Rpm_HeaderTags::TransFileTriggerPriorities => 5085,
            Rpm_HeaderTags::FileTriggerConds => 5086,
            Rpm_HeaderTags::FileTriggerType => 5087,
            Rpm_HeaderTags::TransFileTriggerConds => 5088,
            Rpm_HeaderTags::TransFileTriggerType => 5089,
            Rpm_HeaderTags::FileSignatures => 5090,
            Rpm_HeaderTags::FileSignatureLength => 5091,
            Rpm_HeaderTags::PayloadSha256 => 5092,
            Rpm_HeaderTags::PayloadSha256AlgoObsolete => 5093,
            Rpm_HeaderTags::AutoInstalledUnimplemented => 5094,
            Rpm_HeaderTags::IdentityUnimplemented => 5095,
            Rpm_HeaderTags::ModularityLabel => 5096,
            Rpm_HeaderTags::PayloadSha256Alt => 5097,
            Rpm_HeaderTags::ArchSuffix => 5098,
            Rpm_HeaderTags::Spec => 5099,
            Rpm_HeaderTags::TranslationUrl => 5100,
            Rpm_HeaderTags::UpstreamReleases => 5101,
            Rpm_HeaderTags::SourceLicenseInternal => 5102,
            Rpm_HeaderTags::PreUntrans => 5103,
            Rpm_HeaderTags::PostUntrans => 5104,
            Rpm_HeaderTags::PreUntransProg => 5105,
            Rpm_HeaderTags::PostUntransProg => 5106,
            Rpm_HeaderTags::PreUntransFlags => 5107,
            Rpm_HeaderTags::PostUntransFlags => 5108,
            Rpm_HeaderTags::SysUsers => 5109,
            Rpm_HeaderTags::BuildSystemInternal => 5110,
            Rpm_HeaderTags::BuildOptionInternal => 5111,
            Rpm_HeaderTags::PayloadSize => 5112,
            Rpm_HeaderTags::PayloadSizeAlt => 5113,
            Rpm_HeaderTags::RpmFormat => 5114,
            Rpm_HeaderTags::FileMimeIndex => 5115,
            Rpm_HeaderTags::MimeDict => 5116,
            Rpm_HeaderTags::FileMimes => 5117,
            Rpm_HeaderTags::PackageDigests => 5118,
            Rpm_HeaderTags::PackageDigestAlgos => 5119,
            Rpm_HeaderTags::SourceNevr => 5120,
            Rpm_HeaderTags::PayloadSha512 => 5121,
            Rpm_HeaderTags::PayloadSha512Alt => 5122,
            Rpm_HeaderTags::PayloadSha3256 => 5123,
            Rpm_HeaderTags::PayloadSha3256Alt => 5124,
            Rpm_HeaderTags::Unknown(v) => v
        }
    }
}

impl Default for Rpm_HeaderTags {
    fn default() -> Self { Rpm_HeaderTags::Unknown(0) }
}

#[derive(Debug, PartialEq, Clone)]
pub enum Rpm_OperatingSystems {

    /**
     * Since RPM 6.0, `archnum` and `osnum` are no longer populated when
     * writing the lead, so they are left zeroed - see
     * <https://github.com/rpm-software-management/rpm/commit/5a685fb5eb085d5bc37723ec29ce72434db6bd4e>.
     * This applies to both v4 and v6 packages.
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v6.md#lead Source
     */
    NotSet,
    Linux,
    Irix,

    /**
     * This value is pretty much a guess, based on that `archnum` and `osnum`
     * values are handled by the same function `getMachineInfo()` (see
     * `doc-ref` link) which uses 255 for an unknown value. Value
     * `architectures::no_arch` can be verified with the magic file of
     * `file(1)` and `.rpm` files that have `noarch` in their name, so it seems
     * reasonable that `no_os` (or "`noos`" originally) follows the same
     * pattern.
     * 
     * Moreover, this value is actually used in practice, see this sample file:
     * <https://github.com/craigwblake/redline/blob/15afff5/src/test/resources/rpm-3-1.0-1.somearch.rpm>
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/lib/rpmrc.cc#L1507 Source
     */
    NoOs,
    Unknown(i64),
}

impl TryFrom<i64> for Rpm_OperatingSystems {
    type Error = KError;
    fn try_from(flag: i64) -> KResult<Rpm_OperatingSystems> {
        match flag {
            0 => Ok(Rpm_OperatingSystems::NotSet),
            1 => Ok(Rpm_OperatingSystems::Linux),
            2 => Ok(Rpm_OperatingSystems::Irix),
            255 => Ok(Rpm_OperatingSystems::NoOs),
            _ => Ok(Rpm_OperatingSystems::Unknown(flag)),
        }
    }
}

impl From<&Rpm_OperatingSystems> for i64 {
    fn from(v: &Rpm_OperatingSystems) -> Self {
        match *v {
            Rpm_OperatingSystems::NotSet => 0,
            Rpm_OperatingSystems::Linux => 1,
            Rpm_OperatingSystems::Irix => 2,
            Rpm_OperatingSystems::NoOs => 255,
            Rpm_OperatingSystems::Unknown(v) => v
        }
    }
}

impl Default for Rpm_OperatingSystems {
    fn default() -> Self { Rpm_OperatingSystems::Unknown(0) }
}

#[derive(Debug, PartialEq, Clone)]
pub enum Rpm_RecordTypes {
    Char,
    Uint8,
    Uint16,
    Uint32,
    Uint64,
    String,
    Bin,
    StringArray,
    I18nString,
    Unknown(i64),
}

impl TryFrom<i64> for Rpm_RecordTypes {
    type Error = KError;
    fn try_from(flag: i64) -> KResult<Rpm_RecordTypes> {
        match flag {
            1 => Ok(Rpm_RecordTypes::Char),
            2 => Ok(Rpm_RecordTypes::Uint8),
            3 => Ok(Rpm_RecordTypes::Uint16),
            4 => Ok(Rpm_RecordTypes::Uint32),
            5 => Ok(Rpm_RecordTypes::Uint64),
            6 => Ok(Rpm_RecordTypes::String),
            7 => Ok(Rpm_RecordTypes::Bin),
            8 => Ok(Rpm_RecordTypes::StringArray),
            9 => Ok(Rpm_RecordTypes::I18nString),
            _ => Ok(Rpm_RecordTypes::Unknown(flag)),
        }
    }
}

impl From<&Rpm_RecordTypes> for i64 {
    fn from(v: &Rpm_RecordTypes) -> Self {
        match *v {
            Rpm_RecordTypes::Char => 1,
            Rpm_RecordTypes::Uint8 => 2,
            Rpm_RecordTypes::Uint16 => 3,
            Rpm_RecordTypes::Uint32 => 4,
            Rpm_RecordTypes::Uint64 => 5,
            Rpm_RecordTypes::String => 6,
            Rpm_RecordTypes::Bin => 7,
            Rpm_RecordTypes::StringArray => 8,
            Rpm_RecordTypes::I18nString => 9,
            Rpm_RecordTypes::Unknown(v) => v
        }
    }
}

impl Default for Rpm_RecordTypes {
    fn default() -> Self { Rpm_RecordTypes::Unknown(0) }
}

#[derive(Debug, PartialEq, Clone)]
pub enum Rpm_RpmTypes {
    Binary,
    Source,
    Unknown(i64),
}

impl TryFrom<i64> for Rpm_RpmTypes {
    type Error = KError;
    fn try_from(flag: i64) -> KResult<Rpm_RpmTypes> {
        match flag {
            0 => Ok(Rpm_RpmTypes::Binary),
            1 => Ok(Rpm_RpmTypes::Source),
            _ => Ok(Rpm_RpmTypes::Unknown(flag)),
        }
    }
}

impl From<&Rpm_RpmTypes> for i64 {
    fn from(v: &Rpm_RpmTypes) -> Self {
        match *v {
            Rpm_RpmTypes::Binary => 0,
            Rpm_RpmTypes::Source => 1,
            Rpm_RpmTypes::Unknown(v) => v
        }
    }
}

impl Default for Rpm_RpmTypes {
    fn default() -> Self { Rpm_RpmTypes::Unknown(0) }
}

#[derive(Debug, PartialEq, Clone)]
pub enum Rpm_SignatureTags {
    Signatures,
    HeaderImmutable,
    I18nTable,
    BadSha11Obsolete,
    BadSha12Obsolete,
    Dsa,
    Rsa,
    Sha1,
    LongSize,
    LongArchiveSize,
    Sha256,
    FileSignatures,
    FileSignatureLength,
    VeritySignatures,
    VeritySignatureAlgo,

    /**
     * RPM v6 OpenPGP signature(s) of the header, base64 encoded. The default
     * signature type when signing v6 packages, but it can also be added to v4
     * packages using `rpmsign --rpmv6` - see
     * <https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/man/rpmsign.1.scd?plain=1#L86-L87>.
     */
    Openpgp,

    /**
     * SHA3-256 digest of the header (only v6).
     */
    Sha3256,

    /**
     * Space reserved for signatures, consisting solely of zeros. Always the
     * last tag in the signature.
     * 
     * v6 packages use this tag instead of `signature_tags::reserved_space`
     * = 1008, which is used for the same purpose in v4 packages. In v6
     * packages, signature tag numbers above 999 are considered illegal, so
     * that signature tags don't clash with header tags - see
     * <https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v6.md?plain=1#L76-L77>.
     * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_v6.md?plain=1#L83-L84 Source
     * \sa https://github.com/rpm-software-management/rpm/commit/a40b6e9a74b517370fda9aa5c9fc3db2276be563 Source
     */
    Reserved,

    /**
     * Header + payload size (32bit) in bytes.
     */
    Size,

    /**
     * MD5 broken on big-endian machines, take 1
     */
    LeMd51Obsolete,

    /**
     * PGP 2.6.3 signature.
     */
    Pgp,

    /**
     * MD5 broken on big-endian machines, take 2
     */
    LeMd52Obsolete,

    /**
     * MD5 signature
     */
    Md5,

    /**
     * GnuPG signature
     */
    Gpg,
    Pgp5Obsolete,

    /**
     * Uncompressed payload size (32bit) in bytes.
     */
    PayloadSize,

    /**
     * Space reserved for signatures
     */
    ReservedSpace,
    Unknown(i64),
}

impl TryFrom<i64> for Rpm_SignatureTags {
    type Error = KError;
    fn try_from(flag: i64) -> KResult<Rpm_SignatureTags> {
        match flag {
            62 => Ok(Rpm_SignatureTags::Signatures),
            63 => Ok(Rpm_SignatureTags::HeaderImmutable),
            100 => Ok(Rpm_SignatureTags::I18nTable),
            264 => Ok(Rpm_SignatureTags::BadSha11Obsolete),
            265 => Ok(Rpm_SignatureTags::BadSha12Obsolete),
            267 => Ok(Rpm_SignatureTags::Dsa),
            268 => Ok(Rpm_SignatureTags::Rsa),
            269 => Ok(Rpm_SignatureTags::Sha1),
            270 => Ok(Rpm_SignatureTags::LongSize),
            271 => Ok(Rpm_SignatureTags::LongArchiveSize),
            273 => Ok(Rpm_SignatureTags::Sha256),
            274 => Ok(Rpm_SignatureTags::FileSignatures),
            275 => Ok(Rpm_SignatureTags::FileSignatureLength),
            276 => Ok(Rpm_SignatureTags::VeritySignatures),
            277 => Ok(Rpm_SignatureTags::VeritySignatureAlgo),
            278 => Ok(Rpm_SignatureTags::Openpgp),
            279 => Ok(Rpm_SignatureTags::Sha3256),
            999 => Ok(Rpm_SignatureTags::Reserved),
            1000 => Ok(Rpm_SignatureTags::Size),
            1001 => Ok(Rpm_SignatureTags::LeMd51Obsolete),
            1002 => Ok(Rpm_SignatureTags::Pgp),
            1003 => Ok(Rpm_SignatureTags::LeMd52Obsolete),
            1004 => Ok(Rpm_SignatureTags::Md5),
            1005 => Ok(Rpm_SignatureTags::Gpg),
            1006 => Ok(Rpm_SignatureTags::Pgp5Obsolete),
            1007 => Ok(Rpm_SignatureTags::PayloadSize),
            1008 => Ok(Rpm_SignatureTags::ReservedSpace),
            _ => Ok(Rpm_SignatureTags::Unknown(flag)),
        }
    }
}

impl From<&Rpm_SignatureTags> for i64 {
    fn from(v: &Rpm_SignatureTags) -> Self {
        match *v {
            Rpm_SignatureTags::Signatures => 62,
            Rpm_SignatureTags::HeaderImmutable => 63,
            Rpm_SignatureTags::I18nTable => 100,
            Rpm_SignatureTags::BadSha11Obsolete => 264,
            Rpm_SignatureTags::BadSha12Obsolete => 265,
            Rpm_SignatureTags::Dsa => 267,
            Rpm_SignatureTags::Rsa => 268,
            Rpm_SignatureTags::Sha1 => 269,
            Rpm_SignatureTags::LongSize => 270,
            Rpm_SignatureTags::LongArchiveSize => 271,
            Rpm_SignatureTags::Sha256 => 273,
            Rpm_SignatureTags::FileSignatures => 274,
            Rpm_SignatureTags::FileSignatureLength => 275,
            Rpm_SignatureTags::VeritySignatures => 276,
            Rpm_SignatureTags::VeritySignatureAlgo => 277,
            Rpm_SignatureTags::Openpgp => 278,
            Rpm_SignatureTags::Sha3256 => 279,
            Rpm_SignatureTags::Reserved => 999,
            Rpm_SignatureTags::Size => 1000,
            Rpm_SignatureTags::LeMd51Obsolete => 1001,
            Rpm_SignatureTags::Pgp => 1002,
            Rpm_SignatureTags::LeMd52Obsolete => 1003,
            Rpm_SignatureTags::Md5 => 1004,
            Rpm_SignatureTags::Gpg => 1005,
            Rpm_SignatureTags::Pgp5Obsolete => 1006,
            Rpm_SignatureTags::PayloadSize => 1007,
            Rpm_SignatureTags::ReservedSpace => 1008,
            Rpm_SignatureTags::Unknown(v) => v
        }
    }
}

impl Default for Rpm_SignatureTags {
    fn default() -> Self { Rpm_SignatureTags::Unknown(0) }
}


#[derive(Default, Debug, Clone)]
pub struct Rpm_Dummy {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_Header>,
    pub _self: SharedType<Self>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_Dummy {
    type Root = Rpm;
    type Parent = Rpm_Header;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        Ok(())
    }
}
impl Rpm_Dummy {
}
impl Rpm_Dummy {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

/**
 * header structure used for both the "header" and "signature", but some tag
 * values have different meanings in signature and header (hence they use
 * different enums)
 */

#[derive(Default, Debug, Clone)]
pub struct Rpm_Header {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm>,
    pub _self: SharedType<Self>,
    is_signature: RefCell<bool>,
    header_record: RefCell<OptRc<Rpm_HeaderRecord>>,
    index_records: RefCell<Vec<OptRc<Rpm_HeaderIndexRecord>>>,
    storage_section: RefCell<OptRc<Rpm_Dummy>>,
    _io: RefCell<BytesReader>,
    storage_section_raw: RefCell<Vec<u8>>,
    f_is_header: Cell<bool>,
    is_header: RefCell<bool>,
}
impl KStruct for Rpm_Header {
    type Root = Rpm;
    type Parent = Rpm;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        let t = Self::read_into::<_, Rpm_HeaderRecord>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()))?.into();
        *self_rc.header_record.borrow_mut() = t;
        *self_rc.index_records.borrow_mut() = Vec::new();
        let l_index_records = *self_rc.header_record().num_index_records();
        for _i in 0..l_index_records {
            let t = Self::read_into::<_, Rpm_HeaderIndexRecord>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()))?.into();
            self_rc.index_records.borrow_mut().push(t);
        }
        *self_rc.storage_section_raw.borrow_mut() = _io.read_bytes(*self_rc.header_record().len_storage_section() as usize)?.into();
        let storage_section_raw = self_rc.storage_section_raw.borrow();
        let _t_storage_section_raw_io = BytesReader::from(storage_section_raw.clone());
        let t = Self::read_into::<BytesReader, Rpm_Dummy>(&_t_storage_section_raw_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()))?.into();
        *self_rc.storage_section.borrow_mut() = t;
        Ok(())
    }
}
impl Rpm_Header {
    pub fn is_signature(&self) -> Ref<'_, bool> {
        self.is_signature.borrow()
    }
}
impl Rpm_Header {
    pub fn set_params(&mut self, is_signature: bool) {
        *self.is_signature.borrow_mut() = is_signature;
    }
}
impl Rpm_Header {
    pub fn is_header(
        &self
    ) -> KResult<Ref<'_, bool>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_is_header.get() {
            return Ok(self.is_header.borrow());
        }
        self.f_is_header.set(true);
        *self.is_header.borrow_mut() = (!(*self.is_signature())) as bool;
        Ok(self.is_header.borrow())
    }
}
impl Rpm_Header {
    pub fn header_record(&self) -> Ref<'_, OptRc<Rpm_HeaderRecord>> {
        self.header_record.borrow()
    }
}
impl Rpm_Header {
    pub fn index_records(&self) -> Ref<'_, Vec<OptRc<Rpm_HeaderIndexRecord>>> {
        self.index_records.borrow()
    }
}
impl Rpm_Header {
    pub fn storage_section(&self) -> Ref<'_, OptRc<Rpm_Dummy>> {
        self.storage_section.borrow()
    }
}
impl Rpm_Header {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}
impl Rpm_Header {
    pub fn storage_section_raw(&self) -> Ref<'_, Vec<u8>> {
        self.storage_section_raw.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_HeaderIndexRecord {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_Header>,
    pub _self: SharedType<Self>,
    tag_raw: RefCell<u32>,
    record_type: RefCell<Rpm_RecordTypes>,
    ofs_body: RefCell<u32>,
    count: RefCell<u32>,
    _io: RefCell<BytesReader>,
    f_body: Cell<bool>,
    body: RefCell<Option<Rpm_HeaderIndexRecord_Body>>,
    f_header_tag: Cell<bool>,
    header_tag: RefCell<Rpm_HeaderTags>,
    f_len_value: Cell<bool>,
    len_value: RefCell<u32>,
    f_num_values: Cell<bool>,
    num_values: RefCell<u32>,
    f_signature_tag: Cell<bool>,
    signature_tag: RefCell<Rpm_SignatureTags>,
}
#[derive(Debug, Clone)]
pub enum Rpm_HeaderIndexRecord_Body {
    Rpm_RecordTypeUint32(OptRc<Rpm_RecordTypeUint32>),
    Rpm_RecordTypeUint64(OptRc<Rpm_RecordTypeUint64>),
    Rpm_RecordTypeUint16(OptRc<Rpm_RecordTypeUint16>),
    Rpm_RecordTypeUint8(OptRc<Rpm_RecordTypeUint8>),
    Rpm_RecordTypeString(OptRc<Rpm_RecordTypeString>),
    Rpm_RecordTypeBin(OptRc<Rpm_RecordTypeBin>),
    Rpm_RecordTypeStringArray(OptRc<Rpm_RecordTypeStringArray>),
}
impl From<&Rpm_HeaderIndexRecord_Body> for OptRc<Rpm_RecordTypeUint32> {
    fn from(v: &Rpm_HeaderIndexRecord_Body) -> Self {
        if let Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint32(x) = v {
            return x.clone();
        }
        panic!("expected Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint32, got {:?}", v)
    }
}
impl From<OptRc<Rpm_RecordTypeUint32>> for Rpm_HeaderIndexRecord_Body {
    fn from(v: OptRc<Rpm_RecordTypeUint32>) -> Self {
        Self::Rpm_RecordTypeUint32(v)
    }
}
impl From<&Rpm_HeaderIndexRecord_Body> for OptRc<Rpm_RecordTypeUint64> {
    fn from(v: &Rpm_HeaderIndexRecord_Body) -> Self {
        if let Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint64(x) = v {
            return x.clone();
        }
        panic!("expected Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint64, got {:?}", v)
    }
}
impl From<OptRc<Rpm_RecordTypeUint64>> for Rpm_HeaderIndexRecord_Body {
    fn from(v: OptRc<Rpm_RecordTypeUint64>) -> Self {
        Self::Rpm_RecordTypeUint64(v)
    }
}
impl From<&Rpm_HeaderIndexRecord_Body> for OptRc<Rpm_RecordTypeUint16> {
    fn from(v: &Rpm_HeaderIndexRecord_Body) -> Self {
        if let Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint16(x) = v {
            return x.clone();
        }
        panic!("expected Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint16, got {:?}", v)
    }
}
impl From<OptRc<Rpm_RecordTypeUint16>> for Rpm_HeaderIndexRecord_Body {
    fn from(v: OptRc<Rpm_RecordTypeUint16>) -> Self {
        Self::Rpm_RecordTypeUint16(v)
    }
}
impl From<&Rpm_HeaderIndexRecord_Body> for OptRc<Rpm_RecordTypeUint8> {
    fn from(v: &Rpm_HeaderIndexRecord_Body) -> Self {
        if let Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint8(x) = v {
            return x.clone();
        }
        panic!("expected Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeUint8, got {:?}", v)
    }
}
impl From<OptRc<Rpm_RecordTypeUint8>> for Rpm_HeaderIndexRecord_Body {
    fn from(v: OptRc<Rpm_RecordTypeUint8>) -> Self {
        Self::Rpm_RecordTypeUint8(v)
    }
}
impl From<&Rpm_HeaderIndexRecord_Body> for OptRc<Rpm_RecordTypeString> {
    fn from(v: &Rpm_HeaderIndexRecord_Body) -> Self {
        if let Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeString(x) = v {
            return x.clone();
        }
        panic!("expected Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeString, got {:?}", v)
    }
}
impl From<OptRc<Rpm_RecordTypeString>> for Rpm_HeaderIndexRecord_Body {
    fn from(v: OptRc<Rpm_RecordTypeString>) -> Self {
        Self::Rpm_RecordTypeString(v)
    }
}
impl From<&Rpm_HeaderIndexRecord_Body> for OptRc<Rpm_RecordTypeBin> {
    fn from(v: &Rpm_HeaderIndexRecord_Body) -> Self {
        if let Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeBin(x) = v {
            return x.clone();
        }
        panic!("expected Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeBin, got {:?}", v)
    }
}
impl From<OptRc<Rpm_RecordTypeBin>> for Rpm_HeaderIndexRecord_Body {
    fn from(v: OptRc<Rpm_RecordTypeBin>) -> Self {
        Self::Rpm_RecordTypeBin(v)
    }
}
impl From<&Rpm_HeaderIndexRecord_Body> for OptRc<Rpm_RecordTypeStringArray> {
    fn from(v: &Rpm_HeaderIndexRecord_Body) -> Self {
        if let Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeStringArray(x) = v {
            return x.clone();
        }
        panic!("expected Rpm_HeaderIndexRecord_Body::Rpm_RecordTypeStringArray, got {:?}", v)
    }
}
impl From<OptRc<Rpm_RecordTypeStringArray>> for Rpm_HeaderIndexRecord_Body {
    fn from(v: OptRc<Rpm_RecordTypeStringArray>) -> Self {
        Self::Rpm_RecordTypeStringArray(v)
    }
}
impl KStruct for Rpm_HeaderIndexRecord {
    type Root = Rpm;
    type Parent = Rpm_Header;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.tag_raw.borrow_mut() = _io.read_u4be()?.into();
        *self_rc.record_type.borrow_mut() = (_io.read_u4be()? as i64).try_into()?;
        *self_rc.ofs_body.borrow_mut() = _io.read_u4be()?.into();
        *self_rc.count.borrow_mut() = _io.read_u4be()?.into();
        Ok(())
    }
}
impl Rpm_HeaderIndexRecord {
    pub fn body(
        &self
    ) -> KResult<Ref<'_, Option<Rpm_HeaderIndexRecord_Body>>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_body.get() {
            return Ok(self.body.borrow());
        }
        self.f_body.set(true);
        let io = Clone::clone(&*_prc.as_ref().unwrap().storage_section()._io());
        let _pos = io.pos();
        io.seek(*self.ofs_body() as usize)?;
        match *self.record_type() {
            Rpm_RecordTypes::Bin => {
                let f = |t : &mut Rpm_RecordTypeBin| Ok(t.set_params((*self.len_value()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeBin>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::Char => {
                let f = |t : &mut Rpm_RecordTypeUint8| Ok(t.set_params((*self.num_values()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeUint8>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::I18nString => {
                let f = |t : &mut Rpm_RecordTypeStringArray| Ok(t.set_params((*self.num_values()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeStringArray>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::String => {
                let t = Self::read_into::<BytesReader, Rpm_RecordTypeString>(&io, Some(self._root.clone()), Some(self._self.clone()))?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::StringArray => {
                let f = |t : &mut Rpm_RecordTypeStringArray| Ok(t.set_params((*self.num_values()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeStringArray>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::Uint16 => {
                let f = |t : &mut Rpm_RecordTypeUint16| Ok(t.set_params((*self.num_values()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeUint16>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::Uint32 => {
                let f = |t : &mut Rpm_RecordTypeUint32| Ok(t.set_params((*self.num_values()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeUint32>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::Uint64 => {
                let f = |t : &mut Rpm_RecordTypeUint64| Ok(t.set_params((*self.num_values()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeUint64>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            Rpm_RecordTypes::Uint8 => {
                let f = |t : &mut Rpm_RecordTypeUint8| Ok(t.set_params((*self.num_values()?).try_into().map_err(|_| KError::CastError)?));
                let t = Self::read_into_with_init::<BytesReader, Rpm_RecordTypeUint8>(&io, Some(self._root.clone()), Some(self._self.clone()), &f)?.into();
                *self.body.borrow_mut() = Some(t);
            }
            _ => {}
        }
        io.seek(_pos)?;
        Ok(self.body.borrow())
    }
    pub fn header_tag(
        &self
    ) -> KResult<Ref<'_, Rpm_HeaderTags>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_header_tag.get() {
            return Ok(self.header_tag.borrow());
        }
        self.f_header_tag.set(true);
        if *_prc.as_ref().unwrap().is_header()? {
            *self.header_tag.borrow_mut() = (*self.tag_raw() as i64).try_into()?;
        }
        Ok(self.header_tag.borrow())
    }
    pub fn len_value(
        &self
    ) -> KResult<Ref<'_, u32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_len_value.get() {
            return Ok(self.len_value.borrow());
        }
        self.f_len_value.set(true);
        if *self.record_type() == Rpm_RecordTypes::Bin {
            *self.len_value.borrow_mut() = (*self.count()) as u32;
        }
        Ok(self.len_value.borrow())
    }
    pub fn num_values(
        &self
    ) -> KResult<Ref<'_, u32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_num_values.get() {
            return Ok(self.num_values.borrow());
        }
        self.f_num_values.set(true);
        if *self.record_type() != Rpm_RecordTypes::Bin {
            *self.num_values.borrow_mut() = (*self.count()) as u32;
        }
        Ok(self.num_values.borrow())
    }
    pub fn signature_tag(
        &self
    ) -> KResult<Ref<'_, Rpm_SignatureTags>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_signature_tag.get() {
            return Ok(self.signature_tag.borrow());
        }
        self.f_signature_tag.set(true);
        if *_prc.as_ref().unwrap().is_signature() {
            *self.signature_tag.borrow_mut() = (*self.tag_raw() as i64).try_into()?;
        }
        Ok(self.signature_tag.borrow())
    }
}

/**
 * prefer to access `signature_tag` and `header_tag` instead
 */
impl Rpm_HeaderIndexRecord {
    pub fn tag_raw(&self) -> Ref<'_, u32> {
        self.tag_raw.borrow()
    }
}
impl Rpm_HeaderIndexRecord {
    pub fn record_type(&self) -> Ref<'_, Rpm_RecordTypes> {
        self.record_type.borrow()
    }
}
impl Rpm_HeaderIndexRecord {
    pub fn ofs_body(&self) -> Ref<'_, u32> {
        self.ofs_body.borrow()
    }
}

/**
 * internal; access `num_values` and `len_value` instead
 */
impl Rpm_HeaderIndexRecord {
    pub fn count(&self) -> Ref<'_, u32> {
        self.count.borrow()
    }
}
impl Rpm_HeaderIndexRecord {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_HeaderRecord {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_Header>,
    pub _self: SharedType<Self>,
    magic: RefCell<Vec<u8>>,
    reserved: RefCell<Vec<u8>>,
    num_index_records: RefCell<u32>,
    len_storage_section: RefCell<u32>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_HeaderRecord {
    type Root = Rpm;
    type Parent = Rpm_Header;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.magic.borrow_mut() = _io.read_bytes(4 as usize)?.into();
        if !(*self_rc.magic() == vec![0x8eu8, 0xadu8, 0xe8u8, 0x1u8]) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::NotEqual, src_path: "/types/header_record/seq/0".to_string() }));
        }
        *self_rc.reserved.borrow_mut() = _io.read_bytes(4 as usize)?.into();
        if !(*self_rc.reserved() == vec![0x0u8, 0x0u8, 0x0u8, 0x0u8]) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::NotEqual, src_path: "/types/header_record/seq/1".to_string() }));
        }
        *self_rc.num_index_records.borrow_mut() = _io.read_u4be()?.into();
        if !(((*self_rc.num_index_records() as u32) >= (1 as u32))) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::LessThan, src_path: "/types/header_record/seq/2".to_string() }));
        }
        if !(((*self_rc.num_index_records() as i32) <= (if *_prc.as_ref().unwrap().is_signature() { 32 } else { 65535 } as i32))) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::GreaterThan, src_path: "/types/header_record/seq/2".to_string() }));
        }
        *self_rc.len_storage_section.borrow_mut() = _io.read_u4be()?.into();
        if !(((*self_rc.len_storage_section() as i32) <= (if *_prc.as_ref().unwrap().is_signature() { ((((64 as i32) * (1024 as i32)) as i32) * (1024 as i32)) } else { 268435455 } as i32))) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::GreaterThan, src_path: "/types/header_record/seq/3".to_string() }));
        }
        Ok(())
    }
}
impl Rpm_HeaderRecord {
}
impl Rpm_HeaderRecord {
    pub fn magic(&self) -> Ref<'_, Vec<u8>> {
        self.magic.borrow()
    }
}
impl Rpm_HeaderRecord {
    pub fn reserved(&self) -> Ref<'_, Vec<u8>> {
        self.reserved.borrow()
    }
}
impl Rpm_HeaderRecord {
    pub fn num_index_records(&self) -> Ref<'_, u32> {
        self.num_index_records.borrow()
    }
}

/**
 * Size of the storage area for the data
 * pointed to by the Index Records.
 */
impl Rpm_HeaderRecord {
    pub fn len_storage_section(&self) -> Ref<'_, u32> {
        self.len_storage_section.borrow()
    }
}
impl Rpm_HeaderRecord {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

/**
 * Like `signature_tags_step`, but looks for `header_tags::payload_size`,
 * which is where v6 packages store the payload size.
 */

#[derive(Default, Debug, Clone)]
pub struct Rpm_HeaderTagsStep {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm>,
    pub _self: SharedType<Self>,
    idx: RefCell<i32>,
    prev_payload_size_tag_idx: RefCell<i32>,
    _io: RefCell<BytesReader>,
    f_payload_size_tag_idx: Cell<bool>,
    payload_size_tag_idx: RefCell<i32>,
}
impl KStruct for Rpm_HeaderTagsStep {
    type Root = Rpm;
    type Parent = Rpm;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        Ok(())
    }
}
impl Rpm_HeaderTagsStep {
    pub fn idx(&self) -> Ref<'_, i32> {
        self.idx.borrow()
    }
}
impl Rpm_HeaderTagsStep {
    pub fn prev_payload_size_tag_idx(&self) -> Ref<'_, i32> {
        self.prev_payload_size_tag_idx.borrow()
    }
}
impl Rpm_HeaderTagsStep {
    pub fn set_params(&mut self, idx: i32, prev_payload_size_tag_idx: i32) {
        *self.idx.borrow_mut() = idx;
        *self.prev_payload_size_tag_idx.borrow_mut() = prev_payload_size_tag_idx;
    }
}
impl Rpm_HeaderTagsStep {
    pub fn payload_size_tag_idx(
        &self
    ) -> KResult<Ref<'_, i32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_payload_size_tag_idx.get() {
            return Ok(self.payload_size_tag_idx.borrow());
        }
        self.f_payload_size_tag_idx.set(true);
        *self.payload_size_tag_idx.borrow_mut() = (if ((*self.prev_payload_size_tag_idx() as i32) != (-1 as i32)) { *self.prev_payload_size_tag_idx() } else { if  ((*_prc.as_ref().unwrap().header().index_records()[*self.idx() as usize].header_tag()? == Rpm_HeaderTags::PayloadSize) && (*_prc.as_ref().unwrap().header().index_records()[*self.idx() as usize].record_type() == Rpm_RecordTypes::Uint64) && (((*_prc.as_ref().unwrap().header().index_records()[*self.idx() as usize].num_values()? as u32) >= (1 as u32))))  { *self.idx() } else { -1 } }) as i32;
        Ok(self.payload_size_tag_idx.borrow())
    }
}
impl Rpm_HeaderTagsStep {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

/**
 * In 2021, Panu Matilainen (an RPM developer) [described this
 * structure](https://github.com/kaitai-io/kaitai_struct_formats/pull/469#discussion_r718288192)
 * as follows:
 * 
 * > The lead as a structure is 25 years obsolete, the data there is
 * > meaningless. Seriously. Except to check for the magic to detect that
 * > it's an rpm file in the first place, just ignore everything in it.
 * > Literally everything.
 * 
 * RPM 4.19 and older rejected packages that didn't meet the `valid`
 * constraints specified here, while RPM 4.20 and later only check the
 * `magic` - see
 * <https://github.com/rpm-software-management/rpm/commit/b3449a0774487a091bbe59e821b4004b06d4fa66>.
 * Nevertheless, RPM still writes values that pass these checks for backwards
 * compatibility, so any `.rpm` file should pass.
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/docs/manual/format_lead.md Source
 */

#[derive(Default, Debug, Clone)]
pub struct Rpm_Lead {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm>,
    pub _self: SharedType<Self>,
    magic: RefCell<Vec<u8>>,
    version: RefCell<OptRc<Rpm_RpmVersion>>,
    type: RefCell<Rpm_RpmTypes>,
    architecture: RefCell<Rpm_Architectures>,
    package_name: RefCell<String>,
    os: RefCell<Rpm_OperatingSystems>,
    signature_type: RefCell<u16>,
    reserved: RefCell<Vec<u8>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_Lead {
    type Root = Rpm;
    type Parent = Rpm;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.magic.borrow_mut() = _io.read_bytes(4 as usize)?.into();
        if !(*self_rc.magic() == vec![0xedu8, 0xabu8, 0xeeu8, 0xdbu8]) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::NotEqual, src_path: "/types/lead/seq/0".to_string() }));
        }
        let t = Self::read_into::<_, Rpm_RpmVersion>(&*_io, Some(self_rc._root.clone()), Some(self_rc._self.clone()))?.into();
        *self_rc.version.borrow_mut() = t;
        *self_rc.type.borrow_mut() = (_io.read_u2be()? as i64).try_into()?;
        *self_rc.architecture.borrow_mut() = (_io.read_u2be()? as i64).try_into()?;
        *self_rc.package_name.borrow_mut() = bytes_to_str(&bytes_terminate(&_io.read_bytes(66 as usize)?.into(), 0, false).into(), "UTF-8")?;
        *self_rc.os.borrow_mut() = (_io.read_u2be()? as i64).try_into()?;
        *self_rc.signature_type.borrow_mut() = _io.read_u2be()?.into();
        if !(((*self_rc.signature_type() as u16) == (5 as u16))) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::NotEqual, src_path: "/types/lead/seq/6".to_string() }));
        }
        *self_rc.reserved.borrow_mut() = _io.read_bytes(16 as usize)?.into();
        Ok(())
    }
}
impl Rpm_Lead {
}
impl Rpm_Lead {
    pub fn magic(&self) -> Ref<'_, Vec<u8>> {
        self.magic.borrow()
    }
}
impl Rpm_Lead {
    pub fn version(&self) -> Ref<'_, OptRc<Rpm_RpmVersion>> {
        self.version.borrow()
    }
}
impl Rpm_Lead {
    pub fn type(&self) -> Ref<'_, Rpm_RpmTypes> {
        self.type.borrow()
    }
}
impl Rpm_Lead {
    pub fn architecture(&self) -> Ref<'_, Rpm_Architectures> {
        self.architecture.borrow()
    }
}
impl Rpm_Lead {
    pub fn package_name(&self) -> Ref<'_, String> {
        self.package_name.borrow()
    }
}
impl Rpm_Lead {
    pub fn os(&self) -> Ref<'_, Rpm_OperatingSystems> {
        self.os.borrow()
    }
}

/**
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/lib/rpmlead.cc#L20-L21 Source
 */
impl Rpm_Lead {
    pub fn signature_type(&self) -> Ref<'_, u16> {
        self.signature_type.borrow()
    }
}
impl Rpm_Lead {
    pub fn reserved(&self) -> Ref<'_, Vec<u8>> {
        self.reserved.borrow()
    }
}
impl Rpm_Lead {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RecordTypeBin {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_HeaderIndexRecord>,
    pub _self: SharedType<Self>,
    len_value: RefCell<u32>,
    values: RefCell<Vec<Vec<u8>>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RecordTypeBin {
    type Root = Rpm;
    type Parent = Rpm_HeaderIndexRecord;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.values.borrow_mut() = Vec::new();
        let l_values = 1;
        for _i in 0..l_values {
            self_rc.values.borrow_mut().push(_io.read_bytes(*self_rc.len_value() as usize)?.into());
        }
        Ok(())
    }
}
impl Rpm_RecordTypeBin {
    pub fn len_value(&self) -> Ref<'_, u32> {
        self.len_value.borrow()
    }
}
impl Rpm_RecordTypeBin {
    pub fn set_params(&mut self, len_value: u32) {
        *self.len_value.borrow_mut() = len_value;
    }
}
impl Rpm_RecordTypeBin {
}
impl Rpm_RecordTypeBin {
    pub fn values(&self) -> Ref<'_, Vec<Vec<u8>>> {
        self.values.borrow()
    }
}
impl Rpm_RecordTypeBin {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RecordTypeString {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_HeaderIndexRecord>,
    pub _self: SharedType<Self>,
    values: RefCell<Vec<String>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RecordTypeString {
    type Root = Rpm;
    type Parent = Rpm_HeaderIndexRecord;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.values.borrow_mut() = Vec::new();
        let l_values = 1;
        for _i in 0..l_values {
            self_rc.values.borrow_mut().push(bytes_to_str(&_io.read_bytes_term(0, false, true, true)?.into(), "UTF-8")?);
        }
        Ok(())
    }
}
impl Rpm_RecordTypeString {
}
impl Rpm_RecordTypeString {
    pub fn values(&self) -> Ref<'_, Vec<String>> {
        self.values.borrow()
    }
}
impl Rpm_RecordTypeString {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RecordTypeStringArray {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_HeaderIndexRecord>,
    pub _self: SharedType<Self>,
    num_values: RefCell<u32>,
    values: RefCell<Vec<String>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RecordTypeStringArray {
    type Root = Rpm;
    type Parent = Rpm_HeaderIndexRecord;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.values.borrow_mut() = Vec::new();
        let l_values = *self_rc.num_values();
        for _i in 0..l_values {
            self_rc.values.borrow_mut().push(bytes_to_str(&_io.read_bytes_term(0, false, true, true)?.into(), "UTF-8")?);
        }
        Ok(())
    }
}
impl Rpm_RecordTypeStringArray {
    pub fn num_values(&self) -> Ref<'_, u32> {
        self.num_values.borrow()
    }
}
impl Rpm_RecordTypeStringArray {
    pub fn set_params(&mut self, num_values: u32) {
        *self.num_values.borrow_mut() = num_values;
    }
}
impl Rpm_RecordTypeStringArray {
}
impl Rpm_RecordTypeStringArray {
    pub fn values(&self) -> Ref<'_, Vec<String>> {
        self.values.borrow()
    }
}
impl Rpm_RecordTypeStringArray {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RecordTypeUint16 {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_HeaderIndexRecord>,
    pub _self: SharedType<Self>,
    num_values: RefCell<u32>,
    values: RefCell<Vec<u16>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RecordTypeUint16 {
    type Root = Rpm;
    type Parent = Rpm_HeaderIndexRecord;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.values.borrow_mut() = Vec::new();
        let l_values = *self_rc.num_values();
        for _i in 0..l_values {
            self_rc.values.borrow_mut().push(_io.read_u2be()?.into());
        }
        Ok(())
    }
}
impl Rpm_RecordTypeUint16 {
    pub fn num_values(&self) -> Ref<'_, u32> {
        self.num_values.borrow()
    }
}
impl Rpm_RecordTypeUint16 {
    pub fn set_params(&mut self, num_values: u32) {
        *self.num_values.borrow_mut() = num_values;
    }
}
impl Rpm_RecordTypeUint16 {
}
impl Rpm_RecordTypeUint16 {
    pub fn values(&self) -> Ref<'_, Vec<u16>> {
        self.values.borrow()
    }
}
impl Rpm_RecordTypeUint16 {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RecordTypeUint32 {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_HeaderIndexRecord>,
    pub _self: SharedType<Self>,
    num_values: RefCell<u32>,
    values: RefCell<Vec<u32>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RecordTypeUint32 {
    type Root = Rpm;
    type Parent = Rpm_HeaderIndexRecord;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.values.borrow_mut() = Vec::new();
        let l_values = *self_rc.num_values();
        for _i in 0..l_values {
            self_rc.values.borrow_mut().push(_io.read_u4be()?.into());
        }
        Ok(())
    }
}
impl Rpm_RecordTypeUint32 {
    pub fn num_values(&self) -> Ref<'_, u32> {
        self.num_values.borrow()
    }
}
impl Rpm_RecordTypeUint32 {
    pub fn set_params(&mut self, num_values: u32) {
        *self.num_values.borrow_mut() = num_values;
    }
}
impl Rpm_RecordTypeUint32 {
}
impl Rpm_RecordTypeUint32 {
    pub fn values(&self) -> Ref<'_, Vec<u32>> {
        self.values.borrow()
    }
}
impl Rpm_RecordTypeUint32 {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RecordTypeUint64 {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_HeaderIndexRecord>,
    pub _self: SharedType<Self>,
    num_values: RefCell<u32>,
    values: RefCell<Vec<u64>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RecordTypeUint64 {
    type Root = Rpm;
    type Parent = Rpm_HeaderIndexRecord;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.values.borrow_mut() = Vec::new();
        let l_values = *self_rc.num_values();
        for _i in 0..l_values {
            self_rc.values.borrow_mut().push(_io.read_u8be()?.into());
        }
        Ok(())
    }
}
impl Rpm_RecordTypeUint64 {
    pub fn num_values(&self) -> Ref<'_, u32> {
        self.num_values.borrow()
    }
}
impl Rpm_RecordTypeUint64 {
    pub fn set_params(&mut self, num_values: u32) {
        *self.num_values.borrow_mut() = num_values;
    }
}
impl Rpm_RecordTypeUint64 {
}
impl Rpm_RecordTypeUint64 {
    pub fn values(&self) -> Ref<'_, Vec<u64>> {
        self.values.borrow()
    }
}
impl Rpm_RecordTypeUint64 {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RecordTypeUint8 {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_HeaderIndexRecord>,
    pub _self: SharedType<Self>,
    num_values: RefCell<u32>,
    values: RefCell<Vec<u8>>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RecordTypeUint8 {
    type Root = Rpm;
    type Parent = Rpm_HeaderIndexRecord;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.values.borrow_mut() = Vec::new();
        let l_values = *self_rc.num_values();
        for _i in 0..l_values {
            self_rc.values.borrow_mut().push(_io.read_u1()?.into());
        }
        Ok(())
    }
}
impl Rpm_RecordTypeUint8 {
    pub fn num_values(&self) -> Ref<'_, u32> {
        self.num_values.borrow()
    }
}
impl Rpm_RecordTypeUint8 {
    pub fn set_params(&mut self, num_values: u32) {
        *self.num_values.borrow_mut() = num_values;
    }
}
impl Rpm_RecordTypeUint8 {
}
impl Rpm_RecordTypeUint8 {
    pub fn values(&self) -> Ref<'_, Vec<u8>> {
        self.values.borrow()
    }
}
impl Rpm_RecordTypeUint8 {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

#[derive(Default, Debug, Clone)]
pub struct Rpm_RpmVersion {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm_Lead>,
    pub _self: SharedType<Self>,
    major: RefCell<u8>,
    minor: RefCell<u8>,
    _io: RefCell<BytesReader>,
}
impl KStruct for Rpm_RpmVersion {
    type Root = Rpm;
    type Parent = Rpm_Lead;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        *self_rc.major.borrow_mut() = _io.read_u1()?.into();
        if !(((*self_rc.major() as u8) >= (3 as u8))) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::LessThan, src_path: "/types/rpm_version/seq/0".to_string() }));
        }
        if !(((*self_rc.major() as u8) <= (4 as u8))) {
            return Err(KError::ValidationFailed(ValidationFailedError { kind: ValidationKind::GreaterThan, src_path: "/types/rpm_version/seq/0".to_string() }));
        }
        *self_rc.minor.borrow_mut() = _io.read_u1()?.into();
        Ok(())
    }
}
impl Rpm_RpmVersion {
}

/**
 * 3 in v3 and v4 packages, 4 in v6 packages.
 * \sa https://github.com/rpm-software-management/rpm/blob/ec9ea8c43808c346da4b6cb454cdc58aef8e506a/lib/rpmlead.cc#L51-L52 Source
 */
impl Rpm_RpmVersion {
    pub fn major(&self) -> Ref<'_, u8> {
        self.major.borrow()
    }
}
impl Rpm_RpmVersion {
    pub fn minor(&self) -> Ref<'_, u8> {
        self.minor.borrow()
    }
}
impl Rpm_RpmVersion {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}

/**
 * Finds the first `signature_tags::size` and `signature_tags::long_size`
 * index record. Since Kaitai Struct doesn't have a built-in way to search an
 * array directly, each step receives the indexes found so far via
 * parameters.
 */

#[derive(Default, Debug, Clone)]
pub struct Rpm_SignatureTagsStep {
    pub _root: SharedType<Rpm>,
    pub _parent: SharedType<Rpm>,
    pub _self: SharedType<Self>,
    idx: RefCell<i32>,
    prev_size_tag_idx: RefCell<i32>,
    prev_long_size_tag_idx: RefCell<i32>,
    _io: RefCell<BytesReader>,
    f_long_size_tag_idx: Cell<bool>,
    long_size_tag_idx: RefCell<i32>,
    f_size_tag_idx: Cell<bool>,
    size_tag_idx: RefCell<i32>,
}
impl KStruct for Rpm_SignatureTagsStep {
    type Root = Rpm;
    type Parent = Rpm;

    fn read<S: KStream>(
        self_rc: &OptRc<Self>,
        _io: &S,
        _root: SharedType<Self::Root>,
        _parent: SharedType<Self::Parent>,
    ) -> KResult<()> {
        *self_rc._io.borrow_mut() = _io.clone();
        self_rc._root.set(_root.get());
        self_rc._parent.set(_parent.get());
        self_rc._self.set(Ok(self_rc.clone()));
        let _rrc = self_rc._root.get_value().borrow().upgrade();
        let _prc = self_rc._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        Ok(())
    }
}
impl Rpm_SignatureTagsStep {
    pub fn idx(&self) -> Ref<'_, i32> {
        self.idx.borrow()
    }
}
impl Rpm_SignatureTagsStep {
    pub fn prev_size_tag_idx(&self) -> Ref<'_, i32> {
        self.prev_size_tag_idx.borrow()
    }
}
impl Rpm_SignatureTagsStep {
    pub fn prev_long_size_tag_idx(&self) -> Ref<'_, i32> {
        self.prev_long_size_tag_idx.borrow()
    }
}
impl Rpm_SignatureTagsStep {
    pub fn set_params(&mut self, idx: i32, prev_size_tag_idx: i32, prev_long_size_tag_idx: i32) {
        *self.idx.borrow_mut() = idx;
        *self.prev_size_tag_idx.borrow_mut() = prev_size_tag_idx;
        *self.prev_long_size_tag_idx.borrow_mut() = prev_long_size_tag_idx;
    }
}
impl Rpm_SignatureTagsStep {
    pub fn long_size_tag_idx(
        &self
    ) -> KResult<Ref<'_, i32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_long_size_tag_idx.get() {
            return Ok(self.long_size_tag_idx.borrow());
        }
        self.f_long_size_tag_idx.set(true);
        *self.long_size_tag_idx.borrow_mut() = (if ((*self.prev_long_size_tag_idx() as i32) != (-1 as i32)) { *self.prev_long_size_tag_idx() } else { if  ((*_prc.as_ref().unwrap().signature().index_records()[*self.idx() as usize].signature_tag()? == Rpm_SignatureTags::LongSize) && (*_prc.as_ref().unwrap().signature().index_records()[*self.idx() as usize].record_type() == Rpm_RecordTypes::Uint64) && (((*_prc.as_ref().unwrap().signature().index_records()[*self.idx() as usize].num_values()? as u32) >= (1 as u32))))  { *self.idx() } else { -1 } }) as i32;
        Ok(self.long_size_tag_idx.borrow())
    }
    pub fn size_tag_idx(
        &self
    ) -> KResult<Ref<'_, i32>> {
        let _io = self._io.borrow();
        let _rrc = self._root.get_value().borrow().upgrade();
        let _prc = self._parent.get_value().borrow().upgrade();
        let _r = _rrc.as_ref().unwrap();
        if self.f_size_tag_idx.get() {
            return Ok(self.size_tag_idx.borrow());
        }
        self.f_size_tag_idx.set(true);
        *self.size_tag_idx.borrow_mut() = (if ((*self.prev_size_tag_idx() as i32) != (-1 as i32)) { *self.prev_size_tag_idx() } else { if  ((*_prc.as_ref().unwrap().signature().index_records()[*self.idx() as usize].signature_tag()? == Rpm_SignatureTags::Size) && (*_prc.as_ref().unwrap().signature().index_records()[*self.idx() as usize].record_type() == Rpm_RecordTypes::Uint32) && (((*_prc.as_ref().unwrap().signature().index_records()[*self.idx() as usize].num_values()? as u32) >= (1 as u32))))  { *self.idx() } else { -1 } }) as i32;
        Ok(self.size_tag_idx.borrow())
    }
}
impl Rpm_SignatureTagsStep {
    pub fn _io(&self) -> Ref<'_, BytesReader> {
        self._io.borrow()
    }
}