Fix would be to use this:
events
|> Enum.each(fn(event) ->
unless event[:to] in states do
raise "Target state :#{event[:to]} is not present in @states"
end
def unquote(event[:name])(model) do
model
|> Changeset.change(%{ unquote(column) => "#{unquote(event[:to])}" })
|> unquote(event[:callback]).()
|> unquote(:"validate_state_transition_#{column}")(unquote(event), model)
end
def unquote(:"can_#{event[:name]}?")(model) do
:"#{Map.get(model, unquote(column))}" in unquote(event[:from])
end
end)
defp unquote(:"validate_state_transition_#{column}")(changeset, event, model) do
change = Map.get(model, unquote(column))
if :"#{change}" in event[:from] do
changeset
else
changeset
|> Changeset.add_error(unquote(column),
"You can't move state from :#{change} to :#{event[:to]}"
)
end
end
Fix would be to use this: