From 0d4615a7e5888f10c1cd6862cab8b2ab327e5a6e Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Sun, 26 Oct 2014 12:21:39 +0000 Subject: [PATCH] [Node] Correctly handle errors --- Stencil/Node.swift | 24 +++++++++++++++++++++--- StencilTests/NodeTests.swift | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/Stencil/Node.swift b/Stencil/Node.swift index 54136d8..4eef501 100644 --- a/Stencil/Node.swift +++ b/Stencil/Node.swift @@ -12,6 +12,20 @@ public protocol Error : Printable { } +struct NodeError : Error { + let token:Token + let message:String + + init(token:Token, message:String) { + self.token = token + self.message = message + } + + var description:String { + return "\(token.components().first!): \(message)" + } +} + public protocol Node { func render(context:Context) -> (String?, Error?) } @@ -126,14 +140,14 @@ public class ForNode : Node { emptyNodes = nodes } } + } else { + return (nil, NodeError(token: token, message: "`endfor` was not found.")) } return (ForNode(variable: variable, loopVariable: loopVariable, nodes: nodes!, emptyNodes:emptyNodes), nil) - } else { - // TODO error } - return (TextNode(text: "TODO return some error"), nil) + return (nil, NodeError(token: token, message: "Invalid syntax. Expected `for x in y`.")) } public init(variable:String, loopVariable:String, nodes:[Node], emptyNodes:[Node]) { @@ -195,6 +209,8 @@ public class IfNode : Node { falseNodes = nodes } } + } else { + return (nil, NodeError(token: token, message: "`endif` was not found.")) } return (IfNode(variable: variable, trueNodes: trueNodes!, falseNodes: falseNodes), nil) @@ -222,6 +238,8 @@ public class IfNode : Node { parser.nextToken() } + } else { + return (nil, NodeError(token: token, message: "`endif` was not found.")) } return (IfNode(variable: variable, trueNodes: trueNodes, falseNodes: falseNodes!), nil) diff --git a/StencilTests/NodeTests.swift b/StencilTests/NodeTests.swift index fa9282f..6ee110c 100644 --- a/StencilTests/NodeTests.swift +++ b/StencilTests/NodeTests.swift @@ -139,6 +139,30 @@ class IfNodeTests: NodeTests { XCTAssertEqual(falseNode.text, "false") } + func testParseIfWithoutEndIfError() { + let tokens = [ + Token.Block(value: "if value"), + ] + + let parser = TokenParser(tokens: tokens) + let (nodes, error) = parser.parse() + + XCTAssertTrue(nodes == nil) + XCTAssertEqual(error!.description, "if: `endif` was not found.") + } + + func testParseIfNotWithoutEndIfError() { + let tokens = [ + Token.Block(value: "ifnot value"), + ] + + let parser = TokenParser(tokens: tokens) + let (nodes, error) = parser.parse() + + XCTAssertTrue(nodes == nil) + XCTAssertEqual(error!.description, "ifnot: `endif` was not found.") + } + // MARK: Rendering func testIfNodeRenderTruth() {