Skip to content

Commit

Permalink
Add Msg2swift command plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
DimaRU committed Feb 18, 2024
1 parent 8203aab commit a04f005
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 4 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
.swiftpm
/Packages
/*.xcodeproj
Package.resolved
21 changes: 17 additions & 4 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
// swift-tools-version:5.6
// swift-tools-version:5.8

import PackageDescription

let package = Package(
name: "CDRCodable",
platforms: [.macOS(.v13)],
products: [
.library(
name: "CDRCodable",
targets: ["CDRCodable"]),
.library(name: "CDRCodable", targets: ["CDRCodable"]),
.plugin(name: "Msg2swiftCommand", targets: ["Msg2swiftCommand"]),
],
dependencies: [
.package(url: "https://github.com/DimaRU/Msg2swift.git", branch: "develop")
],
targets: [
.target(
Expand All @@ -16,5 +19,15 @@ let package = Package(
name: "CDRCodableTests",
dependencies: ["CDRCodable"]
),
.plugin(
name: "Msg2swiftCommand",
capability: .command(
intent: .custom(verb: "msg2swift", description: "Generate Swift model code from ROS message file."),
permissions: [.writeToPackageDirectory(reason: "Add generated Swift code")]
),
dependencies: [
.product(name: "msg2swift", package: "Msg2swift"),
]
),
]
)
37 changes: 37 additions & 0 deletions Plugins/Msg2swiftCommand/plugin.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import PackagePlugin
import Foundation

@main
struct Msg2swiftCommandPlugin: CommandPlugin {
func performCommand(context: PluginContext, arguments: [String]) throws {
let msg2swiftTool = try context.tool(named: "msg2swift").path
var argExtractor = ArgumentExtractor(arguments)

let targetNames = argExtractor.extractOption(named: "target")
var runArguments = argExtractor.remainingArguments
if !(arguments.contains("-o") || arguments.contains("--output-directory")) {
let targets = targetNames.isEmpty
? context.package.targets
: try context.package.targets(named: targetNames)

for target in targets {
guard let target = target as? SourceModuleTarget else { continue }
runArguments.append("--output-directory")
runArguments.append(target.directory.string)
break
}
}

let process = try Process.run(URL(fileURLWithPath: msg2swiftTool.string), arguments: runArguments)
process.waitUntilExit()

guard
process.terminationReason == .exit,
process.terminationStatus == 0
else {
let problem = "\(process.terminationReason):\(process.terminationStatus)"
Diagnostics.error("msg2swift invocation failed: \(problem)")
return
}
}
}

0 comments on commit a04f005

Please sign in to comment.