nibarchive 0.1.0

NIB Archive decoder/encoder
Documentation
# NIB Archive Decoder/Encoder

Decode and encode NIB Archive `.nib` files.

`.nib` files are mainly used by Interface Builder component of Xcode to encode `.xib` files.
Both store information about creating a GUI for macOS and iOS applications.
The difference is, `.xib` is a human-readable xml used only during development,
and `.nib` is a compiled version of it.

There're two variations of `.nib`s. The first one is a NIB Archive (used by UIKit
on iPhones since iOS 6) whose decoded structure somewhat resembles Cocoa Keyed
Archive. This library is designed to work with these `.nib`s.
The second one is actually a Cocoa Keyed Archive (used prior iOS 6).
macOS uses both versions.

The file format has been described in detail in the
[nibsqueeze](https://github.com/matsmattsson/nibsqueeze/blob/master/NibArchive.md) repository
and this great [article](https://www.mothersruin.com/software/Archaeology/reverse/uinib.html).
You may also want to check the [nibarchive](https://github.com/MatrixEditor/nibarchive) repository –
a NIB Archive parser written in Python.

## Known issues

Some NIB Archives (presumably ones with a coder version of 10) have some extra bytes
at the end of a file. Those bytes are not handled and their purpose is unknown yet.

## Example

The following example prints all archive's objects and their values:

```rust
use nibarchive::*;

let archive: NIBArchive = NIBArchive::from_file("./foo.nib")?;

for (i, object) in 0..archive.objects().iter().enumerate() {
    let class_name = object.class_name(&archive.class_names()).name();
    println!("[{i}] Object of a class '{class_name}':");

    let values: &[Value] = object.values(&archive.values());
    for (j, value) in 0..values.iter().enumerate() {
        let key = value.key(&archive.keys());
        let inner_value = value.value();
        println!("-- [{j}] {key}: {inner_value:?}");
    }
}
```