Skip to content

Commit 76ee898

Browse files
committed
model platform as enum
1 parent 4e8bc2f commit 76ee898

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

Plugins/PackageToJS/Sources/PackageToJS.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ import Foundation
22

33
struct PackageToJS {
44
struct PackageOptions {
5+
enum Platform: String, CaseIterable {
6+
case browser
7+
case node
8+
}
9+
510
/// Path to the output directory
611
var outputPath: String?
712
/// The build configuration to use (default: debug)
813
var configuration: String?
914
/// Name of the package (default: lowercased Package.swift name)
1015
var packageName: String?
1116
/// Target platform for the generated JavaScript (default: browser)
12-
var platform: String?
17+
var platform: Platform = .browser
1318
/// Whether to explain the build plan (default: false)
1419
var explain: Bool = false
1520
/// Whether to print verbose output
@@ -719,7 +724,7 @@ struct PackagingPlanner {
719724
"USE_WASI_CDN": options.useCDN,
720725
"HAS_BRIDGE": exportedSkeletons.count > 0 || importedSkeletons.count > 0,
721726
"HAS_IMPORTS": importedSkeletons.count > 0,
722-
"TARGET_PLATFORM_NODE": options.platform == "node",
727+
"TARGET_PLATFORM_NODE": options.platform == .node,
723728
]
724729
let constantSubstitutions: [String: String] = [
725730
"PACKAGE_TO_JS_MODULE_PATH": wasmFilename,

Plugins/PackageToJS/Sources/PackageToJSPlugin.swift

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ struct PackageToJSPlugin: CommandPlugin {
175175
}
176176

177177
var extractor = ArgumentExtractor(arguments)
178-
let buildOptions = PackageToJS.BuildOptions.parse(from: &extractor)
178+
let buildOptions = try PackageToJS.BuildOptions.parse(from: &extractor)
179179

180180
if extractor.remainingArguments.count > 0 {
181181
printStderr(
@@ -239,7 +239,7 @@ struct PackageToJSPlugin: CommandPlugin {
239239
}
240240

241241
var extractor = ArgumentExtractor(arguments)
242-
let testOptions = PackageToJS.TestOptions.parse(from: &extractor)
242+
let testOptions = try PackageToJS.TestOptions.parse(from: &extractor)
243243

244244
if extractor.remainingArguments.count > 0 {
245245
printStderr(
@@ -440,13 +440,28 @@ private func printStderr(_ message: String) {
440440

441441
// MARK: - Options parsing
442442

443+
extension ArgumentExtractor {
444+
mutating func extractPlatformOption(named name: String) throws -> PackageToJS.PackageOptions.Platform {
445+
let stringValue : String? = self.extractOption(named: name).last
446+
guard let stringValue else {
447+
throw PackageToJSError("Missing value for option --\(name)")
448+
}
449+
guard let platform = PackageToJS.PackageOptions.Platform(rawValue: stringValue) else {
450+
throw PackageToJSError(
451+
"Invalid platform: \(stringValue), expected one of \(PackageToJS.PackageOptions.Platform.allCases.map(\.rawValue).joined(separator: ", "))"
452+
)
453+
}
454+
return platform
455+
}
456+
}
457+
443458
extension PackageToJS.PackageOptions {
444-
static func parse(from extractor: inout ArgumentExtractor) -> PackageToJS.PackageOptions {
459+
static func parse(from extractor: inout ArgumentExtractor) throws -> PackageToJS.PackageOptions {
445460
let outputPath = extractor.extractOption(named: "output").last
446461
let configuration: String? =
447462
(extractor.extractOption(named: "configuration") + extractor.extractSingleDashOption(named: "c")).last
448463
let packageName = extractor.extractOption(named: "package-name").last
449-
let platform = extractor.extractOption(named: "platform").last
464+
let platform = try extractor.extractPlatformOption(named: "platform")
450465
let explain = extractor.extractFlag(named: "explain")
451466
let useCDN = extractor.extractFlag(named: "use-cdn")
452467
let verbose = extractor.extractFlag(named: "verbose")
@@ -468,7 +483,7 @@ extension PackageToJS.PackageOptions {
468483
--output <path> Path to the output directory (default: .build/plugins/PackageToJS/outputs/Package)
469484
-c, --configuration <name> The build configuration to use (values: debug, release; default: debug)
470485
--package-name <name> Name of the package (default: lowercased Package.swift name)
471-
--platform <name> Target platform for generated JavaScript (values: browser, node; default: browser)
486+
--platform <name> Target platform for generated JavaScript (values: \(PackageToJS.PackageOptions.Platform.allCases.map(\.rawValue).joined(separator: ", ")); default: \(PackageToJS.PackageOptions.Platform.browser))
472487
--use-cdn Whether to use CDN for dependency packages
473488
--enable-code-coverage Whether to enable code coverage collection
474489
--explain Whether to explain the build plan
@@ -478,7 +493,7 @@ extension PackageToJS.PackageOptions {
478493
}
479494

480495
extension PackageToJS.BuildOptions {
481-
static func parse(from extractor: inout ArgumentExtractor) -> PackageToJS.BuildOptions {
496+
static func parse(from extractor: inout ArgumentExtractor) throws -> PackageToJS.BuildOptions {
482497
let product = extractor.extractOption(named: "product").last
483498
let noOptimize = extractor.extractFlag(named: "no-optimize")
484499
let rawDebugInfoFormat = extractor.extractOption(named: "debug-info-format").last
@@ -491,7 +506,7 @@ extension PackageToJS.BuildOptions {
491506
}
492507
debugInfoFormat = format
493508
}
494-
let packageOptions = PackageToJS.PackageOptions.parse(from: &extractor)
509+
let packageOptions = try PackageToJS.PackageOptions.parse(from: &extractor)
495510
return PackageToJS.BuildOptions(
496511
product: product,
497512
noOptimize: noOptimize != 0,
@@ -529,15 +544,15 @@ extension PackageToJS.BuildOptions {
529544
}
530545

531546
extension PackageToJS.TestOptions {
532-
static func parse(from extractor: inout ArgumentExtractor) -> PackageToJS.TestOptions {
547+
static func parse(from extractor: inout ArgumentExtractor) throws -> PackageToJS.TestOptions {
533548
let buildOnly = extractor.extractFlag(named: "build-only")
534549
let listTests = extractor.extractFlag(named: "list-tests")
535550
let filter = extractor.extractOption(named: "filter")
536551
let prelude = extractor.extractOption(named: "prelude").last
537552
let environment = extractor.extractOption(named: "environment").last
538553
let inspect = extractor.extractFlag(named: "inspect")
539554
let extraNodeArguments = extractor.extractSingleDashOption(named: "Xnode")
540-
let packageOptions = PackageToJS.PackageOptions.parse(from: &extractor)
555+
let packageOptions = try PackageToJS.PackageOptions.parse(from: &extractor)
541556
var options = PackageToJS.TestOptions(
542557
buildOnly: buildOnly != 0,
543558
listTests: listTests != 0,

0 commit comments

Comments
 (0)