apple / apple/container

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

Open
#633 8 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.