gltf_kun 0.4.0

Graph-based glTF processing library.
Documentation
use base64::engine::{Engine, general_purpose::STANDARD};

use super::{Resolver, ResolverError};

pub struct DataUriResolver;

impl Resolver for DataUriResolver {
    async fn resolve(&mut self, uri: &str) -> Result<Vec<u8>, ResolverError> {
        let uri = uri.to_string();

        let uri = uri
            .strip_prefix("data:")
            .ok_or_else(|| ResolverError::InvalidUri(uri.clone()))?;

        let (mime_type, data) = uri
            .split_once(',')
            .ok_or_else(|| ResolverError::InvalidUri(uri.to_string()))?;

        let (_mime_type, base64) = mime_type
            .strip_suffix(";base64")
            .map_or((mime_type, false), |m| (m, true));

        let data = if base64 {
            STANDARD
                .decode(data.as_bytes())
                .map_err(|e| ResolverError::ResolutionError(e.to_string()))?
        } else {
            data.as_bytes().to_vec()
        };

        Ok(data)
    }
}