rtest-util 0.2.0

common structs for rtest and rtest-derive
Documentation
/// TestArguments specifies every possible setting a test can have. This can be
/// used to specify a responsible, set groups, or similar for a test
#[derive(Debug, Default)]
#[cfg_attr(feature = "derive", derive(darling::FromMeta))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TestArguments {
    /// specifies the module your test lives in
    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
    pub module:      Option<String>,
    /// only relevant for displaying, tests in one group will be displayed
    /// together
    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
    pub group:       Option<String>,
    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
    pub cost:        Option<u32>,
    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
    pub responsible: Option<String>,
    /// test is not necessary to be executed, but still might be executed.
    /// Missing execution does not cause a Failure. If it runs but then fails,
    /// it still counts as an failure
    #[cfg_attr(feature = "derive", darling(default))]
    #[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "std::ops::Not::not"))]
    pub optional:    bool,
}

#[cfg(feature = "derive")]
impl quote::ToTokens for TestArguments {
    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
        use quote::quote;

        let module = match self.module.clone() {
            Some(val) => quote!(Some( #val.to_string() )),
            None => quote!(None),
        };
        let group = match self.group.clone() {
            Some(val) => quote!(Some( #val.to_string() )),
            None => quote!(None),
        };
        let cost = match self.cost {
            Some(val) => quote!(Some( #val )),
            None => quote!(None),
        };
        let responsible = match self.responsible.clone() {
            Some(val) => quote!(Some( #val.to_string() )),
            None => quote!(None),
        };
        let optional = self.optional;
        let optional = quote!( #optional );

        tokens.extend(quote!(TestArguments{
            module: #module,
            group: #group,
            cost: #cost,
            responsible: #responsible,
            optional: #optional,
        }));
    }
}