Use the force of Pattern Matching you much (or at least try ;))
https://gitlab.com/jameslong/sceopa/blob/master/web/models/user.ex#L95-102
above can be written as
defp put_email_key(%Ecto.Changeset{valid?: false} = changeset), do: changeset
defp put_email_key(%Ecto.Changeset{valid?: true} = changeset) do
put_change(changeset, :email_verification_key, gen_email_key())
end