dfraw_json_parser/parser/creature_effect/
raw.rs

1use serde::{Deserialize, Serialize};
2
3use crate::parser::serializer_helper;
4
5use super::tokens::CreatureEffectProperty;
6
7/// A creature effect.
8#[derive(Serialize, Deserialize, Debug, Clone, Default)]
9#[serde(rename_all = "camelCase")]
10pub struct CreatureEffect {
11    severity: u32,
12    probability: u8,
13
14    #[serde(skip_serializing_if = "Option::is_none")]
15    affected_body_parts_by_category: Option<Vec<String>>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    affected_body_parts_by_type: Option<Vec<String>>,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    affected_body_parts_by_token: Option<Vec<String>>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    tags: Option<Vec<CreatureEffectProperty>>,
22
23    start: u32,
24    peak: u32,
25    end: u32,
26
27    #[serde(skip_serializing_if = "Option::is_none")]
28    dwf_stretch: Option<u8>,
29}
30
31impl CreatureEffect {
32    /// Function to "clean" the creature. This is used to remove any empty list or strings,
33    /// and to remove any default values. By "removing" it means setting the value to None.
34    ///
35    /// This also will remove the metadata if `is_metadata_hidden` is true.
36    ///
37    /// Steps:
38    /// - Set any metadata to None if `is_metadata_hidden` is true.
39    /// - Set any empty string to None.
40    /// - Set any empty list to None.
41    /// - Set any default values to None.
42    #[must_use]
43    pub fn cleaned(&self) -> Self {
44        let mut cleaned = self.clone();
45
46        // Set any empty string to None.
47        if let Some(affected_body_parts_by_category) =
48            cleaned.affected_body_parts_by_category.clone()
49        {
50            if affected_body_parts_by_category.is_empty() {
51                cleaned.affected_body_parts_by_category = None;
52            }
53        }
54
55        // Set any empty string to None.
56        if let Some(affected_body_parts_by_type) = cleaned.affected_body_parts_by_type.clone() {
57            if affected_body_parts_by_type.is_empty() {
58                cleaned.affected_body_parts_by_type = None;
59            }
60        }
61
62        // Set any empty string to None.
63        if let Some(affected_body_parts_by_token) = cleaned.affected_body_parts_by_token.clone() {
64            if affected_body_parts_by_token.is_empty() {
65                cleaned.affected_body_parts_by_token = None;
66            }
67        }
68
69        // Set any empty string to None.
70        if let Some(tags) = cleaned.tags.clone() {
71            if tags.is_empty() {
72                cleaned.tags = None;
73            }
74        }
75
76        // Set any default values to None.
77        if serializer_helper::is_zero_u8(cleaned.dwf_stretch) {
78            cleaned.dwf_stretch = None;
79        }
80
81        cleaned
82    }
83}