| 91 | } |
| 92 | |
| 93 | pub(crate) fn parse(line_reader: &mut LineReader) -> Result<Vec<PosCommand>, PosError> { |
| 94 | let mut out = Vec::new(); |
| 95 | while let Some((pos, line)) = line_reader.peek() { |
| 96 | let pos = *pos; |
| 97 | let command = match line.chars().next() { |
| 98 | Some('$') => { |
| 99 | let version = parse_version_constraint(line_reader)?; |
| 100 | Command::Builtin(parse_builtin(line_reader)?, version) |
| 101 | } |
| 102 | Some('>') => { |
| 103 | let version = parse_version_constraint(line_reader)?; |
| 104 | Command::Sql(parse_sql(line_reader)?, version) |
| 105 | } |
| 106 | Some('?') => { |
| 107 | let version = parse_version_constraint(line_reader)?; |
| 108 | Command::Sql(parse_explain_sql(line_reader)?, version) |
| 109 | } |
| 110 | Some('!') => { |
| 111 | let version = parse_version_constraint(line_reader)?; |
| 112 | Command::FailSql(parse_fail_sql(line_reader)?, version) |
| 113 | } |
| 114 | Some('#') => { |
| 115 | // Comment line. |
| 116 | line_reader.next(); |
| 117 | continue; |
| 118 | } |
| 119 | Some(x) => { |
| 120 | return Err(PosError { |
| 121 | source: anyhow!(format!("unexpected input line at beginning of file: {}", x)), |
| 122 | pos: Some(pos), |
| 123 | }); |
| 124 | } |
| 125 | None => { |
| 126 | return Err(PosError { |
| 127 | source: anyhow!("unexpected input line at beginning of file"), |
| 128 | pos: Some(pos), |
| 129 | }); |
| 130 | } |
| 131 | }; |
| 132 | out.push(PosCommand { command, pos }); |
| 133 | } |
| 134 | Ok(out) |
| 135 | } |
| 136 | |
| 137 | fn parse_builtin(line_reader: &mut LineReader) -> Result<BuiltinCommand, PosError> { |
| 138 | let (pos, line) = line_reader.next().unwrap(); |