// Auto-generated from JSON data // Do not edit manually use serde::{Deserialize, Serialize}; use anyhow::Result; use std::collections::HashMap; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Cinematalktable { #[serde(rename = "acceptTimeline")] pub accept_timeline: Option, #[serde(rename = "backgroundImgName")] pub background_img_name: Option, #[serde(rename = "bubbleType")] pub bubble_type: Option, #[serde(rename = "dialogStoryTextId")] pub dialog_story_text_id: Option, #[serde(rename = "emotionType")] pub emotion_type: Option, #[serde(rename = "faceIllustName")] pub face_illust_name: Option, #[serde(rename = "id")] pub id: i32, #[serde(rename = "illustCharAnimation")] pub illust_char_animation: Option>, #[serde(rename = "illustUniqueCharId")] pub illust_unique_char_id: Option>, #[serde(rename = "nameTextId")] pub name_text_id: Option, #[serde(rename = "packId")] pub pack_id: Option, #[serde(rename = "packIndex")] pub pack_index: Option, #[serde(rename = "questGroupId")] pub quest_group_id: Option, #[serde(rename = "questGroupIndex")] pub quest_group_index: Option, #[serde(rename = "speakerName")] pub speaker_name: Option, #[serde(rename = "state")] pub state: Option, #[serde(rename = "tabType")] pub tab_type: Option, #[serde(rename = "voiceResourceName")] pub voice_resource_name: Option, } pub struct CinematalktableTable { records: Vec, by_id: HashMap, by_group: HashMap>, } impl CinematalktableTable { pub fn load(path: &str) -> Result { let json = std::fs::read_to_string(path)?; let records: Vec = serde_json::from_str(&json)?; let mut by_id = HashMap::with_capacity(records.len()); let mut by_group: HashMap> = HashMap::new(); for (idx, record) in records.iter().enumerate() { by_id.insert(record.id, idx); if let Some(group_id) = record.quest_group_id { by_group.entry(group_id).or_insert_with(Vec::new).push(idx); } } Ok(Self { records, by_id, by_group, }) } #[inline] pub fn get(&self, id: i32) -> Option<&Cinematalktable> { self.by_id.get(&id).map(|&idx| &self.records[idx]) } pub fn by_group(&self, group_id: i32) -> impl Iterator + '_ { self.by_group .get(&group_id) .into_iter() .flat_map(|indices| indices.iter()) .map(|&idx| &self.records[idx]) } #[inline] pub fn all(&self) -> &[Cinematalktable] { &self.records } #[inline] pub fn iter(&self) -> std::slice::Iter { self.records.iter() } pub fn len(&self) -> usize { self.records.len() } pub fn is_empty(&self) -> bool { self.records.is_empty() } }