diff --git a/resource_api/Cargo.toml b/resource_api/Cargo.toml index b7e78ad..67e0c23 100644 --- a/resource_api/Cargo.toml +++ b/resource_api/Cargo.toml @@ -4,4 +4,5 @@ version = "0.1.0" edition = "2024" [dependencies] +paste = "1.0.15" serde = { version = "1.0.228", features = ["derive"] } diff --git a/resource_api/src/singleton/mod.rs b/resource_api/src/singleton/mod.rs index 70b786d..4860ed8 100644 --- a/resource_api/src/singleton/mod.rs +++ b/resource_api/src/singleton/mod.rs @@ -1 +1,70 @@ -// TODO +#![allow(unused)] + +use crate::types::{ + CharacterDetail, CharacterFull, CharacterMini, CharacterSearch, Id, ItemMini, ItemSearch, + LightconeDetail, LightconeFull, LightconeMini, LightconeSearch, RelicMini, RelicSearch, +}; +use paste::paste; +use std::sync::OnceLock; + +macro_rules! define_data_store { + ($base:ident, full) => { + paste::item! { + pub static [<$base:upper _DETAIL>]: OnceLock<[<$base Detail>]> = OnceLock::new(); + pub static [<$base:upper _SEARCH>]: OnceLock<[<$base Search>]> = OnceLock::new(); + + pub fn []() -> &'static [<$base Detail>] { + [<$base:upper _DETAIL>] + .get() + .expect(concat!(stringify!([<$base:upper _DETAIL>]), " not initialized")) + } + + pub fn []() -> &'static [<$base Search>] { + [<$base:upper _SEARCH>] + .get() + .expect(concat!(stringify!([<$base:upper _SEARCH>]), " not initialized")) + } + + pub fn [](id: &Id) -> Option<&[<$base Full>]> { + []().0.get(id) + } + + pub fn [](id: &Id) -> Option<&[<$base Mini>]> { + []().0.get(id) + } + + pub fn [](data: [<$base Detail>]) -> Result<(), [<$base Detail>]> { + [<$base:upper _DETAIL>].set(data) + } + + pub fn [](data: [<$base Search>]) -> Result<(), [<$base Search>]> { + [<$base:upper _SEARCH>].set(data) + } + } + }; + + ($base:ident, mini) => { + paste::item! { + pub static [<$base:upper _SEARCH>]: OnceLock<[<$base Search>]> = OnceLock::new(); + + pub fn []() -> &'static [<$base Search>] { + [<$base:upper _SEARCH>] + .get() + .expect(concat!(stringify!([<$base:upper _SEARCH>]), " not initialized")) + } + + pub fn [](id: &Id) -> Option<&[<$base Mini>]> { + []().0.get(id) + } + + pub fn [](data: [<$base Search>]) -> Result<(), [<$base Search>]> { + [<$base:upper _SEARCH>].set(data) + } + } + }; +} + +define_data_store!(Character, full); +define_data_store!(Lightcone, full); +define_data_store!(Relic, mini); +define_data_store!(Item, mini); diff --git a/resource_api/src/types/relic.rs b/resource_api/src/types/relic.rs index c62b5a4..0e36654 100644 --- a/resource_api/src/types/relic.rs +++ b/resource_api/src/types/relic.rs @@ -10,16 +10,7 @@ pub struct RelicMini { pub name: String, pub r#type: RelicType, pub img_url: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RelicDetail(pub HashMap); - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RelicFull { - pub name: String, - pub r#type: RelicType, - pub img_url: Uri, + // lets just display these in the search page pub two_pc: Desc, pub four_pc: Option, }