glitchup
A databender executable made in Rust. Comes with option loading, and proc macros to help development.
**Note:** This project is still a work in progress. You can install the current executable by using:
- `cargo install glitchup`
- downloading the program from [here](https://github.com/Calmynt/glitchup/releases)
...however it's incomplete and you may encounter bugs.
If you have any questions, for example *"What's databending?"* or *"Why did you make this?"*, check the [**Q&A**](./Q&A.md)
If you wanna have a headstart on databending, check out the [databending tutorial!](./TUTORIAL.md)
## Options
An example options file can be found at [`Options.toml`](./Options.toml). I'll explain some important parts:
### Input + Output
The `inputfile` option needs to be set in order to specify which file to databend:
```toml
inputfile = "somefile.jpeg"
```
You can also specify a file that's not in the current directory. A file being in subdirectories (`dir/file.jpeg`) was tested, however a file being out of the current directory (`../file.jpeg`) was not. This may work, however some further testing is currently required.
By default, the output file will have the same name as the input file *(along with an appended string)*. If you'd like to save the file with a different name/directory, you can specify the `outputfile` option.
```toml
inputfile = "somefile.jpeg"
outputfile = "otherfile.jpeg"
```
**Note:** The output file's name will not be exactly the same as the name you specified. Currently, the format of the output files name is `name.extension`. This is to display what mutations the file underwent, while also avoiding overwriting existing files.
### Global options
Currently there are 4 global options:
- `times`: This specifies how many times to run the program.
- `iterations`: Specifies how many times the mutation should be performed before saving.
- `chunksize`: The size of each chunk to mutate at a time.
- `mutations`: The mutations to use.
So with the following options:
```toml
times = 2
iterations = [5,10]
chunksize = 1000
mutations = [ ["Reverse"], ["Swap"] ]
```
The program is going to be run **twice**, with each run containing an output for
- A mutation of `1KB` chunks by applying `Reverse` _5 to 10 times_, and
- A mutation of `1KB` chunks by applynig `Swap` _5 to 10 times_
...resulting in **2 * 2** output files in total. *(Times * No. of Mutations)*
#### Ranges
As you've seen above, `iterations` is an `array` of 2 integers. Almost all mutation-specific options can be set up with ranges, meaning an array of 2 numbers:
- `iterations = x`: `x` iterations
- `iterations = [x,y]` : Between `x` and `y` iterations.
A number will be generated randomly between `x` and `y` for each *`time`*. So if you want to randomly generate a setting between two bounds, use `[x,y]`. Otherwise, if
you want your setting to be more concrete, simply use a literal number.
#### Mutations
The `mutations` option has been overhauled from [*BEND++*](https://github.com/Calmynt/BENDPlusPlus)! Now it uses an *array of arrays*
```toml
mutations = [
["Reverse", "Swap"],
["Shuffle"],
...
]
```
Each element of `mutations` is an *array* and represents a single output. This array can have multiple mutations *chained together!*
In the options shown above, it means that the first file will first be mutated by `Reverse`, then by `Swap`, **then** saved. Then a new copy of the original file will be made, mutated by `Shuffle`, **then** saved. And so on...
### Specific options
Some mutations may have their own options that they require. For example, currently there is a `Loops` mutation that requires an option `loops` to be set. Each mutation has its own configuration as `[Config]`, so to configure `Loops`:
```toml
[LoopsConfig]
loops = 10
```
This will set `loops` to be `10` for the `Loop` mutation. If you forget to specify this option, the program will specify which options it requires, and under which name.
```
TODO: Add example of error.
```
**Note:** In the case above, you only need to specify the `loops` option *if you include `"Loops"` in the `mutations` option!* If you exclude `"loops"` then the part above can be excluded as well.
### Overriding global options
What if, for example, you want `Loops` to have *different* values for `chunksize`? You can override them by simply specifying them under `[LoopsConfig]`:
```toml
[LoopsConfig]
loops = 10
chunksize = [10,1000]
```
In this case, the `iterations` used will be the global option set, however the `chunksize` used will be taken from `[LoopsConfig]`.
## Feedback!
This project is currently a prototype. As a result, any sort of feedback is *heavily* appreciated! If you'd like to contact me, you can use [my email](mctech26@gmail.com), or if you're on the *Fediverse* you can hit me up [there!](https://hellsite.site/@andre).
You can also open an issue, and I'll try to respond as fast as possible! Don't worry - any kind of feedback is accepted, be they feature requests, opinions, or criticism.
## TODO
- [ ] Update structure/formatting of code
- [x] Improve structure to use `CfgMap` instead.
- [ ] Find a way to improve structure of Mutations, specifically randomly generating settings in ranges.
- [ ] Improve UX by possibly adding a CLI app.
- [ ] Improve UX by possibly adding a GUI.