s0rg/decompose

View on GitHub
internal/node/node.go

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package node

import (
    "path/filepath"
    "slices"
)

type Node struct {
    Container Container
    Meta      *Meta
    Ports     *Ports
    ID        string
    Name      string
    Image     string
    Cluster   string
    Networks  []string
    Volumes   []*Volume
}

func External(name string) (rv *Node) {
    return &Node{
        ID:    name,
        Name:  name,
        Ports: &Ports{},
    }
}

func (n *Node) IsExternal() bool {
    return n.ID == n.Name
}

func (n *Node) ToJSON() (rv *JSON) {
    rv = &JSON{
        Name:       n.Name,
        IsExternal: n.IsExternal(),
        Networks:   n.Networks,
        Container:  n.Container,
        Listen:     make(map[string][]*Port),
        Volumes:    []*Volume{},
        Tags:       []string{},
        Connected:  make(map[string][]*Connection),
    }

    if n.Meta != nil {
        rv.Tags = n.Meta.Tags
    }

    if n.Image != "" {
        rv.Image = &n.Image
    }

    n.Ports.Compact()

    n.Ports.Iter(func(name string, ports []*Port) {
        rv.Listen[name] = ports
    })

    if len(n.Volumes) > 0 {
        rv.Volumes = n.Volumes
    }

    return rv
}

func (n *Node) ToView() (rv *View) {
    rv = &View{
        Name:       n.Name,
        Image:      n.Image,
        Listen:     n.Ports,
        IsExternal: n.IsExternal(),
    }

    if n.Meta != nil && len(n.Meta.Tags) > 0 {
        rv.Tags = n.Meta.Tags
    }

    if len(n.Container.Cmd) > 0 {
        rv.Cmd = filepath.Base(n.Container.Cmd[0])
        rv.Args = n.Container.Cmd[1:]
    }

    return rv
}

func (n *Node) FormatMeta() (rv []string, ok bool) {
    if n.Meta == nil {
        return
    }

    const maxMeta = 3

    rv = make([]string, 0, maxMeta)

    if n.Meta.Info != "" {
        rv = append(rv, n.Meta.Info)
    }

    if n.Meta.Docs != "" {
        rv = append(rv, n.Meta.Docs)
    }

    if n.Meta.Repo != "" {
        rv = append(rv, n.Meta.Repo)
    }

    return slices.Clip(rv), len(rv) > 0
}