feature: added CLI interface

This commit is contained in:
amorozov 2025-05-21 17:19:30 +03:00
parent 66b0b821f6
commit 929e686698
4 changed files with 108 additions and 2 deletions

View File

@ -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()));
}
}

View 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();
}
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}