wolfrpg_map_parser/command/
db_management_command.rs1use crate::byte_utils::as_u32_le;
2use crate::command::db_management_command::assignment::Assignment;
3use crate::command::db_management_command::options::Options;
4use crate::command::db_management_command::state::State;
5use crate::common::u32_or_string::U32OrString;
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9pub mod base;
10pub mod options;
11pub mod db_operation_type;
12pub mod db_type;
13pub mod assignment;
14pub mod assignment_operator;
15pub mod string;
16pub mod csv;
17pub mod state;
18
19type DBStrings = (Option<String>, Option<String>, Option<String>);
20
21#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
22#[derive(PartialEq, Clone)]
23pub struct DBManagementCommand {
24 db_type: U32OrString, data: U32OrString, field: U32OrString,
27 assignment: Assignment,
28 options: Options,
29 state: State
30}
31
32impl DBManagementCommand {
33 fn parse(bytes: &[u8], parse_state: fn(&[u8]) -> (usize, State, DBStrings)) -> (usize, Self) {
34 let mut offset: usize = 0;
35
36 let db_type: u32 = as_u32_le(&bytes[offset..offset + 4]);
37 offset += 4;
38
39 let data: u32 = as_u32_le(&bytes[offset..offset + 4]);
40 offset += 4;
41
42 let field: u32 = as_u32_le(&bytes[offset..offset + 4]);
43 offset += 4;
44
45 let assignment: u8 = bytes[offset];
46 let assignment: Assignment = Assignment::new(assignment);
47 offset += 1;
48
49 let options: u8 = bytes[offset];
50 let options: Options = Options::new(options);
51 offset += 1;
52
53 offset += 2; let (bytes_read, state, db_strings) = parse_state(&bytes[offset..]);
56 offset += bytes_read;
57
58 let db_type: U32OrString = Self::get_u32_or_string(db_type, db_strings.0);
59 let data: U32OrString = Self::get_u32_or_string(data, db_strings.1);
60 let field: U32OrString = Self::get_u32_or_string(field, db_strings.2);
61
62 offset += 1; (offset, Self {
65 db_type,
66 data,
67 field,
68 assignment,
69 options,
70 state
71 })
72 }
73
74 pub(crate) fn parse_base(bytes: &[u8]) -> (usize, Self) {
75 Self::parse(bytes, State::parse_base)
76 }
77
78 pub(crate) fn parse_string(bytes: &[u8]) -> (usize, Self) {
79 Self::parse(bytes, State::parse_string)
80 }
81
82 pub(crate) fn parse_csv(bytes: &[u8]) -> (usize, Self) {
83 Self::parse(bytes, State::parse_csv)
84 }
85
86 fn get_u32_or_string(value: u32, string: Option<String>) -> U32OrString {
87 match string {
88 Some(s) if !s.is_empty() => U32OrString::String(s),
89 _ => U32OrString::U32(value),
90 }
91 }
92
93 pub fn db_type(&self) -> &U32OrString {
94 &self.db_type
95 }
96
97 pub fn db_type_mut(&mut self) -> &mut U32OrString {
98 &mut self.db_type
99 }
100
101 pub fn data(&self) -> &U32OrString {
102 &self.data
103 }
104
105 pub fn data_mut(&mut self) -> &mut U32OrString {
106 &mut self.data
107 }
108
109 pub fn field(&self) -> &U32OrString {
110 &self.field
111 }
112
113 pub fn field_mut(&mut self) -> &mut U32OrString {
114 &mut self.field
115 }
116
117 pub fn assignment(&self) -> &Assignment {
118 &self.assignment
119 }
120
121 pub fn assignment_mut(&mut self) -> &mut Assignment {
122 &mut self.assignment
123 }
124
125 pub fn options(&self) -> &Options {
126 &self.options
127 }
128
129 pub fn options_mut(&mut self) -> &mut Options {
130 &mut self.options
131 }
132
133 pub fn state(&self) -> &State {
134 &self.state
135 }
136
137 pub fn state_mut(&mut self) -> &mut State {
138 &mut self.state
139 }
140}