# synthzip [![Latest Version]][crates.io]
[Latest Version]: https://img.shields.io/crates/v/synthzip.svg
[crates.io]: https://crates.io/crates/synthzip
## What is it?
A rust library for constructing a synthetic Central Directory when you have ZIP
data that has a Local File Header (LFH), but no Central Directory File Header (CDFH),
or End of Central Directory (EOCD) data.
This is a somewhat niche library. You probably won't need it (directly), unless
you happen to be doing something unusual. But if you are, it may be **exactly**
what you need to do that one weird thing.
## How do I obtain this majestic tool?
Run the following Cargo command in your project directory (assuming you have [cargo-edit](https://github.com/killercup/cargo-edit) installed):
```fish
cargo add synthzip
```
Or add the following line to your `Cargo.toml` (in the `[dependencies]` array):
```toml
synthzip = "^ 0.1"
```
## How do I use it?
```rust
fn main() {
// This can be any source that implements Read + Seek, and reads a valid ZIP
// Local File Header, compressed data, and (optional) trailing Data Descriptor.
let mut input = std::io::Cursor::new(Vec::new());
// read the data into an entry.
let entry = synthzip::Entry::read(&mut input).expect("failed to read zip entry from input");
// create a new (empty) CentralDirectory
let mut index = synthzip::CentralDirectory::new();
// add the Entry to the CentralDirectory. This will create a corresponding ZIP
// Central Directory File Header and update the End of Central Directory appropriately.
index.add(&entry)
// this can be any destination that implements Write + Seek.
let mut output = std::fs::File::create("/path/for/output.zip").expect("failed to create output file");
// write the entry to the output destination.
entry.write(&mut output).expect("failed to write zip entry to output");
// write the Central Directory after the entry data.
index.write(&mut output).expect("failed to write central directory to output");
/// flush the output, if you're so inclined.
output.flush().unwrap();
}
```
## License
`synthzip` is available under the MIT License. See `LICENSE.txt` for the full text.
While the license is short, it's still written in fancy lawyer-speak. If you
prefer more down-to-earth language, consider the following:
- tl;drLegal has a simple visual summary available [here](https://www.tldrlegal.com/license/mit-license).
- FOSSA has a more in-depth overview available [here](https://fossa.com/blog/open-source-licenses-101-mit-license/).