diff --git a/Sources/Common/Error.swift b/Sources/Common/Error.swift
new file mode 100644
index 0000000..00bed18
--- /dev/null
+++ b/Sources/Common/Error.swift
@@ -0,0 +1,126 @@
+// p4rse, Copyright 2026, Will Hawkins
+//
+// This file is part of p4rse.
+//
+// This file is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+public struct Error: Errorable, Equatable, CustomStringConvertible {
+ public func format() -> String {
+ return self.description
+ }
+
+ public func msg() -> String {
+ return self._msg
+ }
+
+ public func append(error: any Errorable) -> any Errorable {
+ return Errors(self, error)
+ }
+
+ let _msg: String
+
+ public init(withMessage msg: String) {
+ self._msg = msg
+ }
+
+ public var description: String {
+ return self._msg
+ }
+}
+
+public struct ErrorWithLocation: Errorable, Equatable, CustomStringConvertible {
+ let startFormat: String = "\u{1B}[31;1;4m"
+ let endFormat: String = "\u{1B}[0m"
+
+ public func format() -> String {
+ return startFormat + "\(self.location)" + endFormat + ": \(self._msg)"
+ }
+
+ public func msg() -> String {
+ return self.description
+ }
+
+ public func append(error: any Errorable) -> any Errorable {
+ return Errors(self, error)
+ }
+
+ let _msg: String
+
+ let location: SourceLocation
+
+ public init(sourceLocation location: SourceLocation, withError msg: String) {
+ self._msg = msg
+ self.location = location
+ }
+
+ public var description: String {
+ return "\(self.location): \(self._msg)"
+ }
+}
+
+public struct Errors: Errorable, CustomStringConvertible {
+ public func format() -> String {
+ return self.description
+ }
+
+ public func msg() -> String {
+ return self.description
+ }
+
+ public func append(error: any Errorable) -> any Errorable {
+ return Errors(self.errors + [error])
+ }
+
+ public var description: String {
+ return self.errors.map { error in
+ return error.msg()
+ }.joined(separator: ";")
+ }
+
+ public let errors: [any Errorable]
+
+ init(_ errors: [any Errorable]) {
+ self.errors = errors
+ }
+
+ public init(_ e1: any Errorable, _ e2: any Errorable) {
+ self.errors = [e1, e2]
+ }
+}
+
+public struct ErrorWithLabel: Errorable {
+ let label: String
+ let error: any Errorable
+
+ public init(_ label: String, _ error: any Errorable) {
+ self.label = label
+ self.error = error
+ }
+
+ public func format() -> String {
+ return self.description
+ }
+
+ public func msg() -> String {
+ return self.description
+ }
+
+ public func append(error: any Errorable) -> any Errorable {
+ return Errors(self, error)
+ }
+
+ public var description: String {
+ return "\(self.label): \(self.error.msg())"
+ }
+}
diff --git a/Sources/Common/Result.swift b/Sources/Common/Result.swift
index eb97311..da6119a 100644
--- a/Sources/Common/Result.swift
+++ b/Sources/Common/Result.swift
@@ -15,113 +15,6 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-public struct Error: Errorable, Equatable, CustomStringConvertible {
- public func format() -> String {
- return self.description
- }
-
- public func msg() -> String {
- return self._msg
- }
-
- public func append(error: any Errorable) -> any Errorable {
- return Errors(self, error)
- }
-
- let _msg: String
-
- public init(withMessage msg: String) {
- self._msg = msg
- }
-
- public var description: String {
- return self._msg
- }
-}
-
-public struct ErrorWithLocation: Errorable, Equatable, CustomStringConvertible {
-
- public func format() -> String {
- return self.description
- }
-
- public func msg() -> String {
- return self.description
- }
-
- public func append(error: any Errorable) -> any Errorable {
- return Errors(self, error)
- }
-
- let _msg: String
-
- let location: SourceLocation
-
- public init(sourceLocation location: SourceLocation, withError msg: String) {
- self._msg = msg
- self.location = location
- }
-
- public var description: String {
- return "\(self.location): \(self._msg)"
- }
-}
-
-public struct Errors: Errorable, CustomStringConvertible {
- public func format() -> String {
- return self.description
- }
-
- public func msg() -> String {
- return self.description
- }
-
- public func append(error: any Errorable) -> any Errorable {
- return Errors(self.errors + [error])
- }
-
- public var description: String {
- return self.errors.map { error in
- return error.msg()
- }.joined(separator: ";")
- }
-
- public let errors: [any Errorable]
-
- init(_ errors: [any Errorable]) {
- self.errors = errors
- }
-
- public init(_ e1: any Errorable, _ e2: any Errorable) {
- self.errors = [e1, e2]
- }
-}
-
-public struct ErrorWithLabel: Errorable {
- let label: String
- let error: any Errorable
-
- public init(_ label: String, _ error: any Errorable) {
- self.label = label
- self.error = error
- }
-
- public func format() -> String {
- return self.description
- }
-
- public func msg() -> String {
- return self.description
- }
-
- public func append(error: any Errorable) -> any Errorable {
- return Errors(self, error)
- }
-
- public var description: String {
- return "\(self.label): \(self.error.msg())"
- }
-}
public enum Result: Equatable {
case Ok(OKT)
diff --git a/Tests/p4rseTests/ErrorTests/Formatting.swift b/Tests/p4rseTests/ErrorTests/Formatting.swift
new file mode 100644
index 0000000..d6c5aff
--- /dev/null
+++ b/Tests/p4rseTests/ErrorTests/Formatting.swift
@@ -0,0 +1,34 @@
+// p4rse, Copyright 2026, Will Hawkins
+//
+// This file is part of p4rse.
+//
+// This file is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+
+import Common
+import Foundation
+import Macros
+import P4Runtime
+import P4Lang
+import SwiftTreeSitter
+import Testing
+import TreeSitter
+import TreeSitterP4
+
+@testable import P4Compiler
+
+@Test func test_error_with_location_formatting() async throws {
+ let e = ErrorWithLocation(sourceLocation: SourceLocation(1, 5), withError: "There was an error")
+
+ print(e.format())
+}