Attribute Macro lockjaw::module_attributes::elements_into_vec[][src]

#[elements_into_vec]
Expand description

Similar to #[into_vec] but instead of a single element, all elements in the returned Vec<T> is merged into the Vec<T> binding.

This allows the module to inject multiple elements into the Vec<T>, or conditionally inject no elements.

struct MyModule;

#[module]
impl MyModule {

    #[provides]
    #[into_vec]
    pub fn provide_string1() -> String {
        "string1".to_owned()
    }

    #[provides]
    #[elements_into_vec]
    pub fn provide_string2() -> Vec<String> {
        vec!["string2".to_owned(), "string3".to_owned()]
    }
    
    #[provides]
    #[elements_into_vec]
    pub fn provide_string4() -> Vec<String> {
        if true {
            vec![]        
        } else {
            vec!["string4".to_owned()]
        }
    }
}

#[component(modules: MyModule)]
pub trait MyComponent {
    fn vec_string(&self) -> Vec<String>;
}

pub fn main() {
    let component: Box<dyn MyComponent> = <dyn MyComponent>::new();
    let v = component.vec_string();
    assert!(v.contains(&"string1".to_owned()));
    assert!(v.contains(&"string2".to_owned()));
    assert!(v.contains(&"string3".to_owned()));
    
    assert!(!v.contains(&"string4".to_owned()));
}

epilogue!();