private bool ProcessVariable(VarSpec varSpec, bool multiVariableExpression = false)
{
var varname = varSpec.VarName.ToString();
if (_ParameterNames != null) _ParameterNames.Add(varname);
if (!_Parameters.ContainsKey(varname)
|| _Parameters[varname] == null
|| (_Parameters[varname] is IList && ((IList) _Parameters[varname]).Count == 0)
|| (_Parameters[varname] is IDictionary && ((IDictionary) _Parameters[varname]).Count == 0))
{
if (_resolvePartially == true)
{
if (multiVariableExpression)
{
if (varSpec.First)
{
_Result.Append("{");
}
_Result.Append(varSpec.ToString());
}
else
{
_Result.Append("{");
_Result.Append(varSpec.ToString());
_Result.Append("}");
}
return false;
}
return false;
}
if (varSpec.First)
{
_Result.Append(varSpec.OperatorInfo.First);
}
else
{
_Result.Append(varSpec.OperatorInfo.Seperator);
}
object value = _Parameters[varname];
// Handle Strings
if (value is string)
{
var stringValue = (string)value;
if (varSpec.OperatorInfo.Named)
{
_Result.AppendName(varname, varSpec.OperatorInfo, string.IsNullOrEmpty(stringValue));
}
_Result.AppendValue(stringValue, varSpec.PrefixLength, varSpec.OperatorInfo.AllowReserved);
}
else
{
// Handle Lists
var list = value as IList;
if (list == null && value is IEnumerable<string>)
{
list = ((IEnumerable<string>)value).ToList<string>();
} ;
if (list != null)
{
if (varSpec.OperatorInfo.Named && !varSpec.Explode) // exploding will prefix with list name
{
_Result.AppendName(varname, varSpec.OperatorInfo, list.Count == 0);
}
_Result.AppendList(varSpec.OperatorInfo, varSpec.Explode, varname, list);
}
else
{
// Handle associative arrays
var dictionary = value as IDictionary<string, string>;
if (dictionary != null)
{
if (varSpec.OperatorInfo.Named && !varSpec.Explode) // exploding will prefix with list name
{
_Result.AppendName(varname, varSpec.OperatorInfo, dictionary.Count() == 0);
}
_Result.AppendDictionary(varSpec.OperatorInfo, varSpec.Explode, dictionary);
}
else
{
// If above all fails, convert the object to string using the default object.ToString() implementation
var stringValue = value.ToString();
if (varSpec.OperatorInfo.Named)
{
_Result.AppendName(varname, varSpec.OperatorInfo, string.IsNullOrEmpty(stringValue));
}
_Result.AppendValue(stringValue, varSpec.PrefixLength, varSpec.OperatorInfo.AllowReserved);
}
}
}
return true;
}