Skip to content

Commit 253c785

Browse files
committed
Cleanup.
1 parent ed08fb9 commit 253c785

File tree

6 files changed

+84
-83
lines changed

6 files changed

+84
-83
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ artifacts/
66
.tmp/
77
cache/
88
.idea/
9+
910
*.user
1011
*.psess
1112
*.log

src/CsvHelper/CsvHelper.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<!-- Assembly -->
44
<AssemblyTitle>CsvHelper</AssemblyTitle>
55
<Description>A library for reading and writing CSV files. Extremely fast, flexible, and easy to use. Supports reading and writing of custom class objects.</Description>
6-
<Copyright>Copyright © 2009-2022 Josh Close</Copyright>
6+
<Copyright>Copyright © 2009-2024 Josh Close</Copyright>
77
<Authors>Josh Close</Authors>
88

99
<!-- Build -->

src/CsvHelper/TypeConversion/NotSupportedTypeConverter.cs

+8-10
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44
// https://github.com/JoshClose/CsvHelper
55
using CsvHelper.Configuration;
66
using System;
7-
using System.Collections.Generic;
8-
using System.Linq;
9-
using System.Text;
10-
using System.Threading.Tasks;
117

128
namespace CsvHelper.TypeConversion
139
{
@@ -28,9 +24,10 @@ public class NotSupportedTypeConverter<T> : TypeConverter<T>
2824
/// <returns>The object created from the string.</returns>
2925
public override T ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
3026
{
31-
var message = $"Converting " + typeof(T).FullName + " is not supported. " +
32-
"If you want to do this, create your own ITypeConverter and register " +
33-
"it in the TypeConverterFactory by calling AddConverter.";
27+
var message =
28+
$"Converting {typeof(T).FullName} is not supported. " +
29+
"If you want to do this, create your own ITypeConverter and register " +
30+
"it in the TypeConverterFactory by calling AddConverter.";
3431
throw new TypeConverterException(this, memberMapData, text ?? string.Empty, row.Context, message);
3532
}
3633

@@ -43,9 +40,10 @@ public override T ConvertFromString(string text, IReaderRow row, MemberMapData m
4340
/// <returns>The string representation of the object.</returns>
4441
public override string ConvertToString(T value, IWriterRow row, MemberMapData memberMapData)
4542
{
46-
var message = "Converting " + typeof(T).FullName + " is not supported. " +
47-
"If you want to do this, create your own ITypeConverter and register " +
48-
"it in the TypeConverterFactory by calling AddConverter.";
43+
var message =
44+
$"Converting {typeof(T).FullName} is not supported. " +
45+
"If you want to do this, create your own ITypeConverter and register " +
46+
"it in the TypeConverterFactory by calling AddConverter.";
4947
throw new TypeConverterException(this, memberMapData, value, row.Context, message);
5048
}
5149
}

src/CsvHelper/TypeConversion/TypeConverter.cs

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
// Copyright 2009-2024 Josh Close
2+
// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
3+
// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
4+
// https://github.com/JoshClose/CsvHelper
15
using CsvHelper.Configuration;
6+
using System;
27

38
namespace CsvHelper.TypeConversion
49
{
@@ -25,12 +30,13 @@ public abstract class TypeConverter<T> : ITypeConverter
2530
/// <returns>The string representation of the value.</returns>
2631
public abstract string ConvertToString(T value, IWriterRow row, MemberMapData memberMapData);
2732

28-
object ITypeConverter.ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData) =>
29-
ConvertFromString(text, row, memberMapData);
33+
object ITypeConverter.ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData) => ConvertFromString(text, row, memberMapData);
3034

31-
string ITypeConverter.ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) =>
32-
value is T v
35+
string ITypeConverter.ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
36+
{
37+
return value is T v
3338
? ConvertToString(v, row, memberMapData)
34-
: throw new System.InvalidCastException();
39+
: throw new InvalidCastException();
40+
}
3541
}
3642
}

src/CsvHelper/TypeConversion/TypeConverterCache.cs

-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
// https://github.com/JoshClose/CsvHelper
55
using CsvHelper.Configuration.Attributes;
66
using System;
7-
using System.Collections;
87
using System.Collections.Generic;
9-
using System.Collections.ObjectModel;
108
using System.Linq;
119
using System.Numerics;
1210
using System.Reflection;
@@ -84,7 +82,6 @@ public void AddConverter(Type type, ITypeConverter typeConverter)
8482
public void AddConverter<T>(TypeConverter<T> typeConverter) =>
8583
AddConverter<T>(typeConverter as ITypeConverter);
8684

87-
8885
/// <summary>
8986
/// Adds the <see cref="ITypeConverter"/> for the given <see cref="System.Type"/>.
9087
/// </summary>
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,23 @@
1+
// Copyright 2009-2024 Josh Close
2+
// This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0.
3+
// See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0.
4+
// https://github.com/JoshClose/CsvHelper
5+
using CsvHelper.Configuration;
6+
using CsvHelper.TypeConversion;
17
using System;
28
using System.Collections;
39
using System.Collections.Generic;
410
using System.Globalization;
511
using System.IO;
612
using System.Linq;
7-
using CsvHelper.Configuration;
8-
using CsvHelper.TypeConversion;
913
using Xunit;
1014

1115
namespace CsvHelper.Tests.TypeConversion
1216
{
1317
public class TypeConverterFactoryTests
1418
{
15-
public readonly record struct Option<T> : IEnumerable<T>
16-
{
17-
public bool IsPresent { get; }
18-
private readonly T _value;
19-
20-
internal Option(T value)
21-
{
22-
IsPresent = true;
23-
_value = value;
24-
}
25-
26-
public IEnumerator<T> GetEnumerator()
27-
{
28-
if (IsPresent) yield return _value;
29-
}
30-
31-
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
32-
}
33-
34-
private class MyOptionTypeFactory : ITypeConverterFactory
35-
{
36-
public bool CanCreate(Type type) =>
37-
type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Option<>);
38-
39-
public bool Create(Type type, TypeConverterCache cache, out ITypeConverter typeConverter)
40-
{
41-
var wrappedType = type.GetGenericArguments().Single();
42-
typeConverter =
43-
Activator.CreateInstance(typeof(OptionConverter<>).MakeGenericType(wrappedType)) as
44-
ITypeConverter ?? throw new NullReferenceException();
45-
return true;
46-
}
47-
48-
internal class OptionConverter<T> : TypeConverter<Option<T>>
49-
{
50-
public override string ConvertToString(Option<T> value, IWriterRow row,
51-
MemberMapData memberMapData)
52-
{
53-
var wrappedTypeConverter = row.Context.TypeConverterCache.GetConverter<T>();
54-
return value.IsPresent
55-
? wrappedTypeConverter.ConvertToString(value.Single(), row, memberMapData)
56-
: "";
57-
}
58-
59-
public override Option<T> ConvertFromString(string text, IReaderRow row,
60-
MemberMapData memberMapData)
61-
{
62-
var wrappedTypeConverter = row.Context.TypeConverterCache.GetConverter<T>();
63-
64-
return text == ""
65-
? new Option<T>()
66-
: new Option<T>((T)wrappedTypeConverter.ConvertFromString(text, row, memberMapData));
67-
}
68-
}
69-
}
70-
71-
private record RecordWithGenerics(Option<int> MaybeNumber);
72-
7319
[Fact]
74-
void ReadTypeConverterGenericInt()
20+
public void ReadTypeConverterGenericInt()
7521
{
7622
var input = """
7723
MaybeNumber
@@ -86,7 +32,7 @@ void ReadTypeConverterGenericInt()
8632
}
8733

8834
[Fact]
89-
void WriteTypeConverterGenericInt()
35+
public void WriteTypeConverterGenericInt()
9036
{
9137
var expected = """
9238
MaybeNumber
@@ -105,7 +51,7 @@ void WriteTypeConverterGenericInt()
10551
}
10652

10753
[Fact]
108-
void ReadTypeConverterFactory()
54+
public void ReadTypeConverterFactory()
10955
{
11056
var input = """
11157
MaybeNumber
@@ -120,7 +66,7 @@ void ReadTypeConverterFactory()
12066
}
12167

12268
[Fact]
123-
void WriteTypeConverterFactory()
69+
public void WriteTypeConverterFactory()
12470
{
12571
var expected = """
12672
MaybeNumber
@@ -137,5 +83,58 @@ void WriteTypeConverterFactory()
13783
});
13884
Assert.Equal(expected, stringWriter.ToString());
13985
}
86+
87+
public readonly record struct Option<T> : IEnumerable<T>
88+
{
89+
public bool IsPresent { get; }
90+
private readonly T value;
91+
92+
internal Option(T value)
93+
{
94+
IsPresent = true;
95+
this.value = value;
96+
}
97+
98+
public IEnumerator<T> GetEnumerator()
99+
{
100+
if (IsPresent) yield return value;
101+
}
102+
103+
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
104+
}
105+
106+
private class MyOptionTypeFactory : ITypeConverterFactory
107+
{
108+
public bool CanCreate(Type type) => type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Option<>);
109+
110+
public bool Create(Type type, TypeConverterCache cache, out ITypeConverter typeConverter)
111+
{
112+
var wrappedType = type.GetGenericArguments().Single();
113+
typeConverter = Activator.CreateInstance(typeof(OptionConverter<>).MakeGenericType(wrappedType)) as ITypeConverter ?? throw new NullReferenceException();
114+
115+
return true;
116+
}
117+
118+
internal class OptionConverter<T> : TypeConverter<Option<T>>
119+
{
120+
public override string ConvertToString(Option<T> value, IWriterRow row, MemberMapData memberMapData)
121+
{
122+
var wrappedTypeConverter = row.Context.TypeConverterCache.GetConverter<T>();
123+
124+
return value.IsPresent ? wrappedTypeConverter.ConvertToString(value.Single(), row, memberMapData) : "";
125+
}
126+
127+
public override Option<T> ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
128+
{
129+
var wrappedTypeConverter = row.Context.TypeConverterCache.GetConverter<T>();
130+
131+
return text == ""
132+
? new Option<T>()
133+
: new Option<T>((T)wrappedTypeConverter.ConvertFromString(text, row, memberMapData));
134+
}
135+
}
136+
}
137+
138+
private record RecordWithGenerics(Option<int> MaybeNumber);
140139
}
141140
}

0 commit comments

Comments
 (0)