pub const MAX_ISSUE_LEN: usize = 7;
pub const MAX_DESC_LEN: usize = 200;
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy)]
pub enum Field {
#[default]
Type,
Issue,
Desc,
}
#[derive(Debug, Default)]
pub struct CreateForm {
pub field: Field,
pub type_index: usize,
pub issue: String,
pub desc: String,
}
impl CreateForm {
pub fn new() -> Self {
Self::default()
}
pub fn reset(&mut self) {
self.field = Field::Type;
self.type_index = 0;
self.issue.clear();
self.desc.clear();
}
pub fn next_field(&mut self) {
self.field = match self.field {
Field::Type => Field::Issue,
Field::Issue => Field::Desc,
Field::Desc => Field::Type,
};
}
pub fn prev_field(&mut self) {
self.field = match self.field {
Field::Type => Field::Desc,
Field::Issue => Field::Type,
Field::Desc => Field::Issue,
};
}
pub fn next_type(&mut self, types_len: usize) {
if types_len == 0 {
return;
}
self.type_index = (self.type_index + 1) % types_len;
}
pub fn prev_type(&mut self, types_len: usize) {
if types_len == 0 {
return;
}
if self.type_index == 0 {
self.type_index = types_len - 1;
} else {
self.type_index -= 1;
}
}
pub fn push_char(&mut self, c: char) {
match self.field {
Field::Issue if c.is_ascii_digit() && self.issue.chars().count() < MAX_ISSUE_LEN => self.issue.push(c),
Field::Desc if self.desc.chars().count() < MAX_DESC_LEN => self.desc.push(c),
_ => {}
}
}
pub fn pop_char(&mut self) {
match self.field {
Field::Issue => {
self.issue.pop();
}
Field::Desc => {
self.desc.pop();
}
_ => {}
}
}
}