-
Notifications
You must be signed in to change notification settings - Fork 656
Open
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:
@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
- I agree to follow this project's Code of Conduct
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels