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; }
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); }
private void ProcessExpression(StringBuilder currentExpression) { if (currentExpression.Length == 0) { _ErrorDetected = true; _Result.Append("{}"); return; } OperatorInfo op = GetOperator(currentExpression[0]); var firstChar = op.Default ? 0 : 1; bool multivariableExpression = false; var varSpec = new VarSpec(op); for (int i = firstChar; i < currentExpression.Length; i++) { char currentChar = currentExpression[i]; switch (currentChar) { case '*': varSpec.Explode = true; break; case ':': // Parse Prefix Modifier var prefixText = new StringBuilder(); currentChar = currentExpression[++i]; while (currentChar >= '0' && currentChar <= '9' && i < currentExpression.Length) { prefixText.Append(currentChar); i++; if (i < currentExpression.Length) currentChar = currentExpression[i]; } varSpec.PrefixLength = int.Parse(prefixText.ToString()); i--; break; case ',': multivariableExpression = true; var success = ProcessVariable(varSpec, multivariableExpression); bool isFirst = varSpec.First; // Reset for new variable varSpec = new VarSpec(op); if (success || !isFirst || _resolvePartially) varSpec.First = false; if (!success && _resolvePartially) {_Result.Append(",") ; } break; default: if (IsVarNameChar(currentChar)) { varSpec.VarName.Append(currentChar); } else { _ErrorDetected = true; } break; } } ProcessVariable(varSpec, multivariableExpression); if (multivariableExpression && _resolvePartially) _Result.Append("}"); }
private void ProcessExpression(StringBuilder currentExpression) { if (currentExpression.Length == 0) { _ErrorDetected = true; _Result.Append("{}"); return; } OperatorInfo op = GetOperator(currentExpression[0]); var firstChar = op.Default ? 0 : 1; bool multivariableExpression = false; var varSpec = new VarSpec(op); for (int i = firstChar; i < currentExpression.Length; i++) { char currentChar = currentExpression[i]; switch (currentChar) { case '*': varSpec.Explode = true; break; case ':': // Parse Prefix Modifier var prefixText = new StringBuilder(); currentChar = currentExpression[++i]; while (currentChar >= '0' && currentChar <= '9' && i < currentExpression.Length) { prefixText.Append(currentChar); i++; if (i < currentExpression.Length) { currentChar = currentExpression[i]; } } varSpec.PrefixLength = int.Parse(prefixText.ToString()); i--; break; case ',': multivariableExpression = true; var success = ProcessVariable(varSpec, multivariableExpression); bool isFirst = varSpec.First; // Reset for new variable varSpec = new VarSpec(op); if (success || !isFirst || _resolvePartially) { varSpec.First = false; } if (!success && _resolvePartially) { _Result.Append(","); } break; default: if (IsVarNameChar(currentChar)) { varSpec.VarName.Append(currentChar); } else { _ErrorDetected = true; } break; } } ProcessVariable(varSpec, multivariableExpression); if (multivariableExpression && _resolvePartially) { _Result.Append("}"); } }