import ArgumentParser import CliClient @dynamicMemberLookup struct GenerateOptions: ParsableArguments { @OptionGroup var basic: BasicGlobalOptions @Option( name: [.short, .customLong("file")], help: "Files used to generate the output, can be specified multiple times.", completion: .file() ) var files: [String] = [] @Option( name: [.customShort("H"), .long], help: "Files to include in the header, can be specified multiple times.", completion: .file() ) var includeInHeader: [String] = [] @Flag( help: "Do not build the project prior to generating the output." ) var noBuild: Bool = false @Option( name: .shortAndLong, help: "The project directory.", completion: .directory ) var projectDirectory: String? @Option( name: .shortAndLong, help: "The output directory", completion: .directory ) var outputDirectory: String? @Option( name: [.customShort("n"), .customLong("name")], help: "Name of the output file." ) var outputFileName: String? // NOTE: This must be last, both here and in the commands, so if the commands have options of their // own, they must be declared ahead of using the global options. @Argument( help: "Extra arguments / options to pass to the underlying pandoc command." ) var extraOptions: [String] = [] subscript(dynamicMember keyPath: WritableKeyPath) -> T { get { basic[keyPath: keyPath] } set { basic[keyPath: keyPath] = newValue } } subscript(dynamicMember keyPath: KeyPath) -> T { basic[keyPath: keyPath] } } extension GenerateOptions { func loggingOptions(commandName: String) -> CliClient.LoggingOptions { basic.loggingOptions(commandName: commandName) } func pandocOptions( _ fileType: CliClient.PandocOptions.FileType ) -> CliClient.PandocOptions { .init( files: files.count > 0 ? files : nil, includeInHeader: includeInHeader.count > 0 ? includeInHeader : nil, outputDirectory: outputDirectory, outputFileName: outputFileName, outputFileType: fileType, projectDirectory: projectDirectory, quiet: basic.quiet, shell: basic.shell, shouldBuild: !noBuild ) } }