fitrs 0.5.0

Parse FITS file in pure rust
Documentation
extern crate fitrs;

use fitrs::{Fits, FitsData};

use std::sync::Arc;
use std::thread;

#[test]
fn read_second_hdu_array_from_n_threads() {
    const FIRST_30_CHARS: &[char] = &[
        '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}',
        '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{80}',
        '\u{0}', 'ÿ', 'ÿ', 'ÿ', 'ÿ', '\u{0}', '\u{0}', '\u{0}', '\u{0}', '\u{0}',
    ];

    const THREAD_COUNT: usize = 10000;
    let fits = Arc::new(Fits::open("tests/testprog.fit").unwrap());
    let fits_arcs = (0..THREAD_COUNT).map(|_| fits.clone());
    let mut panicked = vec![];

    let mut children = Vec::with_capacity(THREAD_COUNT);
    for (i, fits) in fits_arcs.into_iter().enumerate() {
        let child = thread::Builder::new()
            .name(format!("#{}", i))
            .spawn(move || {
                let mut iter = fits.iter();
                iter.next();
                let table_hdu_1 = iter.next().unwrap();
                let data = table_hdu_1.read_data();
                match data {
                    FitsData::Characters(array) => {
                        assert_eq!(&array.data[..30], FIRST_30_CHARS,);
                    }
                    _ => panic!("Should be Characters!"),
                }
            })
            .unwrap();
        children.push(child);
    }

    for (i, result) in children.into_iter().map(|child| child.join()).enumerate() {
        if let Err(e) = result {
            panicked.push((i, e));
        }
    }
    if panicked.len() > 0 {
        panic!("{} threads panicked: {:?}", panicked.len(), panicked);
    }
}