Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 91 additions & 53 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,87 +1,125 @@
use std::io;
use std::fs::File;
use std::io::Write;

struct Tarea {
struct Tarea
{
descripcion: String,
completada: bool,
}

impl Tarea {
fn mostrar(&self, id: usize) {
impl Tarea
{
fn mostrar(&self, id: usize)
{
let estado = if self.completada { "[X]" } else { "[ ]" };
println!("{} {}: {}",estado, id, self.descripcion);
}
}

fn main() {
println!("Bienvenido al gestor de tareas");

let mut tareas: Vec<Tarea> = Vec::new();
fn main()
{
println!("BIENVENIDO GESTOR DE TAREAS!!!"); //imprimo saludo

loop {
println!("\ningresa un comando('agregar <descripcion>', 'listar','salir')");
let mut tareas: Vec<Tarea> = Vec::new(); //creo un vector vacio "Vec::new()" en donde adentro hay variavles del struct Tarea

loop //creo un loop infinito
{
println!("\nIngresa un comando('agregar <descripcion>', 'listar', 'salir', 'completar <numero de la tarea>')"); //imprimo indicaciones

let mut entrada = String::new(); //creo un string vacio modificable para ingresar los datos

let mut entrada = String::new();
io::stdin()
.read_line(&mut entrada)
.expect("Error al leer la entrada");
let entrada = entrada.trim();

if entrada == "salir" {
println!("\nSaliendo del gestor de tareas");
break;
} else if entrada.starts_with("agregar ") {
let descripcion = entrada[8..].trim();
if !descripcion.is_empty() {
tareas.push(Tarea {
descripcion: descripcion.to_string(),
completada: false,
});
println!("\nTarea agregada: {}", descripcion);
} else {
println!("\nLa descripción de la tarea no puede estar vacía.");
match entrada //uso el match (es como un switch en C)
{
"salir" =>
{
println!("\nSaliendo del gestor de tareas");
break; //sale del loop
}
} else if entrada == "listar" {
listar_tareas(&tareas);
} else if entrada.starts_with("completar ") {
let id: usize = match entrada[10..].trim().parse() {
Ok(num) => num,
Err(_) => {
println!("\nID inválido. Debe ser un número.");
continue;
"listar" =>
{
listar_tareas(&tareas);
}
_ if entrada.starts_with("agregar ") =>
{
let descripcion = entrada[8..].trim();
if !descripcion.is_empty()
{
tareas.push(Tarea {descripcion: descripcion.to_string(), completada: false,});

println!("\nTarea agregada: {}", descripcion);
guardar_tareas_a_archivo(&tareas);
}
else
{
println!("\nLa descripción de la tarea no puede estar vacía.");
}
};
if id > 0 && id <= tareas.len() {
tareas[id - 1].completada = true;
println!("\nTarea {} marcada como completada.", id);
} else {
println!("\nID de tarea no válido.");
}
} else {
println!("\nComando no reconocido. Intenta de nuevo.");
}
_ if entrada.starts_with("completar ") =>
{
let id: usize = match entrada[10..].trim().parse()
{
Ok(num) => num,
Err(_) =>
{
println!("\nID inválido. Debe ser un número y que exista en la lista.");
continue;
}
};

if id > 0 && id <= tareas.len() {
tareas[id - 1].completada = true;
println!("\nTarea {} marcada como completada.", id);
guardar_tareas_a_archivo(&tareas);
}
else { println!("\nID de tarea no válido."); }
}
_ =>
{
println!("\nComando no reconocido. Intenta de nuevo.");
}
}
}
}

fn listar_tareas(lista_de_tareas: &Vec<Tarea>) {

fn listar_tareas(lista_de_tareas: &Vec<Tarea>) //funcion para imprimir toda la lista de tareas hasta el momento
{
println!("\nLista de Tareas:");

for (i, tarea) in lista_de_tareas.iter().enumerate() {
for (i, tarea) in lista_de_tareas.iter().enumerate()
{
tarea.mostrar(i + 1);
}
}

/*
Desafio uno:
Refactorizar el codigo con un match en vez de if, else if, else

Desafio dos:
Guardar las tareas en un archivo
fn guardar_tareas_a_archivo(tareas: &Vec<Tarea>) //funcion guarda el vector de tareas en el archivo
{
let resultado_archivo = File::create("tareas.txt"); //crea el archivo

Desafio tres:
Investigar el crate serde y como se usaria para serializar y deserializar las tareas

Desafio cuatro:
Cargar las tareas desde un archivo al iniciar el programa
let mut archivo = match resultado_archivo //chequea si se creo
{
Ok(archivo_abierto) => archivo_abierto,
Err(error_creacion) =>
{
eprintln!("Error creando archivo: {}", error_creacion);
return;
}
};

*/
for (i, tarea) in tareas.iter().enumerate() //por enumerate i guarda la posicion y tarea el contenido
{
let estado = if tarea.completada { "X" } else { " " };
if let Err(error_escritura) = writeln!(archivo, "[{}] {}: {}", estado, i + 1, tarea.descripcion)
{
eprintln!("Error escribiendo en archivo: {}", error_escritura);
return;
}
}
}