use common::*; #[derive(PartialEq, Debug)] pub struct CookedString<'a> { pub raw: &'a str, pub cooked: String, } impl<'a> CookedString<'a> { pub fn new(token: &Token<'a>) -> CompilationResult<'a, CookedString<'a>> { let raw = &token.lexeme[1..token.lexeme.len()-1]; if let TokenKind::RawString = token.kind { Ok(CookedString{cooked: raw.to_string(), raw}) } else if let TokenKind::StringToken = token.kind { let mut cooked = String::new(); let mut escape = false; for c in raw.chars() { if escape { match c { 'n' => cooked.push('\n'), 'r' => cooked.push('\r'), 't' => cooked.push('\t'), '\\' => cooked.push('\\'), '"' => cooked.push('"'), other => return Err(token.error(CompilationErrorKind::InvalidEscapeSequence { character: other, })), } escape = false; continue; } if c == '\\' { escape = true; continue; } cooked.push(c); } Ok(CookedString{raw, cooked}) } else { Err(token.error(CompilationErrorKind::Internal { message: "cook_string() called on non-string token".to_string() })) } } }