moosicbox_assert 0.1.4

MoosicBox assert package
Documentation
# MoosicBox Assert

A conditional assertion library providing enhanced assertion macros with colorized output and stack traces, controlled by environment variables.

## Features

- **Conditional Assertions**: Enable/disable assertions via environment variable
- **Colorized Output**: Red background with white text for assertion failures
- **Stack Traces**: Automatic backtrace capture on assertion failures
- **Multiple Assert Types**: Different assertion behaviors (exit, error, panic, unimplemented)
- **Flexible Error Handling**: Convert assertions to errors, warnings, or panics
- **Environment Control**: Runtime control over assertion behavior

## Installation

Add this to your `Cargo.toml`:

```toml
[dependencies]
moosicbox_assert = "0.1.1"
```

## Usage

### Basic Assertions

```rust
use moosicbox_assert::{assert, die};

fn main() {
    // Set environment variable to enable assertions
    std::env::set_var("ENABLE_ASSERT", "1");

    let value = 42;

    // Basic assertion - exits process on failure
    assert!(value > 0);
    assert!(value == 42, "Expected 42, got {}", value);

    // Unconditional death (only when assertions enabled)
    if value < 0 {
        die!("Value cannot be negative: {}", value);
    }
}
```

### Assert with Error Return

```rust
use moosicbox_assert::assert_or_err;

#[derive(Debug)]
enum MyError {
    InvalidValue,
    OutOfRange,
}

fn validate_input(value: i32) -> Result<(), MyError> {
    // Convert assertion failure to error return
    assert_or_err!(value >= 0, MyError::InvalidValue);
    assert_or_err!(value <= 100, MyError::OutOfRange, "Value {} is out of range", value);

    Ok(())
}

fn main() {
    std::env::set_var("ENABLE_ASSERT", "1");

    match validate_input(-5) {
        Ok(()) => println!("Input is valid"),
        Err(e) => println!("Validation error: {:?}", e),
    }
}
```

### Assert with Logging

```rust
use moosicbox_assert::assert_or_error;

fn process_data(data: &[u8]) {
    // Log error instead of exiting when assertions disabled
    assert_or_error!(!data.is_empty(), "Cannot process empty data");
    assert_or_error!(data.len() < 1024, "Data too large: {} bytes", data.len());

    // Process data...
}

fn main() {
    env_logger::init();

    // With ENABLE_ASSERT=1: exits on failure
    // With ENABLE_ASSERT=0: logs error and continues
    std::env::set_var("ENABLE_ASSERT", "0");

    process_data(&[]);  // Will log error but not exit
}
```

### Assert with Panic

```rust
use moosicbox_assert::assert_or_panic;

fn critical_operation(input: Option<i32>) {
    // Panic with colorized output on failure
    let value = input.expect("Input required");
    assert_or_panic!(value > 0, "Value must be positive, got {}", value);

    println!("Processing value: {}", value);
}

fn main() {
    std::env::set_var("ENABLE_ASSERT", "1");

    critical_operation(Some(42));  // OK
    critical_operation(Some(-1));  // Panics with colored output
}
```

### Assert with Unimplemented

```rust
use moosicbox_assert::assert_or_unimplemented;

fn experimental_feature(enabled: bool) {
    // Mark unimplemented code paths
    assert_or_unimplemented!(enabled, "Feature not yet implemented");

    println!("Running experimental feature");
}

fn main() {
    std::env::set_var("ENABLE_ASSERT", "1");

    experimental_feature(true);   // OK
    experimental_feature(false);  // Calls unimplemented!() with colors
}
```

### Environment Control

```rust
use moosicbox_assert::assert;

fn debug_mode_example() {
    let data = vec![1, 2, 3];

    // Only checked when ENABLE_ASSERT=1
    assert!(!data.is_empty());
    assert!(data.len() == 3, "Expected 3 elements");
}

fn main() {
    // Disable assertions for production
    std::env::set_var("ENABLE_ASSERT", "0");
    debug_mode_example();  // Assertions are no-ops

    // Enable for debugging
    std::env::set_var("ENABLE_ASSERT", "1");
    debug_mode_example();  // Assertions are active
}
```

## Assertion Types

### `assert!(condition [, message])`
Exits the process with colored output when condition fails and assertions are enabled.

### `assert_or_err!(condition, error [, message])`
Returns the error when condition fails, or exits with assertion if `ENABLE_ASSERT=1`.

### `assert_or_error!(condition, message)`
Logs an error when condition fails, or exits with assertion if `ENABLE_ASSERT=1`.

### `assert_or_panic!(condition [, message])`
Panics with colored output when condition fails, or exits with assertion if `ENABLE_ASSERT=1`.

### `assert_or_unimplemented!(condition [, message])`
Calls `unimplemented!()` when condition fails, or exits with assertion if `ENABLE_ASSERT=1`.

### `die!([message])`
Unconditionally exits with colored output when assertions are enabled.

## Environment Variables

- `ENABLE_ASSERT`: Set to "1" to enable assertions, any other value disables them

## Output Format

When assertions fail, the output includes:
- **Red background** with **white text** for visibility
- **Bold** and **underlined** formatting
- **Full stack trace** showing the failure location
- **Custom messages** with formatting support

## Dependencies

- `colored`: For colorized terminal output
- `moosicbox_env_utils`: For environment variable handling
- Standard library backtrace support

## Use Cases

- **Development**: Enable detailed assertion checking
- **Testing**: Verify preconditions and postconditions
- **Production**: Disable assertions for performance
- **Debugging**: Get detailed failure information with stack traces