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:
@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
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:
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