/// <inheritdoc/>
        public override bool TryHandleLeave(
            MongoDbProjectionVisitorContext context,
            ISelection selection,
            [NotNullWhen(true)] out ISelectionVisitorAction?action)
        {
            context.Path.Pop();

            action = SelectionVisitor.Continue;
            return(true);
        }
        /// <inheritdoc/>
        public override bool TryHandleEnter(
            MongoDbProjectionVisitorContext context,
            ISelection selection,
            [NotNullWhen(true)] out ISelectionVisitorAction?action)
        {
            IObjectField field = selection.Field;

            context.Path.Push(field.GetName());
            action = SelectionVisitor.Continue;
            return(true);
        }
        public static bool TryCreateQuery(
            this MongoDbProjectionVisitorContext context,
            [NotNullWhen(true)] out MongoDbProjectionDefinition?query)
        {
            query = null;

            if (context.Projections.Count == 0)
            {
                return(false);
            }

            query = new MongoDbCombinedProjectionDefinition(context.Projections.ToArray());
            return(true);
        }
        /// <inheritdoc/>
        public override bool TryHandleEnter(
            MongoDbProjectionVisitorContext context,
            ISelection selection,
            out ISelectionVisitorAction?action)
        {
            IObjectField field = selection.Field;

            context.Path.Push(field.GetName());
            context.Projections.Push(
                new MongoDbIncludeProjectionOperation(context.GetPath()));
            context.Path.Pop();

            action = SelectionVisitor.SkipAndLeave;
            return(true);
        }
 public static string GetPath(this MongoDbProjectionVisitorContext ctx) =>
 string.Join(".", ctx.Path.Reverse());