1 unstable release

0.12.2 Nov 10, 2024
0.12.0 Sep 11, 2024
0.11.0 Apr 27, 2024
0.7.10 Mar 24, 2024
0.7.5 Jun 21, 2018

#506 in Rust patterns

Download history 55/week @ 2024-07-28 158/week @ 2024-09-08 28/week @ 2024-09-15 24/week @ 2024-09-22 7/week @ 2024-09-29 2/week @ 2024-10-06 130/week @ 2024-10-13 27/week @ 2024-10-20 3/week @ 2024-10-27 7/week @ 2024-11-03 160/week @ 2024-11-10

223 downloads per month
Used in eventor

MIT/Apache

26KB
206 lines

elicit-rs Rust

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


lib.rs:

lib.rs

Examples

Elicit

pub(crate) mod mine {
    use elicit::{elicit_define, Elicit};

    #[elicit_define(mine_elicit)]
    pub(crate) trait Mine {
        fn action(&self) -> i32;
        fn action_mut(&mut self) -> i32;
    }

    // pub(crate) mine_elicit::author as elicit_author;
    pub(crate) use mine_elicit::user as elicit_user;

    #[derive(Debug, Default, Clone, Elicit)]
    #[elicit_mod_author(mine_elicit::author)]
    pub(crate) struct MineX {}

    impl Mine for MineX {
        fn action(&self) -> i32 {
            0i32
        }
        fn action_mut(&mut self) -> i32 {
            0i32
        }
    }

    #[derive(Debug, Clone, Elicit)]
    #[elicit_mod_author(mine_elicit::author)]
    // #[elicit_from_self_field(_fsf)] // here
    pub(crate) struct MineY {
        #[elicit_from_self_field] // or here
        _fsf: mine_elicit::author::ElicitFromSelfField,
        i: i32,
    }

    impl MineY {
        pub(crate) fn new(a: i32) -> Self {
            MineY {
                _fsf: Default::default(),
                i: a,
            }
        }
    }

    impl Mine for MineY {
        fn action(&self) -> i32 {
            self.i
        }
        fn action_mut(&mut self) -> i32 {
            self.i += 1;
            self.i
        }
    }
}

pub(crate) fn fire() -> elicit::Result<()> {
    use mine::elicit_user::Elicit as MineElicit;
    use mine::{MineX, MineY};

    let mut e: MineElicit;

    e = MineElicit::new(MineX::default())?;

    e.try_with(|m| -> elicit::Result<()> {
        println!("{:?}", m);
        assert!(m.action() == 0);
        Ok(())
    })?;

    let y = MineY::new(1);
    e = MineElicit::new(y)?;

    e.try_with_mut(|m| -> elicit::Result<()> {
        println!("{:?}", m);
        assert!(m.action_mut() == 2);
        Ok(())
    })?;

    Ok(())
}

fire().expect("Doc-tests");

Dependencies

~0.3–5MB
~19K SLoC