• Stars
    star
    387
  • Rank 110,971 (Top 3 %)
  • Language
    Go
  • License
    MIT License
  • Created over 8 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Package treeprint provides a simple ASCII tree composing tool.

treeprint GoDoc test coverage

Package treeprint provides a simple ASCII tree composing tool.

SYSTEME FIGURE

If you are familiar with the tree utility that is a recursive directory listing command that produces a depth indented listing of files, then you have the idea of what it would look like.

On my system the command yields the following

 $ tree
.
├── LICENSE
├── README.md
├── treeprint.go
└── treeprint_test.go

0 directories, 4 files

and I'd like to have the same format for my Go data structures when I print them.

Installation

$ go get github.com/xlab/treeprint

Concept of work

The general idea is that you initialise a new tree with treeprint.New() and then add nodes and branches into it. Use AddNode() when you want add a node on the same level as the target or use AddBranch() when you want to go a level deeper. So tree.AddBranch().AddNode().AddNode() would create a new level with two distinct nodes on it. So tree.AddNode().AddNode() is a flat thing and tree.AddBranch().AddBranch().AddBranch() is a high thing. Use String() or Bytes() on a branch to render a subtree, or use it on the root to print the whole tree.

The utility will yield Unicode-friendly trees. The output is predictable and there is no platform-dependent exceptions, so if you have issues with displaying the tree in the console, all platform-related transformations can be done after the tree has been rendered: an example for Asian locales.

Use cases

When you want to render a complex data structure:

func main() {
    // to add a custom root name use `treeprint.NewWithRoot()` instead
    tree := treeprint.New()

    // create a new branch in the root
    one := tree.AddBranch("one")

    // add some nodes
    one.AddNode("subnode1").AddNode("subnode2")

    // create a new sub-branch
    one.AddBranch("two").
        AddNode("subnode1").AddNode("subnode2"). // add some nodes
        AddBranch("three"). // add a new sub-branch
        AddNode("subnode1").AddNode("subnode2") // add some nodes too

    // add one more node that should surround the inner branch
    one.AddNode("subnode3")

    // add a new node to the root
    tree.AddNode("outernode")

    fmt.Println(tree.String())
}

Will give you:

.
├── one
│   ├── subnode1
│   ├── subnode2
│   ├── two
│   │   ├── subnode1
│   │   ├── subnode2
│   │   └── three
│   │       ├── subnode1
│   │       └── subnode2
│   └── subnode3
└── outernode

Another case, when you have to make a tree where any leaf may have some meta-data (as tree is capable of it):

func main {
    // to add a custom root name use `treeprint.NewWithRoot()` instead
    tree := treeprint.New()

    tree.AddNode("Dockerfile")
    tree.AddNode("Makefile")
    tree.AddNode("aws.sh")
    tree.AddMetaBranch(" 204", "bin").
        AddNode("dbmaker").AddNode("someserver").AddNode("testtool")
    tree.AddMetaBranch(" 374", "deploy").
        AddNode("Makefile").AddNode("bootstrap.sh")
    tree.AddMetaNode("122K", "testtool.a")

    fmt.Println(tree.String())
}

Output:

.
├── Dockerfile
├── Makefile
├── aws.sh
├── [ 204]  bin
│   ├── dbmaker
│   ├── someserver
│   └── testtool
├── [ 374]  deploy
│   ├── Makefile
│   └── bootstrap.sh
└── [122K]  testtool.a

Iterating over the tree nodes

tree := New()

one := tree.AddBranch("one")
one.AddNode("one-subnode1").AddNode("one-subnode2")
one.AddBranch("two").AddNode("two-subnode1").AddNode("two-subnode2").
    AddBranch("three").AddNode("three-subnode1").AddNode("three-subnode2")
tree.AddNode("outernode")

// if you need to iterate over the whole tree
// call `VisitAll` from your top root node.
tree.VisitAll(func(item *node) {
    if len(item.Nodes) > 0 {
        // branch nodes
        fmt.Println(item.Value) // will output one, two, three
    } else {
        // leaf nodes
        fmt.Println(item.Value) // will output one-*, two-*, three-* and outernode
    }
})

Yay! So it works.

License

MIT

More Repositories

1

c-for-go

Automatic C-Go Bindings Generator for Go Programming Language
Go
1,384
star
2

android-go

The android-go project provides a platform for writing native Android apps in Go programming language.
Go
1,058
star
3

pocketsphinx-go

CMU PocketSphinx for Golang, a lightweight speech recognition engine.
C
296
star
4

libvpx-go

Package vpx provides Go bindings for libvpx-1.6.0, the WebM Project VP8/VP9 codec implementation.
C
190
star
5

go-lambda

A multi-purpose tool for creating and managing AWS Lambda instances backed by arbitrary Go code
Go
146
star
6

closer

Package closer ensures a clean exit for your Go app.
Go
132
star
7

at

AT is a framework written in Go for communication with AT-compatible devices like Huawei modems via serial port.
Go
113
star
8

matchbox-keyboard

A mirror of matchbox-keyboard tree + my patches
C
63
star
9

netsed

Mirror of http://silicone.homelinux.org/git/netsed.git/
C
59
star
10

structwalk

Battle-tested Go struct and map traversal utilities.
Go
31
star
11

portmidi

The package provides Go bindings for PortMIDI from the PortMedia set of libraries.
Go
26
star
12

teg-workshop

Go
25
star
13

tablewriter

The platform-independent fork of Go ASCII Table Generator, ported from the Ruby terminal-tables library.
Go
24
star
14

handysort

Alphanumeric string sorting algorithm implementation in Go
Go
24
star
15

vorbis-go

Package vorbis provides Go bindings for OggVorbis implementation by the Xiph.Org Foundation.
C
23
star
16

libpd-go

Package libpd provides an idiomatic Go-lang wrapper for Pure Data embeddable audio synthesis library.
Go
19
star
17

portaudio-go

Package portaudio provides Go bindings for PortAudio.
Go
18
star
18

ios-go

The iOS-go project provides a platform for writing native iOS apps in Go programming language.
Go
17
star
19

opus-go

Package opus provides Go bindings for Opus encoder/decoder reference implementation by Xiph.org
C
16
star
20

gitio

A git.io client for Go, also a CLI utility.
Go
13
star
21

pace

Package pace provides a threadsafe counter for measuring ticks in the specified timeframe.
Go
9
star
22

pkgconfig

A lightweight pkg-config(1) clone written in Go.
Go
7
star
23

alac-go

Package alac provides Go bindings for ALAC decoder (C version by David Hammerton) with community patches.
C
5
star
24

suplog

Supercharged Go logging based on Logrus
Go
5
star
25

etherman

Etherman is a CLI tool for managing and testing Solidity contract deployments, written in pure Go.
Go
5
star
26

midievent

Package midievent provides MIDI event type mappings for Go-lang.
Go
4
star
27

termtables

A fork of long-gone apcera/termtables, because I liked it.
Go
4
star
28

smsru

Go-lang API bindings for sms.ru
Go
3
star
29

qml-kit

qml-kit is a bootstrapping template for Go/QML projects.
Go
3
star
30

ziptools

Package ziptools provides functionality to search through USA zip codes and cities in extremely fast way.
Go
3
star
31

clipboard

Clipboard for Go (go-qml applications, uses Qt)
C++
2
star
32

tpmmgd

My coursework 2013 - Modeling DEDS with timed Petri nets
JavaScript
2
star
33

libafrodite

Code completion engine for Vala language
Vala
1
star
34

wp8sdk-installer

A try to install Windows Phone 8 SDK under Windows 7
Ruby
1
star
35

nl80211

Generating Go constants from a C header example project.
C
1
star
36

chunked

A PoC service for chunked and encrypted file uploads.
JavaScript
1
star
37

beam-o

Fire a beam to teleport your files onto servers in distant galaxies.
Go
1
star
38

tun

Tun is a tool that serves files from the specified directory or a web resource.
Go
1
star
39

linmath

Go port of linmath.h — a small library for linear math as required for computer graphics.
Go
1
star
40

statsd_metrics

Common logic to report Go runtime and custom metrics to Telegraf/StatsD
Go
1
star
41

api

Package api is a helper that simplifies the process of REST APIs bindings creation in Go.
Go
1
star
42

invoker

Supercharged "exec.Cmd" helpers for asynchronous and thread-safe reading of StdOut and StdErr.
Go
1
star