Skip to content

[Request]: Enhance DX for passing down option groups when using a Plugin #633

@Mcrich23

Description

@Mcrich23

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions