# l0g
Opinionated l0gging facade meant for the `no_std` libraries that are also sometimes used in a `std` context.
## Overview
Logging facilities differ depending on the environment, especially between `no_std` and `std`. This facade allows to delegate the decision which l0gging implementation shall be used to the top-level application.
Any call to `l0g::{error,warn,info,debug,trace}` turns into a
- noop when no feature is set
- `log::{error,warn,info,debug,trace}` from the [log](https://crates.io/crates/log) crate when `log` feature is set
- `defmt::{error,warn,info,debug,trace}` from the [defmt](https://crates.io/crates/defmt) crate when `defmt` feature is set
Moreover, proc-macro is provided to generalize over which formatting implementation should be used
```rust
#[l0g::format]
struct MyStruct {
value: u8
}
```
turns into
```rust
#[derive(core::fmt::Debug)]
struct MyStruct {
value: u8
}
```
if `log` feature is used or
```rust
#[derive(defmt::Format)]
struct MyStruct {
value: u8
}
```
if `defmt` feature is used.
This allows a `{:?}` formatting to work, regardless of which logging implementation is chosen.
## Usage
In the `Cargo.toml` of your libraries just say
```toml
l0g = "1"
```
In the `no_std` top-level application specify the dependency with the `defmt` feature. For how to make `defmt` work, take a look into its respective documentation.
```toml
l0g = { version = "1", features = ["defmt"] }
```
In the std top-level application specify the dependency with the `log` feature. For how to make `log` work, take a look into its respective documentation.
```toml
l0g = { version = "1", features = ["log"] }
```