virtio: video: use thiserror in the command module

This reduces the code a little bit.

BUG=b:161774071
TEST=arc.VideoDecodeAccel.h264_vm passes on hatch
TEST=arc.VideoEncodeAccel.h264_360p_i420_vm passes on hatch

Change-Id: I547d0d26a1a69bc50af4df9b6bb2b4016ff760c6
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2983089
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Alexandre Courbot <acourbot@chromium.org>
Auto-Submit: Alexandre Courbot <acourbot@chromium.org>
Reviewed-by: Keiichi Watanabe <keiichiw@chromium.org>
Reviewed-by: David Staessens <dstaessens@chromium.org>
diff --git a/devices/src/virtio/video/command.rs b/devices/src/virtio/video/command.rs
index e32a935..3e71850 100644
--- a/devices/src/virtio/video/command.rs
+++ b/devices/src/virtio/video/command.rs
@@ -5,8 +5,8 @@
 //! Data structures for commands of virtio video devices.
 
 use std::convert::{TryFrom, TryInto};
-use std::fmt;
 use std::io;
+use thiserror::Error as ThisError;
 
 use base::error;
 use data_model::Le32;
@@ -19,38 +19,22 @@
 use crate::virtio::Reader;
 
 /// An error indicating a failure while reading a request from the guest.
-#[derive(Debug)]
+#[derive(Debug, ThisError)]
 pub enum ReadCmdError {
-    /// Failure while reading an object.
-    IoError(io::Error),
-    /// Invalid arguement is passed,
+    /// Failed to read an object.
+    #[error("failed to read object: {0}")]
+    IoError(#[from] io::Error),
+    /// Invalid argument is passed.
+    #[error("invalid argument passed to command")]
     InvalidArgument,
     /// The type of the command was invalid.
+    #[error("invalid command type: {0}")]
     InvalidCmdType(u32),
     /// The type of the requested control was unsupported.
+    #[error("unsupported control type: {0}")]
     UnsupportedCtrlType(u32),
 }
 
-impl fmt::Display for ReadCmdError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use self::ReadCmdError::*;
-        match self {
-            IoError(e) => write!(f, "failed to read an object: {}", e),
-            InvalidArgument => write!(f, "invalid arguement is passed in command"),
-            InvalidCmdType(t) => write!(f, "invalid command type: {}", t),
-            UnsupportedCtrlType(t) => write!(f, "unsupported control type: {}", t),
-        }
-    }
-}
-
-impl std::error::Error for ReadCmdError {}
-
-impl From<io::Error> for ReadCmdError {
-    fn from(e: io::Error) -> ReadCmdError {
-        ReadCmdError::IoError(e)
-    }
-}
-
 #[derive(PartialEq, Eq, PartialOrd, Ord, N, Clone, Copy, Debug)]
 #[repr(u32)]
 pub enum QueueType {