ddex_parser/parser/
mode.rs1use std::io::{BufRead, Seek, SeekFrom};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum ParseMode {
9 Dom,
11 Stream,
13 Auto,
15}
16
17impl Default for ParseMode {
18 fn default() -> Self {
19 Self::Auto
20 }
21}
22
23pub struct ModeSelector {
25 threshold: u64,
26}
27
28impl Default for ModeSelector {
29 fn default() -> Self {
30 Self {
31 threshold: 10 * 1024 * 1024, }
33 }
34}
35
36impl ModeSelector {
37 pub fn new(threshold: u64) -> Self {
38 Self { threshold }
39 }
40
41 pub fn select_mode<R: BufRead + Seek>(&self, reader: &mut R, mode: ParseMode) -> Result<ParseMode, std::io::Error> {
43 match mode {
44 ParseMode::Dom | ParseMode::Stream => Ok(mode),
45 ParseMode::Auto => {
46 let current_pos = reader.stream_position()?;
48 let size = reader.seek(SeekFrom::End(0))?;
49 reader.seek(SeekFrom::Start(current_pos))?;
50
51 if size > self.threshold {
52 Ok(ParseMode::Stream)
53 } else {
54 Ok(ParseMode::Dom)
55 }
56 }
57 }
58 }
59
60 pub fn select_mode_hint(&self, size_hint: Option<u64>, mode: ParseMode) -> ParseMode {
62 match mode {
63 ParseMode::Dom | ParseMode::Stream => mode,
64 ParseMode::Auto => {
65 if let Some(size) = size_hint {
66 if size > self.threshold {
67 ParseMode::Stream
68 } else {
69 ParseMode::Dom
70 }
71 } else {
72 ParseMode::Stream
74 }
75 }
76 }
77 }
78}