private WeatherResult MapResponseToWeatherResult(OpenWeatherMapResponse response)
 {
     return(response == null ? null : new WeatherResult(
                response.WeatherDescription?.FirstOrDefault()?.Title,
                response.WeatherDescription?.FirstOrDefault()?.FullDescription,
                (int)Math.Round(UnitsConverter.ConvertTemperatureKelvinToCelsius((double)(response.WeatherGeneralInformation?.Temperature ?? 0M)), 0),
                response.WeatherGeneralInformation?.Pressure ?? 0
                ));
 }
Ejemplo n.º 2
0
        public async Task <WeatherResult> ParseAsync(string cityName, CancellationToken cancellationToken)
        {
            if (string.IsNullOrEmpty(cityName))
            {
                throw new ArgumentException("cityName is required");
            }

            cancellationToken.ThrowIfCancellationRequested();

            string apiRequestUrl = GetApiRequestUrl(cityName);

            _logger.WriteLog("Begin request to OpenWeatherMap Api");
            var httpResponse = await _client.GetAsync(apiRequestUrl, cancellationToken);

            _logger.WriteLog($"Response from OpenWeatherMap Api received. Http Code: {httpResponse?.StatusCode}");

            cancellationToken.ThrowIfCancellationRequested();

            var responseJson = await httpResponse.Content.ReadAsStringAsync();

            _logger.WriteLog($"Response from OpenWeatherMap: {responseJson}");

            cancellationToken.ThrowIfCancellationRequested();

            dynamic parsedResponse = JsonConvert.DeserializeObject <ExpandoObject>(responseJson);
            var     last           = parsedResponse.list.Count > 0 ? parsedResponse.list[parsedResponse.list.Count - 1] : null;

            if (last == null)
            {
                return(null);
            }

            var lastWeather = (last.weather?.Count ?? 0) >= 1 ? last.weather[0] : null;

            return(new WeatherResult((string)lastWeather?.main, (string)lastWeather?.description,
                                     (int)Math.Round(UnitsConverter.ConvertTemperatureKelvinToCelsius((double)(last.main?.temp ?? 0M)), 0),
                                     (int?)last.main?.pressure ?? 0));
        }