feature: added CLI interface
This commit is contained in:
parent
66b0b821f6
commit
929e686698
@ -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()));
|
||||
}
|
||||
}
|
||||
|
36
src/main/java/ru/dima/weather/cli/CLIInputReader.java
Normal file
36
src/main/java/ru/dima/weather/cli/CLIInputReader.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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<WeatherProvider> registeredWeatherProviders = new ArrayList<>();
|
||||
|
||||
public void registerWeatherProvider(WeatherProvider weatherProvider) {
|
||||
registeredWeatherProviders.add(weatherProvider);
|
||||
}
|
||||
|
||||
public List<WeatherProvider> getAllWeatherProviders() {
|
||||
return Collections.unmodifiableList(registeredWeatherProviders);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user