using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text.RegularExpressions; using Newtonsoft.Json; namespace LibMpc { public interface IMpdMessage { IMpdRequest Request { get; } IMpdResponse Response { get; } } [DebuggerDisplay("Request: {Request.Command.Value} | Response Status: {Response.State.Status}")] public class MpdMessage : IMpdMessage { private readonly Regex _linePattern = new Regex("^(?[A-Za-z_-]*):[ ]{0,1}(?.*)$"); private readonly IList _rawResponse; public MpdMessage(IMpcCommand command, bool connected, IReadOnlyCollection response) { Request = new MpdRequest(command); var endLine = response.Skip(response.Count - 1).Single(); _rawResponse = response.Take(response.Count - 1).ToList(); var values = Request.Command.FormatResponse(GetValuesFromResponse()); Response = new MpdResponse(endLine, values, connected); } public IMpdRequest Request { get; } public IMpdResponse Response { get; } private IList> GetValuesFromResponse() { var result = new List>(); foreach (var line in _rawResponse) { var match = _linePattern.Match(line); if (match.Success) { var mpdKey = match.Result("${key}"); if (!string.IsNullOrEmpty(mpdKey)) { var mpdValue = match.Result("${value}"); if (!string.IsNullOrEmpty(mpdValue)) { result.Add(new KeyValuePair(mpdKey, mpdValue)); } } } } return result; } public override string ToString() { return JsonConvert.SerializeObject(this, Formatting.Indented); } } }