using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using Newtonsoft.Json; namespace LibMpc { public interface IMpdMessage { IMpdRequest Request { get; } IMpdResponse Response { get; } } 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 IReadOnlyDictionary> GetValuesFromResponse() { var result = new Dictionary>(); 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)) { if (!result.ContainsKey(mpdKey)) { result.Add(mpdKey, new List() { mpdValue }); } else { result[mpdKey].Add(mpdValue); } } } } } return result; } public override string ToString() { return JsonConvert.SerializeObject(this, Formatting.Indented); } } }