1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
//! Lossless, literal `.env` dialect parsing and verified native text edits.
//!
//! Parsing borrows UTF-8 source and retains every byte, including malformed
//! statements. It never reads files, consults the environment, or expands values.
//!
//! ```
//! use adotenv::{parse, parse_owned, parse_strict, Severity};
//!
//! let text = "# app\nexport PORT=8080\nURL=\"${HOST}/api\" # base\n";
//! let (doc, diagnostics) = parse(text);
//! assert!(!diagnostics.iter().any(|d| d.severity() == Severity::Error));
//! assert_eq!(doc.get("PORT"), Some("8080"));
//! assert_eq!(doc.get("URL"), Some("${HOST}/api"));
//! let edits = doc.set("PORT", "9090")?;
//! assert_eq!(edits.edits()[0].replacement, "9090");
//! assert_eq!(parse_strict(edits.as_str())?.get("PORT"), Some("9090"));
//! let (owned, _) = parse_owned(String::from("KEY='value'\n"));
//! assert_eq!(owned.get("KEY"), Some("value"));
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
//!
//! # Explicit dialects
//!
//! [`parse`], [`parse_owned`] and [`parse_strict`] retain Portable defaults.
//! Their `_with` variants accept a [`Dialect`]; [`Document::reparse`] borrows
//! retained source and rebuilds its interpretation. Presets never enable
//! interpolation, inheritance, file loading or ambient environment access.
//!
//! ```
//! use adotenv::{parse_with, Dialect};
//! let (doc, _) = parse_with("A=a#b\n", Dialect::NODE_DOTENV);
//! assert_eq!(doc.get("A"), Some("a"));
//! assert_eq!(doc.dialect(), Dialect::NODE_DOTENV);
//! assert_eq!(doc.reparse(Dialect::DOCKER_RAW).0.get("A"), Some("a#b"));
//! ```
//!
//! [`Document::portability`] reparses the retained source once per unique
//! configuration, includes the document's own reading first, and reports every
//! physical line whose declarations, values, states, export prefixes, lookup
//! participation or item grouping differ.
//!
//! [`Entry::references`] reports raw `$VAR`, `${VAR:-default}` and `$(command)`
//! candidates with original-source spans and quote/escape context. It never
//! resolves a lookup or executes a command; [`Reference::is_eligible`] applies
//! explicit caller-selected rules.
//!
//! [`Document::resolve`] performs opt-in variable substitution with a caller
//! lookup closure. Sequential or whole-file scope, precedence, unresolved
//! policy, operators, cycles and resource limits are explicit. Command forms
//! stay literal unless [`Document::resolve_with_commands`] receives an explicit
//! callback; callback calls are provenance-recorded and never run by default.
//!
//! # Structure and formatting
//!
//! [`Document::groups`] exposes blank-line-separated item runs, and
//! [`Document::header`] exposes the structural prefix before the first entry.
//! [`Entry::leading_comments`] attaches only contiguous whole-line comments; a
//! blank line breaks attachment. These are views over the selected dialect's
//! lossless items and do not move or reinterpret source.
//!
//! [`Document::format`] applies explicit trivia-only [`FormatOptions`] and
//! reparses the complete output with the exact selected dialect. It returns
//! source-relative [`TextEdit`] values plus verified text. [`BlankLines`] can
//! collapse group separators and [`QuoteStyle`] can prefer a quote style when
//! the exact decoded value survives. Raw values, multiline bodies,
//! invalid/ignored statements, empty assigned values and ambiguous mixed line
//! endings are left untouched. [`Document::sort`] reorders groups with attached
//! comments and reference dependencies, then verifies the result.
//!
//! [`Document::compare`] reports effective-key differences, distinguishing
//! missing keys, bare/empty/assigned states, decoded values and exports.
//! [`Document::example`] removes assigned values while retaining comments and
//! layout, and comments out malformed or ignored statements so their text cannot
//! leak a value.
//!
//! # Loading
//!
//! The opt-in std-only `load` feature provides `load::load_cascade` and
//! `load::load_files`. They strictly read and validate every participating file
//! before returning `load::LoadedEnvironment`, which carries final values,
//! origins, overrides, repeats and skipped declarations.
//! `resolve_contextual` preserves each winning declaration's raw quote/escape
//! context; `resolve_decoded` is an explicit decoded-text policy. Single-source
//! context-aware resolution remains [`Document::resolve`]. Loading performs no
//! expansion or process-environment mutation by itself.
//!
//! The opt-in `serde` feature adds `Document::deserialize`, mapping effective
//! literal declarations into a Serde type with line/key-aware conversion errors.
//! With `load` enabled as well, `LoadedEnvironment::deserialize` maps the final
//! merged cascade into the same Serde types and preserves origin lines.
//!
//! # Source and positions
//!
//! Ranges always address the original source, BOM included. Item ranges plus
//! the optional BOM partition it without gaps. A [`LineIndex`] offers checked
//! zero-based byte, scalar and UTF-16 coordinates. One-based display conversion
//! is explicit; scalar columns are not terminal-cell widths.
//!
//! # Editing and recovery
//!
//! Key-only helpers require unique declarations. [`Edit`] selects explicit
//! occurrences and comments from one source snapshot. Every complete batch is
//! reparsed and checked before [`VerifiedEdits`] exposes its output or native
//! edits. Unrelated malformed statements may remain, but must not change their
//! interpretation. Verification uses the exact selected dialect; values or
//! contexts its grammar cannot represent are rejected. External appliers check
//! versions.
//!
//! # Platform
//!
//! Zero runtime dependencies. Disable default features for `no_std` with `alloc`.
//! Unsafe code is forbidden regardless of features. Reference resolution and
//! process-environment mutation are not part of literal parsing; filesystem
//! loading is available only through the opt-in `load` feature.
extern crate alloc;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use DeserializeError;
pub use ;
/// Compile and execute the README examples with the crate's documentation.
;