From 929e6866984c71b0a9b30cfcb3195597248f08dc Mon Sep 17 00:00:00 2001 From: amorozov Date: Wed, 21 May 2025 17:19:30 +0300 Subject: [PATCH] feature: added CLI interface --- src/main/java/ru/dima/weather/WeatherApp.java | 18 ++++++++- .../ru/dima/weather/cli/CLIInputReader.java | 36 ++++++++++++++++++ .../cli/WeatherProviderCLISelector.java | 38 +++++++++++++++++++ .../provider/WeatherProviderRegistry.java | 18 +++++++++ 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/dima/weather/cli/CLIInputReader.java create mode 100644 src/main/java/ru/dima/weather/cli/WeatherProviderCLISelector.java create mode 100644 src/main/java/ru/dima/weather/provider/WeatherProviderRegistry.java diff --git a/src/main/java/ru/dima/weather/WeatherApp.java b/src/main/java/ru/dima/weather/WeatherApp.java index 815e388..b07764f 100644 --- a/src/main/java/ru/dima/weather/WeatherApp.java +++ b/src/main/java/ru/dima/weather/WeatherApp.java @@ -1,8 +1,15 @@ package ru.dima.weather; import ru.dima.weather.city.CityByIpResolver; +import ru.dima.weather.cli.CLIInputReader; +import ru.dima.weather.cli.WeatherProviderCLISelector; import ru.dima.weather.http.HttpRequester; import ru.dima.weather.provider.OpenWeatherMapWeatherProvider; +import ru.dima.weather.provider.WeatherProvider; +import ru.dima.weather.provider.WeatherProviderRegistry; + +import java.util.Scanner; +import java.util.stream.Collectors; /* 1. Брать текущий IP @@ -14,9 +21,16 @@ public class WeatherApp { public static void main(String[] args) { var httpRequester = new HttpRequester(); var cityByIpResolver = new CityByIpResolver(httpRequester); - System.out.println(cityByIpResolver.getCurrentCityViaIP()); + var weatherProviderRegistry = new WeatherProviderRegistry(); var openWeatherMapProvider = new OpenWeatherMapWeatherProvider(httpRequester, "29ed5ca47c3d0c32385b18f1e82e522f"); - System.out.println(openWeatherMapProvider.getWeeklyWeatherInCity(cityByIpResolver.getCurrentCityViaIP())); + weatherProviderRegistry.registerWeatherProvider(openWeatherMapProvider); + + var weatherProviderCliSelector = new WeatherProviderCLISelector(new CLIInputReader(System.in), weatherProviderRegistry); + var weatherProviderSelectedByUser = weatherProviderCliSelector.selectWeatherProviderFromCLI(); + + System.out.println(weatherProviderSelectedByUser.getWeeklyWeatherInCity(cityByIpResolver.getCurrentCityViaIP())); + +// System.out.println(openWeatherMapProvider.getWeeklyWeatherInCity(cityByIpResolver.getCurrentCityViaIP())); } } diff --git a/src/main/java/ru/dima/weather/cli/CLIInputReader.java b/src/main/java/ru/dima/weather/cli/CLIInputReader.java new file mode 100644 index 0000000..d16872f --- /dev/null +++ b/src/main/java/ru/dima/weather/cli/CLIInputReader.java @@ -0,0 +1,36 @@ +package ru.dima.weather.cli; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class CLIInputReader { + private BufferedReader scanner; + + public CLIInputReader(InputStream systemIn) { + this.scanner = new BufferedReader(new InputStreamReader(systemIn)); + } + + public String readString() { + try { + return scanner.readLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public int readInteger() { + try { + var inputString = readString(); + if (inputString == null) { + throw new IllegalStateException("IO Closed"); + } + + return Integer.parseInt(inputString); + } catch (NumberFormatException e) { + System.out.println("Попробуй еще раз, это не число"); + return readInteger(); + } + } +} diff --git a/src/main/java/ru/dima/weather/cli/WeatherProviderCLISelector.java b/src/main/java/ru/dima/weather/cli/WeatherProviderCLISelector.java new file mode 100644 index 0000000..ba98051 --- /dev/null +++ b/src/main/java/ru/dima/weather/cli/WeatherProviderCLISelector.java @@ -0,0 +1,38 @@ +package ru.dima.weather.cli; + +import ru.dima.weather.provider.WeatherProvider; +import ru.dima.weather.provider.WeatherProviderRegistry; + +public class WeatherProviderCLISelector { + private CLIInputReader cliInputReader; + private WeatherProviderRegistry weatherProviderRegistry; + + public WeatherProviderCLISelector(CLIInputReader cliInputReader, WeatherProviderRegistry weatherProviderRegistry) { + this.cliInputReader = cliInputReader; + this.weatherProviderRegistry = weatherProviderRegistry; + } + + public WeatherProvider selectWeatherProviderFromCLI() { + System.out.println("Для продолжения выбери сервис, предоставляющие погоду из представленных ниже."); + System.out.println("Доступные сервисы погоды:"); + + var weatherProviders = weatherProviderRegistry.getAllWeatherProviders(); + for (var weatherProviderIndex = 0; weatherProviderIndex < weatherProviders.size(); weatherProviderIndex ++) { + var weatherProvider = weatherProviders.get(weatherProviderIndex); + System.out.println((weatherProviderIndex + 1) + ". '" + weatherProvider.getName() + "'"); + } + + var weatherProviderIndexSelectedByUser = requestWeatherProviderIndexFromCLI(); + while (weatherProviderIndexSelectedByUser < 1 || weatherProviderIndexSelectedByUser > weatherProviders.size()) { + System.out.println("Число должно быть от 1 до " + weatherProviders.size() + ". Попробуй еще раз."); + weatherProviderIndexSelectedByUser = requestWeatherProviderIndexFromCLI(); + } + + return weatherProviders.get(weatherProviderIndexSelectedByUser - 1); + } + + private int requestWeatherProviderIndexFromCLI() { + System.out.print(">> Введите номер сервиса: "); + return cliInputReader.readInteger(); + } +} diff --git a/src/main/java/ru/dima/weather/provider/WeatherProviderRegistry.java b/src/main/java/ru/dima/weather/provider/WeatherProviderRegistry.java new file mode 100644 index 0000000..0c09178 --- /dev/null +++ b/src/main/java/ru/dima/weather/provider/WeatherProviderRegistry.java @@ -0,0 +1,18 @@ +package ru.dima.weather.provider; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class WeatherProviderRegistry { + + private List registeredWeatherProviders = new ArrayList<>(); + + public void registerWeatherProvider(WeatherProvider weatherProvider) { + registeredWeatherProviders.add(weatherProvider); + } + + public List getAllWeatherProviders() { + return Collections.unmodifiableList(registeredWeatherProviders); + } +}