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
use super::{ast, lex, parse, token, Error, LineNumber}; #[derive(Debug)] pub struct Line { number: LineNumber, tokens: Vec<token::Token>, } impl Line { pub fn new(source_line: &str) -> Line { let (number, tokens) = lex(&source_line); Line { number, tokens } } pub fn number(&self) -> LineNumber { self.number } pub fn is_direct(&self) -> bool { self.number.is_none() } pub fn is_empty(&self) -> bool { self.tokens.is_empty() } pub fn ast(&self) -> Result<Vec<ast::Statement>, Error> { parse(self.number, &self.tokens) } } impl std::fmt::Display for Line { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { let s: String = self.tokens.iter().map(|s| s.to_string()).collect(); if let Some(number) = self.number { write!(f, "{} {}", number, s) } else { write!(f, "{}", s) } } } impl<'a> IntoIterator for &'a Line { type Item = &'a Line; type IntoIter = std::option::IntoIter<Self::Item>; fn into_iter(self) -> Self::IntoIter { Some(self).into_iter() } }