public static string Serialize(this IGraphQLField field, string operationType = "query", string operationName = null, IEnumerable <IGraphQLVariable> variables = null)
        {
            var vardeclaration = variables == null ? null : " (" + string.Join(" ", variables.Select(s => $"${s.VariableId}: {s.VariableType}")) + ")";
            var sb             = new StringBuilder($"{operationType} {operationName} {vardeclaration}{{");

            field.SerializeInto(sb, Ident);
            sb.AppendLine("}");
            return(sb.ToString());
        }
        internal static IGraphQLField GetLastField(this IGraphQLField field)
        {
            IGraphQLField prev = null;

            while (field != null)
            {
                prev  = field;
                field = field.SubFields?.SingleOrDefault();
            }
            return(prev);
        }
        internal static IEnumerable <string> GetBindingPath(this IGraphQLField field)
        {
            List <string> path = null;

            while (field != null)
            {
                if (field.Name != null)
                {
                    (path ?? (path = new List <string>())).Add(field.Alias ?? field.Name);
                }
                field = field.SubFields?.SingleOrDefault();
            }
            return(path);
        }
        static void SerializeInto(this IGraphQLField field, StringBuilder sb, int identation)
        {
            sb.AppendLine();

            sb.Append(new string(' ', identation));
            if (field.Name == null)
            {
                if (!field.SubFields?.Any() ?? true)
                {
                    return;
                }

                foreach (var f in field.SubFields)
                {
                    f.SerializeInto(sb, identation + Ident);
                }
                sb.AppendLine();
                return;
            }

            if (field.Alias != null)
            {
                sb.Append($"{field.Alias}: ");
            }
            sb.Append(field.Name);
            if (field.Argument != null)
            {
                sb.Append($" ({field.Argument})");
            }

            if (!field.SubFields?.Any() ?? true)
            {
                return;
            }

            sb.Append(" {");
            foreach (var f in field.SubFields)
            {
                f.SerializeInto(sb, identation + Ident);
            }
            sb.AppendLine();
            sb.Append(new string(' ', identation));
            sb.AppendLine("}");
        }