braces 0.2.6

Convert path lists into compact brace expansion syntax
Documentation
mod helpers;

use braces::{brace_paths, BraceConfig, BraceError};
use helpers::*;

#[test]
fn test_disallow_empty_braces_1_to_2_levels() {
    let config = BraceConfig {
        disallow_empty_braces: true,
        ..Default::default()
    };
    assert_braces(vec!["a", "a/b"], "{a/b,a}", &config);
}

#[test]
fn test_disallow_empty_braces_2_to_3_levels() {
    let config = BraceConfig {
        disallow_empty_braces: true,
        ..Default::default()
    };
    assert_braces(vec!["a/b", "a/b/c"], "a/{b/c,b}", &config);
}

#[test]
fn test_empty_input() {
    let paths: Vec<String> = vec![];
    let result = brace_paths(&paths, &BraceConfig::default());
    assert!(matches!(result, Err(BraceError::EmptyInput)));
}

#[test]
fn test_mixed_separators_rejected() {
    let paths = vec!["foo/bar", "foo\\baz"];
    let result = brace_paths(&paths, &BraceConfig::default());
    assert!(matches!(result, Err(BraceError::MixedSeparators { .. })));
}

#[test]
fn test_deduplication_enabled() {
    assert_braces_default(
        vec!["foo/bar.rs", "foo/bar.rs", "foo/baz.rs"],
        "foo/{bar,baz}.rs",
    );
}

#[test]
fn test_deduplication_disabled() {
    let config = BraceConfig {
        deduplicate_inputs: false,
        ..Default::default()
    };
    assert_braces(
        vec!["foo/bar.rs", "foo/bar.rs", "foo/baz.rs"],
        "foo/{bar,bar,baz}.rs",
        &config,
    );
}

#[test]
fn test_braces_in_input_rejected() {
    let paths = vec!["foo/{bar,baz}.rs"];
    let result = brace_paths(&paths, &BraceConfig::default());
    assert!(matches!(result, Err(BraceError::InvalidBraceInput { .. })));
}

#[test]
fn test_disallow_empty_with_nested() {
    let config = BraceConfig {
        disallow_empty_braces: true,
        ..Default::default()
    };
    assert_braces(vec!["a/b", "a/b/c"], "a/{b/c,b}", &config);
}