ReadonlycodeWhich problem this is.
ReadonlymessageWhat's wrong and what to do about it, as a full sentence.
Some messages run past a hundred characters, which is too long for a table cell. Use short there.
Optional ReadonlyquantitiesThe numbers that fill template's placeholders, canonical and unrounded.
Keyed by placeholder name. They're canonical because the rest of the
package uses canonical units and a display layer needs them as input. The
litres in message are rendered from these.
ReadonlyseverityHow serious it is: error, warning or note, as described above.
ReadonlyshortThe same problem in a few words, for places with no room, such as a table cell.
Truncating message would cut it off partway through the advice,
which is the part that tells the brewer what to do. So short says what's
wrong and message says what to do.
Optional Readonlytemplatemessage with each of its numbers replaced by a {name} placeholder
naming an entry in quantities.
Set on every issue that quotes a measurement, and absent on the ones that
quote a percentage, a number of minutes or no number at all. A caller that
shows gallons instead of litres renders this with
renderDecoctionIssue. Anything else can use message as it is.
One problem with a decoction, as structured data.
errormeans the pull as specified can't happen, and the numbers next to it are only arithmetic, not advice.warningmeans it can happen but probably shouldn't.notemeans it will happen and there's something the brewer should know. Callers sort byseverity.decoctionWarningsflattens issues into the string listRecipeCalculation.warningstakes.