///////////////////////////////////////////////////////////////////////////
// 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));
}
}
}