Skip to content

Commit 11fcf8c

Browse files
committed
Add isPublic option for generated types
1 parent 26ca920 commit 11fcf8c

7 files changed

Lines changed: 581 additions & 41 deletions

File tree

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ queries: Sources/Queries
181181
# The path of the file to generate the Swift code into
182182
# ⚠️ This is not needed and ignored if using the plugin
183183
output: Sources/Queries.swift
184+
# If true all generated declarations are marked as `public`
185+
isPublic: true
184186
```
185187
186188
Optionally, this can be generated automatically via the cli by running the run the following command:
@@ -447,4 +449,4 @@ Below are some idea that I would love input on!
447449
Contributions are welcome and encouraged! Feel free to make a PR or open an issue. If the change is large please open an issue first to make sure the change is desired.
448450

449451
## License
450-
PureSQL is available under the MIT license. See the LICENSE file for more info.
452+
PureSQL is available under the MIT license. See the LICENSE file for more info.

Sources/Compiler/Config.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public struct Config: Codable {
1515
public let databaseName: String?
1616
public let additionalImports: [String]?
1717
public let tableNamePattern: String?
18+
public let isPublic: Bool?
1819

1920
enum ConfigError: Error, CustomStringConvertible {
2021
case invalidURL(String)

Sources/Compiler/Gen/Language.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,17 +372,26 @@ public struct GenerationOptions: Sendable {
372372
public var imports: [String]
373373
public var createDirectoryIfNeeded: Bool
374374
public var tableNamePattern: String?
375-
375+
/// Whether the generated declarations should be marked `public`.
376+
public var isPublic: Bool
377+
376378
public init(
377379
databaseName: String,
378380
imports: [String] = [],
379381
createDirectoryIfNeeded: Bool = true,
380-
tableNamePattern: String? = nil
382+
tableNamePattern: String? = nil,
383+
isPublic: Bool = false
381384
) {
382385
self.databaseName = databaseName
383386
self.imports = imports
384387
self.createDirectoryIfNeeded = createDirectoryIfNeeded
385388
self.tableNamePattern = tableNamePattern
389+
self.isPublic = isPublic
390+
}
391+
392+
/// The access modifier for all generated declarations
393+
var accessModifier: String {
394+
isPublic ? "public " : ""
386395
}
387396
}
388397

Sources/Compiler/Gen/SwiftLanguage.swift

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,12 @@ public struct SwiftLanguage: Language {
142142
writer.reset()
143143
}
144144

145-
writer.write("let connection: any PureSQL.Connection")
145+
writer.write(options.accessModifier, "let connection: any PureSQL.Connection")
146146
take()
147147
self.adapters(adapters: adapters)
148148
take()
149-
150-
writer.write("static var sanitizedMigrations: [String] ")
149+
150+
writer.write(options.accessModifier, "static var sanitizedMigrations: [String] ")
151151
writer.braces {
152152
writer.write(line: "return ")
153153
writer.brackets {
@@ -187,31 +187,31 @@ public struct SwiftLanguage: Language {
187187
migrations: [String],
188188
adapters: [AdapterReference]
189189
) {
190-
writer.write(line: "struct ", options.databaseName, ": Database")
191-
190+
writer.write(line: options.accessModifier, "struct ", options.databaseName, ": Database")
191+
192192
writer.braces {
193-
writer.write(line: "let connection: any PureSQL.Connection")
193+
writer.write(line: options.accessModifier, "let connection: any PureSQL.Connection")
194194
self.adapters(adapters: adapters)
195195

196196
writer.newline()
197197

198-
writer.write(line: "static var migrations: [String] ")
198+
writer.write(line: options.accessModifier, "static var migrations: [String] ")
199199
writer.braces {
200200
writer.write(line: "return ")
201201
writer.brackets {
202202
for (position, migration) in migrations.positional() {
203203
multilineStringLiteral(of: migration)
204-
204+
205205
if !position.isLast {
206206
writer.write(",")
207207
}
208208
}
209209
}
210210
}
211-
211+
212212
for (namespace, queries) in queries {
213213
if let namespace {
214-
writer.write(line: "var ", namespace.lowercaseFirst, ": ", namespace, " ")
214+
writer.write(line: options.accessModifier, "var ", namespace.lowercaseFirst, ": ", namespace, " ")
215215

216216
// Initialize queries object
217217
writer.braces {
@@ -230,20 +230,20 @@ public struct SwiftLanguage: Language {
230230
}
231231

232232
private func adapters(adapters: [AdapterReference]) {
233-
writer.write(line: "let adapters: Adapters")
233+
writer.write(line: options.accessModifier, "let adapters: Adapters")
234234
writer.newline()
235-
235+
236236
if adapters.isEmpty {
237-
writer.write(line: "typealias Adapters = DefaultAdapters")
237+
writer.write(line: options.accessModifier, "typealias Adapters = DefaultAdapters")
238238
} else {
239-
writer.write(line: "struct Adapters: PureSQL.Adapters ")
239+
writer.write(line: options.accessModifier, "struct Adapters: PureSQL.Adapters ")
240240
writer.braces {
241241
for adapter in adapters {
242-
writer.write(line: "let ", adapter.name, ": AnyDatabaseValueAdapter<", adapter.type, ">")
242+
writer.write(line: options.accessModifier, "let ", adapter.name, ": AnyDatabaseValueAdapter<", adapter.type, ">")
243243
}
244-
244+
245245
writer.blankLine()
246-
writer.write(line: "init(")
246+
writer.write(line: options.accessModifier, "init(")
247247
writer.indented {
248248
for (position, adapter) in adapters.positional() {
249249
writer.write(line: adapter.name, ": any DatabaseValueAdapter<", adapter.type, ">")
@@ -265,13 +265,13 @@ public struct SwiftLanguage: Language {
265265
}
266266

267267
private func queries(name: String, queries: [GeneratedQuery]) {
268-
writer.write(line: "struct ", name, ": PureSQL.ConnectionWrapper, Sendable {")
268+
writer.write(line: options.accessModifier, "struct ", name, ": PureSQL.ConnectionWrapper, Sendable {")
269269
writer.indent()
270-
271-
writer.write(line: "let connection: any PureSQL.Connection")
272-
270+
271+
writer.write(line: options.accessModifier, "let connection: any PureSQL.Connection")
272+
273273
for query in queries {
274-
writer.write(line: "var ", query.variableName, ": any ", query.typealiasName)
274+
writer.write(line: options.accessModifier, "var ", query.variableName, ": any ", query.typealiasName)
275275
}
276276

277277
writer.blankLine()
@@ -285,7 +285,7 @@ public struct SwiftLanguage: Language {
285285
}
286286

287287
private func queriesLive(name: String, queries: [GeneratedQuery]) {
288-
writer.write(line: "static func live(connection: PureSQL.Connection, adapters: DB.Adapters) -> ", name," {")
288+
writer.write(line: options.accessModifier, "static func live(connection: PureSQL.Connection, adapters: DB.Adapters) -> ", name," {")
289289
writer.indent()
290290

291291
writer.write(line: "return ", name, "(")
@@ -312,7 +312,7 @@ public struct SwiftLanguage: Language {
312312
}
313313

314314
private func queriesNoop(name: String, queries: [GeneratedQuery]) {
315-
writer.write(line: "static func noop(")
315+
writer.write(line: options.accessModifier, "static func noop(")
316316
writer.indented {
317317
for (position, query) in queries.positional() {
318318
writer.write(line: query.variableName, ": any ", query.typealiasName, " = ")
@@ -439,7 +439,7 @@ public struct SwiftLanguage: Language {
439439
databaseName: String
440440
) {
441441
let variableName = underscoreName ? "_\(query.variableName)" : query.variableName
442-
writer.write("var ", variableName, ": ", query.typeName)
442+
writer.write(options.accessModifier, "var ", variableName, ": ", query.typeName)
443443
writer.braces {
444444
expression(for: query)
445445
}
@@ -475,7 +475,7 @@ public struct SwiftLanguage: Language {
475475
writer.write(line: "@dynamicMemberLookup")
476476
}
477477

478-
writer.write(line: "struct ", model.name, ": Hashable, Sendable")
478+
writer.write(line: options.accessModifier, "struct ", model.name, ": Hashable, Sendable")
479479

480480
if model.fields["id"] != nil {
481481
writer.write(", Identifiable")
@@ -496,13 +496,13 @@ public struct SwiftLanguage: Language {
496496

497497
// Write out fields of struct
498498
for field in model.fields.values {
499-
writer.write(line: "let ", field.name, ": ", field.typeName)
499+
writer.write(line: options.accessModifier, "let ", field.name, ": ", field.typeName)
500500
}
501-
501+
502502
if isOutput {
503503
writer.blankLine()
504-
505-
writer.write(line: "static let nonOptionalIndices: [Int32] = [")
504+
505+
writer.write(line: options.accessModifier, "static let nonOptionalIndices: [Int32] = [")
506506
for (position, index) in model.nonOptionalIndices.positional() {
507507
writer.write(index.description)
508508

@@ -549,7 +549,7 @@ public struct SwiftLanguage: Language {
549549
isOptional: Bool
550550
) {
551551
writer.newline()
552-
writer.write(line: "subscript<Value>(dynamicMember dynamicMember: ")
552+
writer.write(line: options.accessModifier, "subscript<Value>(dynamicMember dynamicMember: ")
553553
writer.write("KeyPath<", typeName, ", Value>) -> Value")
554554
if isOptional {
555555
writer.write("?")
@@ -566,7 +566,7 @@ public struct SwiftLanguage: Language {
566566

567567
private func rowDecodableInit(for model: GeneratedModel) {
568568
// Initializer signature
569-
writer.write(line: "init(")
569+
writer.write(line: options.accessModifier, "init(")
570570
writer.indent()
571571
writer.write(line: "row: borrowing PureSQL.Row,")
572572
writer.write(line: "startingAt start: Int32")
@@ -623,9 +623,9 @@ public struct SwiftLanguage: Language {
623623
for model: GeneratedModel
624624
) {
625625
// Initializer signature
626-
writer.write(line: "init(")
626+
writer.write(line: options.accessModifier, "init(")
627627
writer.indent()
628-
628+
629629
for (position, (name, field)) in model.fields.elements.positional() {
630630
writer.write(line: name, ": ", field.typeName)
631631

@@ -648,14 +648,14 @@ public struct SwiftLanguage: Language {
648648

649649
/// Creates a type alias for the query so it can be referenced as an existential
650650
private func typeAlias(for query: GeneratedQuery) {
651-
writer.write(line: "typealias ", query.typealiasName, " = Query<", query.inputName, ", ", query.outputName, ">")
651+
writer.write(line: options.accessModifier, "typealias ", query.typealiasName, " = Query<", query.inputName, ", ", query.outputName, ">")
652652
}
653653

654654
/// Used in the macros, to create a typealias for the database query since those need
655655
/// to be referenced explicitly in their decl.
656656
private func dbTypeAlias(for query: GeneratedQuery, queryType: String = "Query") {
657657
let name = query.typealiasName.replacingOccurrences(of: "Query", with: "DatabaseQuery")
658-
writer.write(line: "typealias ", name, " = DatabaseQuery<", query.inputName, ", ", query.outputName, ">")
658+
writer.write(line: options.accessModifier, "typealias ", name, " = DatabaseQuery<", query.inputName, ", ", query.outputName, ">")
659659
}
660660

661661
private func inputExtension(
@@ -728,7 +728,7 @@ public struct SwiftLanguage: Language {
728728
condition: (() -> Void)? = nil,
729729
builder: () -> Void
730730
) {
731-
writer.write(line: "extension ", type)
731+
writer.write(line: options.accessModifier, "extension ", type)
732732

733733
if let conformance {
734734
writer.write(": ", conformance)

Sources/PureSQLCLI/GenerateCommand.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ struct GenerateCommand: AsyncParsableCommand {
4646
databaseName: config.databaseName ?? "DB",
4747
imports: config.additionalImports ?? [],
4848
createDirectoryIfNeeded: !skipDirectoryCreate,
49-
tableNamePattern: config.tableNamePattern
49+
tableNamePattern: config.tableNamePattern,
50+
isPublic: config.isPublic ?? false
5051
)
5152

5253
try await generate(

0 commit comments

Comments
 (0)