Skip to content

Commit d5e952c

Browse files
authored
Merge pull request #5 from MartinFiorde/maf-practice
Practica finalizada
2 parents 5a03ed7 + ea5855a commit d5e952c

5 files changed

Lines changed: 30 additions & 40 deletions

File tree

jobs-search-reporter/src/main/java/com/platzi/jobsearch/CommanderFunctions.java

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,6 @@
88
import java.util.function.Supplier;
99

1010
public interface CommanderFunctions {
11-
/**
12-
* JCommander permite generar opciones de terminal de cualquier clase, por eso el primer parametro es
13-
* de tipo Object.
14-
*
15-
* @param object Clase de la cual se generaran los argumentos de JCommander
16-
* @return una instancia de JCommander. Idealmente con CLIArguments como objeto pasado.
17-
*/
18-
static JCommander buildCommander(Object object) {
19-
return JCommander
20-
.newBuilder()
21-
.addObject(object)
22-
.build();
23-
}
24-
2511
/**
2612
* Con esta funcion, facilitamos crear una configuracion inicial de JCommander, pidiendo el nombre del
2713
* programa y un Supplier de tipo T para los argumentos. Asi podemos usar alguna funcion que nos devuelva
@@ -33,7 +19,11 @@ static JCommander buildCommander(Object object) {
3319
* @return una instancia de {@link JCommander} ya configurada con el nombre y los argumentos.
3420
*/
3521
static <T> JCommander buildCommanderWithName(String name, Supplier<T> argumentsSupplier) {
36-
JCommander jCommander = buildCommander(argumentsSupplier.get());
22+
// JCommander permite generar opciones de terminal de cualquier clase, por eso se le agrega un object con el metodo addObject(...)
23+
// argumentsSupplier.get() es la clase de la cual se generaran los argumentos de JCommander
24+
// Queda definida una instancia de JCommander. Idealmente con CLIArguments como objeto pasado.
25+
JCommander jCommander = JCommander.newBuilder().addObject(argumentsSupplier.get()).build();
26+
3727
jCommander.setProgramName(name);
3828
return jCommander;
3929
}
@@ -45,18 +35,14 @@ static <T> JCommander buildCommanderWithName(String name, Supplier<T> argumentsS
4535
static Optional<List<Object>> parseArguments(
4636
JCommander jCommander,
4737
String[] arguments,
48-
OnCommandError onCommandError
49-
) {
50-
List<Object> result;
38+
OnCommandError onCommandError) { // en caso que las validaciones de CLIKeywordValidaror o CLIHelpValidator fallen, se generará un ParameterException
5139
try {
5240
jCommander.parse(arguments);
53-
5441
return Optional.of(jCommander.getObjects());
55-
} catch (ParameterException exception) {
42+
} catch (ParameterException exception) { // atrapará el parameter exception y devuelve un optional vacio
5643
onCommandError.onError(jCommander);
44+
return Optional.empty();
5745
}
58-
59-
return Optional.empty();
6046
}
6147

6248
@FunctionalInterface

jobs-search-reporter/src/main/java/com/platzi/jobsearch/JobSearch.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,22 @@ public static void main(String[] args) {
2121
JCommander jCommander = buildCommanderWithName("job-search", CLIArguments::newInstance);
2222

2323
//Obtenemos las opciones que se le dieron a JCommander
24-
Stream<CLIArguments> streamOfCLI =
25-
//Nos retorna un Optional<List<Object>>
26-
parseArguments(jCommander, args, JCommander::usage)
27-
//En caso de un Optional.empty()
28-
.orElse(Collections.emptyList())
24+
Stream<CLIArguments> streamOfCLI = parseArguments(jCommander, args, JCommander::usage) //Nos retorna un Optional<List<Object>>
25+
.orElse(Collections.emptyList()) //En caso de un Optional.empty()
2926
.stream()
3027
.map(CLIArguments.class::cast); // map(obj -> (CLIArguments) obj) give same result
3128

3229
//Tomamos nuestro Stream y obtenemos las opciones que se dieron en el CLI
3330
Optional<CLIArguments> cliOptional = streamOfCLI
34-
//Solo nos interesan los casos donde no sea la solicitud de ayuda
35-
.filter(cli -> !cli.isHelp())
36-
//Y que contengan un keyword, en otros caso no tenemos que buscar
37-
.filter(cli -> cli.getKeyword() != null)
31+
.filter(cli -> !cli.isHelp()) //Solo nos interesan los casos donde no sea la solicitud de ayuda
32+
.filter(cli -> cli.getKeyword() != null) //Y que contengan un keyword, en otros caso no tenemos que buscar
3833
.findFirst();
3934

4035
//Si el Optional tiene un dato, lo convertimos a Map<String,Object>
4136
cliOptional.map(CLIFunctions::toMap)
42-
//Convertimos el Map en un request
43-
.map(JobSearch::executeRequest)
44-
//Aun seguimos operando sobre un Optional… en caso de que no hubiera datos
45-
//Generamos un stream vacio
46-
.orElse(Stream.empty())
47-
//Imprimos los datos por pantalla.
48-
.forEach(System.out::println);
37+
.map(JobSearch::executeRequest) //Convertimos el Map en un request
38+
.orElse(Stream.empty()) //Aun seguimos operando sobre un Optional… en caso de que no hubiera datos generamos un stream vacio
39+
.forEach(System.out::println); //Imprimos los datos por pantalla.
4940
}
5041

5142
private static Stream<JobPosition> executeRequest(Map<String, Object> options) {

jobs-search-reporter/src/main/java/com/platzi/jobsearch/cli/CLIArguments.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public final class CLIArguments {
4444
private boolean isMarkdown = false;
4545

4646
@Parameter(
47-
names = "--help",
47+
names = {"--help", "-h"},
4848
help = true,
4949
validateWith = CLIHelpValidator.class,
5050
description = "Muestra esta ayuda")

jobs-search-reporter/src/main/java/com/platzi/jobsearch/cli/CLIKeywordValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public class CLIKeywordValidator implements IParameterValidator {
1212
@Override
1313
public void validate(String name, String value) throws ParameterException {
14-
if (!value.matches("^[a-zA-Z]+[0-9]*$")) {
14+
if (!value.matches("^[a-zA-Z]+\\d*$")) {
1515
System.err.println("Keyword: " + value + " no es un Keyword valido, keywords deben ser alfanumericas.\n");
1616
throw new ParameterException("Only alphanumerics are supported");
1717
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.platzi.functional_student_practice._20_job_search_reporter;
2+
3+
public class C30A40JobSearchReporter {
4+
/*
5+
al 24 de julio de 2024, la API https://jobs.github.com/api se encuentra fuera de servicio, por lo que no se
6+
puede realizar practica real sobre los conceptos desarrollados en clase. Las clases y los contenidos se siguen
7+
de manera teórica de aquí en adelante, usando como referencia el código del directorio root/jobs-search-reporter
8+
y los conceptos desarrollados en videos y recursos del curso https://platzi.com/cursos/java-funcional/
9+
10+
Link al repositorio de un compañero que aplica los conceptos sobre la API de rick y morty,
11+
pero de forma más limitada: https://github.com/barreracarlosandres/CLIRickAndMorty
12+
*/
13+
}

0 commit comments

Comments
 (0)