mirror of
https://github.com/trycua/computer.git
synced 2026-02-16 11:29:04 -06:00
Add --json suppor to get and list
This commit is contained in:
@@ -9,6 +9,9 @@ struct Get: AsyncParsableCommand {
|
||||
@Argument(help: "Name of the virtual machine", completion: .custom(completeVMName))
|
||||
var name: String
|
||||
|
||||
@Flag(name: .long, help: "Outputs the images as a machine-readable JSON.")
|
||||
var json = false
|
||||
|
||||
init() {
|
||||
}
|
||||
|
||||
@@ -16,6 +19,6 @@ struct Get: AsyncParsableCommand {
|
||||
func run() async throws {
|
||||
let vmController = LumeController()
|
||||
let vm = try vmController.get(name: name)
|
||||
VMDetailsPrinter.printStatus([vm.details])
|
||||
try VMDetailsPrinter.printStatus([vm.details], json: self.json)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@ struct List: AsyncParsableCommand {
|
||||
abstract: "List virtual machines"
|
||||
)
|
||||
|
||||
@Flag(name: .long, help: "Outputs the images as a machine-readable JSON.")
|
||||
var json = false
|
||||
|
||||
init() {
|
||||
}
|
||||
|
||||
@@ -14,10 +17,10 @@ struct List: AsyncParsableCommand {
|
||||
func run() async throws {
|
||||
let manager = LumeController()
|
||||
let vms = try manager.list()
|
||||
if vms.isEmpty {
|
||||
if vms.isEmpty && !json {
|
||||
print("No virtual machines found")
|
||||
} else {
|
||||
VMDetailsPrinter.printStatus(vms)
|
||||
try VMDetailsPrinter.printStatus(vms, json: self.json)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,17 +33,25 @@ enum VMDetailsPrinter {
|
||||
|
||||
/// Prints the status of all VMs in a formatted table
|
||||
/// - Parameter vms: Array of VM status objects to display
|
||||
static func printStatus(_ vms: [VMDetails]) {
|
||||
printHeader()
|
||||
vms.forEach(printVM)
|
||||
static func printStatus(_ vms: [VMDetails], json: Bool, print: (String) -> () = { print($0) }) throws {
|
||||
if json {
|
||||
let jsonEncoder = JSONEncoder()
|
||||
jsonEncoder.outputFormatting = .prettyPrinted
|
||||
let jsonData = try jsonEncoder.encode(vms)
|
||||
let jsonString = String(data: jsonData, encoding: .utf8)!
|
||||
print(jsonString)
|
||||
} else {
|
||||
printHeader(print: print)
|
||||
vms.forEach({ printVM($0, print: print)})
|
||||
}
|
||||
}
|
||||
|
||||
private static func printHeader() {
|
||||
private static func printHeader(print: (String) -> () = { print($0) }) {
|
||||
let paddedHeaders = columns.map { $0.header.paddedToWidth($0.width) }
|
||||
print(paddedHeaders.joined())
|
||||
}
|
||||
|
||||
private static func printVM(_ vm: VMDetails) {
|
||||
private static func printVM(_ vm: VMDetails, print: (String) -> Void = { print($0) }) {
|
||||
let paddedColumns = columns.map { column in
|
||||
column.getValue(vm).paddedToWidth(column.width)
|
||||
}
|
||||
@@ -58,4 +66,4 @@ private extension String {
|
||||
func paddedToWidth(_ width: Int) -> String {
|
||||
padding(toLength: width, withPad: " ", startingAt: 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
48
tests/VM/VMDetailsPrinterTests.swift
Normal file
48
tests/VM/VMDetailsPrinterTests.swift
Normal file
@@ -0,0 +1,48 @@
|
||||
import Testing
|
||||
import Foundation
|
||||
@testable import lume
|
||||
|
||||
struct VMDetailsPrinterTests {
|
||||
|
||||
@Test func printStatus_whenJSON() throws {
|
||||
// Given
|
||||
let vms: [VMDetails] = [VMDetails(name: "name",
|
||||
os: "os",
|
||||
cpuCount: 2,
|
||||
memorySize: 1024,
|
||||
diskSize: .init(allocated: 24, total: 30),
|
||||
status: "status",
|
||||
vncUrl: "vncUrl",
|
||||
ipAddress: "0.0.0.0")]
|
||||
let jsonEncoder = JSONEncoder()
|
||||
jsonEncoder.outputFormatting = .prettyPrinted
|
||||
let expectedOutput = try String(data: jsonEncoder.encode(vms), encoding: .utf8)!
|
||||
|
||||
// When
|
||||
var printedStatus: String?
|
||||
try VMDetailsPrinter.printStatus(vms, json: true, print: { printedStatus = $0 })
|
||||
|
||||
// Then
|
||||
#expect(printedStatus == expectedOutput)
|
||||
}
|
||||
|
||||
@Test func printStatus_whenNotJSON() throws {
|
||||
// Given
|
||||
let vms: [VMDetails] = [VMDetails(name: "name",
|
||||
os: "os",
|
||||
cpuCount: 2,
|
||||
memorySize: 1024,
|
||||
diskSize: .init(allocated: 24, total: 30),
|
||||
status: "status",
|
||||
vncUrl: "vncUrl",
|
||||
ipAddress: "0.0.0.0")]
|
||||
|
||||
// When
|
||||
var printedLines: [String] = []
|
||||
try VMDetailsPrinter.printStatus(vms, json: false, print: { printedLines.append($0) })
|
||||
|
||||
// Then
|
||||
#expect(printedLines.popLast() == "name os 2 0.00G 24.0B/30.0B status 0.0.0.0 vncUrl ")
|
||||
#expect(printedLines.popLast() == "name os cpu memory disk status ip vnc ")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user