# retdec-rust
[![docs.rs](https://docs.rs/retdec/badge.svg)](https://docs.rs/retdec)
[![crates.io](https://img.shields.io/crates/v/retdec.svg)](https://crates.io/crates/retdec)
A Rust library and tools providing easy access to the
[retdec.com](https://retdec.com) decompilation service through their public
[REST API](https://retdec.com/api/).
You can either incorporate the library in your own tools:
```rust
extern crate retdec;
use retdec::{Decompiler, DecompilationArguments, File, Settings};
let decompiler = Decompiler::new(
Settings::new()
.with_api_key("YOUR-API-KEY")
);
let mut decompilation = decompiler.start_decompilation(
DecompilationArguments::new()
.with_input_file(File::from_path("hello.exe")?)
)?;
decompilation.wait_until_finished()?;
let output_code = decompilation.get_output_hll_code()?;
print!("{}", output_code);
```
or you can use the provided tool for stand-alone decompilations:
```text
$ decompiler -k YOUR-API-KEY hello.exe
```
Either way, you get the decompiled C code:
```text
//
// This file was generated by the Retargetable Decompiler
// Website: https://retdec.com
// Copyright (c) 2017 Retargetable Decompiler <info@retdec.com>
//
int main(int argc, char ** argv) {
printf("Hello, world!\n");
return 0;
}
```
Additionally, the crate provides access to the
[fileinfo](https://retdec.com/api/docs/fileinfo.html) service (analysis of
binary files).
## Status
Currently, the crate only provides very basic support for the
[decompilation](https://retdec.com/api/docs/decompiler.html) and
[file-analyzing](https://retdec.com/api/docs/fileinfo.html) services. **Support
for more features is under way as the crate is under development.**
A summary of all the currently supported parts of the [retdec.com's
API](https://retdec.com/api/docs/index.html) is available
[here](https://github.com/s3rvac/retdec-rust/tree/master/STATUS.md).
## Installation
To include the crate into your project so you can use it as a library, add the
following lines into your `Cargo.toml` file:
```
[dependencies]
retdec = "0.1.0"
```
If you want to use the development version (current `master` branch), use these
two lines instead:
```text
[dependencies]
retdec = { git = "https://github.com/s3rvac/retdec-rust" }
```
If you just want to use the command-line tools (`decompiler`, `fileinfo`),
install the project as follows:
```text
cargo install retdec
```
## Documentation
An automatically generated API documentation is available here:
* [master](https://projects.petrzemek.net/retdec-rust/doc/master/retdec/index.html)
(development version)
* [0.1.0](https://docs.rs/retdec/0.1.0/retdec/) (latest stable version)
## Contributions
Contributions are welcome. Notes:
* To generate API documentation, run
```text
cargo doc --lib --no-deps
```
* To run unit tests, execute
```text
cargo test --lib
```
* To run documentation tests, execute
```text
cargo test --doc
```
* To run all tests, including integration tests, execute
```text
RETDEC_API_KEY=YOUR-API-KEY cargo test
```
*Note*: Before running integration tests, you need to set the
`RETDEC_API_KEY` environment variable to your API key. Integrations tests
communicate with the `retdec.com`'s API, which is why a valid API key is
needed.
## License
Licensed under either of
* Apache License, Version 2.0,
([LICENSE-APACHE](https://github.com/s3rvac/retdec-rust/tree/master/LICENSE-APACHE)
or http://www.apache.org/licenses/LICENSE-2.0)
* MIT License
([LICENSE-MIT](https://github.com/s3rvac/retdec-rust/tree/master/LICENSE-APACHE)
or http://opensource.org/licenses/MIT)
at your option.
## Access from Other Languages
If you want to access the [retdec.com](https://retdec.com) decompilation
service from other languages, check out the following projects:
* [retdec-python](https://github.com/s3rvac/retdec-python) - A library and
tools for accessing the service from Python.
* [retdec-cpp](https://github.com/s3rvac/retdec-cpp) - A library and tools for
accessing the service from C++.
* [retdec-sh](https://github.com/s3rvac/retdec-sh) - Scripts for accessing the
service from shell.