Merge #223

223: Add the ErrorCode type to libtock_platform. r=hudson-ayers a=jrvanwhy

ErrorCode is a wrapper around an isize that is useful for type safety. Its intended use case is to wrap a non-successful ReturnCode returned from a system call.

Co-authored-by: Johnathan Van Why <jrvanwhy@google.com>
diff --git a/core/platform/src/error_code.rs b/core/platform/src/error_code.rs
new file mode 100644
index 0000000..ca1c657
--- /dev/null
+++ b/core/platform/src/error_code.rs
@@ -0,0 +1,25 @@
+/// An error code returned by the kernel. Tock's system calls return errors as a
+/// negative `isize`. This wraps the isize, and is useful for adding type safety
+/// to APIs.
+
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub struct ErrorCode {
+    // Note: value *should* always be negative, but we do not *verify* that so
+    // unsafe code cannot rely on value being negative.
+    value: isize,
+}
+
+impl ErrorCode {
+    // Converts the given isize into an ErrorCode. Note that the isize should be
+    // negative, although that is not verified to reduce code size. We don't
+    // implement From because not every isize converts sensibly to an ErrorCode.
+    pub fn new(value: isize) -> ErrorCode {
+        ErrorCode { value }
+    }
+}
+
+impl Into<isize> for ErrorCode {
+    fn into(self) -> isize {
+        self.value
+    }
+}
diff --git a/core/platform/src/lib.rs b/core/platform/src/lib.rs
index 64d520b..24c46f5 100644
--- a/core/platform/src/lib.rs
+++ b/core/platform/src/lib.rs
@@ -7,3 +7,7 @@
 //   2. The PlatformApi trait and Platform implementation.
 //   3. A system call trait so that Platform works in both real Tock apps and
 //      unit test environments.
+
+mod error_code;
+
+pub use error_code::ErrorCode;