/////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 // // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // // rights of fair usage, the disclaimer and warranty conditions. // /////////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace wasSharp.Languages { public static class KeyValue { /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Returns the value of a key from a key-value data string. /// /// true if the key was found in data public static string Get(string key, string data) { return data.Split('&') .AsParallel() .Select(o => o.Split('=')) .Where(o => o.Length.Equals(2) && o[0] == key) .Select(o => o[1]) .FirstOrDefault(); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Returns a key-value data string with a key set to a given value. /// /// /// a key-value data string or the empty string if either key or /// value are empty /// public static string Set(string key, string value, string data) { return string.Join("&", string.Join("&", data.Split('&') .AsParallel() .Select(o => o.Split('=')) .Where(o => o.Length.Equals(2) && o[0] == key) .Select(o => o[0] + "=" + o[1])), key + "=" + value); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Deletes a key-value pair from a string referenced by a key. /// /// a key-value pair string public static string Delete(string key, string data) { return string.Join("&", data.Split('&') .AsParallel() .Select(o => o.Split('=')) .Where(o => o.Length.Equals(2) && o[0] == key) .Select(o => o[0] + "=" + o[1])); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Decodes key-value pair data to a dictionary. /// /// a dictionary containing the keys and values public static Dictionary Decode(string data) { return data.Split('&') .AsParallel() .Select(o => o.Split('=')) .Where(o => o.Length.Equals(2)) .Select(o => new { k = o[0], v = o[1] }) .GroupBy(o => o.k) .ToDictionary(o => o.Key, p => p.FirstOrDefault()?.v); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Serialises a dictionary to key-value data. /// /// a key-value data encoded string public static string Encode(Dictionary data) { return string.Join("&", data.Select(o => o.Key + "=" + o.Value)); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Serializes a dictionary to key-value data. /// /// an input string /// a key-value data encoded string public static string Encode(IEnumerable> data) { return string.Join("&", data.Select(o => o.Key + "=" + o.Value)); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2018 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Asynchronously serializes a dictionary to key-value data. /// /// an input string /// a key-value data encoded string public static string Encode(IEnumerable, Task>> data) { return string.Join("&", data.Select(o => o.Key.Result + "=" + o.Value.Result)); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Escapes a dictionary's keys and values for sending as POST data. /// public static IEnumerable> Escape(IEnumerable> data, Func func) { return data.ToDictionary(o => func(o.Key), p => func(p.Value)); } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// /// /// Escapes a dictionary's keys and values for sending as POST data. /// public static IEnumerable, Task>> EscapeAsync( IEnumerable> data, Func> func) { return data.ToDictionary(async o => await func(o.Key), async p => await func(p.Value)); } } }