[Node] Correctly handle errors

This commit is contained in:
Kyle Fuller
2014-10-26 12:21:39 +00:00
parent 925c663555
commit 0d4615a7e5
2 changed files with 45 additions and 3 deletions

View File

@@ -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)

View File

@@ -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() {