translator 0.3.1

A procedural macro which translates your repr-C structs into C++, Python and C# at compile time for helping write FFI libraries
Documentation
# Translator
Translator is a rust procedural macro which translates rust structs into other languages for exposure over a rust FFI (or however else you want to use them). Structs that are not ```[repr(C)]``` are ignored. The structs are translated into:

* Python
* C++
* C#

This macro isn't a magic bullet, but it will (hopefully) greatly reduce the cost of creating Rust libraries for use with other languages

## Use
### Input
Say you want to translate the following structs:
```rust
#[repr(C)]
#[derive(Clone, Copy)]
pub struct SomeStruct {
    //pub raw_message: [i16;5],
    pub foo: i32,
    pub bar: Baz,
    pub foobar: [u8;5]
}

#[repr(C)]
#[derive(Clone, Copy)]
pub struct Baz {
    pub bob: f32
}
```

You would have to add the Translator macro, and the ```Translator``` to the derivations. You would also have to add the 'magic struct' to the end of the struct declarations. It would look like this:

```rust
#[macro_use]
extern crate translator;

#[repr(C)]
#[derive(Clone, Copy, Translate)]
pub struct SomeStruct {
    //pub raw_message: [i16;5],
    pub foo: i32,
    pub bar: Baz,
    pub foobar: [u8;5]
}

#[repr(C)]
#[derive(Clone, Copy, Translate)]
pub struct Baz {
    pub bob: f32
}

#[derive(Translate)]
struct __FinalizeTranslatorStruct__{}
```

When you compile, in the 'target' folder a new folder will be created named 'TranslateOutput' with 3 files (one for each language) with the following contents:

### c++
```c++
typedef struct SomeStructTag {
	int32_t foo;
	Baz bar;
	uint8_t foobar[5];
} SomeStruct;

typedef struct BazTag {
	float bob;
} Baz;
```

### Python
```python
class SomeStruct(Structure):
        _fields_ = [
        ("foo", c_int),
        ("bar", Baz),
        ("foobar", c_ubyte * 5),
        ]

class Baz(Structure):
        _fields_ = [
        ("bob", c_float),
        ]
```

### C#
```csharp
[StructLayout(LayoutKind.Sequential)]
public struct SomeStruct
{
    public int foo;
    public Baz bar;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
    public byte[] foobar;
}

[StructLayout(LayoutKind.Sequential)]
public struct Baz
{
    public float bob;
}
```

<a rel="me" href="https://infosec.exchange/@livinginsyn">Mastodon</a>