i2c: Change error code to option<I2cError> to prevent usage on success
diff --git a/services/i2c/api/src/protocol.rs b/services/i2c/api/src/protocol.rs
index 1cfdbb3..c699692 100644
--- a/services/i2c/api/src/protocol.rs
+++ b/services/i2c/api/src/protocol.rs
@@ -312,8 +312,12 @@
         self.status == 0
     }
 
-    pub fn error_code(&self) -> I2cError {
-        I2cError::from(self.status)
+    pub fn error_code(&self) -> Option<I2cError> {
+        if self.is_success() {
+            None
+        } else {
+            Some(I2cError::from(self.status))
+        }
     }
 
     pub fn payload_length(&self) -> usize {
@@ -361,7 +365,7 @@
         let err = I2cResponseHeader::error(I2cError::AddressNack);
         let err = I2cResponseHeader::ref_from_bytes(err.as_bytes()).unwrap();
         assert!(!err.is_success());
-        assert_eq!(err.error_code(), I2cError::AddressNack);
+        assert_eq!(err.error_code(), Some(I2cError::AddressNack));
         assert_eq!(err.payload_length(), 0);
     }
 
@@ -430,6 +434,6 @@
         let nd = I2cResponseHeader::error(I2cError::NoData);
         let nd = I2cResponseHeader::ref_from_bytes(nd.as_bytes()).unwrap();
         assert!(!nd.is_success());
-        assert_eq!(nd.error_code(), I2cError::NoData);
+        assert_eq!(nd.error_code(), Some(I2cError::NoData));
     }
 }
diff --git a/services/i2c/client/src/lib.rs b/services/i2c/client/src/lib.rs
index 39532a5..9b4cd2e 100644
--- a/services/i2c/client/src/lib.rs
+++ b/services/i2c/client/src/lib.rs
@@ -137,7 +137,7 @@
             return Err(ClientError::InvalidResponse);
         };
         if !rhdr.is_success() {
-            return Err(ClientError::ServerError(rhdr.error_code()));
+            return Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError)));
         }
         let n = rhdr.payload_length();
         if resp_len < I2cResponseHeader::SIZE + n {
@@ -236,7 +236,7 @@
             return Err(ClientError::InvalidResponse);
         };
         if !rhdr.is_success() {
-            return Err(ClientError::ServerError(rhdr.error_code()));
+            return Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError)));
         }
 
         let payload_len = rhdr.payload_length();
@@ -308,7 +308,7 @@
         if rhdr.is_success() {
             Ok(())
         } else {
-            Err(ClientError::ServerError(rhdr.error_code()))
+            Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError)))
         }
     }
 
@@ -382,7 +382,7 @@
             return Err(ClientError::InvalidResponse);
         };
         if !rhdr.is_success() {
-            return Err(ClientError::ServerError(rhdr.error_code()));
+            return Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError)));
         }
 
         let payload_len = rhdr.payload_length();
diff --git a/services/i2c/server-runtime/src/lib.rs b/services/i2c/server-runtime/src/lib.rs
index a8ced56..3052cae 100644
--- a/services/i2c/server-runtime/src/lib.rs
+++ b/services/i2c/server-runtime/src/lib.rs
@@ -211,11 +211,13 @@
                     .ok()
                     {
                         use i2c_api::I2cError;
-                        match rhdr.error_code() {
-                            I2cError::Bus | I2cError::ArbitrationLoss | I2cError::Timeout => {
-                                let _ = bus.driver.recover_bus();
+                        if let Some(code) = rhdr.error_code() {
+                            match code {
+                                I2cError::Bus | I2cError::ArbitrationLoss | I2cError::Timeout => {
+                                    let _ = bus.driver.recover_bus();
+                                }
+                                _ => {}
                             }
-                            _ => {}
                         }
                     }
                 }
diff --git a/services/i2c/server/src/lib.rs b/services/i2c/server/src/lib.rs
index b354a23..45e1ace 100644
--- a/services/i2c/server/src/lib.rs
+++ b/services/i2c/server/src/lib.rs
@@ -293,7 +293,7 @@
             zerocopy::Ref::<_, I2cResponseHeader>::from_bytes(&resp[..I2cResponseHeader::SIZE])
                 .unwrap();
         assert!(!rh.is_success());
-        assert_eq!(rh.error_code(), I2cError::AddressNack);
+        assert_eq!(rh.error_code(), Some(I2cError::AddressNack));
     }
 
     #[test]
@@ -305,6 +305,6 @@
         let rh =
             zerocopy::Ref::<_, I2cResponseHeader>::from_bytes(&resp[..I2cResponseHeader::SIZE])
                 .unwrap();
-        assert_eq!(rh.error_code(), I2cError::InvalidOperation);
+        assert_eq!(rh.error_code(), Some(I2cError::InvalidOperation));
     }
 }
diff --git a/services/i2c/server/src/slave.rs b/services/i2c/server/src/slave.rs
index d306f26..ea92458 100644
--- a/services/i2c/server/src/slave.rs
+++ b/services/i2c/server/src/slave.rs
@@ -134,7 +134,7 @@
         let n = dispatch_slave(&mut s, &req(I2cOp::SlaveReceive, 0), &mut r);
         let h = zerocopy::Ref::<_, I2cResponseHeader>::from_bytes(&r[..I2cResponseHeader::SIZE])
             .unwrap();
-        assert_eq!(h.error_code(), I2cError::InvalidOperation);
+        assert_eq!(h.error_code(), Some(I2cError::InvalidOperation));
         let _ = n;
 
         // Too-short request: rejected, no panic.