JanGorman / Table

CLI tables in Swift

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Swift Tables

CI SPM codecov

Working on CLI tools in Swift? Need to display tables? Continue reading.

Add the dependency to your Package.swift file:

import PackageDescription

let package = Package(
    name: "My awesome CLI tool"
    dependencies: [
        .package(
            url: "https://github.com/JanGorman/Table",
            from: "1.0.0"
        )
    ]
)

Basic Usage

import Table

func doSomething() throws {
    let data = [
      ["0A", "0B", "0C"],
      ["1A", "1B", "1C"],
      ["2A", "2B", "2C"],
    ]

    let table = try Table(data: data).table()

    print(table)
}

Results in a pretty table:

╔════╤════╤════╗
║ 0A │ 0B │ 0C ║
╟────┼────┼────╢
║ 1A │ 1B │ 1C ║
╟────┼────┼────╢
║ 2A │ 2B │ 2C ║
╚════╧════╧════╝

Alignment

You can align your table rows by passing in a Configuration:

import Table

func doSomething() throws {
    let data = [
      ["0A", "0B", "0C"],
    ]
    // Give alignment and a minimum width
    let columns = [
      Column(alignment: .left, width: 10),
      Column(alignment: .center, width: 10),
      Column(alignment: .right, width: 10)
    ]
    let configuration = Configuration(columns: columns)
    let table = try Table(data: data).table()

    print(table)
}

Results in:

╔══════════╤══════════╤══════════╗
║0A        │    0B    │        0C║
╚══════════╧══════════╧══════════╝

Padding

The Configuration also allows for padding:

import Table

func doSomething() throws {
    let data = [
      ["0A", "0B", "0C"],
    ]
    let columns = [
      Column(paddingLeft: 3, paddingRight: 4),
      Column(paddingLeft: 8, paddingRight: 8),
      Column(paddingLeft: 3, paddingRight: 4)
    ]
    let configuration = Configuration(columns: columns)
    let table = try Table(data: data).table()

    print(table)
}

Would give you:

╔═════════╤══════════════════╤═════════╗
║   0A    │        0B        │   0C    ║
╚═════════╧══════════════════╧═════════╝

Custom Border Style

To use a custom border for your tables simply create a struct conforming to the Border protocol and pass it as part of a custom Configuration. For example:

import Table

struct CustomBorder: Border {
  public let topBody = ""
  public let topJoin = ""
  public let topLeft = ""
  public let topRight = ""

  public let bottomBody = ""
  public let bottomJoin = ""
  public let bottomLeft = ""
  public let bottomRight = ""

  public let bodyLeft = ""
  public let bodyRight = ""
  public let bodyJoin = ""

  public let joinBody = ""
  public let joinLeft = ""
  public let joinRight = ""
  public let joinJoin = ""
}

func doSomething() throws -> String {
  
  let configuration = Configuration(border: CustomBorder(), columns: columns)
  return try Table(data: data).table()
}

Licence

Table is released under the MIT license. See LICENSE for details.

About

CLI tables in Swift

License:MIT License


Languages

Language:Swift 100.0%