using System.Text.RegularExpressions; namespace ShareeBike.Repository.Exception { /// Handles booking request which fail due to too many bikes requested/ booked. public class BookingDeclinedException : InvalidResponseException { /// Holds error description if user/ password combination is not valid. public const string BOOKING_FAILURE_STATUS_MESSAGE_UPPERCASE = "(OK: BOOKING_REQUEST DECLINED\\. MAX COUNT OF )([0-9]+)( OCCUPIED BIKES HAS BEEN REACHED)"; /// Prevents invalid use of exception. private BookingDeclinedException() : base(typeof(BookingDeclinedException).Name) { } /// Prevents invalid use of exception. public BookingDeclinedException(int maxBikesCount) : base(typeof(BookingDeclinedException).Name) { MaxBikesCount = maxBikesCount; } public static bool IsBookingDeclined(string responseState, out BookingDeclinedException exception) { // Check if there are too many bikes requested/ booked. var match = Regex.Match( responseState.ToUpper(), BOOKING_FAILURE_STATUS_MESSAGE_UPPERCASE); if (match.Groups.Count != 4 || !int.TryParse(match.Groups[2].ToString(), out int maxBikesCount)) { exception = null; return false; } exception = new BookingDeclinedException(maxBikesCount); return true; } /// Holds the maximum count of bikes allowed to reserve/ book. public int MaxBikesCount { get; private set; } } }