An open API service indexing awesome lists of open source software.

https://github.com/pgimalac/rust-graphviz

FFI bindings for the graphviz C lib generated with rust-bindgen.
https://github.com/pgimalac/rust-graphviz

Last synced: 8 months ago
JSON representation

FFI bindings for the graphviz C lib generated with rust-bindgen.

Awesome Lists containing this project

README

          

### Description
FFI bindings for the [Graphviz C library](https://graphviz.org/) generated with [Rust-bindgen](https://github.com/rust-lang/rust-bindgen). Very unsafe and not very usable in my opinion.

### Other similar crates
I discovered that the [graphviz-sys crate](https://crates.io/crates/graphviz-sys) (which is almost exactly the same as this crate) existed when I decided to publish this crate on [crates.io](https://crates.io/). Nevertheless I decided to publish it since I'd like (one day) to crate safe API bindings for the graphviz library. Any help with that would be appreciated.

### How to use
One example of use of the graphviz C library (from [this document](https://www.graphviz.org/pdf/libguide.pdf), although slightly modified) is

```C
#include

int main(int argc, char**argv){
FILE *fp;
if (argc > 1)
fp = fopen(argv[1], "r");
else
fp = stdin;

GVC_t *gvc = gvContext();
Agraph_t *g = agread(fp, 0);

gvLayout(gvc, g, "dot");
gvRender(gvc, g, "plain", stdout);

gvFreeLayout(gvc, g);
agclose(g);

return gvFreeContext(gvc);
}
```

A similar Rust code would be
```Rust
use graphviz_ffi::{
agclose, agread, fopen, gvContext, gvFreeContext, gvFreeLayout, gvLayout, gvRender, stdin,
stdout,
};

macro_rules! to_c_string {
($str:expr) => {
std::ffi::CString::new($str).unwrap().as_ptr()
};
}

fn main() {
unsafe {
let fp = match std::env::args().nth(1) {
Some(path) => fopen(to_c_string!(path), to_c_string!("r")),
None => stdin,
};

let gvc = gvContext();
let g = agread(fp as _, 0 as _);

gvLayout(gvc, g, to_c_string!("dot"));
gvRender(gvc, g, to_c_string!("plain"), stdout);

gvFreeLayout(gvc, g);
agclose(g);

std::process::exit(gvFreeContext(gvc))
}
}
```