Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Examples/HelloWorldServer/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Examples/StarWars/Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ let package = Package(
),
],
dependencies: [
.package(url: "https://github.com/GraphQLSwift/GraphQL.git", from: "4.1.0"),
.package(url: "https://github.com/GraphQLSwift/GraphQL.git", from: "4.3.0"),
.package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.3.0"),
.package(url: "https://github.com/swiftlang/swift-syntax.git", "600.0.1"..<"603.0.0"),
.package(url: "https://github.com/jpsim/Yams.git", "4.0.0"..<"7.0.0"),
Expand Down Expand Up @@ -61,7 +61,7 @@ let package = Package(
.testTarget(
name: "GraphQLGeneratorCoreTests",
dependencies: [
"GraphQLGeneratorCore"
"GraphQLGeneratorCore",
]
),
.testTarget(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,22 @@ package struct BuildGraphQLSchemaGenerator {
!$0.name.hasPrefix("__")
}

// Apply serialize and parse methods for scalar types
let scalarTypes = types.compactMap {
$0 as? GraphQLScalarType
}
for scalar in scalarTypes {
// Avoid default scalars
guard scalar.astNode != nil else {
continue
}
output += """


\(generateScalarType(for: scalar).indent(1))
"""
}

// Generate type definitions for all object types
let interfaceTypes = types.compactMap {
$0 as? GraphQLInterfaceType
Expand Down Expand Up @@ -94,6 +110,20 @@ package struct BuildGraphQLSchemaGenerator {
return output
}

func generateScalarType(for type: GraphQLScalarType) -> String {
let swiftType = mapScalarType(type, nameGenerator: nameGenerator)
return """


if let scalar = schema.typeMap["\(type.name)"] as? GraphQLScalarType {
scalar.serialize = { try \(swiftType).serialize(any: $0) }
scalar.parseValue = { try \(swiftType).parseValue(map: $0) }
scalar.parseLiteral = { try \(swiftType).parseLiteral(value: $0) }
}

"""
}

func generateInterfaceType(for type: GraphQLInterfaceType) throws -> String {
let typeName = nameGenerator.swiftMemberName(for: type.name)
let variableName = "\(typeName)Fields"
Expand Down
3 changes: 1 addition & 2 deletions Sources/GraphQLGeneratorCore/Utilities/swiftTypeName.swift
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,10 @@ func swiftTypeDeclaration(
throw GeneratorError.unsupportedType("Unknown type: \(type)")
}

/// Map GraphQL leaf types to Swift types.
/// Map GraphQL scalar types to Swift types.
///
/// - Parameters:
/// - graphQLType: The GraphQL Type to generate a reference to
/// - includeNamespace: Whether to include the `GraphQLGenerated` type namespace in the result
/// - nameGenerator: The name generator
func mapScalarType(_ type: GraphQLScalarType, nameGenerator: SafeNameGenerator) -> String {
switch type.name {
Expand Down
19 changes: 19 additions & 0 deletions Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,25 @@ struct SchemaGeneratorTests {
)
}

@Test func generateScalarType() throws {
let scalar = try GraphQLScalarType(name: "EmailAddress")

let result = generator.generateScalarType(for: scalar)

let expected = """


if let scalar = schema.typeMap["EmailAddress"] as? GraphQLScalarType {
scalar.serialize = { try GraphQLScalars.EmailAddress.serialize(any: $0) }
scalar.parseValue = { try GraphQLScalars.EmailAddress.parseValue(map: $0) }
scalar.parseLiteral = { try GraphQLScalars.EmailAddress.parseLiteral(value: $0) }
}

"""

#expect(result == expected)
}

@Test func generateInterfaceType() throws {
let interfaceType = try GraphQLInterfaceType(
name: "Node",
Expand Down
Loading