From 16f19b8b236afeb951a22a4a255fd678353f468a Mon Sep 17 00:00:00 2001 From: rakuja Date: Sun, 1 Dec 2024 18:42:13 +0100 Subject: [PATCH] feat: add senses data and vision field --- src/db/data_providers/creature_fetcher.rs | 21 ++++++++++++++----- .../creature_component/creature_extra.rs | 4 +++- src/models/db/mod.rs | 2 +- src/models/db/raw_sense.rs | 7 ------- src/models/db/sense.rs | 11 ++++++++++ 5 files changed, 31 insertions(+), 14 deletions(-) delete mode 100644 src/models/db/raw_sense.rs create mode 100644 src/models/db/sense.rs diff --git a/src/db/data_providers/creature_fetcher.rs b/src/db/data_providers/creature_fetcher.rs index 322777c..e866929 100644 --- a/src/db/data_providers/creature_fetcher.rs +++ b/src/db/data_providers/creature_fetcher.rs @@ -23,9 +23,9 @@ use crate::models::creature::items::spell_caster_entry::SpellCasterEntry; use crate::models::db::raw_immunity::RawImmunity; use crate::models::db::raw_language::RawLanguage; use crate::models::db::raw_resistance::RawResistance; -use crate::models::db::raw_sense::RawSense; use crate::models::db::raw_speed::RawSpeed; use crate::models::db::raw_weakness::RawWeakness; +use crate::models::db::sense::Sense; use crate::models::item::armor_struct::Armor; use crate::models::item::item_struct::Item; use crate::models::item::shield_struct::Shield; @@ -83,10 +83,10 @@ async fn fetch_creature_resistances( .await?) } -async fn fetch_creature_senses(conn: &Pool, creature_id: i64) -> Result> { +async fn fetch_creature_senses(conn: &Pool, creature_id: i64) -> Result> { Ok(sqlx::query_as!( - RawSense, - "SELECT * FROM SENSE_TABLE INTERSECT SELECT sense_id FROM SENSE_CREATURE_ASSOCIATION_TABLE WHERE creature_id == ($1)", + Sense, + "SELECT * FROM SENSE_TABLE WHERE id IN (SELECT sense_id FROM SENSE_CREATURE_ASSOCIATION_TABLE WHERE creature_id == ($1))", creature_id ).fetch_all(conn).await?) } @@ -188,6 +188,15 @@ async fn fetch_creature_perception(conn: &Pool, creature_id: i64) -> Res ) } +async fn fetch_creature_vision(conn: &Pool, creature_id: i64) -> Result { + Ok( + sqlx::query_scalar("SELECT vision FROM CREATURE_TABLE WHERE id = $1 LIMIT 1") + .bind(creature_id) + .fetch_one(conn) + .await?, + ) +} + async fn fetch_creature_perception_detail( conn: &Pool, creature_id: i64, @@ -577,6 +586,7 @@ pub async fn fetch_creature_extra_data( let ac_detail = fetch_creature_ac_detail(conn, creature_id).await?; let language_detail = fetch_creature_language_detail(conn, creature_id).await?; let perception = fetch_creature_perception(conn, creature_id).await?; + let has_vision = fetch_creature_vision(conn, creature_id).await?; let perception_detail = fetch_creature_perception_detail(conn, creature_id).await?; Ok(CreatureExtraData { @@ -584,7 +594,7 @@ pub async fn fetch_creature_extra_data( skills, items, languages: languages.iter().map(|x| x.name.clone()).collect(), - senses: senses.iter().map(|x| x.name.clone()).collect(), + senses, speeds: speeds .iter() .map(|x| (x.name.clone(), x.value as i16)) @@ -595,6 +605,7 @@ pub async fn fetch_creature_extra_data( language_detail, perception, perception_detail, + has_vision, }) } diff --git a/src/models/creature/creature_component/creature_extra.rs b/src/models/creature/creature_component/creature_extra.rs index 6d57bd4..85d0349 100644 --- a/src/models/creature/creature_component/creature_extra.rs +++ b/src/models/creature/creature_component/creature_extra.rs @@ -1,6 +1,7 @@ use crate::models::creature::creature_metadata::variant_enum::CreatureVariant; use crate::models::creature::items::action::Action; use crate::models::creature::items::skill::Skill; +use crate::models::db::sense::Sense; use crate::models::item::item_struct::Item; use serde::{Deserialize, Serialize}; #[allow(unused_imports)] // it's actually used in the example schema @@ -30,7 +31,7 @@ pub struct CreatureExtraData { pub skills: Vec, pub items: Vec, pub languages: Vec, - pub senses: Vec, + pub senses: Vec, #[schema(example = json!({"fly": 100, "swim": 50, "Base": 25}))] pub speeds: BTreeMap, pub ability_scores: AbilityScores, @@ -40,6 +41,7 @@ pub struct CreatureExtraData { #[schema(example = 0)] pub perception: i8, pub perception_detail: Option, + pub has_vision: bool, } impl CreatureExtraData { diff --git a/src/models/db/mod.rs b/src/models/db/mod.rs index 4891214..471eb1c 100644 --- a/src/models/db/mod.rs +++ b/src/models/db/mod.rs @@ -1,6 +1,6 @@ pub mod raw_immunity; pub mod raw_language; pub mod raw_resistance; -pub mod raw_sense; pub mod raw_speed; pub mod raw_weakness; +pub mod sense; diff --git a/src/models/db/raw_sense.rs b/src/models/db/raw_sense.rs deleted file mode 100644 index 0ed414b..0000000 --- a/src/models/db/raw_sense.rs +++ /dev/null @@ -1,7 +0,0 @@ -use serde::{Deserialize, Serialize}; -use sqlx::FromRow; - -#[derive(Serialize, Deserialize, FromRow)] -pub struct RawSense { - pub name: String, -} diff --git a/src/models/db/sense.rs b/src/models/db/sense.rs new file mode 100644 index 0000000..8a24e74 --- /dev/null +++ b/src/models/db/sense.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; +use sqlx::FromRow; +use utoipa::ToSchema; + +#[derive(Serialize, Deserialize, FromRow, ToSchema, Clone, Eq, Hash, PartialEq)] +pub struct Sense { + pub id: i64, + pub name: String, + pub range: Option, + pub acuity: Option, +}