feat: Adds minimal cli executable and commands.
All checks were successful
CI / Linux Tests (push) Successful in 6m44s

This commit is contained in:
2026-02-07 21:17:29 -05:00
parent 1a38922ac0
commit 291bed28d5
6 changed files with 103 additions and 2 deletions

14
Sources/CLI/Cli.swift Normal file
View File

@@ -0,0 +1,14 @@
import ArgumentParser
@main
struct DuctCalcCli: AsyncParsableCommand {
static let configuration: CommandConfiguration = .init(
commandName: "ductcalc",
abstract: "Perform duct calculations.",
subcommands: [
ConvertCommand.self,
SizeCommand.self,
],
defaultSubcommand: SizeCommand.self
)
}

View File

@@ -0,0 +1,35 @@
import ArgumentParser
import Dependencies
import ManualDClient
struct ConvertCommand: AsyncParsableCommand {
static let configuration = CommandConfiguration(
commandName: "convert",
abstract: "Convert to an equivalent recangular size."
)
@Option(
name: .shortAndLong,
help: "The height"
)
var height: Int
@Argument(
// name: .shortAndLong,
help: "The round size."
)
var roundSize: Int
func run() async throws {
@Dependency(\.manualD) var manualD
let size = try await manualD.rectangularSize(
round: .init(roundSize),
height: .init(height)
)
print("\(size.width) x \(height)")
}
}

View File

@@ -0,0 +1,35 @@
import ArgumentParser
import Dependencies
import ManualDClient
struct SizeCommand: AsyncParsableCommand {
static let configuration = CommandConfiguration(
commandName: "size",
abstract: "Calculate the required size of a duct."
)
@Option(
name: .shortAndLong,
help: "The design friction rate."
)
var frictionRate: Double = 0.06
@Argument(
help: "The required CFM for the duct."
)
var cfm: Int
func run() async throws {
@Dependency(\.manualD) var manualD
let size = try await manualD.ductSize(cfm: cfm, frictionRate: frictionRate)
print(
"""
Calculated: \(size.calculatedSize.string(digits: 2))
Final Size: \(size.finalSize)
Flex Size: \(size.flexSize)
"""
)
}
}