1use crate::prelude::*;
2
3pub struct DogmaGroup<'a> {
5 pub(crate) esi: &'a Esi,
6}
7
8#[derive(Debug, Clone, PartialEq, Deserialize)]
10#[allow(missing_docs)]
11pub struct DogmaAttribute {
12 pub attribute_id: i64,
13 pub default_value: Option<f64>,
14 pub description: Option<String>,
15 pub display_name: Option<String>,
16 pub high_is_good: Option<bool>,
17 pub icon_id: Option<i64>,
18 pub name: Option<String>,
19 pub published: Option<bool>,
20 pub stackable: Option<bool>,
21 pub unit_id: Option<i64>,
22}
23
24#[derive(Debug, Clone, PartialEq, Deserialize)]
26#[allow(missing_docs)]
27pub struct DogmaEffectModifier {
28 pub domain: Option<String>,
29 pub effect_id: Option<i64>,
30 pub func: String,
31 pub modified_attribute_id: Option<i64>,
32 pub modifying_attribute_id: Option<i64>,
33 pub operator: Option<i64>,
34}
35
36#[derive(Debug, Clone, PartialEq, Deserialize)]
38#[allow(missing_docs)]
39pub struct DogmaEffect {
40 pub description: Option<String>,
41 pub disallow_auto_repeat: Option<bool>,
42 pub discharge_attribute_id: Option<i64>,
43 pub display_name: Option<String>,
44 pub duration_attribute_id: Option<i64>,
45 pub effect_category: Option<i64>,
46 pub effect_id: i64,
47 pub electronic_chance: Option<bool>,
48 pub falloff_attribute_id: Option<i64>,
49 pub icon_id: Option<i64>,
50 pub is_assistance: Option<bool>,
51 pub is_offensive: Option<bool>,
52 pub is_warp_safe: Option<bool>,
53 pub modifiers: Option<Vec<DogmaEffectModifier>>,
54 pub name: Option<String>,
55 pub post_expression: Option<i64>,
56 pub pre_expression: Option<i64>,
57 pub published: Option<bool>,
58 pub range_attribute_id: Option<i64>,
59 pub range_chance: Option<bool>,
60 pub tracking_speed_attribute_id: Option<i64>,
61}
62
63#[derive(Debug, Clone, PartialEq, Deserialize)]
65#[allow(missing_docs)]
66pub struct DynamicItemAttribute {
67 pub attribute_id: i64,
68 pub value: f64,
69}
70
71#[derive(Debug, Clone, PartialEq, Deserialize)]
73#[allow(missing_docs)]
74pub struct DynamicItemEffect {
75 pub effect_id: i64,
76 pub is_default: bool,
77}
78
79#[derive(Debug, Clone, PartialEq, Deserialize)]
81#[allow(missing_docs)]
82pub struct DynamicItem {
83 pub created_by: i64,
85 pub dogma_attributes: Vec<DynamicItemAttribute>,
86 pub dogma_effects: Vec<DynamicItemEffect>,
87 pub mutator_type_id: i64,
88 pub source_type_id: i64,
89}
90
91impl DogmaGroup<'_> {
92 api_get!(
93 get_attributes,
95 "GetDogmaAttributes",
96 RequestType::Public,
97 Vec<i64>,
98 );
99
100 api_get!(
101 get_attribute,
103 "GetDogmaAttributesAttributeId",
104 RequestType::Public,
105 DogmaAttribute,
106 (attribute_id: i64) => "{attribute_id}"
107 );
108
109 api_get!(
110 get_dynamic_item,
112 "GetDogmaDynamicItemsTypeIdItemId",
113 RequestType::Public,
114 DynamicItem,
115 (type_id: i64) => "{type_id}",
116 (item_id: i64) => "{item_id}"
117 );
118
119 api_get!(
120 get_effects,
122 "GetDogmaEffects",
123 RequestType::Public,
124 Vec<i64>,
125 );
126
127 api_get!(
128 get_effect,
130 "GetDogmaEffectsEffectId",
131 RequestType::Public,
132 DogmaEffect,
133 (effect_id: i64) => "{effect_id}"
134 );
135}
136
137#[cfg(test)]
138mod tests {
139 use super::{DogmaEffect, DynamicItem};
140
141 #[test]
142 fn test_parse_dynamic_item() {
143 let json = r#"{
144 "created_by": 2112000000,
145 "dogma_attributes": [{"attribute_id": 9, "value": 1.5}],
146 "dogma_effects": [{"effect_id": 11, "is_default": true}],
147 "mutator_type_id": 49730,
148 "source_type_id": 2048
149 }"#;
150 let item: DynamicItem = serde_json::from_str(json).unwrap();
151 assert_eq!(item.created_by, 2_112_000_000);
152 assert!(item.dogma_effects[0].is_default);
153 }
154
155 #[test]
156 fn test_parse_effect_with_only_required_fields() {
157 let effect: DogmaEffect = serde_json::from_str(r#"{"effect_id": 11}"#).unwrap();
158 assert_eq!(effect.effect_id, 11);
159 assert!(effect.modifiers.is_none());
160 }
161}