mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
* 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>
79 lines
2.3 KiB
Go
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()
|
|
}
|