6b468824ce
The CSV reader set has_headers(true) with no trimming and no header check, so three real-world inputs failed silently or opaquely: - A file with no header row had its first data row consumed as the header and silently dropped. - A leading UTF-8 BOM (Excel exports it) became part of the first header name, breaking the `timestamp` column mapping. - Leading/trailing whitespace around values broke serde parsing. Add a BomStripReader<R> Read adapter that discards a leading EF BB BF, set csv::Trim::All on the builder, and validate after opening that the header names every required OHLCV column — a missing column now yields a clear Error::Malformed instead of a silent misread. open/from_reader route through a shared build() helper; from_reader and from_csv_reader now return Result because header validation can fail.