Skip to content

Commit

Permalink
Merge pull request #28 from askazakov/add-cancellation-token-to-async…
Browse files Browse the repository at this point in the history
…-methods

Add cancellation token to async methods
  • Loading branch information
nalgeon authored Sep 2, 2021
2 parents f2ad5a4 + 6920c06 commit c2d9a15
Show file tree
Hide file tree
Showing 11 changed files with 188 additions and 125 deletions.
2 changes: 1 addition & 1 deletion Dadata.Test/SuggestClientAsyncTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ public async Task FindAffiliatedTest()
}

[Fact]
public async Task FindAffilliatedScopeTest()
public async Task FindAffiliatedScopeTest()
{
var request = new FindAffiliatedRequest("773006366201")
{
Expand Down
2 changes: 1 addition & 1 deletion Dadata.Test/SuggestClientSyncTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ public void FindAffiliatedTest()
}

[Fact]
public void FindAffilliatedScopeTest()
public void FindAffiliatedScopeTest()
{
var request = new FindAffiliatedRequest("773006366201")
{
Expand Down
14 changes: 8 additions & 6 deletions Dadata/CleanClientAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
Expand All @@ -13,7 +14,7 @@ public class CleanClientAsync : ClientBaseAsync, ICleanClientAsync
{
protected const string BASE_URL = "https://cleaner.dadata.ru/api/v1";

CustomCreationConverter<IDadataEntity> converter;
readonly CustomCreationConverter<IDadataEntity> converter;

// maps concrete IDadataEntity types to corresponding structure types
static Dictionary<Type, StructureType> TYPE_TO_STRUCTURE = new Dictionary<Type, StructureType>()
Expand All @@ -39,22 +40,23 @@ public CleanClientAsync(string token, string secret, string baseUrl = BASE_URL,
serializer.Converters.Add(new StringEnumConverter());
}

public async Task<T> Clean<T>(string source) where T : IDadataEntity
public async Task<T> Clean<T>(string source, CancellationToken cancellationToken = default) where T : IDadataEntity
{
// infer structure from target entity type
var structure = new List<StructureType>(
new StructureType[] { TYPE_TO_STRUCTURE[typeof(T)] }
);
// transform enity list to CleanRequest data structure
// transform entity list to CleanRequest data structure
var data = new string[] { source };
var response = await Clean(structure, data);
var response = await Clean(structure, data, cancellationToken);
return (T)response[0];
}

public async Task<IList<IDadataEntity>> Clean(IEnumerable<StructureType> structure, IEnumerable<string> data)
public async Task<IList<IDadataEntity>> Clean(IEnumerable<StructureType> structure, IEnumerable<string> data,
CancellationToken cancellationToken = default)
{
var request = new CleanRequest(structure, data);
var response = await Execute<CleanResponse>(method: "clean", entity: null, request: request);
var response = await Execute<CleanResponse>(method: "clean", entity: null, request: request, cancellationToken);
return response.data[0];
}

Expand Down
22 changes: 11 additions & 11 deletions Dadata/ClientBaseAsync.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Dadata.Model;
Expand All @@ -14,7 +12,7 @@ namespace Dadata
{
public abstract class ClientBaseAsync : ClientBase
{
protected HttpClient client;
protected readonly HttpClient client;

public ClientBaseAsync(string token, string baseUrl, HttpClient client)
: this(token, null, baseUrl, client) { }
Expand All @@ -25,32 +23,34 @@ public ClientBaseAsync(string token, string secret, string baseUrl, HttpClient c
this.client = client ?? new HttpClient();
}

protected async Task<T> ExecuteGet<T>(string method, string entity)
protected async Task<T> ExecuteGet<T>(string method, string entity, CancellationToken cancellationToken)
{
var parameters = new NameValueCollection();
return await ExecuteGet<T>(method, entity, parameters);
return await ExecuteGet<T>(method, entity, parameters, cancellationToken);
}

protected async Task<T> ExecuteGet<T>(string method, string entity, NameValueCollection parameters)
protected async Task<T> ExecuteGet<T>(string method, string entity, NameValueCollection parameters,
CancellationToken cancellationToken)
{
var queryString = SerializeParameters(parameters);
var url = BuildUrl(method: method, entity: entity, queryString: queryString);
using (var httpRequest = CreateHttpRequest(verb: HttpMethod.Get, url: url))
using (var httpResponse = await client.SendAsync(httpRequest))
using (var httpResponse = await client.SendAsync(httpRequest, cancellationToken))
{
httpResponse.EnsureSuccessStatusCode();
return await Deserialize<T>(httpResponse);
}
}

protected async Task<T> Execute<T>(string method, string entity, IDadataRequest request)
protected async Task<T> Execute<T>(string method, string entity, IDadataRequest request,
CancellationToken cancellationToken)
{
var url = BuildUrl(method: method, entity: entity);
using (var httpRequest = CreateHttpRequest(verb: HttpMethod.Post, url: url))
using (var httpContent = Serialize(httpRequest, request))
{
httpRequest.Content = httpContent;
using (var httpResponse = await client.SendAsync(httpRequest))
using (var httpResponse = await client.SendAsync(httpRequest, cancellationToken))
{
httpResponse.EnsureSuccessStatusCode();
return await Deserialize<T>(httpResponse);
Expand Down
7 changes: 5 additions & 2 deletions Dadata/ICleanClientAsync.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Dadata.Model;

namespace Dadata
{
public interface ICleanClientAsync
{
Task<T> Clean<T>(string source) where T : IDadataEntity;
Task<IList<IDadataEntity>> Clean(IEnumerable<StructureType> structure, IEnumerable<string> data);
Task<T> Clean<T>(string source, CancellationToken cancellationToken = default) where T : IDadataEntity;

Task<IList<IDadataEntity>> Clean(IEnumerable<StructureType> structure, IEnumerable<string> data,
CancellationToken cancellationToken = default);
}
}
18 changes: 13 additions & 5 deletions Dadata/IOutwardClientAsync.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
using Dadata.Model;

namespace Dadata
{
public interface IOutwardClientAsync
{
Task<SuggestResponse<T>> Suggest<T>(string query, int count = 5) where T : IOutward;
Task<SuggestResponse<T>> Suggest<T>(SuggestOutwardRequest request) where T : IOutward;
Task<SuggestResponse<T>> Find<T>(string query) where T : IOutward;
Task<SuggestResponse<T>> Geolocate<T>(double lat, double lon, int radius_meters = 100, int count = 5)
Task<SuggestResponse<T>> Suggest<T>(string query, int count = 5, CancellationToken cancellationToken = default)
where T : IOutward;

Task<SuggestResponse<T>> Suggest<T>(SuggestOutwardRequest request,
CancellationToken cancellationToken = default) where T : IOutward;

Task<SuggestResponse<T>> Find<T>(string query, CancellationToken cancellationToken = default)
where T : IOutward;

Task<SuggestResponse<T>> Geolocate<T>(double lat, double lon, int radius_meters = 100, int count = 5,
CancellationToken cancellationToken = default)
where T : IOutward;
}
}
9 changes: 5 additions & 4 deletions Dadata/IProfileClientAsync.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Dadata.Model;

namespace Dadata
{
public interface IProfileClientAsync
{
Task<GetBalanceResponse> GetBalance();
Task<GetDailyStatsResponse> GetDailyStats();
Task<GetDailyStatsResponse> GetDailyStats(DateTime date);
Task<GetVersionsResponse> GetVersions();
Task<GetBalanceResponse> GetBalance(CancellationToken cancellationToken = default);
Task<GetDailyStatsResponse> GetDailyStats(CancellationToken cancellationToken = default);
Task<GetDailyStatsResponse> GetDailyStats(DateTime date, CancellationToken cancellationToken = default);
Task<GetVersionsResponse> GetVersions(CancellationToken cancellationToken = default);
}
}
53 changes: 27 additions & 26 deletions Dadata/ISuggestClientAsync.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,35 @@
using System.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;
using Dadata.Model;

namespace Dadata
{
public interface ISuggestClientAsync
{
Task<SuggestResponse<Address>> SuggestAddress(string query, int count = 5);
Task<SuggestResponse<Address>> SuggestAddress(SuggestAddressRequest request);
Task<SuggestResponse<Address>> FindAddress(string query);
Task<SuggestResponse<Address>> FindAddress(FindAddressRequest request);
Task<SuggestResponse<Address>> Geolocate(double lat, double lon, int radius_meters = 100, int count = 5);
Task<SuggestResponse<Address>> Geolocate(GeolocateRequest request);
Task<IplocateResponse> Iplocate(string ip, string language = "ru");
Task<SuggestResponse<Bank>> SuggestBank(string query, int count = 5);
Task<SuggestResponse<Bank>> SuggestBank(SuggestBankRequest request);
Task<SuggestResponse<Bank>> FindBank(string query);
Task<SuggestResponse<Bank>> FindBank(FindBankRequest request);
Task<SuggestResponse<Email>> SuggestEmail(string query, int count = 5);
Task<SuggestResponse<Email>> SuggestEmail(SuggestRequest request);
Task<SuggestResponse<FiasAddress>> SuggestFias(string query, int count = 5);
Task<SuggestResponse<FiasAddress>> SuggestFias(SuggestAddressRequest request);
Task<SuggestResponse<FiasAddress>> FindFias(string query);
Task<SuggestResponse<FiasAddress>> FindFias(SuggestRequest request);
Task<SuggestResponse<Fullname>> SuggestName(string query, int count = 5);
Task<SuggestResponse<Fullname>> SuggestName(SuggestNameRequest request);
Task<SuggestResponse<Party>> SuggestParty(string query, int count = 5);
Task<SuggestResponse<Party>> SuggestParty(SuggestPartyRequest request);
Task<SuggestResponse<Party>> FindParty(string query);
Task<SuggestResponse<Party>> FindParty(FindPartyRequest request);
Task<SuggestResponse<Party>> FindAffiliated(string query);
Task<SuggestResponse<Party>> FindAffiliated(FindAffiliatedRequest request);
Task<SuggestResponse<Address>> SuggestAddress(string query, int count = 5, CancellationToken cancellationToken = default);
Task<SuggestResponse<Address>> SuggestAddress(SuggestAddressRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Address>> FindAddress(string query, CancellationToken cancellationToken = default);
Task<SuggestResponse<Address>> FindAddress(FindAddressRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Address>> Geolocate(double lat, double lon, int radius_meters = 100, int count = 5, CancellationToken cancellationToken = default);
Task<SuggestResponse<Address>> Geolocate(GeolocateRequest request, CancellationToken cancellationToken = default);
Task<IplocateResponse> Iplocate(string ip, string language = "ru", CancellationToken cancellationToken = default);
Task<SuggestResponse<Bank>> SuggestBank(string query, int count = 5, CancellationToken cancellationToken = default);
Task<SuggestResponse<Bank>> SuggestBank(SuggestBankRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Bank>> FindBank(string query, CancellationToken cancellationToken = default);
Task<SuggestResponse<Bank>> FindBank(FindBankRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Email>> SuggestEmail(string query, int count = 5, CancellationToken cancellationToken = default);
Task<SuggestResponse<Email>> SuggestEmail(SuggestRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<FiasAddress>> SuggestFias(string query, int count = 5, CancellationToken cancellationToken = default);
Task<SuggestResponse<FiasAddress>> SuggestFias(SuggestAddressRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<FiasAddress>> FindFias(string query, CancellationToken cancellationToken = default);
Task<SuggestResponse<FiasAddress>> FindFias(SuggestRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Fullname>> SuggestName(string query, int count = 5, CancellationToken cancellationToken = default);
Task<SuggestResponse<Fullname>> SuggestName(SuggestNameRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Party>> SuggestParty(string query, int count = 5, CancellationToken cancellationToken = default);
Task<SuggestResponse<Party>> SuggestParty(SuggestPartyRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Party>> FindParty(string query, CancellationToken cancellationToken = default);
Task<SuggestResponse<Party>> FindParty(FindPartyRequest request, CancellationToken cancellationToken = default);
Task<SuggestResponse<Party>> FindAffiliated(string query, CancellationToken cancellationToken = default);
Task<SuggestResponse<Party>> FindAffiliated(FindAffiliatedRequest request, CancellationToken cancellationToken = default);
}
}
23 changes: 15 additions & 8 deletions Dadata/OutwardClientAsync.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Dadata.Model;

Expand All @@ -11,30 +12,36 @@ public class OutwardClientAsync : ClientBaseAsync, IOutwardClientAsync
public OutwardClientAsync(string token, string baseUrl = BASE_URL, HttpClient client = null)
: base(token, baseUrl, client) { }

public async Task<SuggestResponse<T>> Suggest<T>(string query, int count = 5) where T : IOutward
public async Task<SuggestResponse<T>> Suggest<T>(string query, int count = 5, CancellationToken cancellationToken = default) where T : IOutward
{
var request = new SuggestOutwardRequest(query, count);
return await Suggest<T>(request);
return await Suggest<T>(request, cancellationToken);
}

public async Task<SuggestResponse<T>> Suggest<T>(SuggestOutwardRequest request) where T : IOutward
public async Task<SuggestResponse<T>> Suggest<T>(SuggestOutwardRequest request,
CancellationToken cancellationToken = default) where T : IOutward
{
var entity = Outwards.GetEntityName(typeof(T));
return await Execute<SuggestResponse<T>>(method: SuggestionsMethod.Suggest, entity: entity, request: request);
return await Execute<SuggestResponse<T>>(method: SuggestionsMethod.Suggest, entity: entity,
request: request, cancellationToken: cancellationToken);
}

public async Task<SuggestResponse<T>> Find<T>(string query) where T : IOutward
public async Task<SuggestResponse<T>> Find<T>(string query, CancellationToken cancellationToken = default)
where T : IOutward
{
var request = new SuggestOutwardRequest(query);
var entity = Outwards.GetEntityName(typeof(T));
return await Execute<SuggestResponse<T>>(method: SuggestionsMethod.Find, entity: entity, request: request);
return await Execute<SuggestResponse<T>>(method: SuggestionsMethod.Find, entity: entity, request: request,
cancellationToken: cancellationToken);
}

public async Task<SuggestResponse<T>> Geolocate<T>(double lat, double lon, int radius_meters = 100, int count = 5) where T : IOutward
public async Task<SuggestResponse<T>> Geolocate<T>(double lat, double lon, int radius_meters = 100,
int count = 5, CancellationToken cancellationToken = default) where T : IOutward
{
var request = new GeolocateRequest(lat, lon, radius_meters, count);
var entity = Outwards.GetEntityName(typeof(T));
return await Execute<SuggestResponse<T>>(method: SuggestionsMethod.Geolocate, entity: entity, request: request);
return await Execute<SuggestResponse<T>>(method: SuggestionsMethod.Geolocate, entity: entity,
request: request, cancellationToken: cancellationToken);
}
}
}
19 changes: 10 additions & 9 deletions Dadata/ProfileClientAsync.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Specialized;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Dadata.Model;

Expand All @@ -14,27 +15,27 @@ public ProfileClientAsync(string token, string secret, string baseUrl = BASE_URL
: base(token, secret, baseUrl, client) { }


public async Task<GetBalanceResponse> GetBalance()
public async Task<GetBalanceResponse> GetBalance(CancellationToken cancellationToken = default)
{
return await ExecuteGet<GetBalanceResponse>(method: "profile", entity: "balance");
return await ExecuteGet<GetBalanceResponse>(method: "profile", entity: "balance", cancellationToken);
}

public async Task<GetDailyStatsResponse> GetDailyStats()
public async Task<GetDailyStatsResponse> GetDailyStats(CancellationToken cancellationToken = default)
{
return await GetDailyStats(DateTime.Today);
return await GetDailyStats(DateTime.Today, cancellationToken);
}

public async Task<GetDailyStatsResponse> GetDailyStats(DateTime date)
public async Task<GetDailyStatsResponse> GetDailyStats(DateTime date, CancellationToken cancellationToken)
{
var parameters = new NameValueCollection(1);
parameters.Add("date", date.ToString("yyyy-MM-dd"));
return await ExecuteGet<GetDailyStatsResponse>(method: "stat", entity: "daily", parameters: parameters);
return await ExecuteGet<GetDailyStatsResponse>(method: "stat", entity: "daily", parameters: parameters,
cancellationToken);
}

public async Task<GetVersionsResponse> GetVersions()
public async Task<GetVersionsResponse> GetVersions(CancellationToken cancellationToken = default)
{
return await ExecuteGet<GetVersionsResponse>(method: "version", entity: null);
return await ExecuteGet<GetVersionsResponse>(method: "version", entity: null, cancellationToken);
}

}
}
Loading

0 comments on commit c2d9a15

Please sign in to comment.