fluent-impl 0.2.0

A procedural macro that generates chaining methods from non-chaining ones in an impl block
Documentation
extern crate fluent_impl;

pub mod m {
    use fluent_impl::{fluent_impl, fluent_impl_opts};
    use std::borrow::Borrow;

    #[derive(Default, PartialEq, Debug)]
    pub struct TCounter(pub u32);

    #[derive(Default, PartialEq, Debug)]
    pub struct SCounter {
        pub c: u32,
    }

    #[derive(Default, PartialEq, Debug)]
    pub struct St {
        text: String,
    }

    #[fluent_impl]
    impl St {
        pub(crate) const C_TC: u32 = 3;
        pub(crate) const C_SC: u32 = 7;

        pub fn get_text(&self) -> &str {
            &self.text
        }

        #[fluent_impl_opts(rename = "appended")]
        pub fn append<S: Borrow<str>>(&mut self, arg: S, counter: &mut usize) {
            self.text += arg.borrow();
            *counter += 1;
        }

        #[fluent_impl_opts(rename = "appended_tc")]
        pub fn append_tc<S: Borrow<str>>(&mut self, arg: S, TCounter(counter): &mut TCounter) {
            self.text += arg.borrow();
            *counter += 1;
        }

        #[fluent_impl_opts(rename = "appended_sc")]
        pub fn append_sc<S: Borrow<str>>(&mut self, arg: S, SCounter { c: counter }: &mut SCounter) {
            self.text += arg.borrow();
            *counter += 1;
        }
    }
}

fn main() {
    use m::{SCounter, St, TCounter};
    let mut s = St::default();
    let mut s_tc = St::default();
    let mut s_sc = St::default();
    let mut c1 = 0;
    let mut c2 = 0;
    let mut tc1 = TCounter(St::C_TC);
    let mut tc2 = TCounter(St::C_TC);
    let mut sc1 = SCounter { c: St::C_SC };
    let mut sc2 = SCounter { c: St::C_SC };
    s.append("foo", &mut c1);
    assert_eq!(s.get_text(), "foo");
    assert_eq!(s, St::default().with_appended("foo", &mut c2));
    assert_eq!(c1, 1);
    assert_eq!(c1, c2);
    // ========
    s_tc.append_tc("foo", &mut tc1);
    assert_eq!(s_tc.get_text(), "foo");
    assert_eq!(s_tc, St::default().with_appended_tc("foo", &mut tc2));
    assert_eq!(tc1, TCounter(St::C_TC + 1));
    assert_eq!(tc1, tc2);
    // ========
    s_sc.append_sc("foo", &mut sc1);
    assert_eq!(s_sc.get_text(), "foo");
    assert_eq!(s_sc, St::default().with_appended_sc("foo", &mut sc2));
    assert_eq!(sc1, SCounter { c: St::C_SC + 1 });
    assert_eq!(sc1, sc2);
}