using System; using System.Collections.Generic; using System.Linq; using System.Net.Mail; namespace SendGridMail { public class Header : IHeader { private const string SendgridHeader = "X-Smtpapi"; private readonly HeaderSettingsNode _settings; public Header() { _settings = new HeaderSettingsNode(); } public IEnumerable To { get { return _settings.GetArray("to"); } } public void AddSubVal(string tag, IEnumerable substitutions) { var keys = new List {"sub", tag}; _settings.AddArray(keys, substitutions); } public void AddTo(IEnumerable addresses) { _settings.AddArray(new List { "to" }, addresses); } public void AddUniqueIdentifier(IDictionary identifiers) { foreach (var key in identifiers.Keys) { var keys = new List {"unique_args", key}; var value = identifiers[key]; _settings.AddSetting(keys, value); } } public void SetCategory(string category) { var keys = new List {"category"}; _settings.AddSetting(keys, category); } public void Enable(string filter) { AddFilterSetting(filter, new List(){ "enable" }, "1"); } public void Disable(string filter) { AddFilterSetting(filter, new List(){"enable"}, "0"); } public void AddFilterSetting(string filter, IEnumerable settings, string value) { var keys = new List() {"filters", filter, "settings" }.Concat(settings).ToList(); _settings.AddSetting(keys, value); } public void AddHeader(MailMessage mime) { mime.Headers.Add(SendgridHeader, AsJson()); } public String AsJson() { if(_settings.IsEmpty()) return ""; return _settings.ToJson(); } internal class HeaderSettingsNode { private readonly Dictionary _branches; private IEnumerable _array; private String _leaf; public HeaderSettingsNode() { _branches = new Dictionary(); } public void AddArray(List keys, IEnumerable value) { if (keys.Count == 0) { _array = value; } else { if (_leaf != null || _array != null) throw new ArgumentException("Attempt to overwrite setting"); var key = keys.First(); if (!_branches.ContainsKey(key)) _branches[key] = new HeaderSettingsNode(); var remainingKeys = keys.Skip(1).ToList(); _branches[key].AddArray(remainingKeys, value); } } public void AddSetting(List keys, String value) { if (keys.Count == 0) { _leaf = value; } else { if(_leaf != null || _array != null) throw new ArgumentException("Attempt to overwrite setting"); var key = keys.First(); if (!_branches.ContainsKey(key)) _branches[key] = new HeaderSettingsNode(); var remainingKeys = keys.Skip(1).ToList(); _branches[key].AddSetting(remainingKeys, value); } } public String GetSetting(params String[] keys) { return GetSetting(keys.ToList()); } public String GetSetting(List keys) { if (keys.Count == 0) return _leaf; var key = keys.First(); if(!_branches.ContainsKey(key)) throw new ArgumentException("Bad key path!"); var remainingKeys = keys.Skip(1).ToList(); return _branches[key].GetSetting(remainingKeys); } public IEnumerable GetArray(params String[] keys) { return GetArray(keys.ToList()); } public IEnumerable GetArray(List keys) { if (keys.Count == 0) return _array; var key = keys.First(); if (!_branches.ContainsKey(key)) throw new ArgumentException("Bad key path!"); var remainingKeys = keys.Skip(1).ToList(); return _branches[key].GetArray(remainingKeys); } public String GetLeaf() { return _leaf; } public String ToJson() { if (_branches.Count > 0) return "{" + String.Join(",", _branches.Keys.Select(k => Utils.Serialize(k) + " : " + _branches[k].ToJson())) + "}"; if (_leaf != null) return Utils.Serialize(_leaf); if (_array != null) return "[" + String.Join(", ", _array.Select(i => Utils.Serialize(i))) + "]"; return "{}"; } public bool IsEmpty() { if (_leaf != null) return false; return _branches == null || _branches.Keys.Count == 0; } } } }