1package godo
2
3import (
4	"context"
5	"net/http"
6)
7
8// SizesService is an interface for interfacing with the size
9// endpoints of the DigitalOcean API
10// See: https://docs.digitalocean.com/reference/api/api-reference/#tag/Sizes
11type SizesService interface {
12	List(context.Context, *ListOptions) ([]Size, *Response, error)
13}
14
15// SizesServiceOp handles communication with the size related methods of the
16// DigitalOcean API.
17type SizesServiceOp struct {
18	client *Client
19}
20
21var _ SizesService = &SizesServiceOp{}
22
23// Size represents a DigitalOcean Size
24type Size struct {
25	Slug         string   `json:"slug,omitempty"`
26	Memory       int      `json:"memory,omitempty"`
27	Vcpus        int      `json:"vcpus,omitempty"`
28	Disk         int      `json:"disk,omitempty"`
29	PriceMonthly float64  `json:"price_monthly,omitempty"`
30	PriceHourly  float64  `json:"price_hourly,omitempty"`
31	Regions      []string `json:"regions,omitempty"`
32	Available    bool     `json:"available,omitempty"`
33	Transfer     float64  `json:"transfer,omitempty"`
34	Description  string   `json:"description,omitempty"`
35}
36
37func (s Size) String() string {
38	return Stringify(s)
39}
40
41type sizesRoot struct {
42	Sizes []Size
43	Links *Links `json:"links"`
44	Meta  *Meta  `json:"meta"`
45}
46
47// List all images
48func (s *SizesServiceOp) List(ctx context.Context, opt *ListOptions) ([]Size, *Response, error) {
49	path := "v2/sizes"
50	path, err := addOptions(path, opt)
51	if err != nil {
52		return nil, nil, err
53	}
54
55	req, err := s.client.NewRequest(ctx, http.MethodGet, path, nil)
56	if err != nil {
57		return nil, nil, err
58	}
59
60	root := new(sizesRoot)
61	resp, err := s.client.Do(ctx, req, root)
62	if err != nil {
63		return nil, resp, err
64	}
65	if l := root.Links; l != nil {
66		resp.Links = l
67	}
68	if m := root.Meta; m != nil {
69		resp.Meta = m
70	}
71
72	return root.Sizes, resp, err
73}
74