use super::Bits;
use crate::{
error::{Error, Result},
types::{Mode, Version},
};
#[derive(Clone, Copy, Debug)]
pub enum ExtendedMode {
Eci,
Data(Mode),
Fnc1First,
Fnc1Second,
StructuredAppend,
}
impl Bits {
pub fn push_mode_indicator(&mut self, mode: ExtendedMode) -> Result<()> {
#[expect(clippy::match_same_arms)]
let number = match (self.version, mode) {
(Version::Micro(1), ExtendedMode::Data(Mode::Numeric)) => return Ok(()),
(Version::Micro(_), ExtendedMode::Data(Mode::Numeric)) => 0,
(Version::Micro(_), ExtendedMode::Data(Mode::Alphanumeric)) => 1,
(Version::Micro(_), ExtendedMode::Data(Mode::Byte)) => 0b10,
(Version::Micro(_), ExtendedMode::Data(Mode::Kanji)) => 0b11,
(Version::Micro(_), _) => return Err(Error::UnsupportedCharacterSet),
(Version::RectMicro(..), ExtendedMode::Data(Mode::Numeric)) => 0b001,
(Version::RectMicro(..), ExtendedMode::Data(Mode::Alphanumeric)) => 0b010,
(Version::RectMicro(..), ExtendedMode::Data(Mode::Byte)) => 0b011,
(Version::RectMicro(..), ExtendedMode::Data(Mode::Kanji)) => 0b100,
(Version::RectMicro(..), ExtendedMode::Eci) => 0b111,
(Version::RectMicro(..), ExtendedMode::Fnc1First) => 0b101,
(Version::RectMicro(..), ExtendedMode::Fnc1Second) => 0b110,
(Version::RectMicro(..), _) => return Err(Error::UnsupportedCharacterSet),
(_, ExtendedMode::Data(Mode::Numeric)) => 0b0001,
(_, ExtendedMode::Data(Mode::Alphanumeric)) => 0b0010,
(_, ExtendedMode::Data(Mode::Byte)) => 0b0100,
(_, ExtendedMode::Data(Mode::Kanji)) => 0b1000,
(_, ExtendedMode::Eci) => 0b0111,
(_, ExtendedMode::Fnc1First) => 0b0101,
(_, ExtendedMode::Fnc1Second) => 0b1001,
(_, ExtendedMode::StructuredAppend) => 0b0011,
};
let bits = self.version.mode_bits_count();
self.push_number_checked(bits, number)
.or(Err(Error::UnsupportedCharacterSet))
}
}