[Request]: Enhance DX for passing down option groups when using a Plugin
- Dominant language
- Swift
- Stars
- 49.9k
- Forks
- 1.8k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 22
Description
### Feature or enhancement request details
The principal issue here is that it was decided to not expose any properties of commands for the purposes of Plugin development (see #603). Because of that, passing down OptionGroups can look like the following:
```swift
@OptionGroup
var managementFlags: Flags.Management
mutating func run2() async throws {
var arguments: [String] = ["hello-world"]
// Expand managementFlags into CLI arguments
if managementFlags.detach {
arguments.append("--detach")
}
if let entryPoint = managementFlags.entryPoint {
arguments.append(contentsOf: ["--entrypoint", entryPoint])
}
for mount in managementFlags.mounts {
arguments.append(contentsOf: ["--mount", mount])
}
for port in managementFlags.publishPorts {
arguments.append(contentsOf: ["--publish", port])
}
for socket in managementFlags.publishSockets {
arguments.append(contentsOf: ["--publish-socket", socket])
}
for tmp in managementFlags.tmpFs {
arguments.append(contentsOf: ["--tmpfs", tmp])
}
if let name = managementFlags.name {
arguments.append(contentsOf: ["--name", name])
}
if managementFlags.remove {
arguments.append("--rm")
}
if let platform = managementFlags.platform {
arguments.append(contentsOf: ["--platform", platform])
}
arguments.append(contentsOf: ["--os", managementFlags.os])
arguments.append(contentsOf: ["--arch", managementFlags.arch])
for vol in managementFlags.volumes {
arguments.append(contentsOf: ["--volume", vol])
}
if let kernel = managementFlags.kernel {
arguments.append(contentsOf: ["--kernel", kernel])
}
for network in managementFlags.networks {
arguments.append(contentsOf: ["--network", network])
}
if !managementFlags.cidfile.isEmpty {
arguments.append(contentsOf: ["--cidfile", managementFlags.cidfile])
}
if managementFlags.dnsDisabled {
arguments.append("--no-dns")
}
for dns in managementFlags.dnsNameservers {
arguments.append(contentsOf: ["--dns", dns])
}
if let domain = managementFlags.dnsDomain {
arguments.append(contentsOf: ["--dns-domain", domain])
}
for search in managementFlags.dnsSearchDomains {
arguments.append(contentsOf: ["--dns-search", search])
}
for option in managementFlags.dnsOptions {
arguments.append(contentsOf: ["--dns-option", option])
}
for label in managementFlags.labels {
arguments.append(contentsOf: ["--label", label])
}
if managementFlags.virtualization {
arguments.append("--virtualization")
}
if managementFlags.ssh {
arguments.append("--ssh")
}
// Now parse with all expanded args
var createCommand = try Application.ContainerCreate.parse(arguments)
try await createCommand.run()
}
```
This also makes it so developers have to manually add support when new options are added rather than just a requirement of recompiling (which is far more likely to speed up adoption in plugins).
To address this issue, I would like to propose the development of a macro that synthesizes a function called asParsableArguments and returns an array of arguments for the option group and can then be passed along when desirable.
Thoughts?
### Code of Conduct
- [x] I agree to follow this project's Code of Conduct
Contributor guide
Assessment
This issue has not been assessed yet.