Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ extension Optional: ConvertibleToModelOutput where Wrapped: ConvertibleToModelOu
}
}

@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *)
extension Optional: ConvertibleFromModelOutput where Wrapped: ConvertibleFromModelOutput {
public init(_ content: ModelOutput) throws {
if case .null = content.kind {
self = nil
return
}
self = try Wrapped(content)
}
}

@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *)
extension Bool: FirebaseGenerable {
public static var jsonSchema: JSONSchema {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,10 @@ public struct ModelOutput: Sendable, CustomDebugStringConvertible, FirebaseGener
return nil
}

if case .null = value.kind {
return nil
}

return try Value(value)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@ final class FirebaseAILogicMacrosTests: XCTestCase {
@FirebaseGenerable
struct Person {
let firstName: String
let middleName: String?
let lastName: String
let age: Int
}
""",
expandedSource: """
struct Person {
let firstName: String
let middleName: String?
let lastName: String
let age: Int

Expand All @@ -51,6 +53,7 @@ final class FirebaseAILogicMacrosTests: XCTestCase {
type: Self.self,
properties: [
FirebaseAILogic.JSONSchema.Property(name: "firstName", type: String.self),
FirebaseAILogic.JSONSchema.Property(name: "middleName", type: String?.self),
FirebaseAILogic.JSONSchema.Property(name: "lastName", type: String.self),
FirebaseAILogic.JSONSchema.Property(name: "age", type: Int.self)
]
Expand All @@ -60,6 +63,7 @@ final class FirebaseAILogicMacrosTests: XCTestCase {
nonisolated var modelOutput: FirebaseAILogic.ModelOutput {
var properties = [(name: String, value: any ConvertibleToModelOutput)]()
addProperty(name: "firstName", value: self.firstName)
addProperty(name: "middleName", value: self.middleName)
addProperty(name: "lastName", value: self.lastName)
addProperty(name: "age", value: self.age)
return ModelOutput(
Expand All @@ -81,11 +85,13 @@ final class FirebaseAILogicMacrosTests: XCTestCase {
nonisolated struct Partial: Identifiable, FirebaseAILogic.ConvertibleFromModelOutput {
var id: FirebaseAILogic.ResponseID
var firstName: String.Partial?
var middleName: String?.Partial?
var lastName: String.Partial?
var age: Int.Partial?
nonisolated init(_ content: FirebaseAILogic.ModelOutput) throws {
self.id = content.id ?? FirebaseAILogic.ResponseID()
self.firstName = try content.value(forProperty: "firstName")
self.middleName = try content.value(forProperty: "middleName")
self.lastName = try content.value(forProperty: "lastName")
self.age = try content.value(forProperty: "age")
}
Expand All @@ -96,6 +102,7 @@ final class FirebaseAILogicMacrosTests: XCTestCase {
extension Person: FirebaseAILogic.FirebaseGenerable {
nonisolated init(_ content: FirebaseAILogic.ModelOutput) throws {
self.firstName = try content.value(forProperty: "firstName")
self.middleName = try content.value(forProperty: "middleName")
self.lastName = try content.value(forProperty: "lastName")
self.age = try content.value(forProperty: "age")
}
Expand Down
Loading
Loading