go/statuschart/stdout.go

Summary

Maintainability
A
0 mins
Test Coverage
package statuschart

import (
    "strings"

    "github.com/burke/zeus/go/processtree"
)

func stdoutStart(tree *processtree.ProcessTree, done, quit chan bool) {
    go func() {
        for {
            select {
            case <-quit:
                done <- true
                return
                // TODO: Maybe handle SCW Write requests?
            case <-theChart.update:
                theChart.logChanges()
            }
        }
    }()
}

func (s *StatusChart) logChanges() {
    s.L.Lock()
    defer s.L.Unlock()
    log := theChart.directLogger

    log.ColorizedSansNl("{reset}Status: ")
    s.logSubtree(s.RootSlave)
    log.Colorized("{reset}")
    s.logCommands()
}

func collectCommands(commands []*processtree.CommandNode, desiredState string) []*processtree.CommandNode {
    desiredCommands := make([]*processtree.CommandNode, 0)

    for _, command := range commands {
        if command.Parent.State() == desiredState {
            desiredCommands = append(desiredCommands, command)
        }
    }
    return desiredCommands
}

func (s *StatusChart) logCommands() {
    log := theChart.directLogger

    runningCommands := collectCommands(s.Commands, processtree.SReady)
    crashedCommands := collectCommands(s.Commands, processtree.SCrashed)
    if len(runningCommands) > 0 {
        log.ColorizedSansNl("Available commands: ")
        for i, command := range runningCommands {
            if i > 0 {
                log.ColorizedSansNl("{reset}, ")
            }
            log.ColorizedSansNl("{green}" + command.Name)
            if len(command.Aliases) > 0 {
                log.ColorizedSansNl("{reset}(aliases: {green}" + strings.Join(command.Aliases, ",{green}") +
                    "{reset})")
            }
        }
        log.Colorized("{reset}")
    }

    if len(crashedCommands) > 0 {
        log.ColorizedSansNl("Crashed commands ({yellow}run to see backtrace{reset}): ")
        for i, command := range crashedCommands {
            if i > 0 {
                log.ColorizedSansNl("{reset}, ")
            }
            log.ColorizedSansNl("{red}" + command.Name)
        }
        log.Colorized("{reset}")
    }
}

func (s *StatusChart) logSubtree(node *processtree.SlaveNode) {
    log := theChart.directLogger
    printStateInfo("", node.Name, node.State(), true, false)

    if len(node.Slaves) > 0 {
        log.ColorizedSansNl("{reset}(")
    }
    for i, slave := range node.Slaves {
        if i != 0 {
            log.ColorizedSansNl("{reset}, ")
        }
        s.logSubtree(slave)
    }
    if len(node.Slaves) > 0 {
        log.ColorizedSansNl("{reset})")
    }
}