diff --git a/Morpher.WebService.V3.Client/BadRequestException.cs b/Morpher.WebService.V3.Client/BadRequestException.cs index be2b382..d0879fb 100644 --- a/Morpher.WebService.V3.Client/BadRequestException.cs +++ b/Morpher.WebService.V3.Client/BadRequestException.cs @@ -5,6 +5,13 @@ namespace Morpher.WebService.V3 class BadRequestException : Exception { public int Status { get; } + public int ErrorCode { get; } + + public BadRequestException(int status, int errorCode) + { + Status = status; + ErrorCode = errorCode; + } public BadRequestException(int status) { diff --git a/Morpher.WebService.V3.Client/MyWebClient.cs b/Morpher.WebService.V3.Client/MyWebClient.cs index 6bd5e46..5a85c67 100644 --- a/Morpher.WebService.V3.Client/MyWebClient.cs +++ b/Morpher.WebService.V3.Client/MyWebClient.cs @@ -5,6 +5,7 @@ namespace Morpher.WebService.V3 { + using System.Collections.Generic; using System.Collections.Specialized; using Newtonsoft.Json; @@ -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) @@ -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>(jsonResponse); + string errorCode = ""; + if(resp.TryGetValue("code", out errorCode)) + throw new BadRequestException(status, int.Parse(errorCode)); + else + throw new BadRequestException(status); } if (status >= 500) diff --git a/Morpher.WebService.V3.Client/Qazaq/Client.cs b/Morpher.WebService.V3.Client/Qazaq/Client.cs index 33f3541..6261436 100644 --- a/Morpher.WebService.V3.Client/Qazaq/Client.cs +++ b/Morpher.WebService.V3.Client/Qazaq/Client.cs @@ -37,31 +37,56 @@ public DeclensionResult Parse(string lemma) } } + /// + /// Строит количественное числительное прописью из данного числа. + /// + /// Число. + /// Чтобы вместо "бір мың" (одна тысяча) выдавалось упрощенная запись "мың" (тысяча), укажите параметр use-one=false. + /// Количественное числительное прописью, например, "жиырма бес" 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("/qazaq/cardinal"); - - return stringResult; + return client.GetObject("/qazaq/cardinal"); } } + /// + /// Строит порядковое числительное из данного количественного числительного. + /// + /// Количественное числительное, например, "жиырма бес". + /// Порядковое числительное, например, "жиырма бесінші" + /// + /// Если не является казахским словом. + /// public string GetOrdinal(string cardinal) { using (var client = _newClient()) { client.AddParam("cardinal", cardinal); - var stringResult = client.GetObject("/qazaq/ordinal"); - - return stringResult; + try + { + return client.GetObject("/qazaq/ordinal"); + } + catch (BadRequestException e) when (e.ErrorCode == 15) + { + throw new ArgumentNotQazaqException(nameof(cardinal)); + } } } + /// + /// Функция преобразует дату в формате ГГГГ-ММ-ДД в пропись на казахском языке. + /// + /// Дата, например, 2000-10-23. + /// Чтобы вместо "бір мың" (одна тысяча) выдавалось упрощенная запись "мың" (тысяча), укажите параметр use-one=false. + /// Дата прописью, например, "екі мыңыншы жылғы жиырма үшінші казан" + /// + /// Если не соответствует формату. + /// public string GetDate(string date, bool useOne) { using (var client = _newClient()) @@ -69,21 +94,74 @@ public string GetDate(string date, bool useOne) client.AddParam("date", date); client.AddParam("use-one", useOne.ToString()); var stringResult = client.GetObject("/qazaq/date"); + try + { + return client.GetObject("/qazaq/date"); + } + catch (BadRequestException e) when (e.ErrorCode == 16) + { + throw new QazaqWrongDateException(nameof(date)); + } + } + } - return stringResult; + /// + /// Функция преобразует дату в формате ГГГГ-ММ-ДД в пропись на казахском языке. + /// + /// Дата, например, 2000-10-23. + /// Чтобы вместо "бір мың" (одна тысяча) выдавалось упрощенная запись "мың" (тысяча), укажите параметр use-one=false. + /// Дата прописью, например, "екі мыңыншы жылғы жиырма үшінші казан" + /// + /// Если не соответствует формату. + /// + 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("/qazaq/date"); + } + catch (BadRequestException e) when (e.ErrorCode == 16) + { + throw new QazaqWrongDateException(nameof(dateTime)); + } } } + /// + /// Функция преобразует номер дня и месяца в пропись на казахском языке. + /// + /// Число от 1 до 31. + /// Номер месяца от 1 до 12. + /// День месяца прописью, например, "ақпанның оны" + /// + /// Если больше 31 или меньше 1. + /// + /// + /// Если больше 12 или меньше 1. + /// 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("/qazaq/day-of-month"); - - return stringResult; + try + { + return client.GetObject("/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; + } } } } diff --git a/Morpher.WebService.V3.Client/Qazaq/QazaqWrongDateException.cs b/Morpher.WebService.V3.Client/Qazaq/QazaqWrongDateException.cs new file mode 100644 index 0000000..0656e1c --- /dev/null +++ b/Morpher.WebService.V3.Client/Qazaq/QazaqWrongDateException.cs @@ -0,0 +1,13 @@ +namespace Morpher.WebService.V3.Qazaq +{ + public class QazaqWrongDateException : InvalidArgumentException + { + public override string Message => + "Неправильная дата. Ожидается формат ГГГГ-ММ-ДД."; + + public QazaqWrongDateException(string parameterName) + : base(parameterName) + { + } + } +} \ No newline at end of file diff --git a/Morpher.WebService.V3.Client/Qazaq/QazaqWrongDayOfMonthException.cs b/Morpher.WebService.V3.Client/Qazaq/QazaqWrongDayOfMonthException.cs new file mode 100644 index 0000000..f4d3c1d --- /dev/null +++ b/Morpher.WebService.V3.Client/Qazaq/QazaqWrongDayOfMonthException.cs @@ -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) + { + } + } +} \ No newline at end of file diff --git a/Morpher.WebService.V3.Client/Qazaq/QazaqWrongMonthException.cs b/Morpher.WebService.V3.Client/Qazaq/QazaqWrongMonthException.cs new file mode 100644 index 0000000..41109cb --- /dev/null +++ b/Morpher.WebService.V3.Client/Qazaq/QazaqWrongMonthException.cs @@ -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) + { + } + } +} \ No newline at end of file