wolfrpg_map_parser/command/show_choice_command/
options.rs

1#[cfg(feature = "serde")]
2use serde::{Serialize, Deserialize};
3use crate::command::show_choice_command::cancel_case::CancelCase;
4use crate::command::show_choice_command::extra_cases::ExtraCases;
5
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7#[derive(PartialEq, Clone)]
8pub struct Options {
9    cancel_case: CancelCase,
10    selected_choices: u8,
11    extra_cases: ExtraCases
12}
13
14impl Options {
15    pub fn new(options: u16) -> Self {
16        let selected_choices: u8 = (options & 0xff) as u8;
17        let extra_cases: u8 = ((options >> 8) & 0xff) as u8;
18        Self {
19            cancel_case: CancelCase::new((selected_choices >> 4) & 0b00001111),
20            selected_choices: selected_choices & 0b00001111,
21            extra_cases: ExtraCases::new(extra_cases)
22        }
23    }
24
25    pub fn case_count(&self) -> usize {
26        self.selected_choices as usize
27        + self.extra_cases.count()
28        + match self.cancel_case {
29            CancelCase::Separate => 1,
30            _ => 0
31        }
32    }
33
34    pub fn cancel_case(&self) -> &CancelCase {
35        &self.cancel_case
36    }
37
38    pub fn cancel_case_mut(&mut self) -> &mut CancelCase {
39        &mut self.cancel_case
40    }
41
42    pub fn selected_choices(&self) -> u8 {
43        self.selected_choices
44    }
45
46    pub fn selected_choices_mut(&mut self) -> &mut u8 {
47        &mut self.selected_choices
48    }
49
50    pub fn extra_cases(&self) -> &ExtraCases {
51        &self.extra_cases
52    }
53
54    pub fn extra_cases_mut(&mut self) -> &mut ExtraCases {
55        &mut self.extra_cases
56    }
57}