diff --git a/src/power_control.cpp b/src/power_control.cpp
index bc30b71..2257484 100644
--- a/src/power_control.cpp
+++ b/src/power_control.cpp
@@ -212,7 +212,7 @@
                 "ERROR_MSG", ec.message());
             return;
         }
-        },
+    },
         "xyz.openbmc_project.BeepCode", "/xyz/openbmc_project/BeepCode",
         "xyz.openbmc_project.BeepCode", "Beep", uint8_t(beepPriority));
 }
@@ -685,7 +685,7 @@
             {
                 lg2::error("failed to reset ACBoot property");
             }
-            },
+        },
             "xyz.openbmc_project.Settings",
             "/xyz/openbmc_project/control/host0/ac_boot",
             "org.freedesktop.DBus.Properties", "Set",
@@ -974,7 +974,7 @@
             return;
         }
         setProperties(properties);
-        },
+    },
         setingsService, powerRestorePolicyObject,
         "org.freedesktop.DBus.Properties", "GetAll", powerRestorePolicyIface);
 
@@ -988,7 +988,7 @@
             return;
         }
         setProperties(properties);
-        },
+    },
         setingsService, powerACBootObject, "org.freedesktop.DBus.Properties",
         "GetAll", powerACBootIface);
 #endif
@@ -1553,13 +1553,13 @@
                 {
                     lg2::error("failed to set poh counter");
                 }
-                },
+            },
                 "xyz.openbmc_project.Settings",
                 "/xyz/openbmc_project/state/chassis0",
                 "org.freedesktop.DBus.Properties", "Set",
                 "xyz.openbmc_project.State.PowerOnHours", "POHCounter",
                 std::variant<uint32_t>(*pohCounter + 1));
-            },
+        },
             "xyz.openbmc_project.Settings",
             "/xyz/openbmc_project/state/chassis0",
             "org.freedesktop.DBus.Properties", "Get",
@@ -1652,7 +1652,7 @@
                             "PRIORITY=%i", LOG_INFO, "REDFISH_MESSAGE_ID=%s",
                             "OpenBMC.0.1.DCPowerOff", NULL);
         }
-        });
+    });
 }
 
 static void sioPowerGoodWatchdogTimerStart()
@@ -2083,7 +2083,7 @@
             lg2::error("Failed to call chassis system reset: {ERR}", "ERR",
                        ec.message());
         }
-        },
+    },
         systemdBusname, systemdPath, systemdInterface, "StartUnit",
         systemTargetName, "replace");
 }
@@ -2097,7 +2097,7 @@
         {
             lg2::error("failed to set NMI source");
         }
-        },
+    },
         "xyz.openbmc_project.Settings",
         "/xyz/openbmc_project/Chassis/Control/NMISource",
         "org.freedesktop.DBus.Properties", "Set",
@@ -2173,7 +2173,7 @@
             lg2::error("Unable to read NMI source: {ERROR}", "ERROR", e);
             return;
         }
-            });
+    });
 }
 
 static void setNmiSource()
@@ -2184,7 +2184,7 @@
         {
             lg2::error("failed to set NMI source");
         }
-        },
+    },
         "xyz.openbmc_project.Settings",
         "/xyz/openbmc_project/Chassis/Control/NMISource",
         "org.freedesktop.DBus.Properties", "Set",
@@ -2475,8 +2475,8 @@
 static sdbusplus::bus::match_t
     dbusGPIOMatcher(const ConfigData& cfg, std::function<void(bool)> onMatch)
 {
-    auto pulseEventMatcherCallback =
-        [&cfg, onMatch](sdbusplus::message_t& msg) {
+    auto pulseEventMatcherCallback = [&cfg,
+                                      onMatch](sdbusplus::message_t& msg) {
         bool value = false;
         if (!getDbusMsgGPIOState(msg, cfg.lineName, value))
         {
@@ -3026,7 +3026,7 @@
         }
         resp = requested;
         return 1;
-        });
+    });
     hostIface->register_property("CurrentHostState",
                                  std::string(getHostState(powerState)));
 
@@ -3099,7 +3099,7 @@
         }
         resp = requested;
         return 1;
-        });
+    });
     chassisIface->register_property("CurrentPowerState",
                                     std::string(getChassisState(powerState)));
     chassisIface->register_property("LastStateChangeTime", getCurrentTimeMs());
@@ -3134,7 +3134,7 @@
         }
         resp = requested;
         return 1;
-        });
+    });
     chassisSysIface->register_property(
         "CurrentPowerState", std::string(getChassisState(powerState)));
     chassisSysIface->register_property("LastStateChangeTime",
@@ -3185,7 +3185,7 @@
             }
             resp = requested;
             return 1;
-            });
+        });
         chassisSlotIface->register_property(
             "CurrentPowerState", std::string(getSlotState(slotPowerState)));
         chassisSlotIface->register_property("LastStateChangeTime",
@@ -3205,8 +3205,7 @@
             "xyz.openbmc_project.Chassis.Buttons");
 
         powerButtonIface->register_property(
-            "ButtonMasked", false,
-            [](const bool requested, bool& current) {
+            "ButtonMasked", false, [](const bool requested, bool& current) {
             if (requested)
             {
                 if (powerButtonMask)
@@ -3233,7 +3232,7 @@
             // Update the mask setting
             current = requested;
             return 1;
-            });
+        });
 
         // Check power button state
         bool powerButtonPressed;
@@ -3261,8 +3260,7 @@
             "xyz.openbmc_project.Chassis.Buttons");
 
         resetButtonIface->register_property(
-            "ButtonMasked", false,
-            [](const bool requested, bool& current) {
+            "ButtonMasked", false, [](const bool requested, bool& current) {
             if (requested)
             {
                 if (resetButtonMask)
@@ -3289,7 +3287,7 @@
             // Update the mask setting
             current = requested;
             return 1;
-            });
+        });
 
         // Check reset button state
         bool resetButtonPressed;
@@ -3317,25 +3315,25 @@
 
         nmiButtonIface->register_property(
             "ButtonMasked", false, [](const bool requested, bool& current) {
-                if (nmiButtonMasked == requested)
-                {
-                    // NMI button mask is already set as requested, so no change
-                    return 1;
-                }
-                if (requested)
-                {
-                    lg2::info("NMI Button Masked.");
-                    nmiButtonMasked = true;
-                }
-                else
-                {
-                    lg2::info("NMI Button Un-masked.");
-                    nmiButtonMasked = false;
-                }
-                // Update the mask setting
-                current = nmiButtonMasked;
+            if (nmiButtonMasked == requested)
+            {
+                // NMI button mask is already set as requested, so no change
                 return 1;
-            });
+            }
+            if (requested)
+            {
+                lg2::info("NMI Button Masked.");
+                nmiButtonMasked = true;
+            }
+            else
+            {
+                lg2::info("NMI Button Un-masked.");
+                nmiButtonMasked = false;
+            }
+            // Update the mask setting
+            current = nmiButtonMasked;
+            return 1;
+        });
 
         // Check NMI button state
         bool nmiButtonPressed;
@@ -3454,7 +3452,7 @@
                   requested);
         resp = requested;
         return 1;
-        });
+    });
 
     restartCauseIface->initialize();
 
