What #[derive(AddAssign)] generates

This code is very similar to the code that is generated for #[derive(Add)]. The difference is that it mutates the existing instance instead of creating a new one.

1 Tuple structs

When deriving AddAssign for a tuple struct with two fields like this:

#[derive(AddAssign)]
struct MyInts(i32, i32);

Code like this will be generated:

impl ::core::ops::AddAssign for MyInts {
    fn add_assign(&mut self, rhs: MyInts) {
        self.0.add_assign(rhs.0);
        self.1.add_assign(rhs.1);
    }
}

The behaviour is similar with more or less fields.

2 Regular structs

When deriving for a regular struct with two fields like this:

#[derive(AddAssign)]
struct Point2D {
    x: i32,
    y: i32,
}

Code like this will be generated:

impl ::core::ops::AddAssign for Point2D {
    fn add_assign(&mut self, rhs: Point2D) {
        self.x.add_assign(rhs.x);
        self.y.add_assign(rhs.y);
    }
}

The behaviour is similar with more or less fields.

3 Enums

Deriving AddAssign is not (yet) supported for enums. This is mostly due to the fact that it is not trivial convert the Add derivation code, because that returns a Result<EnumType> instead of an EnumType. Handling the case where it errors would be hard and maybe impossible.