use crate::db::{Dao, TenebrousDbConn}; use crate::errors::Error; use crate::models::characters::{Character, CharacterDataType, DynCharacterData, Visibility}; use crate::models::users::User; use rocket_contrib::templates::Template; use serde::Serialize; use strum::IntoEnumIterator; #[derive(Serialize)] struct EditCharacterContext<'a> { pub name: &'a str, pub username: &'a str, pub data_type: &'a CharacterDataType, pub sheet: Box, pub state: FormStateContext<'a>, } #[derive(Serialize)] struct FormStateContext<'a> { pub selected_system: &'a CharacterDataType, } #[get("///edit")] pub(super) async fn edit_character_page( character_id: i32, owner: String, logged_in_user: Option<&User>, conn: TenebrousDbConn<'_>, ) -> Result { let owner = conn.load_user(&owner).await?.ok_or(Error::NotFound)?; let logged_in_user = logged_in_user.ok_or(Error::NotLoggedIn)?; let character = conn .load_character(character_id) .await? .ok_or(Error::NotFound)?; if logged_in_user != &owner { return Err(Error::NoPermission); } let context = EditCharacterContext { name: &character.character_name, username: &owner.username, data_type: &character.data_type, sheet: character.dyn_deserialize()?, state: FormStateContext { selected_system: &character.data_type, }, }; Ok(Template::render("characters/edit_character", context)) }