Accumulate and render user messages¶
Accumulates message text onto a manager instance, skipping duplicates and blank input, and renders the accumulated messages for the caller's target channel (web, Windows, or a caller-defined separator).
| Field | Value |
|---|---|
| Operation ID | accumulate-and-render-user-messages |
| Trigger | A derived manager reports a validation failure, save result, or informational note |
| Inputs | One message string, a String(), or an IEnumerable(Of String) |
| Outputs | The Message property (single concatenated string) |
| Primary components | AppManagerBase.AppendMessageLines, MessageFormatting |
| Entry point | SAIF.Application/AppManagerBase.vb, SAIF.Application/MessageFormatting.vb |
Steps¶
AppendMessageLines(IEnumerable(Of String))converts to an array and delegates to the array overload, which loops to the single-string overload.- The single-string overload skips zero-length input and any text already contained in
Message(BR-APP-005); whenMessageis already non-empty,NewLineCharacter(default<BR>) is appended before the new text. - For batch rendering, callers use
MessageFormatting.GetMessagesForWeb/GetMessagesForWindows/GetMessagesUserDefined: each strips pre-existingvbCrLfor<BR>markers, drops duplicates, then joins with the chosen separator, omitting the trailing separator after the final element (BR-APP-010). AppendMessageStringappends the joined result to an existingByRefbuffer, inserting a literal<br>first when that buffer is non-blank — this path ignores the caller's separator for the seam.*
Process flow¶
The following diagram visualizes this operation's control flow.
flowchart TD
Start(["AppendMessageLines<br>called"]) --> Loop["Loop to single-string<br>overload"]
Loop --> Skip{"Blank or<br>already present?"}
Skip -->|Yes| Discard["Skip text"]
Skip -->|No| Prefix{"Message<br>non-empty?"}
Prefix -->|Yes| AddSep["Append<br>NewLineCharacter"]
Prefix -->|No| Append["Append text"]
AddSep --> Append
Append --> Render["MessageFormatting renders<br>for target channel"]
Failure and edge-case behavior¶
AppendMessageStringignores the caller's chosen separator when bridging to an existingByRefbuffer, always inserting a literal<br>— an inconsistency with the channel-appropriate separator rule applied elsewhere.*