using System; using System.Text; using StardewModdingAPI.Web.Framework.LogParsing.Models; namespace StardewModdingAPI.Web.Framework.LogParsing { /// Handles constructing log message instances with minimal memory allocation. internal class LogMessageBuilder { /********* ** Fields *********/ /// The local time when the next log was posted. public string Time { get; set; } /// The log level for the next log message. public LogLevel Level { get; set; } /// The mod name for the next log message. public string Mod { get; set; } /// The text for the next log message. private readonly StringBuilder Text = new StringBuilder(); /********* ** Accessors *********/ /// Whether the next log message has been started. public bool Started { get; private set; } /********* ** Public methods *********/ /// Start accumulating values for a new log message. /// The local time when the log was posted. /// The log level. /// The mod name. /// The initial log text. /// A log message is already started; call before starting a new message. public void Start(string time, LogLevel level, string mod, string text) { if (this.Started) throw new InvalidOperationException("Can't start new message, previous log message isn't done yet."); this.Started = true; this.Time = time; this.Level = level; this.Mod = mod; this.Text.Append(text); } /// Add a new line to the next log message being built. /// The line to add. /// A log message hasn't been started yet. public void AddLine(string text) { if (!this.Started) throw new InvalidOperationException("Can't add text, no log message started yet."); this.Text.Append("\n"); this.Text.Append(text); } /// Get a log message for the accumulated values. public LogMessage Build() { if (!this.Started) return null; return new LogMessage { Time = this.Time, Level = this.Level, Mod = this.Mod, Text = this.Text.ToString() }; } /// Reset to start a new log message. public void Clear() { this.Started = false; this.Text.Clear(); } } }