textlane 0.7.0

Rust-native text processing pipeline — a unified replacement with native and JavaScript plugins
Documentation
use serde_json::json;
use textlane_core::{Error, File};
use textlane_md::ShiftHeading;

use crate::models::pipeline::{Api, Pipeline};

fn shift(shift: i32) -> ShiftHeading {
    ShiftHeading {
        shift,
        ..ShiftHeading::default()
    }
}

fn process(pipeline: &mut Pipeline, input: &str) -> Result<String, Error> {
    pipeline.process(input, &mut File::new(), Api::Sync)
}

#[test]
fn runs_a_native_plugin_in_first_use_order() -> Result<(), Error> {
    let mut pipeline = Pipeline::new();
    pipeline.use_value(&json!("md.parse"), None)?;
    pipeline.use_native("shift", shift(1))?;
    pipeline.use_value(&json!(["md.toHtml", "html.stringify"]), None)?;
    assert_eq!(process(&mut pipeline, "# a")?, "<h2>a</h2>");
    Ok(())
}

#[test]
fn replaces_a_native_plugin_used_again_in_its_place() -> Result<(), Error> {
    let mut pipeline = Pipeline::new();
    pipeline.use_value(&json!("md.parse"), None)?;
    pipeline.use_native("shift", shift(1))?;
    pipeline.use_value(&json!(["md.toHtml", "html.stringify"]), None)?;
    pipeline.use_native("shift", shift(2))?;
    assert_eq!(process(&mut pipeline, "# a")?, "<h3>a</h3>");
    Ok(())
}

#[test]
fn merges_a_named_plugin_used_again_beside_native_ones() -> Result<(), Error> {
    let mut pipeline = Pipeline::new();
    pipeline.use_value(&json!("md.parse"), None)?;
    pipeline.use_native("shift", shift(1))?;
    pipeline.use_value(&json!(["md.toHtml", "html.stringify"]), None)?;
    pipeline.use_value(&json!("html.stringify"), Some(json!({ "quote": "'" })))?;
    let html = process(&mut pipeline, "# [a](b)")?;
    assert_eq!(html, "<h2><a href='b'>a</a></h2>");
    Ok(())
}

#[test]
fn refuses_a_native_plugin_once_frozen() -> Result<(), Error> {
    let mut pipeline = Pipeline::new();
    pipeline.use_value(&json!("md.parse"), None)?;
    pipeline.freeze()?;
    let error = pipeline.use_native("shift", shift(1)).err();
    assert_eq!(
        error.map(|error| error.code),
        Some("frozen-processor".to_owned())
    );
    Ok(())
}