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); } }
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); }
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); }
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()); }
public async Task <WeatherDataRoot> GetWeatherDataForCity(City city, ExcludeParameter excludeParameter = ExcludeParameter.AllExceptDailyAndCurrently, MetricSystem metricSystem = MetricSystem.AUTO) { return(await ProcessCityWeatherDataQuery(city, excludeParameter, metricSystem)); }