Mi primera aplicación con Rust y Rocket

Agenda

  • ¿Qué es Rust?
  • Características
  • Tipos de datos
  • Condicionales
  • Ciclos
  • Primera aplicación con Rocket

¿Qué es Rust?

Rust es...

Un lenguaje para la programación de sistemas

Características

Velocidad

Rust vs Go

Seguridad

Concurrente

Tipos de datos

let es_humano = true; // boolenano

let es_alienigena: bool = false;

let caracter = 'c'; // carácter

let x = 1; // entero

let primer_arreglo = [1, 2, 3]; // lista de elementos del mismo tipo

let mut segundo_arreglo = [4, 5, 6];

let tupla = (1, "hola", 2.5, 'x'); // lista de elementos de distintos tipos

let a: [i32; 4] = [1, 2, 3, 4]; // arreglo

let e = &a[1..3]; //[2, 3] Slice

let hola = "¡Hola mundo!" // Cadena







Condicionales

let numero_de_jugadores = 7;

if numero_de_jugadores < 5 {
    println!("No son suficientes jugadores");
} 

else if numero_de_jugadores < 10 {
    println!("Tienes suficientes jugadores");
} 

else {
    println!("Tienes muchos jugadores");
}

Ciclos

  • while
  • loop
  • for

Primera aplicación con Rocket


[package]
name = "meetup08"
version = "0.1.0"
authors = ["Tu Nombre <tu@correo.com>"]

[dependencies]
rocket = "0.3.3"
rocket_codegen = "0.3.3"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

Paso 1

#![feature(plugin)]
#![plugin(rocket_codegen)]

extern crate rocket;

#[get("/")]
fn index() -> String {
    "It Works!".to_string()
}

fn main() {
    rocket::ignite().mount("/", routes![index]).launch();
}

Paso 2

[package]
name = "meetup08"
version = "0.1.0"
authors = ["Tu Nombre <tu@correo.com>"]

[dependencies]
rand = "0.3.17"
rocket = "0.3.3"
rocket_codegen = "0.3.3"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"
#![feature(plugin)]
#![plugin(rocket_codegen)]

extern crate rand;

extern crate rocket;

use rand::Rng;

const FRASES: &[&'static str] = &[
    "“La fuerza estará ya contigo… siempre.” (Obi-Wan Kenobi a Luke Skywalker en la Estrella de la Muerte. STAR WARS, episodio IV, Una Nueva Esperanza)",
    "“Miedo, ira, agresividad, el lado oscuro ellos son. Si algún día rigen tu vida, para siempre tu destino dominarán.” (Yoda a Luke Skywalker. STAR WARS, episodio V, El Imperio Contrataca)",
    "“¡Tú siempre con tus “NO PUEDE HACERSE”! ¿Es que escuchándome no estabas?.” (Yoda a Luke Skywalker. STAR WARS, episodio V, El Imperio Contrataca)",
    "“Impresionante… ¡Muy impresionante! Controlas tu miedo, Obi-Wan te ha instruido bien…” (Darth Vader a Luke Skywalker, durante el duelo de sables de luz. STAR WARS, episodio V, El Imperio Contrataca)",
];

fn sacar_frase_aleatoria(frases: &[&'static str]) -> &'static str {
    let mut generador_aleatorio = rand::thread_rng();
    let indice = generador_aleatorio.gen_range(0, FRASES.len());

    frases.get(indice).expect("No se pudo obtener una frase")
}

#[get("/")]
fn index() -> String {
    let frase = sacar_frase_aleatoria(&FRASES);
    frase.to_string()
}

fn main() {
    rocket::ignite().mount("/", routes![index]).launch();
}

Paso 3

[package]
name = "meetup08"
version = "0.1.0"
authors = ["Tu Nombre <tu@correo.com>"]

[dependencies]
rand = "0.3.17"
rocket = "0.3.3"
rocket_codegen = "0.3.3"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

[dependencies.rocket_contrib]
version = "0.3.3"
default-features = false
features = ["tera_templates"]
#![feature(plugin, custom_derive)]
...
extern crate rocket_contrib;

#[macro_use]
extern crate serde_derive;
...
use rocket::request::Form;
use rocket_contrib::Template;
...

#[derive(Serialize)]
struct ContextoPlantilla {
    frase: String,
    nombre: Option<String>,
}

#[get("/")]
fn index() -> Template {
    let contexto = ContextoPlantilla {
        frase: sacar_frase_aleatoria(&FRASES).to_string(),
        nombre: None,
    };
    Template::render("index", &contexto)
}

#[derive(FromForm)]
struct Formulario {
    nombre: String,
}

#[post("/", data = "<formulario>")]
fn index_personalizado(formulario: Form<Formulario>) -> Template {
    let form = formulario.get();
    let nombre = form.nombre.clone();
    let contexto = ContextoPlantilla {
        frase: sacar_frase_aleatoria(&FRASES).to_string(),
        nombre: Some(nombre),
    };

    Template::render("index", &contexto)
 }
 
 fn main() {
    rocket::ignite()
        .mount("/", routes![index, index_personalizado])
        .attach(Template::fairing())
        .launch();
 }
 }
<h1>{% if nombre %}<strong>{{nombre}}</strong>{% endif %} {{frase}}</h1>

Paso 4

[package]
name = "meetup08"
version = "0.1.0"
authors = ["Tu Nombre <tu@correo.com>"]

[dependencies]
rand = "0.3.17"
rocket = "0.3.3"
rocket_codegen = "0.3.3"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

[dependencies.rocket_contrib]
version = "0.3.3"
default-features = false
features = ["tera_templates", "json"]
...
use rocket_contrib::{Template, Json};
...

#[get("/frases")]
fn api_frases() -> Json<&'static [&'static str]> {
    Json(FRASES)
}

...
.mount("/api/v1", routes![api_frases])
...

Sigue aprendiendo

¡Gracias!

Rust y Rocket: creando mi primera aplicación

By Maricela Sanchez

Rust y Rocket: creando mi primera aplicación

  • 728