From 2a4d4f960bca7466d36900344c946d08b7204322 Mon Sep 17 00:00:00 2001
From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com>
Date: Sun, 24 May 2020 16:49:49 -0400
Subject: [PATCH] remove all unwraps from style parsing

---
 src/style.rs   | 18 +++++++++---------
 tests/error.rs |  4 ++++
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/style.rs b/src/style.rs
index fb8a7af..b937a6b 100644
--- a/src/style.rs
+++ b/src/style.rs
@@ -98,11 +98,11 @@ impl<'a> StyleParser<'a> {
         while let Some(tok) = toks.peek().cloned() {
             match tok.kind {
                 '{' => {
-                    let span_before = toks.next().unwrap().pos;
+                    toks.next();
                     devour_whitespace(toks);
                     loop {
                         let property =
-                            self.parse_property(toks, super_property.clone(), span_before)?;
+                            self.parse_property(toks, super_property.clone(), tok.pos)?;
                         if let Some(tok) = toks.peek() {
                             if tok.kind == '{' {
                                 match self.eat_style_group(toks, property, scope)? {
@@ -123,17 +123,17 @@ impl<'a> StyleParser<'a> {
                                 continue;
                             }
                         }
-                        let value = self.parse_style_value(toks, scope, span_before)?;
-                        match toks.peek().unwrap().kind {
-                            '}' => {
+                        let value = self.parse_style_value(toks, scope, tok.pos)?;
+                        match toks.peek() {
+                            Some(Token { kind: '}', .. }) => {
                                 styles.push(Style { property, value });
                             }
-                            ';' => {
+                            Some(Token { kind: ';', .. }) => {
                                 toks.next();
                                 devour_whitespace(toks);
                                 styles.push(Style { property, value });
                             }
-                            '{' => {
+                            Some(Token { kind: '{', .. }) => {
                                 styles.push(Style {
                                     property: property.clone(),
                                     value,
@@ -144,7 +144,7 @@ impl<'a> StyleParser<'a> {
                                     _ => unreachable!(),
                                 }
                             }
-                            _ => {
+                            Some(..) | None => {
                                 devour_whitespace(toks);
                                 styles.push(Style { property, value });
                             }
@@ -203,7 +203,7 @@ impl<'a> StyleParser<'a> {
         devour_whitespace(toks);
         let property = eat_ident(toks, self.scope, self.super_selector, span_before)?;
         devour_whitespace_or_comment(toks)?;
-        if toks.peek().is_some() && toks.peek().unwrap().kind == ':' {
+        if let Some(Token { kind: ':', .. }) = toks.peek() {
             toks.next();
             devour_whitespace_or_comment(toks)?;
         } else {
diff --git a/tests/error.rs b/tests/error.rs
index f3837c5..708372c 100644
--- a/tests/error.rs
+++ b/tests/error.rs
@@ -234,3 +234,7 @@ error!(
     invalid_binop_in_list,
     "a {color: foo % bar, baz;}", "Error: Undefined operation \"foo % bar\"."
 );
+error!(
+    improperly_terminated_nested_style,
+    "a {foo: {bar: red", "Error: Expected identifier."
+);