sga 0.1.1

Library for unpacking '.sga' files from Relic.
Documentation
# SGA

What is SGA? SGA is a file format used by Relic games studio for many of their games. This library helps to parse and extract those files for viewing.

## Installation

To install just run `cargo add sga` or add the following to your `Cargo.toml`

```toml
[dependencies]
sga = "0.1"
```

## Usage

To unpack to a specified destination, just use the `extract_all` function.

```rust
use sga::extract_all;

fn main() {
    extract_all("./ArtJapanese.sga", "./ArtJapanese").unwrap();
}
```

If you wish to do something more elaborate, for example only extracting the first folder and files from the table_of_contents, it is possible to construct the file tree, and then write it to disk.

```rust
pub fn extract_toc_folders_only<P: AsRef<Path>>(sga_file: P, out_path: P) -> anyhow::Result<()> {
    // open the file as a buffer
    let mut sga_file = BufReader::new(File::open(sga_file)?);

    // construct the entries from the buffer.
    // contains header, files, folders, and table_of_contents information
    let mut entries = SgaEntries::new(&mut sga_file)?;
    // Just take out the table of contents entries, and replace the taken with an empty vec.
    let toc_entries = std::mem::replace(&mut entries.tocs, Vec::new());
    // Create a new Toc from those entries
    let tocs: Vec<_> = toc_entries
        .into_iter()
        .map(|toc| Toc::initialize_from_entry(&mut sga_file, &entries, toc).unwrap())
        .collect();

    // loop over the tocs
    for toc in tocs {
        // Clone folder for more use.
        let folder = toc.root_folder.clone();
        // read all files from the folder
        let files = FolderNode::read_files_from_folder(folder.clone(), &mut sga_file, &entries)?;
    
        // add all those files into the folder
        for file in files {
            let file = Arc::new(file);
            folder.lock().unwrap().add_child(Node::File(file));
        }

        // write the entire folder to the disk
        write_to_disk(&mut sga_file, folder, &out_path)?;
    }

    Ok(())
}
```