# High-level Protobuf conversion library for Exonum
[![Travis Build Status](https://img.shields.io/travis/exonum/exonum/master.svg?label=Linux%20Build)](https://travis-ci.com/exonum/exonum)
[![License: Apache-2.0](https://img.shields.io/github/license/exonum/exonum.svg)](https://github.com/exonum/exonum/blob/master/LICENSE)
![rust 1.42.0+ required](https://img.shields.io/badge/rust-1.42.0+-blue.svg?label=Required%20Rust)
`exonum-proto` provides a high-level interface for interacting with code
generated by `protoc-rust` crate.
The central part of this crate is `ProtobufConvert` trait.
The main purpose of this trait is to allow users to create
a map between their types and the types generated from `.proto`
descriptions, while providing a mechanism for additional
validation of Protobuf data.
Most of the time you do not have to implement this trait because most
of the use cases are covered by `#[derive(ProtobufConvert)]`
from the `exonum-derive` crate.
A typical example of such mapping with validation is manual implementation
of this trait for `exonum_crypto::Hash`. `exonum_crypto::Hash` is a fixed
sized array of bytes but Protobuf does not allow us to express this
constraint since only dynamically sized arrays are supported.
If you would like to use `Hash` as a part of your Protobuf struct, you would
have to write a conversion function from Protobuf `proto::Hash`(which
is dynamically sized array of bytes) to`exonum_crypto::Hash` and call
it every time when you want to use `exonum_crypto::Hash` in your application.
The provided `ProtobufConvert` implementation for Hash allows you to embed
this field into your struct and generate `ProtobufConvert` for it using
`#[derive(ProtobufConvert)]`, which will validate your structure based on the
validation function for `Hash`.
Consult [the crate docs](https://docs.rs/exonum-proto) for more details.
## Examples
Sample Protobuf roundtrip:
```rust
use exonum_proto::ProtobufConvert;
use bit_vec::BitVec;
let bit_vector = BitVec::from_bytes(&[0b_1010_0000, 0b_0001_0010]);
let bit_vector_pb = bit_vector.to_pb();
let deserialized_bit_vector: BitVec = ProtobufConvert::from_pb(pb_bv).unwrap();
assert_eq!(bit_vector, deserialized_bit_vector);
```
## Usage
Include `exonum-proto` as a dependency in your `Cargo.toml`:
```toml
[dependencies]
exonum-proto = "1.0.0"
```
## License
`exonum-proto` is licensed under the Apache License (Version 2.0).
See [LICENSE](LICENSE) for details.