Skip to content

Commit 916c1e1

Browse files
committed
Funciones para crear objetos agregadas
1 parent 40adc4b commit 916c1e1

6 files changed

Lines changed: 201 additions & 1 deletion

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.platzi.jobsearch;
2+
3+
import com.beust.jcommander.JCommander;
4+
5+
import java.util.function.Supplier;
6+
7+
public interface CommanderFunctions {
8+
/**
9+
* JCommander permite generar opciones de terminal de cualquier clase, por eso el primer parametro es
10+
* de tipo Object.
11+
*
12+
* @param object Clase de la cual se generaran los argumentos de JCommander
13+
* @return una instancia de JCommander. Idealmente con CLIArguments como objeto pasado.
14+
*/
15+
static JCommander buildCommander(Object object) {
16+
return JCommander
17+
.newBuilder()
18+
.addObject(object)
19+
.build();
20+
}
21+
22+
/**
23+
* Con esta funcion, facilitamos crear una configuracion inicial de JCommander, pidiendo el nombre del
24+
* programa y un Supplier de tipo T para los argumentos. Asi podemos usar alguna funcion que nos devuelva
25+
* un objeto que funcione como argumentos de JCommander.
26+
*
27+
* @param name nombre que se mostrara en el CLI
28+
* @param argumentsSupplier una funcion que devuelva un objeto de argumentos de JCommander
29+
* @param <T> Tipo que se usara para los argumentos
30+
* @return una instancia de {@link JCommander} ya configurada con el nombre y los argumentos.
31+
*/
32+
static <T> JCommander buildCommanderWithName(String name, Supplier<T> argumentsSupplier) {
33+
JCommander jCommander = buildCommander(argumentsSupplier.get());
34+
jCommander.setProgramName(name);
35+
return jCommander;
36+
}
37+
}
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package com.platzi.jobsearch;
22

3+
import com.beust.jcommander.JCommander;
4+
import com.platzi.jobsearch.cli.CLIArguments;
5+
6+
import static com.platzi.jobsearch.CommanderFunctions.buildCommanderWithName;
7+
38
public class JobSearch {
49
public static void main(String[] args) {
5-
System.out.println("Hello fellow student");
10+
//Creacion de nuestro CLI con JCommander
11+
JCommander jCommander = buildCommanderWithName("job-search", CLIArguments::newInstance);
612
}
713
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.platzi.jobsearch.api;
2+
3+
import feign.Feign;
4+
import feign.gson.GsonDecoder;
5+
6+
public interface APIFunctions {
7+
/**
8+
* Para construir la llamada fon Feign, necesitamos generar un cliente de Feign,
9+
* esconder que internamente este es el cliente que se usa, nos facilita hacer facil
10+
* el reemplazo de la libreria para http en el futuro.
11+
*
12+
* @param api una Class de tipo T para construir nuestra api
13+
* @param url la URL base donde estaremos haciendo los requests
14+
* @param <T> el tipo de API que contruiremos
15+
* @return una instancia de T para usar como cliente de API
16+
*/
17+
static <T> T buildAPI(Class<T> api, String url) {
18+
return Feign.builder()
19+
.decoder(new GsonDecoder())
20+
.target(api, url);
21+
}
22+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.platzi.jobsearch.cli;
2+
3+
import com.beust.jcommander.Parameter;
4+
5+
public final class CLIArguments {
6+
/**
7+
* Constructor default para permitir que solo clases en el paquete, puedan crear objetos
8+
* de esta clase.
9+
* De esta manera obligamos a que la construccion se haga mediante funciones publicas o
10+
* builders.
11+
* <p>
12+
* Las instancias deberan crearse mediante: CLIArguments#newInstance
13+
*/
14+
CLIArguments() {
15+
}
16+
17+
@Parameter(
18+
required = true,
19+
descriptionKey = "KEYWORD",
20+
description = "KEYWORD",
21+
validateWith = CLIKeywordValidator.class)
22+
private String keyword;
23+
24+
@Parameter(
25+
names = {"--location", "-l"},
26+
description = "Ciudad, codigo postal o algun otro termino para buscar una ubicacion")
27+
private String location;
28+
29+
@Parameter(
30+
names = {"--page", "-p"},
31+
description = "Cada busqueda contiene 50 posiciones, puedes paginar mas resultados cambiando el numero, la paginacion empieza en 0")
32+
private int page = 0;
33+
34+
@Parameter(
35+
names = "--full-time",
36+
description = "Agregar esta bandera si se desea unicamente listar trabajos de 'full time'"
37+
)
38+
private boolean isFullTime = false;
39+
40+
@Parameter(
41+
names = "--markdown",
42+
description = "Agregar esta bandera si se desea obtener los resultados en markdown"
43+
)
44+
private boolean isMarkdown = false;
45+
46+
@Parameter(
47+
names = "--help",
48+
help = true,
49+
validateWith = CLIHelpValidator.class,
50+
description = "Muestra esta ayuda")
51+
private boolean help;
52+
53+
public String getKeyword() {
54+
return keyword;
55+
}
56+
57+
public String getLocation() {
58+
return location;
59+
}
60+
61+
public int getPage() {
62+
return page;
63+
}
64+
65+
public boolean isFullTime() {
66+
return isFullTime;
67+
}
68+
69+
public boolean isMarkdown() {
70+
return isMarkdown;
71+
}
72+
73+
public boolean isHelp() {
74+
return help;
75+
}
76+
77+
@Override
78+
public String toString() {
79+
return "CLIArguments{" +
80+
"keyword='" + keyword + '\'' +
81+
", location='" + location + '\'' +
82+
", pages=" + page +
83+
", isFullTime=" + isFullTime +
84+
", help=" + help +
85+
", isMarkdown=" + isMarkdown +
86+
'}';
87+
}
88+
89+
/**
90+
* Esta funcion es equivalente a CLIArguments::new, sin embargo, si en el futuro queremos agregar
91+
* parametros adicionales, podemos limitar la manera de construir objetos mediante esta funcion.
92+
*/
93+
public static CLIArguments newInstance() {
94+
return new CLIArguments();
95+
}
96+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.platzi.jobsearch.cli;
2+
3+
import com.beust.jcommander.IParameterValidator;
4+
import com.beust.jcommander.ParameterException;
5+
6+
/**
7+
* Clase usada internamente por JCommande para validar ciertos argumentos.
8+
* En nuestro caso la usamos para frenar el parseo de argumentos si encontramos que se solicito
9+
* la opcion de ayuda.
10+
*/
11+
public class CLIHelpValidator implements IParameterValidator {
12+
13+
@Override
14+
public void validate(String name, String value) throws ParameterException {
15+
boolean actualValue = Boolean.parseBoolean(value);
16+
if (actualValue) {
17+
throw new ParameterException("Help passed");
18+
}
19+
}
20+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.platzi.jobsearch.cli;
2+
3+
import com.beust.jcommander.IParameterValidator;
4+
import com.beust.jcommander.ParameterException;
5+
6+
/**
7+
* Clase usada por JCommander para validar argumentos.
8+
* <p>
9+
* En nuestro caso la usamos para validar que el skill solicitiado (keyword) sea unicamente letras y numeros.
10+
*/
11+
public class CLIKeywordValidator implements IParameterValidator {
12+
@Override
13+
public void validate(String name, String value) throws ParameterException {
14+
if (!value.matches("^[a-zA-Z]+[0-9]*$")) {
15+
System.err.println("Keyword: " + value + " no es un Keyword valido, keywords deben ser alfanumericas.\n");
16+
throw new ParameterException("Only alphanumerics are supported");
17+
}
18+
}
19+
}

0 commit comments

Comments
 (0)