2024-02-15 17:14:06 -08:00

143 lines
6.5 KiB
Swift

import Foundation
import CWinRT
import WinSDK
// Handwritten implementation for PropertyValue which *doesn't* try to do the IInspectable <-> Any mapping.
// This class is used by the AnyWrapper to create IInspectable instances from this subset of known Any values.
internal final class PropertyValue {
private static let _IPropertyValueStatics: IPropertyValueStatics = try! RoGetActivationFactory(HString("Windows.Foundation.PropertyValue"))
public static func createUInt8(_ value: UInt8) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateUInt8Impl(value)
return .init(propertyValue!)
}
public static func createInt16(_ value: Int16) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateInt16Impl(value)
return .init(propertyValue!)
}
public static func createUInt16(_ value: UInt16) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateUInt16Impl(value)
return .init(propertyValue!)
}
public static func createInt32(_ value: Int32) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateInt32Impl(value)
return .init(propertyValue!)
}
public static func createUInt32(_ value: UInt32) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateUInt32Impl(value)
return .init(propertyValue!)
}
public static func createInt64(_ value: Int64) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateInt64Impl(value)
return .init(propertyValue!)
}
public static func createUInt64(_ value: UInt64) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateUInt64Impl(value)
return .init(propertyValue!)
}
public static func createSingle(_ value: Float) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateSingleImpl(value)
return .init(propertyValue!)
}
public static func createDouble(_ value: Double) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateDoubleImpl(value)
return .init(propertyValue!)
}
public static func createBoolean(_ value: Bool) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateBooleanImpl(.init(from: value))
return .init(propertyValue!)
}
public static func createString(_ value: String) -> WindowsFoundation.IInspectable {
let _value = try! HString(value)
let propertyValue = try! _IPropertyValueStatics.CreateStringImpl(_value.get())
return .init(propertyValue!)
}
public static func createGuid(_ value: GUID) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateGuidImpl(value)
return .init(propertyValue!)
}
public static func createDateTime(_ value: DateTime) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateDateTimeImpl(.from(swift: value))
return .init(propertyValue!)
}
public static func createTimeSpan(_ value: TimeSpan) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateTimeSpanImpl(.from(swift: value))
return .init(propertyValue!)
}
public static func createPoint(_ value: Point) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreatePointImpl(.from(swift: value))
return .init(propertyValue!)
}
public static func createSize(_ value: Size) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateSizeImpl(.from(swift: value))
return .init(propertyValue!)
}
public static func createRect(_ value: Rect) -> WindowsFoundation.IInspectable {
let propertyValue = try! _IPropertyValueStatics.CreateRectImpl(.from(swift: value))
return .init(propertyValue!)
}
}
extension PropertyValue
{
static func createInt(_ value: Int) -> WindowsFoundation.IInspectable {
#if arch(x86_64) || arch(arm64)
return PropertyValue.createInt64(Int64(value))
#elseif arch(i386) || arch(arm)
return PropertyValue.createInt32(Int32(value))
#else
fatalError("unknown process architecture size")
#endif
}
static func createUInt(_ value: UInt) -> WindowsFoundation.IInspectable {
#if arch(x86_64) || arch(arm64)
return PropertyValue.createUInt64(UInt64(value))
#elseif arch(i386) || arch(arm)
return PropertyValue.createUInt32(UInt32(value))
#else
fatalError("unknown process architecture size")
#endif
}
static func createFrom(_ any: Any) -> WindowsFoundation.IInspectable? {
switch any {
case let value as String: return PropertyValue.createString(value)
case let value as Int: return PropertyValue.createInt(value)
case let value as Int16: return PropertyValue.createInt16(value)
case let value as Int32: return PropertyValue.createInt32(value)
case let value as Int64: return PropertyValue.createInt64(value)
case let value as UInt: return PropertyValue.createUInt(value)
case let value as UInt8: return PropertyValue.createUInt8(value)
case let value as UInt32: return PropertyValue.createUInt32(value)
case let value as UInt64: return PropertyValue.createUInt64(value)
case let value as Float: return PropertyValue.createSingle(value)
case let value as Double: return PropertyValue.createDouble(value)
case let value as Bool: return PropertyValue.createBoolean(value)
case let value as GUID: return PropertyValue.createGuid(value)
case let value as DateTime: return PropertyValue.createDateTime(value)
case let value as TimeSpan: return PropertyValue.createTimeSpan(value)
case let value as Point: return PropertyValue.createPoint(value)
case let value as Size: return PropertyValue.createSize(value)
case let value as Rect: return PropertyValue.createRect(value)
default: return nil
}
}
}