Skip to main content

native/oxc_ex_nif/src/transform_many.rs

use rayon::prelude::*;
use rustler::{Encoder, Env, NifResult, Term};

use crate::options::TransformInput;
use crate::parse::{binary_to_str, source_from_term, transform_source, TransformOutput};

#[rustler::nif(schedule = "DirtyCpu")]
pub fn transform_many<'a>(
    env: Env<'a>,
    inputs: Vec<(Term<'a>, String)>,
    opts_term: Term<'a>,
) -> NifResult<Term<'a>> {
    let opts = TransformInput::from_term(opts_term);
    let inputs = inputs
        .into_iter()
        .map(|(source_term, filename)| {
            let source_binary = source_from_term(source_term)?;
            let source = binary_to_str(&source_binary)?.to_owned();
            Ok((source, filename))
        })
        .collect::<NifResult<Vec<_>>>()?;

    let outputs: Vec<TransformOutput> = inputs
        .par_iter()
        .map(|(source, filename)| transform_source(source, filename, &opts))
        .collect();

    let terms: Vec<Term<'a>> = outputs
        .into_iter()
        .map(|output| output.to_term(env))
        .collect();

    Ok(terms.encode(env))
}