#[cfg(feature = "macros")]
pub use timetrace_macros::{profile_function, profile_session};

pub mod profiler;
pub mod trace_event;

/**
# Timetrace

A lightweight Rust profiling library inspired by Hazel and Tracy-style instrumentation.

Generates JSON traces compatible with Chrome Tracing and Perfetto.


## Features

- RAII profiling (scope-based)
- Function attribute macro: `#[profile_function]`
- Session management: `#[profile_session]`
- Frame indexing in trace (`args.frame`)
- Minimal overhead
- Thread-aware (thread id included)


## Example

```rust
use timetrace::{profile_function, profile_session};

#[profile_session("Example", "trace.json")]
fn main() {
    work();
}

#[profile_function]
fn work() {
    let mut sum = 0.0;

    for i in 0..1_000_000 {
        sum += (i as f64).cos();
    }

    println!("{sum}");
}
```


## Run

```bash
cargo run -p timetrace_example
```


## View Trace

Open in:

- https://ui.perfetto.dev
- Only in Google Chrome: chrome://tracing


## Output Example
```json
{
  "name": "work",
  "cat": "function",
  "ph": "X",
  "ts": 123456789,
  "dur": 23000,
  "pid": 0,
  "tid": 12345,
  "args": {
    "frame": 0
  }
}
```
(Actual output is written as a single line JSON)


## Cargo Features

Enable macros:

```toml
timetrace = { path = "...", features = ["macros"] }
```
(macros are enabled by default)

Disable macros:
```toml
timetrace = { path = "...", default-features = false }
```
*/

#[macro_export]
macro_rules! profile_begin_session {
    ($name:expr, $filepath:expr) => {
        $crate::profiler::Profiler::get()
            .lock()
            .begin_session($name, $filepath);
    };
}

#[macro_export]
macro_rules! profile_begin_session_limited {
    ($name:expr, $path:expr, $frames:expr, $ms:expr) => {
        $crate::profiler::Profiler::get()
            .lock()
            .begin_session_limited($name, $path, $frames, $ms);
    };
}

#[macro_export]
macro_rules! profile_end_session {
    () => {
        $crate::profiler::Profiler::get()
            .lock()
            .end_session()
            .unwrap();
    };
}

#[macro_export]
macro_rules! profile_scope {
    ($name:expr) => {
        let _timer = $crate::profiler::ProfilerTimer::new($name);
    };
}

#[macro_export]
macro_rules! profile_function_scope {
    () => {
        let _timer = $crate::profiler::ProfilerTimer::new(module_path!());
    };
}

#[macro_export]
macro_rules! profile_new_frame {
    () => {
        $crate::profiler::Profiler::get().lock().next_frame();
    };
}
#[macro_export]
macro_rules! profile_update {
    ($name:expr, $value:expr) => {
        profile_new_frame!();
    };
}
