diamondfire_actiondump/
registry.rs1use crate::schema::CodeData;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7type DatabaseValues = HashMap<String, CodeRegistry>;
8
9
10#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
12pub struct CodeDatabase {
13 #[serde(flatten)]
15 pub values: DatabaseValues,
16}
17
18impl CodeDatabase {
19 pub fn new(values: DatabaseValues) -> Self {
21 CodeDatabase {
22 values
23 }
24 }
25}
26
27impl From<CodeDatabase> for DatabaseValues {
28 fn from(database: CodeDatabase) -> Self {
29 database.values
30 }
31}
32
33#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
35#[serde(from = "Vec<CodeData>", into = "Vec<CodeData>")]
36pub struct CodeRegistry {
37 pub items: Vec<CodeData>,
39 by_name: HashMap<String, usize>,
41 by_id: HashMap<String, usize>,
43}
44
45impl CodeRegistry {
46 pub fn new(items: Vec<CodeData>) -> Self {
50 let by_name = items
51 .iter()
52 .enumerate()
53 .filter_map(|(i, v)| v.name.to_owned().map(|k| (k, i)))
54 .collect();
55 let by_id = items
56 .iter()
57 .enumerate()
58 .filter_map(|(i, v)| v.identifier.to_owned().map(|k| (k, i)))
59 .collect();
60
61 CodeRegistry {
62 items,
63 by_name,
64 by_id,
65 }
66 }
67
68 pub fn get_by_name(&self, name: String) -> Option<&CodeData> {
70 self.items.get(self.by_name.get(&name)?.to_owned())
71 }
72
73 pub fn get_by_id(&self, id: String) -> Option<&CodeData> {
75 self.items.get(self.by_id.get(&id)?.to_owned())
76 }
77}
78
79impl From<Vec<CodeData>> for CodeRegistry {
80 fn from(internal: Vec<CodeData>) -> Self {
81 CodeRegistry::new(internal)
82 }
83}
84
85impl From<CodeRegistry> for Vec<CodeData> {
86 fn from(registry: CodeRegistry) -> Self {
87 registry.items
88 }
89}