Example #1
0
        public void Write(T row)
        {
            AssertNotDisposed();

            var shouldEndRecord = true;

            if (IsFirstRow)
            {
                if (!CheckHeaders())
                {
                    shouldEndRecord = false;
                }
            }

            if (shouldEndRecord)
            {
                EndRecord();
            }

            for (var i = 0; i < Columns.Length; i++)
            {
                var needsSeparator = i != 0;

                if (needsSeparator)
                {
                    PlaceCharInStaging(Config.ValueSeparator);
                }

                var col = Columns[i];

                var ctx = new WriteContext(RowNumber, i, col.Name, Context);

                if (!col.Write(row, ctx, Buffer))
                {
                    Throw.SerializationException($"Could not write column {col.Name}, formatter returned false");
                }

                var res = Buffer.Buffer;
                if (res.IsEmpty)
                {
                    // nothing was written, so just move on
                    continue;
                }

                WriteValue(res);
                Buffer.Reset();
            }

            RowNumber++;
        }
Example #2
0
        internal override void WriteInner(dynamic row)
        {
            try
            {
                WriteHeadersAndEndRowIfNeeded(row);

                var wholeRowContext = WriteContext.DiscoveringCells(Configuration.Options, RowNumber, Context);

                var options        = Configuration.Options;
                var valueSeparator = Configuration.ValueSeparatorMemory.Span;

                var cellValuesMem = Utils.GetCells(Configuration.DynamicMemoryPool, ref CellBuffer, options.TypeDescriber, in wholeRowContext, row as object);

                var columnNamesValue = Utils.NonNullValue(ColumnNames);

                Utils.ForceInOrder(columnNamesValue, ColumnNameSorter, cellValuesMem);
                var cellValuesEnumerableSpan = cellValuesMem.Span;

                var i = 0;
                foreach (var cell in cellValuesEnumerableSpan)
                {
                    var needsSeparator = i != 0;

                    if (needsSeparator)
                    {
                        PlaceAllInStaging(valueSeparator);
                    }

                    ColumnIdentifier ci;
                    if (i < columnNamesValue.Length)
                    {
                        var name = columnNamesValue.GetColumnAt(i);
                        ci = ColumnIdentifier.CreateInner(i, null, name);
                    }
                    else
                    {
                        ci = ColumnIdentifier.Create(i);
                    }

                    var ctx = WriteContext.WritingColumn(Configuration.Options, RowNumber, ci, Context);

                    var formatter   = cell.Formatter;
                    var delProvider = (ICreatesCacheableDelegate <Formatter.DynamicFormatterDelegate>)formatter;
                    var del         = delProvider.Guarantee(this);

                    var val = cell.Value as object;
                    if (!del(val, in ctx, Buffer))
                    {
                        Throw.SerializationException($"Could not write column {ci}, formatter {formatter} returned false");
                    }

                    ReadOnlySequence <char> res = default;
                    if (!Buffer.MakeSequence(ref res))
                    {
                        // nothing was written, so just move on
                        goto end;
                    }

                    WriteValue(res);
                    Buffer.Reset();

end:
                    i++;
                }

                RowNumber++;
            }
            catch (Exception e)
            {
                Throw.PoisonAndRethrow(this, e);
            }
        }