public string ParseToJsonString(DateParsingStrategy dateHandling = DateParsingStrategy.HyphenSeparators) { StringBuilder sb = new StringBuilder(); sb.Append("{\"query\": \"{ "); sb.Append($"{MethodName}"); //method name if (Parameters != null) { sb.Append("("); //opening paren foreach (var param in Parameters) { bool isLast = Parameters.IndexOf(param) == Parameters.Count - 1; sb.Append($"{param.Name}: {ParserHelpers.ParseValue(param.Value, dateHandling)}"); if (!isLast) { sb.Append(", "); } } sb.Append(")"); //closing method paren } if (ReturnValues != null) { foreach (var retVal in ReturnValues) { if (ReturnValues.First() == retVal) { sb.Append("{"); } sb = ParseReturnValueRecursively(sb, retVal, dateHandling); if (ReturnValues.Last() == retVal) { sb.Append("}"); } } } sb.Append("}\"}\""); //close the bracket enclosing the method, and the opening query bracket return(sb.ToString()); }
private StringBuilder ParseReturnValueRecursively(StringBuilder sb, GqlReturnValue retVal, DateParsingStrategy dateHandling = DateParsingStrategy.HyphenSeparators) { sb.Append($"{retVal.Name} "); var inlineMethod = retVal as GqlInlineMethodReturnValue; if (inlineMethod != null && inlineMethod.MethodParameters?.Count > 0) { sb.Append("("); int paramCount = inlineMethod.MethodParameters.Count; foreach (var param in inlineMethod.MethodParameters) { bool isLast = inlineMethod.MethodParameters.IndexOf(param) == paramCount - 1; sb.Append($"{param.Name}: {ParserHelpers.ParseValue(param.Value, dateHandling)}"); if (!isLast) { sb.Append(","); } } sb.Append(")"); } if (retVal.Descendants != null) { sb.Append("{"); foreach (var innerRetVal in retVal.Descendants) { ParseReturnValueRecursively(sb, innerRetVal); } } if (retVal.Descendants?.Count > 0) { sb.Append("}"); } return(sb); }
/// <summary> /// Converts the given value into a string, and performs some cleanup logic for easier server-side consumption. /// Wraps strings in backslashes and quotes, and ensures that numerics get ToString()ed into the Invariant forms. /// </summary> /// <param name="value">The Value to convert into a string.</param> /// <returns>The string form of the given value.</returns> public static string ParseValue(object value, DateParsingStrategy dateHandling = DateParsingStrategy.HyphenSeparators) { if (value is GqlTuple) { GqlTuple tuple = value as GqlTuple; return(tuple.ToString()); } if (value is string) //because the server needs strings escaped... ◔_◔ { return($"\\\"{value}\\\""); } if (value is int) { int intVal = (int)value; return($"{intVal.ToString(NumberFormatInfo.InvariantInfo)}"); } if (value is bool) { bool boolVal = (bool)value; return(boolVal.ToString().ToLowerInvariant()); } if (value is float) { float floatVal = (float)value; return($"{floatVal.ToString(NumberFormatInfo.InvariantInfo)}"); } if (value is double) { double doubleVal = (double)value; return($"{doubleVal.ToString(NumberFormatInfo.InvariantInfo)}"); } //server expects Dates as strings (with the associated double quotes and backslashes) in ISO 8601 format: YYYY-MM-DD. Apparently YYYY-M-D is fine too. if (value is DateTime) { DateTime dateTimeVal = (DateTime)value; switch (dateHandling) { case DateParsingStrategy.HyphenSeparators: return($"\\\"{dateTimeVal.Date.Year.ToString(NumberFormatInfo.InvariantInfo)}-{dateTimeVal.Date.Month.ToString("00")}-{dateTimeVal.Date.Day.ToString("00")}\\\""); case DateParsingStrategy.NoSeparators: return($"\\\"{dateTimeVal.Date.Year.ToString(NumberFormatInfo.InvariantInfo)}{dateTimeVal.Date.Month.ToString("00")}{dateTimeVal.Date.Day.ToString("00")}\\\""); } } //server expects Times as strings (with associated double quotes and backslashes) in 24-hr HH:MM:SS format. H:M:S (24-hr) seems to be okay as well. if (value is TimeSpan) { TimeSpan timeSpanVal = (TimeSpan)value; return($"\\\"{timeSpanVal.Hours.ToString(NumberFormatInfo.InvariantInfo)}:{timeSpanVal.Minutes.ToString(NumberFormatInfo.InvariantInfo)}:{timeSpanVal.Seconds.ToString(NumberFormatInfo.InvariantInfo)}\\\""); } if (value is IEnumerable) { var array = value as IEnumerable; var sb = new StringBuilder(); sb.Append("["); foreach (object item in array) { sb.Append(ParseValue(item)); sb.Append(","); } if (sb.Length > 1) { sb.Remove(sb.Length - 1, 1); // Remove the final trailing comma, just in case } sb.Append("]"); return(sb.ToString()); } else { return($"{value}"); } }