# Clyle Procedural Macros

Compile-time styling for terminal output using HTML-like syntax.
This crate provides the [`clyle!`] procedural macro, which processes styling
markup at compile time, resulting in **zero runtime overhead** compared to
manually writing ANSI escape sequences.

## The `clyle!` Macro

The primary export is the [`clyle!`] macro, which takes a string literal
containing HTML-style markup and returns a `&'static str` with the processed
ANSI escape sequences.

### Usage

```rust
use clyle::clyle;
fn main() {
    // Instant compile-time evaluation
    let message = clyle!("<fg=red bold>Error:</> {}", "Something went wrong");
    println!("{}", message);
}
```

### Why Use `clyle!` Over `try_clyle()`?

- **Zero Runtime Overhead**: Styling is processed at compile time
- **Early Error Detection**: Invalid markup fails at compile time, not runtime
- **Optimized Output**: The compiler can optimize static strings
- **Simpler API**: No need for error handling in most cases

## Syntax Guide

### Color Syntax

- **Standard ANSI colors** (16 colors):
  - Lowercase: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`
  - Short form: `k`, `r`, `g`, `y`, `b`, `m`, `c`, `w`
  - Bright variants (uppercase): `Black`, `Red`, `Green`, `Yellow`, `Blue`, `Magenta`, `Cyan`, `White`
  - Bright variants short form: `K`, `R`, `G`, `Y`, `B`, `M`, `C`, `W`

- **256-Color Palette**: `palette(0)` through `palette(255)`

- **True RGB Colors**:
  - Hex format: `#FF00FF` (magenta)
  - RGB format: `rgb(255,0,255)` (magenta)

> Use the `fg=` attribute for background colors and the `bg=` attribute for background colors.

#### Example

```rust
use clyle::clyle;

fn main() {
    println!("{}", clyle!("<bg=blue>Blue background</>"));
    println!("{}", clyle!("<fg=white bg=red>Red background with white text</>"));
    println!("{}", clyle!("<bg=#00FF00>RGB green background</>"));
}
```

### Text Effects

- `bold` or `b` — Bold text
- `dim` or `d` — Dimmed/faint text
- `italic` or `i` — Italic text
- `under` or `u` — Underlined text
- `strike` or `s` — Strikethrough text
- `blink` or `k` — Blinking text
- `reverse` or `r` — Inverted foreground and background
- `hidden` or `h` — Hidden text (not visible)

Effects can be combined in a single tag:

```rust
use clyle::clyle;

fn main() {
    println!("{}", clyle!("<bold>Bold text</bold>"));
    println!("{}", clyle!("<italic dim>Dimmed italic</italic>"));
    println!("{}", clyle!("<fg=cyan bold under>Cyan, bold, underlined</>"));
}
```

### Tag Nesting and Closing

Tags are closed with `</>` or `</TAG-NAME>` which removes all active styling. You can nest tags:

```rust
use clyle::clyle;

fn main() {
    println!("{}", clyle!("<fg=red>Red <bold>and bold</> just red</>"));
}
```

## Examples

### Status Messages

```rust
use clyle::clyle;
fn print_status() {
    println!("{}", clyle!("<fg=green>✓</> Success"));
    println!("{}", clyle!("<fg=yellow>!</> Warning"));
    println!("{}", clyle!("<fg=red>✗</> Error"));
}
```

### Nested Styling

```rust
use clyle::clyle;
fn main() {
    println!("{}", clyle!("<fg=cyan>Info:</> <bold>Important</bold> message"));
}
```

## Compile-Time vs Runtime

Use this macro when:

- You have fixed styling strings (literals)
- You want zero runtime overhead
- You prefer early error detection
Use [`clyle_core::try_clyle`] when:
- You need to style dynamically generated strings
- You need to handle styling errors at runtime
- You're processing user input or external data

## Integration with `clyle` Crate

The `clyle` crate re-exports this macro for convenient use:

```rust
use clyle::clyle;
```

Alternatively, import directly from this crate:

```rust
use clyle_proc::clyle;
```

## Terminal Support

Clyle works on any terminal supporting ANSI escape sequences:

- ✅ Most modern terminals (bash, zsh, PowerShell 7+, etc.)
- ✅ Windows 10+ (with ANSI support enabled or Windows Terminal)
- ✅ macOS Terminal and iTerm2
- ℹ️ Always test on your target platform to ensure color support

## License

Clyle is dual-licensed under either of:

- **Apache License, Version 2.0** ([LICENSE-APACHE](LICENSE-APACHE) or <http://www.apache.org/licenses/LICENSE-2.0>)
- **MIT License** ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)

Choose whichever license works best for your use case.
