ofdsdk 0.1.1

Strongly typed OFD SDK for Rust
Documentation
use std::borrow::Cow;
use std::io::BufRead;

use quick_xml::events::attributes::Attribute;
use quick_xml::{Decoder, Reader};

use super::SdkError;

#[inline(always)]
pub(crate) fn from_reader_inner<R: BufRead>(reader: R) -> Result<Reader<R>, SdkError> {
  let mut xml_reader = quick_xml::Reader::from_reader(reader);
  xml_reader.config_mut().check_end_names = false;

  Ok(xml_reader)
}

#[inline(always)]
pub(crate) fn from_str_inner(s: &str) -> Result<Reader<&[u8]>, SdkError> {
  let mut xml_reader = quick_xml::Reader::from_str(s);
  xml_reader.config_mut().check_end_names = false;

  Ok(xml_reader)
}

#[inline(always)]
pub(crate) fn decode_attr_value<'a>(
  attr: &'a Attribute<'a>,
  decoder: Decoder,
) -> Result<Cow<'a, str>, SdkError> {
  if attr.value.as_ref().contains(&b'&') {
    Ok(attr.decode_and_unescape_value(decoder)?)
  } else {
    Ok(decoder.decode(attr.value.as_ref())?)
  }
}

#[inline(always)]
pub(crate) fn attr_raw_value<'a>(attr: &'a Attribute<'a>) -> Option<&'a [u8]> {
  let value = attr.value.as_ref();
  if value.contains(&b'&') {
    None
  } else {
    Some(value)
  }
}