private void ExpandValues(IEnumerable values, VarSpec varSpec, char separator) { var isNamedAndExploded = varSpec.IsExploded && this.expressionInfo.IsNamed; var name = varSpec.Name; foreach (var value in values) { if (isNamedAndExploded) { this.builder.AppendEncoded(name, this.expressionInfo.AllowReserved); this.builder.Append('='); } this.builder.AppendEncoded(this.ValueToString(value), this.expressionInfo.AllowReserved); this.builder.Append(separator); } }
private bool ProcessVariable(VarSpec varSpec) { 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)) 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) { AppendName(varname, varSpec.OperatorInfo, string.IsNullOrEmpty(stringValue)); } AppendValue(stringValue, varSpec.PrefixLength, varSpec.OperatorInfo.AllowReserved); } else { // Handle Lists var list = value as IEnumerable<string>; if (list != null) { if (varSpec.OperatorInfo.Named && !varSpec.Explode) // exploding will prefix with list name { AppendName(varname, varSpec.OperatorInfo, list.Count() == 0); } 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 { AppendName(varname, varSpec.OperatorInfo, dictionary.Count() == 0); } 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) { AppendName(varname, varSpec.OperatorInfo, string.IsNullOrEmpty(stringValue)); } 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; 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 ',': var success = ProcessVariable(varSpec); bool isFirst = varSpec.First; // Reset for new variable varSpec = new VarSpec(op); if (success || !isFirst) varSpec.First = false; break; default: if (IsVarNameChar(currentChar)) { varSpec.VarName.Append(currentChar); } else { _ErrorDetected = true; } break; } } ProcessVariable(varSpec); }
private bool ProcessVariable(VarSpec varSpec) { 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)) return false; if (varSpec.First) { _result.Append(varSpec.OperatorInfo.First); } else { _result.Append(varSpec.OperatorInfo.Seperator); } var value = _parameters[varname]; // Handle Strings var s = value as string; if (s != null) { var stringValue = s; if (varSpec.OperatorInfo.Named) { AppendName(varname, varSpec.OperatorInfo, string.IsNullOrEmpty(stringValue)); } AppendValue(stringValue, varSpec.PrefixLength, varSpec.OperatorInfo.AllowReserved); } else { // Handle Lists var enumr = value as IEnumerable<string>; if (enumr != null) { var list = enumr as string[] ?? enumr.ToArray(); if (varSpec.OperatorInfo.Named && !varSpec.Explode) // exploding will prefix with list name { AppendName(varname, varSpec.OperatorInfo, !list.Any()); } AppendList(varSpec.OperatorInfo, varSpec.Explode, varname, list); } else { // Handle associative arrays var dictionary = value as IDictionary<string, string>; if (dictionary == null) return true; if (varSpec.OperatorInfo.Named && !varSpec.Explode) // exploding will prefix with list name { AppendName(varname, varSpec.OperatorInfo, !dictionary.Any()); } AppendDictionary(varSpec.OperatorInfo, varSpec.Explode, dictionary); } } return true; }
bool ProcessVariable(VarSpec varSpec) { 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)) return false; if (varSpec.First) { result.Append(varSpec.OperatorInfo.First); } else { result.Append(varSpec.OperatorInfo.Seperator); } var value = parameters[varname]; // Handle Strings if (value is string) { var stringValue = (string)value; if (varSpec.OperatorInfo.Named) { AppendName(varname, varSpec.OperatorInfo, string.IsNullOrEmpty(stringValue)); } AppendValue(stringValue, varSpec.PrefixLength, varSpec.OperatorInfo.AllowReserved); } else { // Handle Lists var list = value as IEnumerable<string>; if (list != null) { if (varSpec.OperatorInfo.Named && !varSpec.Explode) // exploding will prefix with list name { AppendName(varname, varSpec.OperatorInfo, list.Count() == 0); } 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 { AppendName(varname, varSpec.OperatorInfo, dictionary.Count() == 0); } AppendDictionary(varSpec.OperatorInfo, varSpec.Explode, dictionary); } else { var stringValue = value == null ? null : value.ToString(); if (varSpec.OperatorInfo.Named) { AppendName(varname, varSpec.OperatorInfo, string.IsNullOrEmpty(stringValue)); } AppendValue(stringValue, varSpec.PrefixLength, varSpec.OperatorInfo.AllowReserved); } } } return true; }
private void ExpandValues(IEnumerable <KeyValuePair <string, object> > values, VarSpec varSpec, char separator) { var isExploded = varSpec.IsExploded; var name = varSpec.Name; var pairSeparator = isExploded ? '=' : ','; foreach (var pair in values) { this.builder.AppendEncoded(pair.Key, this.expressionInfo.AllowReserved); this.builder.Append(pairSeparator); if (!(pair.Value is string) && pair.Value is IEnumerable innerValues) { bool hasValue = false; foreach (var innerValue in innerValues) { this.builder.AppendEncoded(this.ValueToString(innerValue), this.expressionInfo.AllowReserved); this.builder.Append(','); hasValue = true; } if (hasValue) { this.builder.RemoveLastChar(); } } else { this.builder.AppendEncoded(this.ValueToString(pair.Value), this.expressionInfo.AllowReserved); } this.builder.Append(separator); } }
private void ExpandValues(IEnumerable <KeyValuePair <string, string> > values, VarSpec varSpec, char separator) { var isExploded = varSpec.IsExploded; var name = varSpec.Name; var pairSeparator = isExploded ? '=' : ','; foreach (var pair in values) { this.builder.AppendEncoded(pair.Key, this.expressionInfo.AllowReserved); this.builder.Append(pairSeparator); this.builder.AppendEncoded(pair.Value, this.expressionInfo.AllowReserved); this.builder.Append(separator); } }
private void Expand(VarSpec varSpec, QueryObject values) { bool isEmpty = values.Count == 0; this.Expand(varSpec, isEmpty, values, this.ExpandValues); }
private void Expand(VarSpec varSpec, IEnumerable <KeyValuePair <string, object> > values) { bool isEmpty = !values.Any(); this.Expand(varSpec, isEmpty, values, this.ExpandValues); }
private void Expand(VarSpec varSpec, IEnumerable values) { bool isEmpty = !values.Any(); this.Expand(varSpec, isEmpty, values, this.ExpandValues); }
private void Expand(VarSpec varSpec, string value) { this.ExpandName(varSpec, value == string.Empty); this.ExpandStringValue(value, varSpec.MaxLength); }