Skip to content
7 changes: 7 additions & 0 deletions Morpher.WebService.V3.Client/BadRequestException.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ namespace Morpher.WebService.V3
class BadRequestException : Exception
{
public int Status { get; }
public int ErrorCode { get; }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Все хорошо, только нужно где-то установить значение ErrorCode. Думаю, лучше это сделать в конструкторе BadRequestException.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ок


public BadRequestException(int status, int errorCode)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Конструктор не используется, следовательно, свойство ErrorCode всегда будет 0.

{
Status = status;
ErrorCode = errorCode;
}

public BadRequestException(int status)
{
Expand Down
13 changes: 10 additions & 3 deletions Morpher.WebService.V3.Client/MyWebClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

namespace Morpher.WebService.V3
{
using System.Collections.Generic;
using System.Collections.Specialized;
using Newtonsoft.Json;

Expand Down Expand Up @@ -120,7 +121,7 @@ static void TryToThrowMorpherException(WebException exc)
if (exc.Response is HttpWebResponse httpWebResponse)
{
int status = (int)httpWebResponse.StatusCode;

if (status >= 400 && status < 500)
{
switch (status)
Expand All @@ -135,8 +136,14 @@ static void TryToThrowMorpherException(WebException exc)
// но никак не ошибка пользователя.
throw new InvalidServerResponseException(exc);
}

throw new BadRequestException(status);
var jsonResponse = new StreamReader(httpWebResponse.GetResponseStream()).ReadToEnd();

var resp = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonResponse);
string errorCode = "";
if(resp.TryGetValue("code", out errorCode))
throw new BadRequestException(status, int.Parse(errorCode));
else
throw new BadRequestException(status);
}

if (status >= 500)
Expand Down
102 changes: 90 additions & 12 deletions Morpher.WebService.V3.Client/Qazaq/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,53 +37,131 @@ public DeclensionResult Parse(string lemma)
}
}

/// <summary>
/// Строит количественное числительное прописью из данного числа.
/// </summary>
/// <param name="n">Число.</param>
/// <param name="use-one">Чтобы вместо "бір мың" (одна тысяча) выдавалось упрощенная запись "мың" (тысяча), укажите параметр use-one=false.</param>
/// <returns>Количественное числительное прописью, например, "жиырма бес"</returns>
public string GetCardinal(long n, bool useOne)
{
using (var client = _newClient())
{
client.AddParam("n", n.ToString());
client.AddParam("use-one", useOne.ToString());

var stringResult = client.GetObject<string>("/qazaq/cardinal");

return stringResult;
return client.GetObject<string>("/qazaq/cardinal");
}
}

/// <summary>
/// Строит порядковое числительное из данного количественного числительного.
/// </summary>
/// <param name="cardinal">Количественное числительное, например, "жиырма бес".</param>
/// <returns>Порядковое числительное, например, "жиырма бесінші"</returns>
/// <exception cref="ArgumentNotQazaqException">
/// Если <paramref name="cardinal"/> не является казахским словом.
/// </exception>
public string GetOrdinal(string cardinal)
{
using (var client = _newClient())
{
client.AddParam("cardinal", cardinal);

var stringResult = client.GetObject<string>("/qazaq/ordinal");

return stringResult;
try
{
return client.GetObject<string>("/qazaq/ordinal");
}
catch (BadRequestException e) when (e.ErrorCode == 15)
{
throw new ArgumentNotQazaqException(nameof(cardinal));
}
}
}

/// <summary>
/// Функция преобразует дату в формате ГГГГ-ММ-ДД в пропись на казахском языке.
/// </summary>
/// <param name="date">Дата, например, 2000-10-23.</param>
/// <param name="use-one">Чтобы вместо "бір мың" (одна тысяча) выдавалось упрощенная запись "мың" (тысяча), укажите параметр use-one=false.</param>
/// <returns>Дата прописью, например, "екі мыңыншы жылғы жиырма үшінші казан"</returns>
/// <exception cref="QazaqWrongDateException">
/// Если <paramref name="date"/> не соответствует формату.
/// </exception>
public string GetDate(string date, bool useOne)
{
using (var client = _newClient())
{
client.AddParam("date", date);
client.AddParam("use-one", useOne.ToString());
var stringResult = client.GetObject<string>("/qazaq/date");
try
{
return client.GetObject<string>("/qazaq/date");
}
catch (BadRequestException e) when (e.ErrorCode == 16)
{
throw new QazaqWrongDateException(nameof(date));
}
}
}

return stringResult;
/// <summary>
/// Функция преобразует дату в формате ГГГГ-ММ-ДД в пропись на казахском языке.
/// </summary>
/// <param name="date">Дата, например, 2000-10-23.</param>
/// <param name="use-one">Чтобы вместо "бір мың" (одна тысяча) выдавалось упрощенная запись "мың" (тысяча), укажите параметр use-one=false.</param>
/// <returns>Дата прописью, например, "екі мыңыншы жылғы жиырма үшінші казан"</returns>
/// <exception cref="QazaqWrongDateException">
/// Если <paramref name="date"/> не соответствует формату.
/// </exception>
public string GetDate(DateTime dateTime, bool useOne)
{
using (var client = _newClient())
{
client.AddParam("date", dateTime.ToString("yyyy-MM-dd"));
client.AddParam("use-one", useOne.ToString());
try
{
return client.GetObject<string>("/qazaq/date");
}
catch (BadRequestException e) when (e.ErrorCode == 16)
{
throw new QazaqWrongDateException(nameof(dateTime));
}
}
}

/// <summary>
/// Функция преобразует номер дня и месяца в пропись на казахском языке.
/// </summary>
/// <param name="day">Число от 1 до 31.</param>
/// <param name="month">Номер месяца от 1 до 12.</param>
/// <returns>День месяца прописью, например, "ақпанның оны"</returns>
/// <exception cref="QazaqWrongDayOfMonthException">
/// Если <paramref name="day"/> больше 31 или меньше 1.
/// </exception>
/// <exception cref="QazaqWrongMonthException">
/// Если <paramref name="month"/> больше 12 или меньше 1.
/// </exception>
public string GetDayOfMonth(int day, int month)
{
using (var client = _newClient())
{
client.AddParam("day", day.ToString());
client.AddParam("month", month.ToString());

var stringResult = client.GetObject<string>("/qazaq/day-of-month");

return stringResult;
try
{
return client.GetObject<string>("/qazaq/day-of-month");
}
catch (BadRequestException e)
{
switch (e.ErrorCode)
{
case 17: throw new QazaqWrongDayOfMonthException(nameof(day));
case 18: throw new QazaqWrongMonthException(nameof(month));
}
throw;
}
}
}
}
Expand Down
13 changes: 13 additions & 0 deletions Morpher.WebService.V3.Client/Qazaq/QazaqWrongDateException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Morpher.WebService.V3.Qazaq
{
public class QazaqWrongDateException : InvalidArgumentException
{
public override string Message =>
"Неправильная дата. Ожидается формат ГГГГ-ММ-ДД.";

public QazaqWrongDateException(string parameterName)
: base(parameterName)
{
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Morpher.WebService.V3.Qazaq
{
public class QazaqWrongMonthException : InvalidArgumentException
{
public override string Message =>
"Недопустимое значение числового параметра month. Допустимы значения от 1 до 12 включительно.";

public QazaqWrongMonthException(string parameterName)
: base(parameterName)
{
}
}
}
13 changes: 13 additions & 0 deletions Morpher.WebService.V3.Client/Qazaq/QazaqWrongMonthException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Morpher.WebService.V3.Qazaq
{
public class QazaqWrongDayOfMonthException : InvalidArgumentException
{
public override string Message =>
"Недопустимое значение числового параметра day. Допустимы значения от 1 до 31 включительно.";

public QazaqWrongDayOfMonthException(string parameterName)
: base(parameterName)
{
}
}
}