-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'ishanpranav-dev' into dev
- Loading branch information
Showing
9 changed files
with
396 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
110 changes: 110 additions & 0 deletions
110
src/RestSharp.Serializers.CsvHelper/CsvHelperSerializer.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
using CsvHelper; | ||
using CsvHelper.Configuration; | ||
using System.Collections; | ||
using System.Globalization; | ||
|
||
namespace RestSharp.Serializers.CsvHelper; | ||
|
||
public class CsvHelperSerializer : IDeserializer, IRestSerializer, ISerializer { | ||
const string TextCsvContentType = "text/csv"; | ||
|
||
readonly CsvConfiguration _configuration; | ||
|
||
public ISerializer Serializer => this; | ||
|
||
public IDeserializer Deserializer => this; | ||
|
||
public string[] AcceptedContentTypes => new[] { TextCsvContentType, "application/x-download" }; | ||
|
||
public SupportsContentType SupportsContentType => x => Array.IndexOf(AcceptedContentTypes, x) != -1 || x.Contains("csv"); | ||
|
||
public DataFormat DataFormat => DataFormat.None; | ||
|
||
public string ContentType { get; set; } = TextCsvContentType; | ||
|
||
public CsvHelperSerializer() => _configuration = new CsvConfiguration(CultureInfo.InvariantCulture); | ||
|
||
public CsvHelperSerializer(CsvConfiguration configuration) => _configuration = configuration; | ||
|
||
public T? Deserialize<T>(RestResponse response) { | ||
try { | ||
if (response.Content == null) | ||
throw new InvalidOperationException(message: "Response content is null"); | ||
|
||
using var stringReader = new StringReader(response.Content); | ||
|
||
using var csvReader = new CsvReader(stringReader, CultureInfo.CurrentCulture); | ||
|
||
var @interface = typeof(T).GetInterface("IEnumerable`1"); | ||
|
||
if (@interface == null) { | ||
csvReader.Read(); | ||
|
||
return csvReader.GetRecord<T>(); | ||
} | ||
|
||
var itemType = @interface.GenericTypeArguments[0]; | ||
T result; | ||
|
||
try { | ||
result = Activator.CreateInstance<T>(); | ||
} | ||
catch (MissingMethodException) { | ||
throw new InvalidOperationException(message: "The type must contain a public, parameterless constructor."); | ||
} | ||
|
||
var method = typeof(T).GetMethod(name: "Add"); | ||
|
||
if (method == null) { | ||
throw new InvalidOperationException( | ||
message: "If the type implements IEnumerable<T>, then it must contain a public \"Add(T)\" method." | ||
); | ||
} | ||
|
||
foreach (var record in csvReader.GetRecords(itemType)) { | ||
method.Invoke(result, new[] { record }); | ||
} | ||
|
||
return result; | ||
} | ||
catch (Exception exception) { | ||
throw new DeserializationException(response, exception); | ||
} | ||
} | ||
|
||
public string? Serialize(Parameter parameter) => Serialize(parameter.Value); | ||
|
||
public string? Serialize(object? obj) { | ||
if (obj == null) { | ||
return null; | ||
} | ||
|
||
using var stringWriter = new StringWriter(); | ||
|
||
using var csvWriter = new CsvWriter(stringWriter, _configuration); | ||
|
||
if (obj is IEnumerable records) { | ||
// ReSharper disable once PossibleMultipleEnumeration | ||
var enumerator = records.GetEnumerator(); | ||
|
||
if (enumerator.MoveNext() && enumerator.Current != null) { | ||
csvWriter.WriteHeader(enumerator.Current.GetType()); | ||
csvWriter.NextRecord(); | ||
// ReSharper disable once PossibleMultipleEnumeration | ||
csvWriter.WriteRecords(records); | ||
} | ||
|
||
if (enumerator is IDisposable disposable) { | ||
disposable.Dispose(); | ||
} | ||
} | ||
else { | ||
csvWriter.WriteHeader(obj.GetType()); | ||
csvWriter.NextRecord(); | ||
csvWriter.WriteRecord(obj); | ||
csvWriter.NextRecord(); | ||
} | ||
|
||
return stringWriter.ToString(); | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
src/RestSharp.Serializers.CsvHelper/RestClientExtensions.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
using CsvHelper.Configuration; | ||
|
||
namespace RestSharp.Serializers.CsvHelper; | ||
|
||
[PublicAPI] | ||
public static class RestClientExtensions { | ||
public static RestClient UseCsvHelper(this RestClient client) => client.UseSerializer<CsvHelperSerializer>(); | ||
|
||
public static RestClient UseCsvHelper(this RestClient client, CsvConfiguration configuration) | ||
=> client.UseSerializer(() => new CsvHelperSerializer(configuration)); | ||
} |
8 changes: 8 additions & 0 deletions
8
src/RestSharp.Serializers.CsvHelper/RestSharp.Serializers.CsvHelper.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
<ItemGroup> | ||
<PackageReference Include="CsvHelper" Version="28.0.1"/> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<ProjectReference Include="..\RestSharp\RestSharp.csproj"/> | ||
</ItemGroup> | ||
</Project> |
18 changes: 9 additions & 9 deletions
18
src/RestSharp.Serializers.NewtonsoftJson/RestSharp.Serializers.NewtonsoftJson.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,11 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
<ItemGroup> | ||
<PackageReference Include="Newtonsoft.Json" Version="[12.0.1,)" /> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<ProjectReference Include="..\RestSharp\RestSharp.csproj" /> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<Using Include="Newtonsoft.Json" /> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1"/> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<ProjectReference Include="..\RestSharp\RestSharp.csproj"/> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<Using Include="Newtonsoft.Json"/> | ||
</ItemGroup> | ||
</Project> |
5 changes: 1 addition & 4 deletions
5
src/RestSharp.Serializers.Xml/RestSharp.Serializers.Xml.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,8 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<RootNamespace>RestSharp.Serializers.Xml</RootNamespace> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<ProjectReference Include="..\RestSharp\RestSharp.csproj" /> | ||
<ProjectReference Include="..\RestSharp\RestSharp.csproj"/> | ||
</ItemGroup> | ||
|
||
</Project> |
Oops, something went wrong.