diff --git a/src/Forecast/Serializer/ForecastPeriodNormalizer.php b/src/Forecast/Serializer/ForecastPeriodNormalizer.php index 70dc9cc..d6b8239 100644 --- a/src/Forecast/Serializer/ForecastPeriodNormalizer.php +++ b/src/Forecast/Serializer/ForecastPeriodNormalizer.php @@ -5,6 +5,7 @@ namespace BomWeather\Forecast\Serializer; use BomWeather\Forecast\ForecastPeriod; +use BomWeather\Trait\WeatherDataAccessorTrait; use BomWeather\Util\BaseNormalizer; /** @@ -12,6 +13,8 @@ */ class ForecastPeriodNormalizer extends BaseNormalizer { + use WeatherDataAccessorTrait; + protected string|array $supportedInterfaceOrClass = ForecastPeriod::class; /** @@ -57,24 +60,14 @@ public function denormalize($data, $type, $format = NULL, array $context = []) { * The period. */ protected function setElementValue(array $element, ForecastPeriod $period): void { - switch ($element['@type']) { - case 'forecast_icon_code': - $period->setIconCode($element['#']); - break; - - case 'air_temperature_minimum': - $period->setAirTempMinimum((int) $element['#']); - break; - - case 'air_temperature_maximum': - $period->setAirTempMaximum((int) $element['#']); - break; - - case 'precipitation_range': - $period->setPrecipitationRange($element['#']); - break; - - } + $value = $this->accessWeatherData($element, '#'); + match ($element['@type']) { + 'forecast_icon_code' => $period->setIconCode($value), + 'air_temperature_minimum' => $period->setAirTempMinimum((int) $value), + 'air_temperature_maximum' => $period->setAirTempMaximum((int) $value), + 'precipitation_range' => $period->setPrecipitationRange($value), + default => '', + }; } /** @@ -86,40 +79,18 @@ protected function setElementValue(array $element, ForecastPeriod $period): void * The period. */ public function setTextValue(array $text, ForecastPeriod $period): void { - switch ($text['@type']) { - case 'precis': - $period->setPrecis($text['#']); - break; - - case 'probability_of_precipitation': - $period->setProbabilityOfPrecipitation($text['#']); - break; - - case 'forecast': - $period->setForecast($text['#']); - break; - - case 'uv_alert': - $period->setUvAlert($text['#']); - break; - - case 'forecast_seas': - $period->setSeas($text['#']); - break; - - case 'forecast_swell1': - $period->setSwell($text['#']); - break; - - case 'forecast_weather': - $period->setWeather($text['#']); - break; - - case 'forecast_winds': - $period->setWinds($text['#']); - break; - - } + $value = $this->accessWeatherData($text, '#'); + match ($text['@type']) { + 'precis' => $period->setPrecis($value), + 'probability_of_precipitation' => $period->setProbabilityOfPrecipitation($value), + 'forecast' => $period->setForecast($value), + 'uv_alert' => $period->setUvAlert($value), + 'forecast_seas' => $period->setSeas($value), + 'forecast_swell1' => $period->setSwell($value), + 'forecast_weather' => $period->setWeather($value), + 'forecast_winds' => $period->setWinds($value), + default => '', + }; } } diff --git a/src/Trait/WeatherDataAccessorTrait.php b/src/Trait/WeatherDataAccessorTrait.php new file mode 100644 index 0000000..9349d5d --- /dev/null +++ b/src/Trait/WeatherDataAccessorTrait.php @@ -0,0 +1,30 @@ +accessWeatherData($text, '#'); match ($text['@type']) { - 'warning_title' => $warningInfo->setWarningTitle($text['#']), - 'preamble' => $warningInfo->setPreamble($text['#']), + 'warning_title' => $warningInfo->setWarningTitle($value), + 'preamble' => $warningInfo->setPreamble($value), 'warning_advice' => \array_map(function ($advice) use ($warningInfo): void { $warningInfo->setWarningAdvice($advice); - }, $text['p']), - 'warning_next_issue' => $warningInfo->setWarningNextIssue($text['#']), + }, $this->accessWeatherData($text, 'p')), + 'warning_next_issue' => $warningInfo->setWarningNextIssue($value), default => '', }; }