1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
wtf/modules/digitalocean/droplet_properties_table.go
Chris Cummer f84142553c
WTF-986 User-definable DigitalOcean columns (#1001)
* WTF-986 Wrap the DigitalOcean droplet in our own droplet

This gives us something to build off while still providing the
underlying functionality of the original droplet instance.

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-986 Dynamically display droplet attributes based on defined column names

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-986 Read DigitalOcean column configuration from settings

Signed-off-by: Chris Cummer <chriscummer@me.com>

* WTF-986 Extract the reflection bits into a Reflective package

Signed-off-by: Chris Cummer <chriscummer@me.com>
2020-10-14 09:29:58 -07:00

79 lines
2.3 KiB
Go

package digitalocean
import (
"fmt"
"strconv"
"strings"
"github.com/wtfutil/wtf/utils"
"github.com/wtfutil/wtf/view"
)
type dropletPropertiesTable struct {
droplet *Droplet
propertyMap map[string]string
colWidth0 int
colWidth1 int
tableHeight int
}
// newDropletPropertiesTable creates and returns an instance of DropletPropertiesTable
func newDropletPropertiesTable(droplet *Droplet) *dropletPropertiesTable {
propTable := &dropletPropertiesTable{
droplet: droplet,
colWidth0: 24,
colWidth1: 47,
tableHeight: 16,
}
propTable.propertyMap = propTable.buildPropertyMap()
return propTable
}
/* -------------------- Unexported Functions -------------------- */
// buildPropertyMap creates a mapping of droplet property names to droplet property values
func (propTable *dropletPropertiesTable) buildPropertyMap() map[string]string {
propMap := map[string]string{}
if propTable.droplet == nil {
return propMap
}
publicV4, _ := propTable.droplet.PublicIPv4()
publicV6, _ := propTable.droplet.PublicIPv6()
propMap["CPUs"] = strconv.Itoa(propTable.droplet.Vcpus)
propMap["Created"] = propTable.droplet.Created
propMap["Disk"] = strconv.Itoa(propTable.droplet.Disk)
propMap["Features"] = utils.Truncate(strings.Join(propTable.droplet.Features, ","), propTable.colWidth1, true)
propMap["Image"] = fmt.Sprintf("%s (%s)", propTable.droplet.Image.Name, propTable.droplet.Image.Distribution)
propMap["Memory"] = strconv.Itoa(propTable.droplet.Memory)
propMap["Public IP v4"] = publicV4
propMap["Public IP v6"] = publicV6
propMap["Region"] = fmt.Sprintf("%s (%s)", propTable.droplet.Region.Name, propTable.droplet.Region.Slug)
propMap["Size"] = propTable.droplet.SizeSlug
propMap["Status"] = propTable.droplet.Status
propMap["Tags"] = utils.Truncate(strings.Join(propTable.droplet.Tags, ","), propTable.colWidth1, true)
propMap["URN"] = utils.Truncate(propTable.droplet.URN(), propTable.colWidth1, true)
propMap["VPC"] = propTable.droplet.VPCUUID
return propMap
}
// render creates a new Table and returns it as a displayable string
func (propTable *dropletPropertiesTable) render() string {
tbl := view.NewInfoTable(
[]string{"Property", "Value"},
propTable.propertyMap,
propTable.colWidth0,
propTable.colWidth1,
propTable.tableHeight,
)
return tbl.Render()
}