using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace Sarand.Net.Standard.Base.Core
{
//=======================================================================
public class NamedValue
{
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Construction.
private NamedValue (String name, DataValue value)
{
Name = StringUtil.EmptyOnNull(name);
Value = value ?? new DataValue();
}
//-------------------------------------------------------------------
// Properties.
public String Name { get; private set; }
public DataValue Value { get; private set; }
//-------------------------------------------------------------------
/// Associative array of named values, case insensitive.
public class Map
{
//---------------------------------------------------------------
// Data members.
private readonly Dictionary values = new Dictionary(StringComparer.OrdinalIgnoreCase);
//---------------------------------------------------------------
// Construction.
public Map (Dictionary values = null)
{
if (values != null)
this.values.AddRange(values);
}
public Map (NamedValue.Map values)
{
if (values != null)
this.values.AddRange(values.values);
}
//---------------------------------------------------------------
// Properties.
/// Optional identifier for the set of values.
public String Id { get; set; } = String.Empty;
/// Retrieve a copy of the value list.
public Dictionary Values { get { return new Dictionary(values); } }
/// Number of values in collection.
public int Count { get { return values.Count; } }
//---------------------------------------------------------------
// Update list.
public void Clear ()
{
values.Clear();
}
public bool AddValue (String name, DataValue value)
{
if (String.IsNullOrEmpty(name) || value == null)
{
if (SacsSystem.DebugMode) SaLogger.Debug(GetType().Name + ".AddValue Invalid named value. Name: " + StringUtil.EmptyOnNull(name) + ". Value: " + (value != null ? value.GetDataType().ToString() : "null"));
return false;
}
values[name] = value;
return true;
}
public bool AddValues (NamedValue.Map values)
{
return AddValues(values.ToNamedValueList());
}
public bool AddValues (ICollection values)
{
bool addValues = true;
foreach (NamedValue value in values)
{
if (!AddValue(value.Name, value.Value))
addValues = false;
}
return addValues;
}
/// Remove the named value from the list if present.
public bool RemoveValue (String name)
{
if (!HasValue(name)) return false;
return values.Remove(name);
}
/// Change the name of a value in the list.
public bool RenameValue (String nameOld, String nameNew)
{
if (StringUtil.IsEmpty(nameOld) || !HasValue(nameOld) || StringUtil.IsEmpty(nameNew) || nameOld.EqualsCI(nameNew)) return false;
DataValue value = GetValue(nameOld);
RemoveValue(nameOld);
return AddValue(nameNew, value);
}
//---------------------------------------------------------------
/// Does the list include a value with the specified name.
public bool HasValue (String name)
{
return values.HasValue(name);
}
//---------------------------------------------------------------
/// Retrieve the value with the specified name.
public DataValue GetValue (String name)
{
return values.GetValue(name);
}
/// Retrieve the named value as a String.
public String GetString (String name, String defaultValue = "")
{
return values.GetString(name, defaultValue);
}
/// Retrieve the named value as a boolean.
public bool GetBool (String name, bool defaultValue = false)
{
return values.GetBool(name, defaultValue);
}
/// Retrieve the named value as a long integer.
public long GetLong (String name, long defaultValue = 0)
{
return values.GetLong(name, defaultValue);
}
/// Retrieve the named value as a double.
public double GetDouble (String name, double defaultValue = 0)
{
return values.GetDouble(name, defaultValue);
}
/// Retrieve the named value as a decimal.
public decimal GetDecimal (String name, decimal defaultValue = 0)
{
return values.GetDecimal(name, defaultValue);
}
/// Retrieve the named value as a DateTime.
public DateTime GetDateTime (String name)
{
return values.GetDateTime(name);
}
/// Retrieve the named value as a date.
public DateTime GetDate (String name)
{
return values.GetDate(name);
}
/// Retrieve the named value as a time.
public DateTime GetTime (String name)
{
return values.GetTime(name);
}
//---------------------------------------------------------------
// Conversion.
//---------------------------------------------------------------
public List ToNamedValueList ()
{
List values = new List();
foreach (String name in this.values.Keys)
values.Add(new NamedValue(name, this.values.GetValue(name)));
return values;
}
/// Concatenate the values with the specified delimiters.
public String Concat (String entryDelim = ".", String valueDelim = "=")
{
return values.Concat(entryDelim, valueDelim);
}
//---------------------------------------------------------------
}
//-------------------------------------------------------------------
}
//=======================================================================
public static class NamedValueDictionary
{
//-------------------------------------------------------------------
/// Does the list include a value with the specified name, case insensitive.
public static bool HasValue (this Dictionary values, String name)
{
if (String.IsNullOrEmpty(name)) return false;
return values.ContainsKey(name);
}
//-------------------------------------------------------------------
/// Retrieve the value with the specified name.
public static DataValue GetValue (this Dictionary values, String name)
{
if (StringUtil.IsEmpty(name)) return DataValue.NullValue;
if (values.ContainsKey(name))
return values[name];
return DataValue.NullValue;
}
/// Retrieve the named value as a String.
public static String GetString (this Dictionary values, String name, String defaultValue = "")
{
if (values.HasValue(name)) return values.GetValue(name).ToString();
return defaultValue;
}
/// Retrieve the named value as a boolean.
public static bool GetBool (this Dictionary values, String name, bool defaultValue = false)
{
if (values.HasValue(name)) return values.GetValue(name).AsBool();
return defaultValue;
}
/// Retrieve the named value as a long integer.
public static long GetLong (this Dictionary values, String name, long defaultValue = 0)
{
if (values.HasValue(name)) return values.GetValue(name).AsLong();
return defaultValue;
}
/// Retrieve the named value as a double.
public static double GetDouble (this Dictionary values, String name, double defaultValue = 0)
{
if (values.HasValue(name)) return values.GetValue(name).AsDouble();
return defaultValue;
}
/// Retrieve the named value as a decimal.
public static decimal GetDecimal (this Dictionary values, String name, decimal defaultValue = 0)
{
if (values.HasValue(name)) return values.GetValue(name).AsDecimal();
return defaultValue;
}
/// Retrieve the named value as a DateTime.
public static DateTime GetDateTime (this Dictionary values, String name)
{
if (values.HasValue(name)) return values.GetValue(name).AsDateTime();
return DateTime.MinValue;
}
/// Retrieve the named value as a date.
public static DateTime GetDate (this Dictionary values, String name)
{
if (values.HasValue(name)) return values.GetValue(name).AsDate();
return DateTime.MinValue;
}
/// Retrieve the named value as a time.
public static DateTime GetTime (this Dictionary values, String name)
{
if (values.HasValue(name)) return values.GetValue(name).AsTime();
return DateTime.MinValue;
}
//-------------------------------------------------------------------
// Conversion.
/// Concatenate the values with the specified delimiters.
public static String Concat (this Dictionary values, String entryDelim = ".", String valueDelim = "=")
{
List dataValues = new List();
foreach (String name in values.Keys)
dataValues.Add(name + valueDelim + values[name]);
return dataValues.Concat(entryDelim);
}
//-------------------------------------------------------------------
}
//=======================================================================
}