1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
package hcapi2
import (
"context"
"strconv"
"sync"
"github.com/hetznercloud/hcloud-go/v2/hcloud"
)
type ServerTypeClient interface {
ServerTypeClientBase
Names() []string
ServerTypeName(id int64) string
ServerTypeDescription(id int64) string
}
func NewServerTypeClient(client ServerTypeClientBase) ServerTypeClient {
return &serverTypeClient{
ServerTypeClientBase: client,
}
}
type serverTypeClient struct {
ServerTypeClientBase
srvTypeByID map[int64]*hcloud.ServerType
once sync.Once
err error
}
// ServerTypeName obtains the name of the server type with id. If the name could not
// be fetched it returns the value id converted to a string.
func (c *serverTypeClient) ServerTypeName(id int64) string {
if err := c.init(); err != nil {
return strconv.FormatInt(id, 10)
}
serverType, ok := c.srvTypeByID[id]
if !ok || serverType.Name == "" {
return strconv.FormatInt(id, 10)
}
return serverType.Name
}
// ServerTypeDescription obtains the description of the server type with id. If the name could not
// be fetched it returns the value id converted to a string.
func (c *serverTypeClient) ServerTypeDescription(id int64) string {
if err := c.init(); err != nil {
return strconv.FormatInt(id, 10)
}
serverType, ok := c.srvTypeByID[id]
if !ok || serverType.Description == "" {
return strconv.FormatInt(id, 10)
}
return serverType.Description
}
// Names returns a slice of all available server types.
func (c *serverTypeClient) Names() []string {
sts, err := c.All(context.Background())
if err != nil || len(sts) == 0 {
return nil
}
names := make([]string, len(sts))
for i, st := range sts {
names[i] = st.Name
}
return names
}
func (c *serverTypeClient) init() error {
c.once.Do(func() {
serverTypes, err := c.All(context.Background())
if err != nil {
c.err = err
}
if c.err != nil || len(serverTypes) == 0 {
return
}
c.srvTypeByID = make(map[int64]*hcloud.ServerType, len(serverTypes))
for _, srv := range serverTypes {
c.srvTypeByID[srv.ID] = srv
}
})
return c.err
}
|