aboutsummaryrefslogtreecommitdiff
path: root/Sources/SleepInhibitor.swift
diff options
context:
space:
mode:
authorGrégoire Duchêne <gduchene@awhk.org>2025-11-02 19:27:32 +0000
committerGrégoire Duchêne <gduchene@awhk.org>2025-11-02 19:29:30 +0000
commitc7d428455c42e8039a6aedeb032b0685d7a47ebb (patch)
treef2b2b176fea7d019d578a873fc23af70f54f829a /Sources/SleepInhibitor.swift
parentaee698176a33879e7cb5b23e89157104c4b05c19 (diff)
First version of the CLI
It’s pretty basic, and it only works on macOS for now.
Diffstat (limited to 'Sources/SleepInhibitor.swift')
-rw-r--r--Sources/SleepInhibitor.swift48
1 files changed, 48 insertions, 0 deletions
diff --git a/Sources/SleepInhibitor.swift b/Sources/SleepInhibitor.swift
new file mode 100644
index 0000000..0cfe895
--- /dev/null
+++ b/Sources/SleepInhibitor.swift
@@ -0,0 +1,48 @@
+import IOKit.pwr_mgt
+
+actor SleepInhibitor {
+ var assertionID = IOPMAssertionID?.none
+ var isInhibitingSleep: Bool { self.assertionID != nil }
+
+ func create(name: String, details: String) throws {
+ guard self.assertionID == nil else {
+ return
+ }
+
+ var assertionID = IOPMAssertionID(0)
+ let ioReturn = IOPMAssertionCreateWithDescription(
+ kIOPMAssertionTypePreventUserIdleSystemSleep as CFString,
+ name as CFString,
+ details as CFString,
+ nil, nil, 0, nil,
+ &assertionID
+ )
+ guard ioReturn == kIOReturnSuccess else {
+ throw SleepInhibitorError(ioReturn: ioReturn)
+ }
+ self.assertionID = assertionID
+ }
+
+ func release() throws {
+ guard let assertionID = self.assertionID else {
+ return
+ }
+
+ let ioReturn = IOPMAssertionRelease(assertionID)
+ guard ioReturn == kIOReturnSuccess else {
+ throw SleepInhibitorError(ioReturn: ioReturn)
+ }
+ self.assertionID = nil
+ }
+}
+
+struct SleepInhibitorError: CustomStringConvertible, Error {
+ let ioReturn: IOReturn
+
+ var description: String {
+ guard let cString = mach_error_string(self.ioReturn) else {
+ return self.ioReturn.description
+ }
+ return String(cString: cString)
+ }
+}