diff --git a/src/objects.rs b/src/objects.rs index adcaea7..93ecdd9 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -42,6 +42,15 @@ pub fn update_object_location(pegatina: String, new_location: String) -> Result< .execute(conn) } +// actualiza as condiciós de un obxeto, devolve o número de rows afectados +pub fn update_object_conditions(pegatina: String, cond: Vec>) -> Result { + use crate::schema::object::dsl::*; + let conn = &mut establish_connection(); + diesel::update(object.filter(tag.eq(pegatina))) + .set(condiciones.eq(cond)) + .execute(conn) +} + // get_salidas trae da base de datos todos os obxetos salida de unha localización pub fn get_salidas(pegatina: String) -> Result, diesel::result::Error> { use crate::schema::object::dsl::*; diff --git a/src/player.rs b/src/player.rs index 7fbe216..a1be5b6 100644 --- a/src/player.rs +++ b/src/player.rs @@ -1,4 +1,4 @@ -use crate::objects::{get_objects, get_object_here, update_object_location}; +use crate::objects::{get_objects, get_object_here, update_object_location, update_object_conditions}; use crate::models::Player; use crate::database::establish_connection; use diesel::prelude::*; @@ -175,29 +175,34 @@ pub fn execute_kill(player: &mut Player, nombre: &str) -> String { } //execute_open cambia a condición 'close' a 'open' de un obxeto nesta sala polo nome -pub fn execute_open(player: &mut Player, nombre: &str) -> String { +pub fn execute_close(player: &mut Player, nombre: &str) -> String { let mut output = String::from(""); let location = &player.location; let objeto = get_object_here(location.to_string(), nombre.to_string()); if objeto.is_ok() { - let obj = objeto.unwrap(); - // println!("{:?}", obj); + let mut obj = objeto.unwrap(); + println!("{:?}", obj); if obj.tipo == "salida" { - for condicion in obj.condiciones { + for (pos, condicion) in obj.condiciones.iter().enumerate() { if condicion.as_ref().unwrap() == "open" { - output = String::from("Ya está abierta."); + output = String::from("Está abierta."); + // actualizar a salida en sentido contrario + // implementar get_salida_opuesta() para actualizar o sentido contario tamén + + obj.condiciones[pos] = Some("closed".to_string()); + let res = update_object_conditions(location.to_string(), obj.condiciones); + + // non actualiza, da ok pero actualiza 0 rows + match res { + Ok(n) => println!("actualizados {} rows", n), + Err(error) => println!("Error actualizando: {:?}", error), + }; + break; } else if condicion.as_ref().unwrap() == "closed" { - // está cerrada, actualizar a open - // e actualizar a salida en sentido contrario - // implementar actualizar_condiciones() - // implementar get_salida_opuesta() - output = String::from("Está cerrada."); - - - + output = String::from("Ya está cerrada."); break; } else { output = String::from(""); diff --git a/src/rlib.rs b/src/rlib.rs index 8e8e790..6807c47 100644 --- a/src/rlib.rs +++ b/src/rlib.rs @@ -106,7 +106,7 @@ pub fn update_state(player: &mut Player, command: &Command) -> String { "coger" => output = execute_pick(player, command.noun.as_str()), "tirar" => output = execute_drop(player, command.noun.as_str()), "matar" => output = execute_kill(player, command.noun.as_str()), - "abrir" => output = execute_open(player, command.noun.as_str()), + "cerrar" => output = execute_close(player, command.noun.as_str()), _ => output = format!("No se como hacer eso."), }