<h1 align="center">Writema? What's Writema?</h1>

### Writema is a binary stream writing library

> Well, what does it do?

### Well I'm glad you asked!

Writema is a little library I started to help with writing binary files.

> That's it?

Well yeah, what did you expect?
Some large module I've been writing my entire life that will change the world with its amazing binary writing ability?

## Cool Badges
![Tests](https://github.com/whamer100/Writema/actions/workflows/tests.yml/badge.svg)
<br/><br/>
![](https://img.shields.io/badge/Shoutouts%20to-SimpleFlips-%23B6BFFF?link=https://www.twitch.tv/simpleflips&logo=data:image/png;base64, )

## Usage

> Note, requires Python 3.8 or higher (For now at least)

### Installation

```sh
pip install writema
```

### Sample code

```py
from writema import Writema

# Let's say you want to write a file to contain in order:
# - An integer
# - An unsigned integer
# - A double
# - A string prefixed by its length with a byte
# - A large buffer blob you dont exactly know the length of
w = Writema("some_file.bin") # note: defaults to Little Endian

w.write(4, 69)  # write a 4 byte integer (int32_t)
w.uwrite(2, -1337)  # write an unsigned 2 bit integer (uint16_t)

w.write("d", 2.718281828459045)  # write the constant e as a double

string = b"Hello, World!"
length = len(string)

w.write(1, length)
w.bytes(string)

important_data = ...  # imagine theres some very large binary blob here in bytes
w.bytes(important_data)
```

Example of ways to do the same action
```py
from writema import Writema, WritemaTypes

w = Writema()

# lets say you want the end buffer to be b"AAAABBBBCCCCDDDD"
# heres four ways you can do each of the four bytes

w.write(4, 1094795585)  # Writes a 32 bit (4 byte) integer (AAAA = 1094795585)
w.write("int", 1111638594)  # this also writes a 32 bit int (BBBB = 1111638594)
w.write(WritemaTypes.int, 1128481603)  # someone might prefer this idk (CCCC = 1128481603)
w.bytes(b"DDDD")  # its a bytestring, probably the easiest to work with
```

Other examples
```py
# writing floats and doubles is a little scuffed for now, i plan to find a better solution
w.write("f", 6.9)
w.write("float", 6.9)
w.write(WritemaTypes.float, 6.9)
w.write("d", 6.90000001)
w.write("double", 6.90000001)
w.write(WritemaTypes.double, 6.90000001)

# you can also set endianness
w.set_endianness("big")
# and
w.set_endianness("little")  # the correct endianness /s
```

## Documentation

### [tba](https://www.youtube.com/watch?v=dQw4w9WgXcQ)

## License

Copyright (c) 2022 [whamer100](https://github.com/whamer100) <br />
This project is [MIT](https://github.com/whamer100/Writema/blob/master/LICENSE.md) licensed.

---
> hey is this project name just one big ligma joke
###### maybe
