Review comments
diff --git a/src/buttons.rs b/src/buttons.rs
index 5787f83..aac5cb2 100644
--- a/src/buttons.rs
+++ b/src/buttons.rs
@@ -1,6 +1,7 @@
 use crate::callback::CallbackSubscription;
 use crate::callback::Consumer;
 use crate::result::OtherError;
+use crate::result::OutOfRangeError;
 use crate::result::TockResult;
 use crate::syscalls;
 use core::marker::PhantomData;
@@ -41,14 +42,15 @@
         self.num_buttons
     }
 
-    pub fn get(&self, button_num: usize) -> Option<Button> {
+    /// Returns the button at 0-based index `button_num`
+    pub fn get(&self, button_num: usize) -> Result<Button, OutOfRangeError> {
         if button_num < self.num_buttons {
-            Some(Button {
+            Ok(Button {
                 button_num,
                 lifetime: PhantomData,
             })
         } else {
-            None
+            Err(OutOfRangeError)
         }
     }
 
diff --git a/src/callback.rs b/src/callback.rs
index 95d4e04..053806f 100644
--- a/src/callback.rs
+++ b/src/callback.rs
@@ -46,7 +46,7 @@
 }
 
 impl<'a> CallbackSubscription<'a> {
-    pub fn new(driver_number: usize, subscribe_number: usize) -> CallbackSubscription<'a> {
+    pub(crate) fn new(driver_number: usize, subscribe_number: usize) -> CallbackSubscription<'a> {
         CallbackSubscription {
             driver_number,
             subscribe_number,
diff --git a/src/leds.rs b/src/leds.rs
index 8fd9ce6..e0f420c 100644
--- a/src/leds.rs
+++ b/src/leds.rs
@@ -1,3 +1,4 @@
+use crate::result::OutOfRangeError;
 use crate::result::TockResult;
 use crate::syscalls::command;
 use core::marker::PhantomData;
@@ -42,14 +43,15 @@
         }
     }
 
-    pub fn get(&self, led_num: usize) -> Option<Led> {
+    /// Returns the led at 0-based index `led_num`
+    pub fn get(&self, led_num: usize) -> Result<Led, OutOfRangeError> {
         if led_num < self.num_leds {
-            Some(Led {
+            Ok(Led {
                 led_num,
                 lifetime: PhantomData,
             })
         } else {
-            None
+            Err(OutOfRangeError)
         }
     }
 }
diff --git a/src/result.rs b/src/result.rs
index 925dcdc..9dc4f16 100644
--- a/src/result.rs
+++ b/src/result.rs
@@ -72,6 +72,7 @@
     TimerDriverDurationOutOfRange,
     TimerDriverErroneousClockFrequency,
     DriverAlreadyTaken,
+    OutOfRangeError,
 }
 
 impl From<OtherError> for TockError {
@@ -80,6 +81,14 @@
     }
 }
 
+pub struct OutOfRangeError;
+
+impl From<OutOfRangeError> for TockError {
+    fn from(_other: OutOfRangeError) -> Self {
+        TockError::Other(OtherError::OutOfRangeError)
+    }
+}
+
 pub const SUCCESS: isize = 0;
 pub const FAIL: isize = -1;
 pub const EBUSY: isize = -2;