wolfrpg_map_parser/command/
db_management_command.rs

1use 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, // name for table?
25    data: U32OrString,    // name for tuple?
26    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; // padding
54
55        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; // Command end signature
63
64        (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}