fluent_messages
The failure and success cases are similar enough that they can share code.
synstructure