39 lines
1.1 KiB
Rust
39 lines
1.1 KiB
Rust
#[macro_use(shards)]
|
|
extern crate reed_solomon_erasure;
|
|
|
|
use reed_solomon_erasure::galois_8::ReedSolomon;
|
|
// or use the following for Galois 2^16 backend
|
|
// use reed_solomon_erasure::galois_16::ReedSolomon;
|
|
|
|
fn main () {
|
|
let r = ReedSolomon::new(3, 2).unwrap(); // 3 data shards, 2 parity shards
|
|
|
|
let mut master_copy = shards!(
|
|
[0, 1, 2, 3],
|
|
[4, 5, 6, 7],
|
|
[8, 9, 10, 11],
|
|
[0, 0, 0, 0], // last 2 rows are parity shards
|
|
[0, 0, 0, 0]
|
|
);
|
|
|
|
// Construct the parity shards
|
|
r.encode(&mut master_copy).unwrap();
|
|
|
|
// Make a copy and transform it into option shards arrangement
|
|
// for feeding into reconstruct_shards
|
|
let mut shards: Vec<_> = master_copy.iter().cloned().map(Some).collect();
|
|
|
|
// We can remove up to 2 shards, which may be data or parity shards
|
|
shards[0] = None;
|
|
shards[4] = None;
|
|
|
|
// Try to reconstruct missing shards
|
|
r.reconstruct(&mut shards).unwrap();
|
|
|
|
// Convert back to normal shard arrangement
|
|
let result: Vec<_> = shards.into_iter().filter_map(|x| x).collect();
|
|
|
|
assert!(r.verify(&result).unwrap());
|
|
assert_eq!(master_copy, result);
|
|
}
|