use crate::result::SQLiteError;
use alloc::format;
use super::ParseBytes;
#[derive(Debug)]
pub struct PayloadFractions {
  maximum: MaximumEmbeddedPayloadFraction,
  minimum: MinimumEmbeddedPayloadFraction,
  leaf: LeafPayloadFraction,
}
impl PayloadFractions {
  pub fn maximum(&self) -> &MaximumEmbeddedPayloadFraction {
    &self.maximum
  }
  pub fn minimum(&self) -> &MinimumEmbeddedPayloadFraction {
    &self.minimum
  }
  pub fn leaf(&self) -> &LeafPayloadFraction {
    &self.leaf
  }
}
impl ParseBytes<&[u8]> for PayloadFractions {
  fn struct_name() -> &'static str {
    "PayloadFractions"
  }
  fn bytes_length() -> usize {
    3
  }
  fn parsing_handler(bytes: &[u8]) -> crate::result::SQLiteResult<Self> {
    let maximum = MaximumEmbeddedPayloadFraction::parse_bytes(&[bytes[0]])?;
    let minimum = MinimumEmbeddedPayloadFraction::parse_bytes(&[bytes[1]])?;
    let leaf = LeafPayloadFraction::parse_bytes(&[bytes[2]])?;
    Ok(Self {
      maximum,
      minimum,
      leaf,
    })
  }
}
#[derive(Debug)]
pub struct MaximumEmbeddedPayloadFraction(u8);
impl MaximumEmbeddedPayloadFraction {
  pub fn get(&self) -> u8 {
    self.0
  }
}
impl ParseBytes<&[u8]> for MaximumEmbeddedPayloadFraction {
  fn struct_name() -> &'static str {
    "MaximumEmbeddedPayloadFraction"
  }
  fn bytes_length() -> usize {
    1
  }
  fn parsing_handler(bytes: &[u8]) -> crate::result::SQLiteResult<Self> {
    let maximum = *bytes.get(0).ok_or(SQLiteError::Custom(format!(
      "Impossible state on parsing {}",
      Self::struct_name()
    )))?;
    if maximum == 64 {
      Ok(Self(maximum))
    } else {
      return Err(SQLiteError::msg(
        "Maximum embedded payload fraction. Must be 64.",
      ));
    }
  }
}
#[derive(Debug)]
pub struct MinimumEmbeddedPayloadFraction(u8);
impl MinimumEmbeddedPayloadFraction {
  pub fn get(&self) -> u8 {
    self.0
  }
}
impl ParseBytes<&[u8]> for MinimumEmbeddedPayloadFraction {
  fn struct_name() -> &'static str {
    "MinimumEmbeddedPayloadFraction"
  }
  fn bytes_length() -> usize {
    1
  }
  fn parsing_handler(bytes: &[u8]) -> crate::result::SQLiteResult<Self> {
    let minimum = *bytes.get(0).ok_or(SQLiteError::Custom(format!(
      "Impossible state on parsing {}",
      Self::struct_name()
    )))?;
    if minimum == 32 {
      Ok(Self(minimum))
    } else {
      return Err(SQLiteError::msg(
        "Minimum embedded payload fraction. Must be 32.",
      ));
    }
  }
}
#[derive(Debug)]
pub struct LeafPayloadFraction(u8);
impl LeafPayloadFraction {
  pub fn get(&self) -> u8 {
    self.0
  }
}
impl ParseBytes<&[u8]> for LeafPayloadFraction {
  fn struct_name() -> &'static str {
    "LeafPayloadFraction"
  }
  fn bytes_length() -> usize {
    1
  }
  fn parsing_handler(bytes: &[u8]) -> crate::result::SQLiteResult<Self> {
    let leaf = *bytes.get(0).ok_or(SQLiteError::Custom(format!(
      "Impossible state on parsing {}",
      Self::struct_name()
    )))?;
    if leaf == 32 {
      Ok(Self(leaf))
    } else {
      Err(SQLiteError::msg("Leaf payload fraction. Must be 32."))
    }
  }
}