Skip to content

Commit 0f1774e

Browse files
izanhzhvirzak
andauthored
refactor: auto-generate sync methods (#807)
- Refactored code towards more auto-generated sync methods - Refactored `CsvWriter` - Added cancellation token to FlushAsync --------- Co-authored-by: Victor Irzak <[email protected]>
1 parent 80c26e3 commit 0f1774e

File tree

5 files changed

+646
-888
lines changed

5 files changed

+646
-888
lines changed

src/MiniExcel/Csv/CsvWriter.cs

Lines changed: 27 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace MiniExcelLibs.Csv
1313
{
14-
internal class CsvWriter : IExcelWriter, IDisposable
14+
internal partial class CsvWriter : IExcelWriter, IDisposable
1515
{
1616
private readonly StreamWriter _writer;
1717
private readonly CsvConfiguration _configuration;
@@ -27,26 +27,6 @@ public CsvWriter(Stream stream, object value, IConfiguration configuration, bool
2727
_writer = _configuration.StreamWriterFunc(stream);
2828
}
2929

30-
public int[] SaveAs()
31-
{
32-
if (_value == null)
33-
{
34-
_writer.Write("");
35-
_writer.Flush();
36-
return new int[0];
37-
}
38-
39-
var rowsWritten = WriteValues(_value);
40-
_writer.Flush();
41-
42-
return new[] { rowsWritten };
43-
}
44-
45-
public int Insert(bool overwriteSheet = false)
46-
{
47-
return SaveAs().FirstOrDefault();
48-
}
49-
5030
private void AppendColumn(StringBuilder rowBuilder, CellWriteInfo column)
5131
{
5232
rowBuilder.Append(CsvHelpers.ConvertToCsvValue(ToCsvString(column.Value, column.Prop), _configuration));
@@ -57,69 +37,31 @@ private static void RemoveTrailingSeparator(StringBuilder rowBuilder)
5737
{
5838
if (rowBuilder.Length == 0)
5939
return;
60-
40+
6141
rowBuilder.Remove(rowBuilder.Length - 1, 1);
6242
}
6343

6444
private string GetHeader(List<ExcelColumnInfo> props) => string.Join(
6545
_configuration.Seperator.ToString(),
6646
props.Select(s => CsvHelpers.ConvertToCsvValue(s?.ExcelColumnName, _configuration)));
6747

68-
private int WriteValues(object values)
69-
{
70-
var writeAdapter = MiniExcelWriteAdapterFactory.GetWriteAdapter(values, _configuration);
71-
72-
var props = writeAdapter.GetColumns();
73-
if (props == null)
74-
{
75-
_writer.Write(_configuration.NewLine);
76-
_writer.Flush();
77-
return 0;
78-
}
79-
80-
if (_printHeader)
81-
{
82-
_writer.Write(GetHeader(props));
83-
_writer.Write(_configuration.NewLine);
84-
}
85-
86-
if (writeAdapter == null)
87-
return 0;
88-
89-
var rowBuilder = new StringBuilder();
90-
var rowsWritten = 0;
91-
92-
foreach (var row in writeAdapter.GetRows(props))
93-
{
94-
rowBuilder.Clear();
95-
foreach (var column in row)
96-
{
97-
AppendColumn(rowBuilder, column);
98-
}
99-
RemoveTrailingSeparator(rowBuilder);
100-
_writer.Write(rowBuilder.ToString());
101-
_writer.Write(_configuration.NewLine);
102-
103-
rowsWritten++;
104-
}
105-
return rowsWritten;
106-
}
107-
108-
private async Task<int> WriteValuesAsync(StreamWriter writer, object values, string seperator, string newLine, CancellationToken cancellationToken)
48+
[Zomp.SyncMethodGenerator.CreateSyncVersion]
49+
private async Task<int> WriteValuesAsync(StreamWriter writer, object values, string seperator, string newLine, CancellationToken cancellationToken = default)
10950
{
11051
cancellationToken.ThrowIfCancellationRequested();
111-
112-
#if NETSTANDARD2_0_OR_GREATER || NET
52+
11353
IMiniExcelWriteAdapter writeAdapter = null;
11454
if (!MiniExcelWriteAdapterFactory.TryGetAsyncWriteAdapter(values, _configuration, out var asyncWriteAdapter))
11555
{
11656
writeAdapter = MiniExcelWriteAdapterFactory.GetWriteAdapter(values, _configuration);
11757
}
118-
var props = writeAdapter != null ? writeAdapter.GetColumns() : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false);
58+
List<ExcelColumnInfo> props;
59+
#if SYNC_ONLY
60+
props = writeAdapter?.GetColumns();
11961
#else
120-
IMiniExcelWriteAdapter writeAdapter = MiniExcelWriteAdapterFactory.GetWriteAdapter(values, _configuration);
121-
var props = writeAdapter.GetColumns();
62+
props = writeAdapter != null ? writeAdapter.GetColumns() : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false);
12263
#endif
64+
12365
if (props == null)
12466
{
12567
await _writer.WriteAsync(_configuration.NewLine
@@ -134,7 +76,7 @@ await _writer.FlushAsync(
13476
).ConfigureAwait(false);
13577
return 0;
13678
}
137-
79+
13880
if (_printHeader)
13981
{
14082
await _writer.WriteAsync(GetHeader(props)
@@ -148,10 +90,10 @@ await _writer.WriteAsync(newLine
14890
#endif
14991
).ConfigureAwait(false);
15092
}
151-
93+
15294
var rowBuilder = new StringBuilder();
15395
var rowsWritten = 0;
154-
96+
15597
if (writeAdapter != null)
15698
{
15799
foreach (var row in writeAdapter.GetRows(props, cancellationToken))
@@ -162,7 +104,7 @@ await _writer.WriteAsync(newLine
162104
cancellationToken.ThrowIfCancellationRequested();
163105
AppendColumn(rowBuilder, column);
164106
}
165-
107+
166108
RemoveTrailingSeparator(rowBuilder);
167109
await _writer.WriteAsync(rowBuilder.ToString()
168110
#if NET5_0_OR_GREATER
@@ -174,24 +116,24 @@ await _writer.WriteAsync(newLine
174116
.AsMemory(), cancellationToken
175117
#endif
176118
).ConfigureAwait(false);
177-
119+
178120
rowsWritten++;
179121
}
180122
}
181-
#if NETSTANDARD2_0_OR_GREATER || NET
182123
else
183124
{
125+
#if !SYNC_ONLY
184126
await foreach (var row in asyncWriteAdapter.GetRowsAsync(props, cancellationToken).ConfigureAwait(false))
185127
{
186128
cancellationToken.ThrowIfCancellationRequested();
187129
rowBuilder.Clear();
188-
130+
189131
await foreach (var column in row.ConfigureAwait(false))
190132
{
191133
cancellationToken.ThrowIfCancellationRequested();
192134
AppendColumn(rowBuilder, column);
193135
}
194-
136+
195137
RemoveTrailingSeparator(rowBuilder);
196138
await _writer.WriteAsync(rowBuilder.ToString()
197139
#if NET5_0_OR_GREATER
@@ -203,18 +145,19 @@ await _writer.WriteAsync(newLine
203145
.AsMemory(), cancellationToken
204146
#endif
205147
).ConfigureAwait(false);
206-
148+
207149
rowsWritten++;
208150
}
209-
}
210151
#endif
152+
}
211153
return rowsWritten;
212154
}
213155

156+
[Zomp.SyncMethodGenerator.CreateSyncVersion]
214157
public async Task<int[]> SaveAsAsync(CancellationToken cancellationToken = default)
215158
{
216159
cancellationToken.ThrowIfCancellationRequested();
217-
160+
218161
var seperator = _configuration.Seperator.ToString();
219162
var newLine = _configuration.NewLine;
220163

@@ -239,10 +182,11 @@ await _writer.FlushAsync(
239182
cancellationToken
240183
#endif
241184
).ConfigureAwait(false);
242-
185+
243186
return new[] { rowsWritten };
244187
}
245188

189+
[Zomp.SyncMethodGenerator.CreateSyncVersion]
246190
public async Task<int> InsertAsync(bool overwriteSheet = false, CancellationToken cancellationToken = default)
247191
{
248192
var rowsWritten = await SaveAsAsync(cancellationToken).ConfigureAwait(false);
@@ -260,11 +204,11 @@ public string ToCsvString(object value, ExcelColumnInfo p)
260204
{
261205
return dateTime.ToString(p.ExcelFormat, _configuration.Culture);
262206
}
263-
return _configuration.Culture.Equals(CultureInfo.InvariantCulture)
264-
? dateTime.ToString("yyyy-MM-dd HH:mm:ss", _configuration.Culture)
207+
return _configuration.Culture.Equals(CultureInfo.InvariantCulture)
208+
? dateTime.ToString("yyyy-MM-dd HH:mm:ss", _configuration.Culture)
265209
: dateTime.ToString(_configuration.Culture);
266210
}
267-
211+
268212
if (p?.ExcelFormat != null && value is IFormattable formattableValue)
269213
return formattableValue.ToString(p.ExcelFormat, _configuration.Culture);
270214

0 commit comments

Comments
 (0)