wrap-ansi 0.1.0

A high-performance, Unicode-aware Rust library for intelligently wrapping text while preserving ANSI escape sequences, colors, styles, and hyperlinks
Documentation
use wrap_ansi::{WrapError, WrapOptions, wrap_ansi, wrap_ansi_checked};

fn main() -> Result<(), WrapError> {
    println!("=== Wrap-ANSI Improved Features Demo ===\n");

    // 1. Builder Pattern for Options
    println!("1. Builder Pattern for Options:");
    let options = WrapOptions::builder()
        .hard_wrap(true)
        .trim_whitespace(false)
        .word_wrap(true)
        .build();

    let text = "This is a verylongwordthatexceedslimit example";
    let wrapped = wrap_ansi(text, 15, Some(options));
    println!("Input: {}", text);
    println!("Output:\n{}\n", wrapped);

    // 2. Error Handling with Input Validation
    println!("2. Error Handling:");

    // Valid input
    match wrap_ansi_checked("Hello world", 10, None) {
        Ok(result) => println!("Valid input wrapped: {}", result.replace('\n', "\\n")),
        Err(e) => println!("Error: {}", e),
    }

    // Invalid column width
    match wrap_ansi_checked("Hello world", 0, None) {
        Ok(result) => println!("Result: {}", result),
        Err(e) => println!("Expected error: {}", e),
    }

    // Large input (simulated)
    let large_text = "x".repeat(100);
    match wrap_ansi_checked(&large_text, 10, None) {
        Ok(result) => println!(
            "Large input handled: {} chars -> {} chars",
            large_text.len(),
            result.len()
        ),
        Err(e) => println!("Error with large input: {}", e),
    }

    println!();

    // 3. ANSI Color Preservation with Named Constants
    println!("3. ANSI Color Preservation:");
    let colored_text =
        "\u{001B}[31mThis is red text that will be wrapped across multiple lines\u{001B}[39m";
    let wrapped_colored = wrap_ansi(colored_text, 20, None);
    println!("Colored text wrapped:");
    println!("{}", wrapped_colored);
    println!();

    // 4. Hyperlink Preservation
    println!("4. Hyperlink Preservation:");
    let hyperlink_text = "\u{001B}]8;;https://example.com\u{0007}This is a clickable link that spans multiple lines\u{001B}]8;;\u{0007}";
    let wrapped_hyperlink = wrap_ansi(hyperlink_text, 15, None);
    println!("Hyperlink text wrapped:");
    println!("{}", wrapped_hyperlink);
    println!();

    // 5. Performance with Complex ANSI Sequences
    println!("5. Complex ANSI Sequences:");
    let complex_text =
        "\u{001B}[31m\u{001B}[42mRed text on green background\u{001B}[39m\u{001B}[49m normal text";
    let wrapped_complex = wrap_ansi(complex_text, 12, None);
    println!("Complex ANSI wrapped:");
    println!("{}", wrapped_complex);
    println!();

    // 6. Unicode Support
    println!("6. Unicode Support:");
    let unicode_text = "Hello δΈ–η•Œ 🌍 こんにけは";
    let wrapped_unicode = wrap_ansi(unicode_text, 10, None);
    println!("Unicode text wrapped:");
    println!("{}", wrapped_unicode);

    Ok(())
}