cosmian_std 0.1.0

Cosmian std lib to write Rust MPC programs with easier abstractions and helpers
#![cfg_attr(not(feature = "emulate"), no_std)]

mod input;
mod output;

pub mod prelude;

pub use input::{Column, InputRow};
pub use output::OutputRow;
pub use scale;

#[cfg(feature = "emulate")]
use std::cell::RefCell;
#[cfg(feature = "emulate")]
#[doc(hidden)]
thread_local!(pub static CURRENT_TEST_NAME: RefCell<Option<&'static str>> = RefCell::new(None));

#[cfg(feature = "emulate")]
#[doc(hidden)]
pub use output::PLAYERS_OUTPUT_ROWS;

pub use scale::main;

#[cfg(feature = "emulate")]
#[doc(hidden)]
pub mod reexports {
    pub use serde_json;
}

#[macro_export]
macro_rules! test {
    ($test_name:expr) => {
        $crate::CURRENT_TEST_NAME.with(|current_test_name| {
            *current_test_name.borrow_mut() = Some($test_name);
        });

        main();

        let mut players_output_rows = $crate::PLAYERS_OUTPUT_ROWS
            .lock()
            .expect("players output rows poisoned");
        for (player, output_rows) in players_output_rows.iter() {
            let output: Vec<Vec<i64>> = {
                let file = std::fs::OpenOptions::new()
                    .read(true)
                    .open(format!(
                        "fixtures/{}/outputs/player_{}.json",
                        $test_name, player
                    ))
                    .unwrap_or_else(|_| {
                        std::panic!("cannot open file for output for player {}", player)
                    });
                let reader = std::io::BufReader::new(&file);

                $crate::reexports::serde_json::from_reader(reader).unwrap_or_else(|_| {
                    std::panic!("cannot read output file for player {}", player)
                })
            };

            assert_eq!(
                &output, output_rows,
                "Output rows are different for player {} (left is what is expected)",
                player
            );
        }

        *players_output_rows = std::collections::HashMap::new();
    };
}