diff --git a/sol/console_buffer.hpp b/sol/console_buffer.hpp
index fe4bfe8..51383cf 100644
--- a/sol/console_buffer.hpp
+++ b/sol/console_buffer.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <algorithm>
+#include <cstdint>
 #include <deque>
 #include <vector>
 
@@ -18,56 +19,55 @@
  */
 class ConsoleData
 {
-    public:
-        /** @brief Get the current size of the host console buffer.
-         *
-         *  @return size of the host console buffer.
-         */
-        auto size() const noexcept
-        {
-            return data.size();
-        }
+  public:
+    /** @brief Get the current size of the host console buffer.
+     *
+     *  @return size of the host console buffer.
+     */
+    auto size() const noexcept
+    {
+        return data.size();
+    }
 
-        /** @brief Read host console data.
-         *
-         *  This API would return the iterator to the read data from the
-         *  console data buffer.
-         *
-         *  @return iterator to read data from the buffer
-         */
-        auto read() const
-        {
-            return data.cbegin();
-        }
+    /** @brief Read host console data.
+     *
+     *  This API would return the iterator to the read data from the
+     *  console data buffer.
+     *
+     *  @return iterator to read data from the buffer
+     */
+    auto read() const
+    {
+        return data.cbegin();
+    }
 
-        /** @brief Write host console data.
-         *
-         *  This API would append the input data to the host console buffer.
-         *
-         *  @param[in] input - data to be written to the console buffer.
-         */
-        void write(const std::vector<uint8_t>& input)
-        {
-            data.insert(data.end(), input.begin(), input.end());
-        }
+    /** @brief Write host console data.
+     *
+     *  This API would append the input data to the host console buffer.
+     *
+     *  @param[in] input - data to be written to the console buffer.
+     */
+    void write(const std::vector<uint8_t>& input)
+    {
+        data.insert(data.end(), input.begin(), input.end());
+    }
 
-        /** @brief Erase console buffer.
-         *
-         *  @param[in] size - the number of bytes to be erased from the console
-         *                    buffer.
-         *
-         *  @note If the console buffer has less bytes that that was requested,
-         *        then the available size is erased.
-         */
-        void erase(size_t size) noexcept
-        {
-            data.erase(data.begin(), data.begin() + std::min(data.size(),
-                       size));
-        }
+    /** @brief Erase console buffer.
+     *
+     *  @param[in] size - the number of bytes to be erased from the console
+     *                    buffer.
+     *
+     *  @note If the console buffer has less bytes that that was requested,
+     *        then the available size is erased.
+     */
+    void erase(size_t size) noexcept
+    {
+        data.erase(data.begin(), data.begin() + std::min(data.size(), size));
+    }
 
-    private:
-        /** @brief Storage for host console data. */
-        ConsoleBuffer data;
+  private:
+    /** @brief Storage for host console data. */
+    ConsoleBuffer data;
 };
 
 } // namespace sol
