use crate::engine::decode::{
dispatch::gpu, flatten_regions, recursive_decode, DecodeFormat, DecodeRules, DecodedRegion,
};
use vyre::{Error, Result};
#[derive(Debug, Clone, Copy, Default)]
#[non_exhaustive]
pub struct GpuDecoder;
impl GpuDecoder {
pub fn new() -> Result<Self> {
Self::try_new()
}
pub fn try_new() -> Result<Self> {
crate::runtime::cached_device()?;
Ok(Self)
}
pub fn decode_recursive(&self, file_bytes: &[u8]) -> Result<Vec<DecodedRegion>> {
self.decode_recursive_with_rules(file_bytes, &DecodeRules::default())
}
pub fn decode_recursive_with_rules(
&self,
file_bytes: &[u8],
rules: &DecodeRules,
) -> Result<Vec<DecodedRegion>> {
decode_recursive_gpu(file_bytes, rules)
}
}
pub fn decode_bytes(input: &[u8], format: DecodeFormat) -> Result<Vec<u8>> {
decode_regions(input, format, &DecodeRules::default()).map(flatten_regions)
}
pub fn decode_base64(input: &[u8]) -> Result<Vec<u8>> {
decode_bytes(input, DecodeFormat::Base64)
}
pub fn decode_hex(input: &[u8]) -> Result<Vec<u8>> {
decode_bytes(input, DecodeFormat::Hex)
}
pub fn decode_url(input: &[u8]) -> Result<Vec<u8>> {
decode_bytes(input, DecodeFormat::Url)
}
pub fn decode_unicode(input: &[u8]) -> Result<Vec<u8>> {
decode_bytes(input, DecodeFormat::Unicode)
}
pub fn decode_file(file_bytes: &[u8]) -> Result<Vec<DecodedRegion>> {
decode_file_with_rules(file_bytes, &DecodeRules::default())
}
pub fn decode_file_with_rules(
file_bytes: &[u8],
rules: &DecodeRules,
) -> Result<Vec<DecodedRegion>> {
rules.validate().map_err(|error| Error::DecodeConfig {
message: error.to_string(),
})?;
GpuDecoder::try_new()?.decode_recursive_with_rules(file_bytes, rules)
}
pub fn decode_regions(
input: &[u8],
format: DecodeFormat,
rules: &DecodeRules,
) -> Result<Vec<DecodedRegion>> {
rules.validate().map_err(|error| Error::DecodeConfig {
message: error.to_string(),
})?;
gpu::dispatch_decode(format, input, rules, None)
}
pub fn decode_recursive_gpu(file_bytes: &[u8], rules: &DecodeRules) -> Result<Vec<DecodedRegion>> {
recursive_decode(file_bytes, rules, |format, input, rules| {
gpu::dispatch_decode(format, input, rules, None)
})
}