private void RenderElement(StringBuilder builder, VariableReference variable, object variableValue, bool firstVariable, bool firstElement) { if (builder == null) throw new ArgumentNullException("builder"); if (variableValue == null) throw new ArgumentNullException("variableValue"); if (firstElement || variable.Composite) builder.Append('.'); else if (!firstElement) builder.Append(','); AppendText(builder, variable, variableValue.ToString(), true); }
protected override void RenderEnumerable(StringBuilder builder, VariableReference variable, IEnumerable variableValue, bool first) { bool firstElement = true; foreach (object value in variableValue) { if (value == null) continue; RenderElement(builder, variable, value, first, firstElement); firstElement = false; } }
private static string BuildVariablePattern(VariableReference variable, bool allowReservedSet, string groupName, ICollection<string> requiredVariables, ICollection<string> arrayVariables, ICollection<string> mapVariables) { string characterPattern; if (allowReservedSet) characterPattern = "(?:" + UnreservedCharacterPattern + "|" + ReservedCharacterPattern + ")"; else characterPattern = "(?:" + UnreservedCharacterPattern + ")"; string valueStartPattern; if (!string.IsNullOrEmpty(groupName)) valueStartPattern = "(?<" + groupName + ">"; else valueStartPattern = "(?:"; string valueEndPattern = ")"; string keyStartPattern; if (!string.IsNullOrEmpty(groupName)) keyStartPattern = "(?<" + groupName + "key>"; else keyStartPattern = "(?:"; string keyEndPattern = ")"; string mapValueStartPattern; if (!string.IsNullOrEmpty(groupName)) mapValueStartPattern = "(?<" + groupName + "value>"; else mapValueStartPattern = "(?:"; string mapValueEndPattern = ")"; string countPattern; if (allowReservedSet) countPattern = "*?"; else countPattern = "*?"; StringBuilder variablePattern = new StringBuilder(); if (variable.Prefix != null) { // by this point we know to match the variable as a simple string variablePattern.Append(valueStartPattern); variablePattern.Append(characterPattern); variablePattern.Append("{0,").Append(variable.Prefix).Append("}"); variablePattern.Append(valueEndPattern); return variablePattern.ToString(); } bool treatAsArray = arrayVariables.Contains(variable.Name); bool treatAsMap = mapVariables.Contains(variable.Name); bool considerString = !variable.Composite && !treatAsArray && !treatAsMap; bool considerArray = treatAsArray || !treatAsMap; bool considerMap = treatAsMap || !treatAsArray; variablePattern.Append("(?:"); if (considerString) { // could be a simple string variablePattern.Append(valueStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(valueEndPattern); } if (considerArray) { if (considerString) variablePattern.Append('|'); // could be an associative array variablePattern.Append(valueStartPattern).Append(characterPattern).Append(countPattern).Append(valueEndPattern); variablePattern.Append("(?:").Append(variable.Composite ? @"\." : ","); variablePattern.Append(valueStartPattern).Append(characterPattern).Append(countPattern).Append(valueEndPattern); variablePattern.Append(")*?"); } if (considerMap) { if (considerString || considerArray) variablePattern.Append('|'); // could be an associative map char separator = variable.Composite ? '=' : ','; variablePattern.Append(valueStartPattern); variablePattern.Append(keyStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(keyEndPattern); variablePattern.Append(separator).Append(mapValueStartPattern).Append(characterPattern).Append(countPattern).Append(mapValueEndPattern); variablePattern.Append(valueEndPattern); variablePattern.Append("(?:").Append(variable.Composite ? @"\." : ","); variablePattern.Append(valueStartPattern); variablePattern.Append(keyStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(keyEndPattern); variablePattern.Append(separator).Append(mapValueStartPattern).Append(characterPattern).Append(countPattern).Append(mapValueEndPattern); variablePattern.Append(valueEndPattern); variablePattern.Append(")*?"); } variablePattern.Append(")"); return variablePattern.ToString(); }
protected override void RenderDictionary(StringBuilder builder, VariableReference variable, IDictionary variableValue, bool first) { bool firstElement = true; foreach (DictionaryEntry entry in variableValue) { if (variable.Composite) { builder.Append('.'); AppendText(builder, variable, entry.Key.ToString(), true); builder.Append('='); AppendText(builder, variable, entry.Value.ToString(), true); } else { RenderElement(builder, variable, entry.Key, first, firstElement); RenderElement(builder, variable, entry.Value, first, false); } firstElement = false; } }
protected override void RenderElement(StringBuilder builder, VariableReference variable, object variableValue, bool first) { RenderElement(builder, variable, variableValue, first, true); }
protected override void RenderElement(StringBuilder builder, VariableReference variable, object variableValue, bool first) { if (builder == null) throw new ArgumentNullException("builder"); if (variableValue == null) throw new ArgumentNullException("variableValue"); if (first) builder.Append('#'); if (!first) builder.Append(','); AppendText(builder, variable, variableValue.ToString(), false); }
private void RenderElement(StringBuilder builder, VariableReference variable, object variableValue, bool firstVariable, bool firstElement) { if (builder == null) throw new ArgumentNullException("builder"); if (variableValue == null) throw new ArgumentNullException("variableValue"); if (firstElement || variable.Composite) builder.Append(Type == UriTemplatePartType.Query && firstVariable && firstElement ? '?' : '&').Append(variable.Name).Append('='); else if (!firstElement) builder.Append(','); AppendText(builder, variable, variableValue.ToString(), true); }
private static string BuildVariablePattern(VariableReference variable, bool allowReservedSet, string groupName, ICollection<string> requiredVariables, ICollection<string> arrayVariables, ICollection<string> mapVariables) { string characterPattern; if (allowReservedSet) characterPattern = "(?:" + UnreservedCharacterPattern + "|" + ReservedCharacterPattern + ")"; else characterPattern = "(?:" + UnreservedCharacterPattern + ")"; string valueStartPattern; if (!string.IsNullOrEmpty(groupName)) valueStartPattern = "(?<" + groupName + ">"; else valueStartPattern = "(?:"; string valueEndPattern = ")"; string nameStartPattern; if (!string.IsNullOrEmpty(groupName)) nameStartPattern = "(?<" + groupName + "name>"; else nameStartPattern = "(?:"; string nameEndPattern = ")"; string keyStartPattern; if (!string.IsNullOrEmpty(groupName)) keyStartPattern = "(?<" + groupName + "key>"; else keyStartPattern = "(?:"; string keyEndPattern = ")"; string mapValueStartPattern; if (!string.IsNullOrEmpty(groupName)) mapValueStartPattern = "(?<" + groupName + "value>"; else mapValueStartPattern = "(?:"; string mapValueEndPattern = ")"; string countPattern; if (allowReservedSet) countPattern = "*?"; else countPattern = "*"; StringBuilder variablePattern = new StringBuilder(); if (variable.Prefix != null) { // by this point we know to match the variable as a simple string variablePattern.Append("(?:"); variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern).Append('='); variablePattern.Append(valueStartPattern); variablePattern.Append(characterPattern); variablePattern.Append("{0,").Append(variable.Prefix).Append("}"); variablePattern.Append(valueEndPattern); variablePattern.Append(")"); return variablePattern.ToString(); } bool treatAsArray = arrayVariables.Contains(variable.Name); bool treatAsMap = mapVariables.Contains(variable.Name); bool considerString = !variable.Composite && !treatAsArray && !treatAsMap; bool considerArray = treatAsArray || !treatAsMap; bool considerMap = treatAsMap || !treatAsArray; variablePattern.Append("(?:"); if (considerString) { // could be a simple string variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern).Append('='); variablePattern.Append(valueStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(valueEndPattern); } if (considerArray) { if (considerString) variablePattern.Append('|'); // could be an associative array variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern).Append('='); variablePattern.Append(valueStartPattern).Append(characterPattern).Append(countPattern).Append(valueEndPattern); if (!variable.Composite) { /* Composite variables appear as separate query parameters that are aggregated by the Match method. * This expression only needs to handle the non-composite case. */ variablePattern.Append("(?:,"); variablePattern.Append(valueStartPattern).Append(characterPattern).Append(countPattern).Append(valueEndPattern); variablePattern.Append(")*?"); } } if (considerMap) { if (considerString || considerArray) variablePattern.Append('|'); if (!variable.Composite) variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern).Append('='); // could be an associative map char separator = variable.Composite ? '=' : ','; variablePattern.Append(valueStartPattern); variablePattern.Append(keyStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(keyEndPattern); variablePattern.Append(separator).Append(mapValueStartPattern).Append(characterPattern).Append(countPattern).Append(mapValueEndPattern); variablePattern.Append(valueEndPattern); if (!variable.Composite) { /* Composite variables appear as separate query parameters that are aggregated by the Match method. * This expression only needs to handle the non-composite case. */ variablePattern.Append("(?:,"); variablePattern.Append(valueStartPattern); variablePattern.Append(keyStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(keyEndPattern); variablePattern.Append(separator).Append(mapValueStartPattern).Append(characterPattern).Append(countPattern).Append(mapValueEndPattern); variablePattern.Append(valueEndPattern); variablePattern.Append(")*?"); } } variablePattern.Append(")"); return variablePattern.ToString(); }
private void RenderElement(StringBuilder builder, VariableReference variable, object variableValue, bool firstVariable, bool firstElement) { if (builder == null) throw new ArgumentNullException("builder"); if (variableValue == null) throw new ArgumentNullException("variableValue"); if (firstElement || variable.Composite) builder.Append(";").Append(variable.Name); else if (!firstElement) builder.Append(','); string text = variableValue.ToString(); if ((firstElement || variable.Composite) && !string.IsNullOrEmpty(text)) builder.Append('='); AppendText(builder, variable, text, true); }
private static string BuildVariablePattern(VariableReference variable, bool allowReservedSet, string groupName, ICollection<string> requiredVariables, ICollection<string> arrayVariables, ICollection<string> mapVariables) { string characterPattern; if (allowReservedSet) characterPattern = "(?:" + UnreservedCharacterPattern + "|" + ReservedCharacterPattern + ")"; else characterPattern = "(?:" + UnreservedCharacterPattern + ")"; string valueStartPattern; if (!string.IsNullOrEmpty(groupName)) valueStartPattern = "(?<" + groupName + ">"; else valueStartPattern = "(?:"; string valueEndPattern = ")"; string nameStartPattern; if (!string.IsNullOrEmpty(groupName)) nameStartPattern = "(?<" + groupName + "name>"; else nameStartPattern = "(?:"; string nameEndPattern = ")"; string keyStartPattern; if (!string.IsNullOrEmpty(groupName)) keyStartPattern = "(?<" + groupName + "key>"; else keyStartPattern = "(?:"; string keyEndPattern = ")"; string mapValueStartPattern; if (!string.IsNullOrEmpty(groupName)) mapValueStartPattern = "(?<" + groupName + "value>"; else mapValueStartPattern = "(?:"; string mapValueEndPattern = ")"; string countPattern; if (allowReservedSet) countPattern = "*?"; else countPattern = "*"; string positiveCountPattern; if (allowReservedSet) positiveCountPattern = "+?"; else positiveCountPattern = "+"; StringBuilder variablePattern = new StringBuilder(); if (variable.Prefix != null) { // by this point we know to match the variable as a simple string variablePattern.Append("(?:"); variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern); // the '=' is only included for non-empty values variablePattern.Append("(?:="); variablePattern.Append(valueStartPattern); variablePattern.Append(characterPattern); variablePattern.Append("{1,").Append(variable.Prefix).Append("}"); variablePattern.Append(valueEndPattern); variablePattern.Append("|").Append(valueStartPattern).Append(valueEndPattern); variablePattern.Append(")"); variablePattern.Append(")"); return variablePattern.ToString(); } bool treatAsArray = arrayVariables.Contains(variable.Name); bool treatAsMap = mapVariables.Contains(variable.Name); bool considerString = !variable.Composite && !treatAsArray && !treatAsMap; bool considerArray = treatAsArray || !treatAsMap; bool considerMap = treatAsMap || !treatAsArray; variablePattern.Append("(?:"); if (considerString) { // could be a simple string variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern); // the '=' is only included for non-empty values variablePattern.Append("(?:="); variablePattern.Append(valueStartPattern); variablePattern.Append(characterPattern).Append(positiveCountPattern); variablePattern.Append(valueEndPattern); variablePattern.Append("|").Append(valueStartPattern).Append(valueEndPattern); variablePattern.Append(")"); } if (considerArray) { if (considerString) variablePattern.Append('|'); // could be an associative array variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern); if (variable.Composite) { // the '=' is only included for non-empty values variablePattern.Append("(?:="); variablePattern.Append(valueStartPattern).Append(characterPattern).Append(positiveCountPattern).Append(valueEndPattern); variablePattern.Append("|").Append(valueStartPattern).Append(valueEndPattern); variablePattern.Append(")"); } else { // the '=' is only included for non-empty values variablePattern.Append("(?:"); // positiveCountPattern if only one item variablePattern.Append('='); variablePattern.Append(valueStartPattern).Append(characterPattern).Append(positiveCountPattern).Append(valueEndPattern); // countPattern for multiple items (the ',' will make the value non-empty) variablePattern.Append("|="); variablePattern.Append(valueStartPattern).Append(characterPattern).Append(countPattern).Append(valueEndPattern); variablePattern.Append("(?:,"); variablePattern.Append(valueStartPattern).Append(characterPattern).Append(countPattern).Append(valueEndPattern); variablePattern.Append(")+?"); // zero items variablePattern.Append("|").Append(valueStartPattern).Append(valueEndPattern); variablePattern.Append(")"); } } if (considerMap) { if (considerString || considerArray) variablePattern.Append('|'); // could be an associative map if (variable.Composite) { variablePattern.Append(valueStartPattern); variablePattern.Append(keyStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(keyEndPattern); // the '=' is only included for non-empty values variablePattern.Append("(?:="); variablePattern.Append(mapValueStartPattern).Append(characterPattern).Append(positiveCountPattern).Append(mapValueEndPattern); variablePattern.Append("|").Append(mapValueStartPattern).Append(mapValueEndPattern); variablePattern.Append(")"); variablePattern.Append(valueEndPattern); } else { variablePattern.Append(nameStartPattern).Append(Regex.Escape(variable.Name)).Append(nameEndPattern); // the '=' is only included for non-empty values variablePattern.Append("(?:="); // the ',' between the key and value allows countPattern and still never empty variablePattern.Append(valueStartPattern); variablePattern.Append(keyStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(keyEndPattern); variablePattern.Append(',').Append(mapValueStartPattern).Append(characterPattern).Append(countPattern).Append(mapValueEndPattern); variablePattern.Append(valueEndPattern); /* Composite variables appear as separate path parameters that are aggregated by the Match method. * This expression only needs to handle the non-composite case. */ variablePattern.Append("(?:,"); variablePattern.Append(valueStartPattern); variablePattern.Append(keyStartPattern); variablePattern.Append(characterPattern).Append(countPattern); variablePattern.Append(keyEndPattern); variablePattern.Append(',').Append(mapValueStartPattern).Append(characterPattern).Append(countPattern).Append(mapValueEndPattern); variablePattern.Append(valueEndPattern); variablePattern.Append(")*?"); // zero items variablePattern.Append("|").Append(valueStartPattern).Append(valueEndPattern); variablePattern.Append(")"); } } variablePattern.Append(")"); return variablePattern.ToString(); }