rust: Refactor Rust impl of protover_compute_vote().

This includes a subtle difference in behaviour to the previous Rust
implementation, where, for each vote that we're computing over, if a single one
fails to parse, we skip it.  This now matches the current behaviour in the C
implementation.

 * REFACTOR `protover::ffi::protover_compute_vote()` to use
   new types and methods.
This commit is contained in:
Isis Lovecruft 2018-03-21 03:05:56 +00:00
parent 0a5494b81d
commit 6f252e0986
No known key found for this signature in database
GPG Key ID: B8938BC5E86C046F

View File

@ -161,6 +161,8 @@ pub extern "C" fn protover_get_supported_protocols() -> *const c_char {
/// Provide an interface for C to translate arguments and return types for
/// protover::compute_vote
//
// Why is the threshold a signed integer? —isis
#[no_mangle]
pub extern "C" fn protover_compute_vote(
list: *const Stringlist,
@ -175,10 +177,19 @@ pub extern "C" fn protover_compute_vote(
// Dereference of raw pointer requires an unsafe block. The pointer is
// checked above to ensure it is not null.
let data: Vec<String> = unsafe { (*list).get_list() };
let hold: usize = threshold as usize;
let mut proto_entries: Vec<UnvalidatedProtoEntry> = Vec::new();
let vote = compute_vote(data, threshold);
for datum in data {
let entry: UnvalidatedProtoEntry = match datum.parse() {
Ok(x) => x,
Err(_) => continue,
};
proto_entries.push(entry);
}
let vote: UnvalidatedProtoEntry = ProtoverVote::compute(&proto_entries, &hold);
allocate_and_copy_string(&vote)
allocate_and_copy_string(&vote.to_string())
}
/// Provide an interface for C to translate arguments and return types for