adotenv 0.10.4

A tooling-grade .env parser: literal values (no variable expansion), exact byte spans, and edits that leave the rest of the file untouched.
Documentation
# Serde

The `serde` feature adds typed deserialization for documents and loaded
environments.

```toml
adotenv = { version = "0.10.4", features = ["serde"] }
```

## Documents

```rust,ignore
use serde::Deserialize;

#[derive(Deserialize)]
struct Config {
    host: String,
    port: u16,
}

let doc = adotenv::parse_strict("host=localhost\nport=8080\n").unwrap();
let config: Config = doc.deserialize()?;
```

Keys follow the document's duplicate policy and lookup participation. Bare
declarations contribute an empty string only under `BareKeys::Empty`.

## Loaded environments

With `load` and `serde` enabled, `LoadedEnvironment::deserialize` uses the final
merged values. Origin lines remain available for conversion errors.

```rust,ignore
let loaded = adotenv::load::load_cascade("/srv/my-app", "production")?;
let config: Config = loaded.deserialize()?;
```

## Conversion rules

Values are decoded literals before Serde sees them. The adapter converts scalars:

- strings;
- booleans;
- integers and floats;
- characters.

It does not invent nested maps, sequences or enum layouts. Deserialize a string
and convert explicitly when a field needs another shape.

`DeserializeError` reports the key and source line when an origin is available.