Esempio n. 1
0
        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());
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        /// <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}");
            }
        }