예제 #1
0
        private string MapExcludeToQueryParameter(ExcludeParameter excludeParameter)
        {
            switch (excludeParameter)
            {
            case ExcludeParameter.None:
                return(string.Empty);

            case ExcludeParameter.Minutely:
                return("exclude=minutely");

            case ExcludeParameter.Hourly:
                return("exclude=hourly");

            case ExcludeParameter.Alerts:
                return("exclude=alerts");

            case ExcludeParameter.Flags:
                return("exclude=flags");;

            case ExcludeParameter.AlertsAndFlags:
                return("exclude=alerts,flags");

            case ExcludeParameter.AllExceptDailyAndCurrently:
                return("exclude=minutely,hourly,alerts,flags");

            default:
                return(string.Empty);
            }
        }
예제 #2
0
        private string BuildRelativeCityUrl(City city, ExcludeParameter excludeParameter, MetricSystem metricSystem)
        {
            string relativeUrlForCityWithoutQueryParams = city.Latitude + "," + city.Longitude;
            string excludeQueryParameter = MapExcludeToQueryParameter(excludeParameter);
            string metricQueryParametere = MapMetricSystemToQueryParameter(metricSystem);

            return(relativeUrlForCityWithoutQueryParams + "?" + excludeQueryParameter + "&" + metricQueryParametere);
        }
예제 #3
0
        private async Task <WeatherDataRoot> ProcessCityWeatherDataQuery(City city, ExcludeParameter excludeParameter, MetricSystem metricSystem)
        {
            string relativeUrlWithQueryParams = BuildRelativeCityUrl(ArgumentValidation.ThrowIfNull(city, nameof(city)), excludeParameter, metricSystem);

            Uri    fullUrl;
            string rawWeatherData;

            try
            {
                fullUrl        = new Uri(_darkSkyForecastBaseUrl, relativeUrlWithQueryParams);
                rawWeatherData = await _weatherDataRetriever.FetchWeatherData(fullUrl);
            }
            catch (UriFormatException ex)
            {
                Logger.Error("The retrieved DarkSky Forecast Request URL used has invalid format.", ex);
                throw ex;
            }
            catch (HttpRequestException ex)
            {
                Logger.Error("The DarkSky Forecast Request failed due to an underlying issue e.g. network connectivity.", ex);
                throw ex;
            }
            catch (ArgumentOutOfRangeException ex)
            {
                Logger.Error("The DarkSky Forecast Base URL processing was unsuccessful.", ex);
                throw ex;
            }
            catch (ArgumentNullException ex)
            {
                Logger.Error("The DarkSky Forecast Base URL was null.", ex);
                throw ex;
            }

            if (Logger.IsInfoEnabled)
            {
                Logger.Info($"Successful weather data retrieval for {city.Name} from URL: {fullUrl}");
            }

            WeatherDataRoot weatherDataForCity;

            try
            {
                weatherDataForCity = ParseWeatherDataFromStringResult(rawWeatherData);
            }
            catch (ArgumentNullException ex)
            {
                weatherDataForCity = null;
                Logger.Error("JSON parser had to work on a null raw response.", ex);
                throw ex;
            }

            if (weatherDataForCity != null)
            {
                weatherDataForCity.CityName = city.Name;
            }
            return(weatherDataForCity);
        }
예제 #4
0
        public async Task <IEnumerable <WeatherDataRoot> > GetWeatherDataForMultipleCities(IEnumerable <City> cities, ExcludeParameter excludeParameter = ExcludeParameter.AllExceptDailyAndCurrently, MetricSystem metricSystem = MetricSystem.AUTO)
        {
            IList <WeatherDataRoot> weatherDataList = new List <WeatherDataRoot>();

            foreach (City city in cities)
            {
                WeatherDataRoot weatherDataForCity = await ProcessCityWeatherDataQuery(city, excludeParameter, metricSystem);

                weatherDataList.Add(weatherDataForCity);
            }
            return(weatherDataList.ToArray());
        }
예제 #5
0
 public async Task <WeatherDataRoot> GetWeatherDataForCity(City city, ExcludeParameter excludeParameter = ExcludeParameter.AllExceptDailyAndCurrently, MetricSystem metricSystem = MetricSystem.AUTO)
 {
     return(await ProcessCityWeatherDataQuery(city, excludeParameter, metricSystem));
 }