csharp/0x1000000/SqExpress/SqExpress/SyntaxTreeOperations/ExportImport/Internal/ExprPlainWriter.cs

ExprPlainWriter.cs
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using SqExpress.Syntax;

namespace SqExpress.SyntaxTreeOperations.ExportImport.Internal
{
    public delegate T PlainItemFactory(int id, int parentId, int? arrayIndex, bool isTypeTag, string tag, string? value)
        where T : IPlainItem;

    internal clast ExprPlainWriter : IWalkerVisitor
        where T : IPlainItem
    {
        private readonly List _buffer = new List();

        private readonly PlainItemFactory _factory;

        private int _currentId;

        private int GetNewId() => ++this._currentId;

        public ExprPlainWriter(PlainItemFactory factory)
        {
            this._factory = factory;
        }

        public IReadOnlyList Result => this._buffer;

        public VisitorResult VisitExpr(IExpr expr, string typeTag, int ctx)
        {
            var newId = this._currentId;
            this._buffer.Add(this._factory(newId, ctx, null, true, typeTag, null));
            return VisitorResult.Continue(newId);
        }

        public void EndVisitExpr(IExpr expr, int ctx)
        {
        }

        public void VisitProperty(string name, bool isArray, bool isNull, int ctx)
        {
            if (!isNull && !isArray)
            {
                this._buffer.Add(this._factory(this.GetNewId(), ctx, null, false, name, null));
            }
        }

        public void EndVisitProperty(string name, bool isArray, bool isNull, int ctx)
        {
        }

        public void VisitArrayItem(string name, int arrayIndex, int ctx)
        {
            this._buffer.Add(this._factory(this.GetNewId(), ctx, arrayIndex, false, name, null));
        }

        public void EndVisitArrayItem(string name, int arrayIndex, int ctx)
        {
        }

        public void VisitPlainProperty(string name, string? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value));
        }

        public void VisitPlainProperty(string name, bool? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString(CultureInfo.InvariantCulture)));
        }

        public void VisitPlainProperty(string name, byte? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString(CultureInfo.InvariantCulture)));
        }

        public void VisitPlainProperty(string name, short? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString(CultureInfo.InvariantCulture)));
        }

        public void VisitPlainProperty(string name, int? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString(CultureInfo.InvariantCulture)));
        }

        public void VisitPlainProperty(string name, long? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString(CultureInfo.InvariantCulture)));
        }

        public void VisitPlainProperty(string name, decimal? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString(CultureInfo.InvariantCulture)));
        }

        public void VisitPlainProperty(string name, double? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString(CultureInfo.InvariantCulture)));
        }

        public void VisitPlainProperty(string name, DateTime? value, int ctx)
        {
            if (value != null)
            {
                string ts = value.Value.ToString("yyyy-MM-ddTHH:mm:ss.fff");
                this._buffer.Add(this._factory(ctx, ctx, null, false, name, ts));
            }
        }

        public void VisitPlainProperty(string name, Guid? value, int ctx)
        {
            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value?.ToString("D")));
        }

        public void VisitPlainProperty(string name, IReadOnlyList? value, int ctx)
        {

            this._buffer.Add(this._factory(ctx, ctx, null, false, name, value != null ? Convert.ToBase64String(value.ToArray()) : null));
        }
    }
}