Created
August 31, 2023 15:25
-
-
Save atierian/4fe4f49b82ffae37d7f592579843e5c1 to your computer and use it in GitHub Desktop.
utsname / DeviceInfo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@dynamicMemberLookup | |
public struct Device { | |
public let info: Info | |
public subscript<T>(dynamicMember keyPath: KeyPath<Info, T>) -> T { | |
info[keyPath: keyPath] | |
} | |
} | |
extension Device: Equatable { | |
public static func == (lhs: Device, rhs: Device) -> Bool { | |
return lhs.info == rhs.info | |
} | |
} | |
extension Device: Hashable {} | |
extension Device { | |
public static var current: Device { | |
Device(info: info) | |
} | |
public struct Info: Equatable, Hashable { | |
public let sysname: String | |
public let nodename: String | |
public let release: String | |
public let version: String | |
public let machine: String | |
} | |
// https://opensource.apple.com/source/xnu/xnu-201/bsd/sys/utsname.h.auto.html | |
static let info: Info = { | |
func value( | |
from p: UnsafeMutablePointer<utsname>, | |
_ keyPath: KeyPath<utsname, utsname_prop> | |
) -> String { | |
var property = p.pointee[keyPath: keyPath] | |
return withUnsafePointer(to: &property) { | |
$0.withMemoryRebound( | |
to: CChar.self, | |
capacity: 1, | |
String.init(cString:) | |
) | |
} | |
} | |
let sysInfo = UnsafeMutablePointer<utsname> | |
.allocate(capacity: 1) | |
sysInfo.initialize(to: utsname()) | |
uname(sysInfo) | |
return Info( | |
sysname: value(from: sysInfo, \.sysname), | |
nodename: value(from: sysInfo, \.nodename), | |
release: value(from: sysInfo, \.release), | |
version: value(from: sysInfo, \.version), | |
machine: value(from: sysInfo, \.machine) | |
) | |
}() | |
} | |
extension Device.Info: CustomDebugStringConvertible { | |
public var debugDescription: String { | |
""" | |
Info( | |
sysname: "\(sysname)", | |
nodename: "\(nodename)", | |
release: "\(release)", | |
machine: "\(machine)", | |
version: "\(version)" | |
) | |
""" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
typealias utsname_prop = (CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar, CChar) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment