diff --git a/policy_table.hpp b/policy_table.hpp
index 07226e6..9272daa 100644
--- a/policy_table.hpp
+++ b/policy_table.hpp
@@ -12,7 +12,6 @@
 namespace policy
 {
 
-
 /**
  *  The details of a policy table entry:
  *  - search modifier
@@ -43,98 +42,94 @@
  */
 class Table
 {
-    public:
+  public:
+    Table() = delete;
+    ~Table() = default;
+    Table(const Table&) = default;
+    Table& operator=(const Table&) = default;
+    Table(Table&&) = default;
+    Table& operator=(Table&&) = default;
 
-        Table() = delete;
-        ~Table() = default;
-        Table(const Table&) = default;
-        Table& operator=(const Table&) = default;
-        Table(Table&&) = default;
-        Table& operator=(Table&&) = default;
+    /**
+     * Constructor
+     *
+     * @param[in] jsonFile - the path to the policy JSON.
+     */
+    explicit Table(const std::string& jsonFile);
 
-        /**
-         * Constructor
-         *
-         * @param[in] jsonFile - the path to the policy JSON.
-         */
-        explicit Table(const std::string& jsonFile);
+    /**
+     * Says if the JSON has been loaded successfully.
+     *
+     * @return bool
+     */
+    inline bool isLoaded() const
+    {
+        return loaded;
+    }
 
-        /**
-         * Says if the JSON has been loaded successfully.
-         *
-         * @return bool
-         */
-        inline bool isLoaded() const
-        {
-            return loaded;
-        }
+    /**
+     * Finds an entry in the policy table based on the
+     * error and the search modifier.
+     *
+     * @param[in] error - the error, like xyz.openbmc_project.Error.X
+     * @param[in] modifier - the search modifier, used to find the entry
+     *                   when multiple ones share the same error
+     *
+     * @return optional<DetailsReference> - the details entry
+     */
+    optional_ns::optional<DetailsReference>
+        find(const std::string& error, const std::string& modifier) const;
 
-        /**
-         * Finds an entry in the policy table based on the
-         * error and the search modifier.
-         *
-         * @param[in] error - the error, like xyz.openbmc_project.Error.X
-         * @param[in] modifier - the search modifier, used to find the entry
-         *                   when multiple ones share the same error
-         *
-         * @return optional<DetailsReference> - the details entry
-         */
-        optional_ns::optional<DetailsReference> find(
-                const std::string& error,
-                const std::string& modifier) const;
+    /**
+     * The default event ID to use when a match in the table
+     * wasn't found.
+     *
+     * @return std::string
+     */
+    inline std::string defaultEID() const
+    {
+        return defaultPolicyEID;
+    }
 
-        /**
-         * The default event ID to use when a match in the table
-         * wasn't found.
-         *
-         * @return std::string
-         */
-        inline std::string defaultEID() const
-        {
-            return defaultPolicyEID;
-        }
+    /**
+     * The default error message to use when a match in the table
+     * wasn't found.
+     *
+     * @return std::string
+     */
+    inline std::string defaultMsg() const
+    {
+        return defaultPolicyMessage;
+    }
 
-        /**
-         * The default error message to use when a match in the table
-         * wasn't found.
-         *
-         * @return std::string
-         */
-        inline std::string defaultMsg() const
-        {
-            return defaultPolicyMessage;
-        }
+  private:
+    /**
+     * The default event ID
+     */
+    const std::string defaultPolicyEID{DEFAULT_POLICY_EID};
 
-    private:
-        /**
-         * The default event ID
-         */
-        const std::string defaultPolicyEID{DEFAULT_POLICY_EID};
+    /**
+     * The default event message
+     */
+    const std::string defaultPolicyMessage{DEFAULT_POLICY_MSG};
 
-        /**
-         * The default event message
-         */
-        const std::string defaultPolicyMessage{DEFAULT_POLICY_MSG};
+    /**
+     * Loads the JSON data into the PolicyMap map
+     *
+     * @param[in] jsonFile - the path to the .json file
+     */
+    void load(const std::string& jsonFile);
 
-        /**
-         * Loads the JSON data into the PolicyMap map
-         *
-         * @param[in] jsonFile - the path to the .json file
-         */
-        void load(const std::string& jsonFile);
+    /**
+     * Reflects if the JSON was successfully loaded or not.
+     */
+    bool loaded = false;
 
-        /**
-         * Reflects if the JSON was successfully loaded or not.
-         */
-        bool loaded = false;
-
-        /**
-         * The policy table
-         */
-        PolicyMap policies;
+    /**
+     * The policy table
+     */
+    PolicyMap policies;
 };
-
-
 }
 }
 }
