libosu 0.0.30

General-purpose osu! library.
pub use lzma_impl::{decode, encode};

static_assertions::assert_cfg!(
    not(all(feature = "replay-data", feature = "replay-data-xz2")),
    "Cannot enable both replay-data (pure-Rust) and replay-data-xz2 (native xz2) at the same time.",
);

#[cfg(all(feature = "replay-data", not(feature = "replay-data-xz2")))]
mod lzma_impl {
  use std::io::BufRead;

  use lzma_rs::{lzma_compress, lzma_decompress};

  use super::super::ReplayResult;

  pub fn decode(mut input: impl BufRead) -> ReplayResult<Vec<u8>> {
    let mut data = Vec::new();
    lzma_decompress(&mut input, &mut data)?;
    Ok(data)
  }

  pub fn encode(mut input: impl BufRead) -> ReplayResult<Vec<u8>> {
    let mut data = Vec::new();
    lzma_compress(&mut input, &mut data)?;
    Ok(data)
  }
}

#[cfg(all(feature = "replay-data-xz2", not(feature = "replay-data")))]
mod lzma_impl {
  use std::{io::BufRead, io::Read};
  use xz2::bufread::{XzDecoder, XzEncoder};
  use xz2::stream::{LzmaOptions, Stream};

  use super::super::ReplayResult;

  pub fn decode(input: impl BufRead) -> ReplayResult<Vec<u8>> {
    let lzma_decoder = Stream::new_lzma_decoder(std::u32::MAX as u64)?;
    let mut xz_decoder = XzDecoder::new_stream(input, lzma_decoder);

    let mut data = Vec::new();
    xz_decoder.read_to_end(&mut data)?;

    Ok(data)
  }

  pub fn encode(input: impl BufRead) -> ReplayResult<Vec<u8>> {
    let lzma_decoder = Stream::new_lzma_encoder(&LzmaOptions::new_preset(6)?)?;
    let mut xz_encoder = XzEncoder::new_stream(input, lzma_decoder);

    let mut data = Vec::new();
    xz_encoder.read_to_end(&mut data)?;

    Ok(data)
  }
}