1// This file was automatically generated. DO NOT EDIT.
2// If you have any remark or suggestion do not hesitate to open an issue.
3
4// Package iot provides methods and message types of the iot v1beta1 API.
5package iot
6
7import (
8	"bytes"
9	"encoding/json"
10	"fmt"
11	"net"
12	"net/http"
13	"net/url"
14	"strings"
15	"time"
16
17	"github.com/scaleway/scaleway-sdk-go/internal/errors"
18	"github.com/scaleway/scaleway-sdk-go/internal/marshaler"
19	"github.com/scaleway/scaleway-sdk-go/internal/parameter"
20	"github.com/scaleway/scaleway-sdk-go/namegenerator"
21	"github.com/scaleway/scaleway-sdk-go/scw"
22)
23
24// always import dependencies
25var (
26	_ fmt.Stringer
27	_ json.Unmarshaler
28	_ url.URL
29	_ net.IP
30	_ http.Header
31	_ bytes.Reader
32	_ time.Time
33	_ = strings.Join
34
35	_ scw.ScalewayRequest
36	_ marshaler.Duration
37	_ scw.File
38	_ = parameter.AddToQuery
39	_ = namegenerator.GetRandomName
40)
41
42// API: this API allows you to manage IoT hubs and devices
43type API struct {
44	client *scw.Client
45}
46
47// NewAPI returns a API object from a Scaleway client.
48func NewAPI(client *scw.Client) *API {
49	return &API{
50		client: client,
51	}
52}
53
54type DeviceMessageFiltersPolicy string
55
56const (
57	// DeviceMessageFiltersPolicyUnknown is [insert doc].
58	DeviceMessageFiltersPolicyUnknown = DeviceMessageFiltersPolicy("unknown")
59	// DeviceMessageFiltersPolicyAccept is [insert doc].
60	DeviceMessageFiltersPolicyAccept = DeviceMessageFiltersPolicy("accept")
61	// DeviceMessageFiltersPolicyReject is [insert doc].
62	DeviceMessageFiltersPolicyReject = DeviceMessageFiltersPolicy("reject")
63)
64
65func (enum DeviceMessageFiltersPolicy) String() string {
66	if enum == "" {
67		// return default value if empty
68		return "unknown"
69	}
70	return string(enum)
71}
72
73func (enum DeviceMessageFiltersPolicy) MarshalJSON() ([]byte, error) {
74	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
75}
76
77func (enum *DeviceMessageFiltersPolicy) UnmarshalJSON(data []byte) error {
78	tmp := ""
79
80	if err := json.Unmarshal(data, &tmp); err != nil {
81		return err
82	}
83
84	*enum = DeviceMessageFiltersPolicy(DeviceMessageFiltersPolicy(tmp).String())
85	return nil
86}
87
88type DeviceStatus string
89
90const (
91	// DeviceStatusError is [insert doc].
92	DeviceStatusError = DeviceStatus("error")
93	// DeviceStatusEnabled is [insert doc].
94	DeviceStatusEnabled = DeviceStatus("enabled")
95	// DeviceStatusDisabled is [insert doc].
96	DeviceStatusDisabled = DeviceStatus("disabled")
97)
98
99func (enum DeviceStatus) String() string {
100	if enum == "" {
101		// return default value if empty
102		return "error"
103	}
104	return string(enum)
105}
106
107func (enum DeviceStatus) MarshalJSON() ([]byte, error) {
108	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
109}
110
111func (enum *DeviceStatus) UnmarshalJSON(data []byte) error {
112	tmp := ""
113
114	if err := json.Unmarshal(data, &tmp); err != nil {
115		return err
116	}
117
118	*enum = DeviceStatus(DeviceStatus(tmp).String())
119	return nil
120}
121
122type HubStatus string
123
124const (
125	// HubStatusError is [insert doc].
126	HubStatusError = HubStatus("error")
127	// HubStatusEnabling is [insert doc].
128	HubStatusEnabling = HubStatus("enabling")
129	// HubStatusReady is [insert doc].
130	HubStatusReady = HubStatus("ready")
131	// HubStatusDisabling is [insert doc].
132	HubStatusDisabling = HubStatus("disabling")
133	// HubStatusDisabled is [insert doc].
134	HubStatusDisabled = HubStatus("disabled")
135)
136
137func (enum HubStatus) String() string {
138	if enum == "" {
139		// return default value if empty
140		return "error"
141	}
142	return string(enum)
143}
144
145func (enum HubStatus) MarshalJSON() ([]byte, error) {
146	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
147}
148
149func (enum *HubStatus) UnmarshalJSON(data []byte) error {
150	tmp := ""
151
152	if err := json.Unmarshal(data, &tmp); err != nil {
153		return err
154	}
155
156	*enum = HubStatus(HubStatus(tmp).String())
157	return nil
158}
159
160type ListDevicesRequestOrderBy string
161
162const (
163	// ListDevicesRequestOrderByNameAsc is [insert doc].
164	ListDevicesRequestOrderByNameAsc = ListDevicesRequestOrderBy("name_asc")
165	// ListDevicesRequestOrderByNameDesc is [insert doc].
166	ListDevicesRequestOrderByNameDesc = ListDevicesRequestOrderBy("name_desc")
167	// ListDevicesRequestOrderByStatusAsc is [insert doc].
168	ListDevicesRequestOrderByStatusAsc = ListDevicesRequestOrderBy("status_asc")
169	// ListDevicesRequestOrderByStatusDesc is [insert doc].
170	ListDevicesRequestOrderByStatusDesc = ListDevicesRequestOrderBy("status_desc")
171	// ListDevicesRequestOrderByHubIDAsc is [insert doc].
172	ListDevicesRequestOrderByHubIDAsc = ListDevicesRequestOrderBy("hub_id_asc")
173	// ListDevicesRequestOrderByHubIDDesc is [insert doc].
174	ListDevicesRequestOrderByHubIDDesc = ListDevicesRequestOrderBy("hub_id_desc")
175	// ListDevicesRequestOrderByCreatedAtAsc is [insert doc].
176	ListDevicesRequestOrderByCreatedAtAsc = ListDevicesRequestOrderBy("created_at_asc")
177	// ListDevicesRequestOrderByCreatedAtDesc is [insert doc].
178	ListDevicesRequestOrderByCreatedAtDesc = ListDevicesRequestOrderBy("created_at_desc")
179	// ListDevicesRequestOrderByUpdatedAtAsc is [insert doc].
180	ListDevicesRequestOrderByUpdatedAtAsc = ListDevicesRequestOrderBy("updated_at_asc")
181	// ListDevicesRequestOrderByUpdatedAtDesc is [insert doc].
182	ListDevicesRequestOrderByUpdatedAtDesc = ListDevicesRequestOrderBy("updated_at_desc")
183	// ListDevicesRequestOrderByAllowInsecureAsc is [insert doc].
184	ListDevicesRequestOrderByAllowInsecureAsc = ListDevicesRequestOrderBy("allow_insecure_asc")
185	// ListDevicesRequestOrderByAllowInsecureDesc is [insert doc].
186	ListDevicesRequestOrderByAllowInsecureDesc = ListDevicesRequestOrderBy("allow_insecure_desc")
187)
188
189func (enum ListDevicesRequestOrderBy) String() string {
190	if enum == "" {
191		// return default value if empty
192		return "name_asc"
193	}
194	return string(enum)
195}
196
197func (enum ListDevicesRequestOrderBy) MarshalJSON() ([]byte, error) {
198	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
199}
200
201func (enum *ListDevicesRequestOrderBy) UnmarshalJSON(data []byte) error {
202	tmp := ""
203
204	if err := json.Unmarshal(data, &tmp); err != nil {
205		return err
206	}
207
208	*enum = ListDevicesRequestOrderBy(ListDevicesRequestOrderBy(tmp).String())
209	return nil
210}
211
212type ListHubsRequestOrderBy string
213
214const (
215	// ListHubsRequestOrderByNameAsc is [insert doc].
216	ListHubsRequestOrderByNameAsc = ListHubsRequestOrderBy("name_asc")
217	// ListHubsRequestOrderByNameDesc is [insert doc].
218	ListHubsRequestOrderByNameDesc = ListHubsRequestOrderBy("name_desc")
219	// ListHubsRequestOrderByStatusAsc is [insert doc].
220	ListHubsRequestOrderByStatusAsc = ListHubsRequestOrderBy("status_asc")
221	// ListHubsRequestOrderByStatusDesc is [insert doc].
222	ListHubsRequestOrderByStatusDesc = ListHubsRequestOrderBy("status_desc")
223	// ListHubsRequestOrderByProductPlanAsc is [insert doc].
224	ListHubsRequestOrderByProductPlanAsc = ListHubsRequestOrderBy("product_plan_asc")
225	// ListHubsRequestOrderByProductPlanDesc is [insert doc].
226	ListHubsRequestOrderByProductPlanDesc = ListHubsRequestOrderBy("product_plan_desc")
227	// ListHubsRequestOrderByCreatedAtAsc is [insert doc].
228	ListHubsRequestOrderByCreatedAtAsc = ListHubsRequestOrderBy("created_at_asc")
229	// ListHubsRequestOrderByCreatedAtDesc is [insert doc].
230	ListHubsRequestOrderByCreatedAtDesc = ListHubsRequestOrderBy("created_at_desc")
231	// ListHubsRequestOrderByUpdatedAtAsc is [insert doc].
232	ListHubsRequestOrderByUpdatedAtAsc = ListHubsRequestOrderBy("updated_at_asc")
233	// ListHubsRequestOrderByUpdatedAtDesc is [insert doc].
234	ListHubsRequestOrderByUpdatedAtDesc = ListHubsRequestOrderBy("updated_at_desc")
235)
236
237func (enum ListHubsRequestOrderBy) String() string {
238	if enum == "" {
239		// return default value if empty
240		return "name_asc"
241	}
242	return string(enum)
243}
244
245func (enum ListHubsRequestOrderBy) MarshalJSON() ([]byte, error) {
246	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
247}
248
249func (enum *ListHubsRequestOrderBy) UnmarshalJSON(data []byte) error {
250	tmp := ""
251
252	if err := json.Unmarshal(data, &tmp); err != nil {
253		return err
254	}
255
256	*enum = ListHubsRequestOrderBy(ListHubsRequestOrderBy(tmp).String())
257	return nil
258}
259
260type ListNetworksRequestOrderBy string
261
262const (
263	// ListNetworksRequestOrderByNameAsc is [insert doc].
264	ListNetworksRequestOrderByNameAsc = ListNetworksRequestOrderBy("name_asc")
265	// ListNetworksRequestOrderByNameDesc is [insert doc].
266	ListNetworksRequestOrderByNameDesc = ListNetworksRequestOrderBy("name_desc")
267	// ListNetworksRequestOrderByTypeAsc is [insert doc].
268	ListNetworksRequestOrderByTypeAsc = ListNetworksRequestOrderBy("type_asc")
269	// ListNetworksRequestOrderByTypeDesc is [insert doc].
270	ListNetworksRequestOrderByTypeDesc = ListNetworksRequestOrderBy("type_desc")
271	// ListNetworksRequestOrderByCreatedAtAsc is [insert doc].
272	ListNetworksRequestOrderByCreatedAtAsc = ListNetworksRequestOrderBy("created_at_asc")
273	// ListNetworksRequestOrderByCreatedAtDesc is [insert doc].
274	ListNetworksRequestOrderByCreatedAtDesc = ListNetworksRequestOrderBy("created_at_desc")
275)
276
277func (enum ListNetworksRequestOrderBy) String() string {
278	if enum == "" {
279		// return default value if empty
280		return "name_asc"
281	}
282	return string(enum)
283}
284
285func (enum ListNetworksRequestOrderBy) MarshalJSON() ([]byte, error) {
286	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
287}
288
289func (enum *ListNetworksRequestOrderBy) UnmarshalJSON(data []byte) error {
290	tmp := ""
291
292	if err := json.Unmarshal(data, &tmp); err != nil {
293		return err
294	}
295
296	*enum = ListNetworksRequestOrderBy(ListNetworksRequestOrderBy(tmp).String())
297	return nil
298}
299
300type ListRoutesRequestOrderBy string
301
302const (
303	// ListRoutesRequestOrderByNameAsc is [insert doc].
304	ListRoutesRequestOrderByNameAsc = ListRoutesRequestOrderBy("name_asc")
305	// ListRoutesRequestOrderByNameDesc is [insert doc].
306	ListRoutesRequestOrderByNameDesc = ListRoutesRequestOrderBy("name_desc")
307	// ListRoutesRequestOrderByHubIDAsc is [insert doc].
308	ListRoutesRequestOrderByHubIDAsc = ListRoutesRequestOrderBy("hub_id_asc")
309	// ListRoutesRequestOrderByHubIDDesc is [insert doc].
310	ListRoutesRequestOrderByHubIDDesc = ListRoutesRequestOrderBy("hub_id_desc")
311	// ListRoutesRequestOrderByTypeAsc is [insert doc].
312	ListRoutesRequestOrderByTypeAsc = ListRoutesRequestOrderBy("type_asc")
313	// ListRoutesRequestOrderByTypeDesc is [insert doc].
314	ListRoutesRequestOrderByTypeDesc = ListRoutesRequestOrderBy("type_desc")
315	// ListRoutesRequestOrderByCreatedAtAsc is [insert doc].
316	ListRoutesRequestOrderByCreatedAtAsc = ListRoutesRequestOrderBy("created_at_asc")
317	// ListRoutesRequestOrderByCreatedAtDesc is [insert doc].
318	ListRoutesRequestOrderByCreatedAtDesc = ListRoutesRequestOrderBy("created_at_desc")
319)
320
321func (enum ListRoutesRequestOrderBy) String() string {
322	if enum == "" {
323		// return default value if empty
324		return "name_asc"
325	}
326	return string(enum)
327}
328
329func (enum ListRoutesRequestOrderBy) MarshalJSON() ([]byte, error) {
330	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
331}
332
333func (enum *ListRoutesRequestOrderBy) UnmarshalJSON(data []byte) error {
334	tmp := ""
335
336	if err := json.Unmarshal(data, &tmp); err != nil {
337		return err
338	}
339
340	*enum = ListRoutesRequestOrderBy(ListRoutesRequestOrderBy(tmp).String())
341	return nil
342}
343
344type MetricsPeriod string
345
346const (
347	// MetricsPeriodHour is [insert doc].
348	MetricsPeriodHour = MetricsPeriod("hour")
349	// MetricsPeriodDay is [insert doc].
350	MetricsPeriodDay = MetricsPeriod("day")
351	// MetricsPeriodWeek is [insert doc].
352	MetricsPeriodWeek = MetricsPeriod("week")
353	// MetricsPeriodMonth is [insert doc].
354	MetricsPeriodMonth = MetricsPeriod("month")
355	// MetricsPeriodYear is [insert doc].
356	MetricsPeriodYear = MetricsPeriod("year")
357)
358
359func (enum MetricsPeriod) String() string {
360	if enum == "" {
361		// return default value if empty
362		return "hour"
363	}
364	return string(enum)
365}
366
367func (enum MetricsPeriod) MarshalJSON() ([]byte, error) {
368	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
369}
370
371func (enum *MetricsPeriod) UnmarshalJSON(data []byte) error {
372	tmp := ""
373
374	if err := json.Unmarshal(data, &tmp); err != nil {
375		return err
376	}
377
378	*enum = MetricsPeriod(MetricsPeriod(tmp).String())
379	return nil
380}
381
382type NetworkNetworkType string
383
384const (
385	// NetworkNetworkTypeUnknown is [insert doc].
386	NetworkNetworkTypeUnknown = NetworkNetworkType("unknown")
387	// NetworkNetworkTypeSigfox is [insert doc].
388	NetworkNetworkTypeSigfox = NetworkNetworkType("sigfox")
389	// NetworkNetworkTypeRest is [insert doc].
390	NetworkNetworkTypeRest = NetworkNetworkType("rest")
391)
392
393func (enum NetworkNetworkType) String() string {
394	if enum == "" {
395		// return default value if empty
396		return "unknown"
397	}
398	return string(enum)
399}
400
401func (enum NetworkNetworkType) MarshalJSON() ([]byte, error) {
402	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
403}
404
405func (enum *NetworkNetworkType) UnmarshalJSON(data []byte) error {
406	tmp := ""
407
408	if err := json.Unmarshal(data, &tmp); err != nil {
409		return err
410	}
411
412	*enum = NetworkNetworkType(NetworkNetworkType(tmp).String())
413	return nil
414}
415
416type ProductPlan string
417
418const (
419	// ProductPlanPlanUnknown is [insert doc].
420	ProductPlanPlanUnknown = ProductPlan("plan_unknown")
421	// ProductPlanPlanShared is [insert doc].
422	ProductPlanPlanShared = ProductPlan("plan_shared")
423	// ProductPlanPlanDedicated is [insert doc].
424	ProductPlanPlanDedicated = ProductPlan("plan_dedicated")
425	// ProductPlanPlanHa is [insert doc].
426	ProductPlanPlanHa = ProductPlan("plan_ha")
427)
428
429func (enum ProductPlan) String() string {
430	if enum == "" {
431		// return default value if empty
432		return "plan_unknown"
433	}
434	return string(enum)
435}
436
437func (enum ProductPlan) MarshalJSON() ([]byte, error) {
438	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
439}
440
441func (enum *ProductPlan) UnmarshalJSON(data []byte) error {
442	tmp := ""
443
444	if err := json.Unmarshal(data, &tmp); err != nil {
445		return err
446	}
447
448	*enum = ProductPlan(ProductPlan(tmp).String())
449	return nil
450}
451
452type RestRouteHTTPVerb string
453
454const (
455	// RestRouteHTTPVerbGet is [insert doc].
456	RestRouteHTTPVerbGet = RestRouteHTTPVerb("get")
457	// RestRouteHTTPVerbPost is [insert doc].
458	RestRouteHTTPVerbPost = RestRouteHTTPVerb("post")
459	// RestRouteHTTPVerbPut is [insert doc].
460	RestRouteHTTPVerbPut = RestRouteHTTPVerb("put")
461	// RestRouteHTTPVerbPatch is [insert doc].
462	RestRouteHTTPVerbPatch = RestRouteHTTPVerb("patch")
463	// RestRouteHTTPVerbDelete is [insert doc].
464	RestRouteHTTPVerbDelete = RestRouteHTTPVerb("delete")
465)
466
467func (enum RestRouteHTTPVerb) String() string {
468	if enum == "" {
469		// return default value if empty
470		return "get"
471	}
472	return string(enum)
473}
474
475func (enum RestRouteHTTPVerb) MarshalJSON() ([]byte, error) {
476	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
477}
478
479func (enum *RestRouteHTTPVerb) UnmarshalJSON(data []byte) error {
480	tmp := ""
481
482	if err := json.Unmarshal(data, &tmp); err != nil {
483		return err
484	}
485
486	*enum = RestRouteHTTPVerb(RestRouteHTTPVerb(tmp).String())
487	return nil
488}
489
490type RouteRouteType string
491
492const (
493	// RouteRouteTypeUnknown is [insert doc].
494	RouteRouteTypeUnknown = RouteRouteType("unknown")
495	// RouteRouteTypeS3 is [insert doc].
496	RouteRouteTypeS3 = RouteRouteType("s3")
497	// RouteRouteTypeDatabase is [insert doc].
498	RouteRouteTypeDatabase = RouteRouteType("database")
499	// RouteRouteTypeRest is [insert doc].
500	RouteRouteTypeRest = RouteRouteType("rest")
501)
502
503func (enum RouteRouteType) String() string {
504	if enum == "" {
505		// return default value if empty
506		return "unknown"
507	}
508	return string(enum)
509}
510
511func (enum RouteRouteType) MarshalJSON() ([]byte, error) {
512	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
513}
514
515func (enum *RouteRouteType) UnmarshalJSON(data []byte) error {
516	tmp := ""
517
518	if err := json.Unmarshal(data, &tmp); err != nil {
519		return err
520	}
521
522	*enum = RouteRouteType(RouteRouteType(tmp).String())
523	return nil
524}
525
526type S3RouteStrategy string
527
528const (
529	// S3RouteStrategyPerTopic is [insert doc].
530	S3RouteStrategyPerTopic = S3RouteStrategy("per_topic")
531	// S3RouteStrategyPerMessage is [insert doc].
532	S3RouteStrategyPerMessage = S3RouteStrategy("per_message")
533)
534
535func (enum S3RouteStrategy) String() string {
536	if enum == "" {
537		// return default value if empty
538		return "per_topic"
539	}
540	return string(enum)
541}
542
543func (enum S3RouteStrategy) MarshalJSON() ([]byte, error) {
544	return []byte(fmt.Sprintf(`"%s"`, enum)), nil
545}
546
547func (enum *S3RouteStrategy) UnmarshalJSON(data []byte) error {
548	tmp := ""
549
550	if err := json.Unmarshal(data, &tmp); err != nil {
551		return err
552	}
553
554	*enum = S3RouteStrategy(S3RouteStrategy(tmp).String())
555	return nil
556}
557
558// CreateDeviceResponse: create device response
559type CreateDeviceResponse struct {
560	// Device: created device information
561	Device *Device `json:"device"`
562	// Crt: device certificate
563	Crt string `json:"crt"`
564	// Key: device certificate key
565	Key string `json:"key"`
566}
567
568// CreateNetworkResponse: create network response
569type CreateNetworkResponse struct {
570	// Network: created network
571	Network *Network `json:"network"`
572	// Secret: endpoint Key to keep secret. This cannot be retrieved later
573	Secret string `json:"secret"`
574}
575
576// DatabaseRoute: database route
577type DatabaseRoute struct {
578	// ID: route ID
579	ID string `json:"id"`
580	// Name: route name
581	Name string `json:"name"`
582	// OrganizationID: organization owning the route
583	OrganizationID string `json:"organization_id"`
584	// HubID: ID of the route's hub
585	HubID string `json:"hub_id"`
586	// Topic: topic the route subscribes to (wildcards allowed). It must be a valid MQTT topic and up to 65535 characters
587	Topic string `json:"topic"`
588	// CreatedAt: route creation date
589	CreatedAt *time.Time `json:"created_at"`
590	// Query: SQL query to be executed ($TOPIC and $PAYLOAD variables are available, see documentation)
591	Query string `json:"query"`
592	// Database: database settings
593	Database *DatabaseSettings `json:"database"`
594}
595
596// DatabaseSettings: database settings
597type DatabaseSettings struct {
598	// Host: database host
599	Host string `json:"host"`
600	// Port: database port
601	Port uint32 `json:"port"`
602	// Dbname: database name
603	Dbname string `json:"dbname"`
604	// Username: database username. Make sure this account can execute the provided query
605	Username string `json:"username"`
606	// Password: database password
607	Password string `json:"password"`
608}
609
610// Device: device
611type Device struct {
612	// ID: device ID, also used as MQTT Client ID or Username
613	ID string `json:"id"`
614	// Name: device name
615	Name string `json:"name"`
616	// Status: device status
617	//
618	// Default value: error
619	Status DeviceStatus `json:"status"`
620	// HubID: hub ID
621	HubID string `json:"hub_id"`
622	// LastActivityAt: device last connection/activity date
623	LastActivityAt *time.Time `json:"last_activity_at"`
624	// IsConnected: whether the device is connected to the Hub or not
625	IsConnected bool `json:"is_connected"`
626	// AllowInsecure: whether to allow device to connect without TLS mutual authentication
627	AllowInsecure bool `json:"allow_insecure"`
628	// AllowMultipleConnections: whether to allow multiple physical devices to connect with this device's credentials
629	AllowMultipleConnections bool `json:"allow_multiple_connections"`
630	// MessageFilters: filter-sets to restrict the topics the device can publish/subscribe to
631	MessageFilters *DeviceMessageFilters `json:"message_filters"`
632	// CreatedAt: device add date
633	CreatedAt *time.Time `json:"created_at"`
634	// UpdatedAt: device last modification date
635	UpdatedAt *time.Time `json:"updated_at"`
636	// OrganizationID: organization owning the resource
637	OrganizationID string `json:"organization_id"`
638}
639
640// DeviceMessageFilters: device message filters
641type DeviceMessageFilters struct {
642	// Publish: filter-set to restrict topics the device can publish to
643	Publish *DeviceMessageFiltersMessageFilterSet `json:"publish"`
644	// Subscribe: filter-set to restrict topics the device can subscribe to
645	Subscribe *DeviceMessageFiltersMessageFilterSet `json:"subscribe"`
646}
647
648type DeviceMessageFiltersMessageFilterSet struct {
649	// Policy:
650	//
651	// Default value: unknown
652	Policy DeviceMessageFiltersPolicy `json:"policy"`
653
654	Topics *[]string `json:"topics"`
655}
656
657// Hub: hub
658type Hub struct {
659	// ID: hub ID
660	ID string `json:"id"`
661	// Name: hub name
662	Name string `json:"name"`
663	// Status: current status of the Hub
664	//
665	// Default value: error
666	Status HubStatus `json:"status"`
667	// ProductPlan: hub feature set
668	//
669	// Default value: plan_unknown
670	ProductPlan ProductPlan `json:"product_plan"`
671	// Enabled: whether the hub has been enabled
672	Enabled bool `json:"enabled"`
673	// DeviceCount: number of registered devices
674	DeviceCount uint64 `json:"device_count"`
675	// ConnectedDeviceCount: number of currently connected devices
676	ConnectedDeviceCount uint64 `json:"connected_device_count"`
677	// Endpoint: host to connect your devices to
678	//
679	// Devices should be connected to this host, port may be 1883 (MQTT), 8883 (MQTT over TLS), 80 (MQTT over Websocket) or 443 (MQTT over Websocket over TLS).
680	Endpoint string `json:"endpoint"`
681	// EventsEnabled: wether Hub events are enabled or not
682	EventsEnabled bool `json:"events_enabled"`
683	// EventsTopicPrefix: hub events topic prefix
684	EventsTopicPrefix string `json:"events_topic_prefix"`
685	// Region: region of the Hub
686	Region scw.Region `json:"region"`
687	// CreatedAt: hub creation date
688	CreatedAt *time.Time `json:"created_at"`
689	// UpdatedAt: hub last modification date
690	UpdatedAt *time.Time `json:"updated_at"`
691	// OrganizationID: organization owning the resource
692	OrganizationID string `json:"organization_id"`
693}
694
695// ListDevicesResponse: list devices response
696type ListDevicesResponse struct {
697	// TotalCount: total number of devices
698	TotalCount uint32 `json:"total_count"`
699	// Devices: a page of devices
700	Devices []*Device `json:"devices"`
701}
702
703// ListHubsResponse: list hubs response
704type ListHubsResponse struct {
705	// TotalCount: total number of hubs
706	TotalCount uint32 `json:"total_count"`
707	// Hubs: a page of hubs
708	Hubs []*Hub `json:"hubs"`
709}
710
711// ListNetworksResponse: list networks response
712type ListNetworksResponse struct {
713	// TotalCount: total number of Networks
714	TotalCount uint32 `json:"total_count"`
715	// Networks: a page of networks
716	Networks []*Network `json:"networks"`
717}
718
719// ListRoutesResponse: list routes response
720type ListRoutesResponse struct {
721	// TotalCount: total number of routes
722	TotalCount uint32 `json:"total_count"`
723	// Routes: a page of routes
724	Routes []*Route `json:"routes"`
725}
726
727// Metrics: metrics
728type Metrics struct {
729	// Metrics: metrics for a hub or a device, over the requested period
730	Metrics []*MetricsMetric `json:"metrics"`
731}
732
733// MetricsMetric: metrics. metric
734type MetricsMetric struct {
735	// Name: metric name
736	Name string `json:"name"`
737	// Values: metric values over the selected period
738	Values []*MetricsMetricValue `json:"values"`
739}
740
741// MetricsMetricValue: metrics. metric. value
742type MetricsMetricValue struct {
743	// Time: timestamp for the value
744	Time *time.Time `json:"time"`
745	// Value: numeric value
746	Value int64 `json:"value"`
747}
748
749// Network: network
750type Network struct {
751	// ID: network ID
752	ID string `json:"id"`
753	// Name: network name
754	Name string `json:"name"`
755	// Type: type of network to connect with
756	//
757	// Default value: unknown
758	Type NetworkNetworkType `json:"type"`
759	// Endpoint: endpoint to use for interacting with the network
760	Endpoint string `json:"endpoint"`
761	// HubID: hub ID to connect the Network to
762	HubID string `json:"hub_id"`
763	// CreatedAt: network creation date
764	CreatedAt *time.Time `json:"created_at"`
765	// TopicPrefix: topic prefix for the Network
766	//
767	// This prefix will be prepended to all topics for this Network.
768	TopicPrefix string `json:"topic_prefix"`
769	// Region: region of the Network
770	Region scw.Region `json:"region"`
771	// OrganizationID: organization owning the resource
772	OrganizationID string `json:"organization_id"`
773}
774
775// RestRoute: rest route
776type RestRoute struct {
777	// ID: route ID
778	ID string `json:"id"`
779	// Name: route name
780	Name string `json:"name"`
781	// OrganizationID: organization owning the route
782	OrganizationID string `json:"organization_id"`
783	// HubID: ID of the route's hub
784	HubID string `json:"hub_id"`
785	// Topic: topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters
786	Topic string `json:"topic"`
787	// CreatedAt: route creation date
788	CreatedAt *time.Time `json:"created_at"`
789	// Verb: HTTP Verb used to call REST URI
790	//
791	// Default value: get
792	Verb RestRouteHTTPVerb `json:"verb"`
793	// URI: URI of the REST endpoint
794	URI string `json:"uri"`
795	// Headers: HTTP call extra headers
796	Headers map[string]string `json:"headers"`
797}
798
799// Route: route
800type Route struct {
801	// ID: route ID
802	ID string `json:"id"`
803	// Name: route name
804	Name string `json:"name"`
805	// OrganizationID: organization owning the resource
806	OrganizationID string `json:"organization_id"`
807	// HubID: ID of the route's hub
808	HubID string `json:"hub_id"`
809	// Topic: topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters
810	Topic string `json:"topic"`
811	// Type: route type
812	//
813	// Default value: unknown
814	Type RouteRouteType `json:"type"`
815	// CreatedAt: route creation date
816	CreatedAt *time.Time `json:"created_at"`
817}
818
819// S3Route: s3 route
820type S3Route struct {
821	// ID: route ID
822	ID string `json:"id"`
823	// Name: route name
824	Name string `json:"name"`
825	// OrganizationID: organization owning the route
826	OrganizationID string `json:"organization_id"`
827	// HubID: ID of the route's hub
828	HubID string `json:"hub_id"`
829	// Topic: topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters
830	Topic string `json:"topic"`
831	// CreatedAt: route creation date
832	CreatedAt *time.Time `json:"created_at"`
833	// BucketRegion: region of the S3 route's destination bucket (eg 'fr-par')
834	BucketRegion string `json:"bucket_region"`
835	// BucketName: name of the S3 route's destination bucket
836	BucketName string `json:"bucket_name"`
837	// ObjectPrefix: optional string to prefix object names with
838	ObjectPrefix string `json:"object_prefix"`
839	// Strategy: how the S3 route's objects will be created: one per topic or one per message
840	//
841	// Default value: per_topic
842	Strategy S3RouteStrategy `json:"strategy"`
843}
844
845// Service API
846
847type GetServiceInfoRequest struct {
848	Region scw.Region `json:"-"`
849}
850
851func (s *API) GetServiceInfo(req *GetServiceInfoRequest, opts ...scw.RequestOption) (*scw.ServiceInfo, error) {
852	var err error
853
854	if req.Region == "" {
855		defaultRegion, _ := s.client.GetDefaultRegion()
856		req.Region = defaultRegion
857	}
858
859	if fmt.Sprint(req.Region) == "" {
860		return nil, errors.New("field Region cannot be empty in request")
861	}
862
863	scwReq := &scw.ScalewayRequest{
864		Method:  "GET",
865		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "",
866		Headers: http.Header{},
867	}
868
869	var resp scw.ServiceInfo
870
871	err = s.client.Do(scwReq, &resp, opts...)
872	if err != nil {
873		return nil, err
874	}
875	return &resp, nil
876}
877
878type ListHubsRequest struct {
879	Region scw.Region `json:"-"`
880	// Page: page number
881	Page *int32 `json:"-"`
882	// PageSize: page size. The maximum value is 100
883	PageSize *uint32 `json:"-"`
884	// OrderBy: ordering of requested hub
885	//
886	// Default value: name_asc
887	OrderBy ListHubsRequestOrderBy `json:"-"`
888	// OrganizationID: filter on the organization
889	OrganizationID *string `json:"-"`
890	// Name: filter on the name
891	Name *string `json:"-"`
892}
893
894// ListHubs: list hubs
895func (s *API) ListHubs(req *ListHubsRequest, opts ...scw.RequestOption) (*ListHubsResponse, error) {
896	var err error
897
898	if req.Region == "" {
899		defaultRegion, _ := s.client.GetDefaultRegion()
900		req.Region = defaultRegion
901	}
902
903	defaultPageSize, exist := s.client.GetDefaultPageSize()
904	if (req.PageSize == nil || *req.PageSize == 0) && exist {
905		req.PageSize = &defaultPageSize
906	}
907
908	query := url.Values{}
909	parameter.AddToQuery(query, "page", req.Page)
910	parameter.AddToQuery(query, "page_size", req.PageSize)
911	parameter.AddToQuery(query, "order_by", req.OrderBy)
912	parameter.AddToQuery(query, "organization_id", req.OrganizationID)
913	parameter.AddToQuery(query, "name", req.Name)
914
915	if fmt.Sprint(req.Region) == "" {
916		return nil, errors.New("field Region cannot be empty in request")
917	}
918
919	scwReq := &scw.ScalewayRequest{
920		Method:  "GET",
921		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs",
922		Query:   query,
923		Headers: http.Header{},
924	}
925
926	var resp ListHubsResponse
927
928	err = s.client.Do(scwReq, &resp, opts...)
929	if err != nil {
930		return nil, err
931	}
932	return &resp, nil
933}
934
935// UnsafeGetTotalCount should not be used
936// Internal usage only
937func (r *ListHubsResponse) UnsafeGetTotalCount() uint32 {
938	return r.TotalCount
939}
940
941// UnsafeAppend should not be used
942// Internal usage only
943func (r *ListHubsResponse) UnsafeAppend(res interface{}) (uint32, error) {
944	results, ok := res.(*ListHubsResponse)
945	if !ok {
946		return 0, errors.New("%T type cannot be appended to type %T", res, r)
947	}
948
949	r.Hubs = append(r.Hubs, results.Hubs...)
950	r.TotalCount += uint32(len(results.Hubs))
951	return uint32(len(results.Hubs)), nil
952}
953
954type CreateHubRequest struct {
955	Region scw.Region `json:"-"`
956	// Name: hub name (up to 255 characters)
957	Name string `json:"name"`
958	// OrganizationID: organization owning the resource
959	OrganizationID string `json:"organization_id"`
960	// ProductPlan: hub feature set
961	//
962	// Default value: plan_shared
963	ProductPlan ProductPlan `json:"product_plan"`
964	// DisableEvents: disable Hub events (default false)
965	DisableEvents *bool `json:"disable_events"`
966	// EventsTopicPrefix: hub events topic prefix (default '$SCW/events')
967	EventsTopicPrefix *string `json:"events_topic_prefix"`
968}
969
970// CreateHub: create a hub
971func (s *API) CreateHub(req *CreateHubRequest, opts ...scw.RequestOption) (*Hub, error) {
972	var err error
973
974	if req.OrganizationID == "" {
975		defaultOrganizationID, _ := s.client.GetDefaultOrganizationID()
976		req.OrganizationID = defaultOrganizationID
977	}
978
979	if req.Region == "" {
980		defaultRegion, _ := s.client.GetDefaultRegion()
981		req.Region = defaultRegion
982	}
983
984	if req.Name == "" {
985		req.Name = namegenerator.GetRandomName("hub")
986	}
987
988	if fmt.Sprint(req.Region) == "" {
989		return nil, errors.New("field Region cannot be empty in request")
990	}
991
992	scwReq := &scw.ScalewayRequest{
993		Method:  "POST",
994		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs",
995		Headers: http.Header{},
996	}
997
998	err = scwReq.SetBody(req)
999	if err != nil {
1000		return nil, err
1001	}
1002
1003	var resp Hub
1004
1005	err = s.client.Do(scwReq, &resp, opts...)
1006	if err != nil {
1007		return nil, err
1008	}
1009	return &resp, nil
1010}
1011
1012type GetHubRequest struct {
1013	Region scw.Region `json:"-"`
1014	// HubID: hub ID
1015	HubID string `json:"-"`
1016}
1017
1018// GetHub: get a hub
1019func (s *API) GetHub(req *GetHubRequest, opts ...scw.RequestOption) (*Hub, error) {
1020	var err error
1021
1022	if req.Region == "" {
1023		defaultRegion, _ := s.client.GetDefaultRegion()
1024		req.Region = defaultRegion
1025	}
1026
1027	if fmt.Sprint(req.Region) == "" {
1028		return nil, errors.New("field Region cannot be empty in request")
1029	}
1030
1031	if fmt.Sprint(req.HubID) == "" {
1032		return nil, errors.New("field HubID cannot be empty in request")
1033	}
1034
1035	scwReq := &scw.ScalewayRequest{
1036		Method:  "GET",
1037		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs/" + fmt.Sprint(req.HubID) + "",
1038		Headers: http.Header{},
1039	}
1040
1041	var resp Hub
1042
1043	err = s.client.Do(scwReq, &resp, opts...)
1044	if err != nil {
1045		return nil, err
1046	}
1047	return &resp, nil
1048}
1049
1050type UpdateHubRequest struct {
1051	Region scw.Region `json:"-"`
1052	// HubID: hub ID
1053	HubID string `json:"-"`
1054	// Name: hub name (up to 255 characters)
1055	Name *string `json:"name"`
1056	// ProductPlan: hub feature set
1057	//
1058	// Default value: plan_unknown
1059	ProductPlan ProductPlan `json:"product_plan"`
1060	// DisableEvents: disable Hub events
1061	DisableEvents *bool `json:"disable_events"`
1062	// EventsTopicPrefix: hub events topic prefix
1063	EventsTopicPrefix *string `json:"events_topic_prefix"`
1064}
1065
1066// UpdateHub: update a hub
1067func (s *API) UpdateHub(req *UpdateHubRequest, opts ...scw.RequestOption) (*Hub, error) {
1068	var err error
1069
1070	if req.Region == "" {
1071		defaultRegion, _ := s.client.GetDefaultRegion()
1072		req.Region = defaultRegion
1073	}
1074
1075	if fmt.Sprint(req.Region) == "" {
1076		return nil, errors.New("field Region cannot be empty in request")
1077	}
1078
1079	if fmt.Sprint(req.HubID) == "" {
1080		return nil, errors.New("field HubID cannot be empty in request")
1081	}
1082
1083	scwReq := &scw.ScalewayRequest{
1084		Method:  "PATCH",
1085		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs/" + fmt.Sprint(req.HubID) + "",
1086		Headers: http.Header{},
1087	}
1088
1089	err = scwReq.SetBody(req)
1090	if err != nil {
1091		return nil, err
1092	}
1093
1094	var resp Hub
1095
1096	err = s.client.Do(scwReq, &resp, opts...)
1097	if err != nil {
1098		return nil, err
1099	}
1100	return &resp, nil
1101}
1102
1103type EnableHubRequest struct {
1104	Region scw.Region `json:"-"`
1105	// HubID: hub ID
1106	HubID string `json:"-"`
1107}
1108
1109// EnableHub: enable a hub
1110func (s *API) EnableHub(req *EnableHubRequest, opts ...scw.RequestOption) (*Hub, error) {
1111	var err error
1112
1113	if req.Region == "" {
1114		defaultRegion, _ := s.client.GetDefaultRegion()
1115		req.Region = defaultRegion
1116	}
1117
1118	if fmt.Sprint(req.Region) == "" {
1119		return nil, errors.New("field Region cannot be empty in request")
1120	}
1121
1122	if fmt.Sprint(req.HubID) == "" {
1123		return nil, errors.New("field HubID cannot be empty in request")
1124	}
1125
1126	scwReq := &scw.ScalewayRequest{
1127		Method:  "POST",
1128		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs/" + fmt.Sprint(req.HubID) + "/enable",
1129		Headers: http.Header{},
1130	}
1131
1132	var resp Hub
1133
1134	err = s.client.Do(scwReq, &resp, opts...)
1135	if err != nil {
1136		return nil, err
1137	}
1138	return &resp, nil
1139}
1140
1141type DisableHubRequest struct {
1142	Region scw.Region `json:"-"`
1143	// HubID: hub ID
1144	HubID string `json:"-"`
1145}
1146
1147// DisableHub: disable a hub
1148func (s *API) DisableHub(req *DisableHubRequest, opts ...scw.RequestOption) (*Hub, error) {
1149	var err error
1150
1151	if req.Region == "" {
1152		defaultRegion, _ := s.client.GetDefaultRegion()
1153		req.Region = defaultRegion
1154	}
1155
1156	if fmt.Sprint(req.Region) == "" {
1157		return nil, errors.New("field Region cannot be empty in request")
1158	}
1159
1160	if fmt.Sprint(req.HubID) == "" {
1161		return nil, errors.New("field HubID cannot be empty in request")
1162	}
1163
1164	scwReq := &scw.ScalewayRequest{
1165		Method:  "POST",
1166		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs/" + fmt.Sprint(req.HubID) + "/disable",
1167		Headers: http.Header{},
1168	}
1169
1170	var resp Hub
1171
1172	err = s.client.Do(scwReq, &resp, opts...)
1173	if err != nil {
1174		return nil, err
1175	}
1176	return &resp, nil
1177}
1178
1179type DeleteHubRequest struct {
1180	Region scw.Region `json:"-"`
1181	// HubID: hub ID
1182	HubID string `json:"-"`
1183	// DeleteDevices: force deletion of devices added to this hub instead of rejecting operation
1184	DeleteDevices *bool `json:"delete_devices"`
1185}
1186
1187// DeleteHub: delete a hub
1188func (s *API) DeleteHub(req *DeleteHubRequest, opts ...scw.RequestOption) error {
1189	var err error
1190
1191	if req.Region == "" {
1192		defaultRegion, _ := s.client.GetDefaultRegion()
1193		req.Region = defaultRegion
1194	}
1195
1196	if fmt.Sprint(req.Region) == "" {
1197		return errors.New("field Region cannot be empty in request")
1198	}
1199
1200	if fmt.Sprint(req.HubID) == "" {
1201		return errors.New("field HubID cannot be empty in request")
1202	}
1203
1204	scwReq := &scw.ScalewayRequest{
1205		Method:  "DELETE",
1206		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs/" + fmt.Sprint(req.HubID) + "",
1207		Headers: http.Header{},
1208	}
1209
1210	err = scwReq.SetBody(req)
1211	if err != nil {
1212		return err
1213	}
1214
1215	err = s.client.Do(scwReq, nil, opts...)
1216	if err != nil {
1217		return err
1218	}
1219	return nil
1220}
1221
1222type GetHubMetricsRequest struct {
1223	Region scw.Region `json:"-"`
1224	// HubID: hub ID
1225	HubID string `json:"-"`
1226	// Period: period over which the metrics span
1227	//
1228	// Default value: hour
1229	Period MetricsPeriod `json:"-"`
1230}
1231
1232// GetHubMetrics: get a hub's metrics
1233func (s *API) GetHubMetrics(req *GetHubMetricsRequest, opts ...scw.RequestOption) (*Metrics, error) {
1234	var err error
1235
1236	if req.Region == "" {
1237		defaultRegion, _ := s.client.GetDefaultRegion()
1238		req.Region = defaultRegion
1239	}
1240
1241	query := url.Values{}
1242	parameter.AddToQuery(query, "period", req.Period)
1243
1244	if fmt.Sprint(req.Region) == "" {
1245		return nil, errors.New("field Region cannot be empty in request")
1246	}
1247
1248	if fmt.Sprint(req.HubID) == "" {
1249		return nil, errors.New("field HubID cannot be empty in request")
1250	}
1251
1252	scwReq := &scw.ScalewayRequest{
1253		Method:  "GET",
1254		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/hubs/" + fmt.Sprint(req.HubID) + "/metrics",
1255		Query:   query,
1256		Headers: http.Header{},
1257	}
1258
1259	var resp Metrics
1260
1261	err = s.client.Do(scwReq, &resp, opts...)
1262	if err != nil {
1263		return nil, err
1264	}
1265	return &resp, nil
1266}
1267
1268type ListDevicesRequest struct {
1269	Region scw.Region `json:"-"`
1270	// Page: page number
1271	Page *int32 `json:"-"`
1272	// PageSize: page size. The maximum value is 100
1273	PageSize *uint32 `json:"-"`
1274	// OrderBy: ordering of requested devices
1275	//
1276	// Default value: name_asc
1277	OrderBy ListDevicesRequestOrderBy `json:"-"`
1278	// OrganizationID: filter on the organization
1279	OrganizationID *string `json:"-"`
1280	// Name: filter on the name
1281	Name *string `json:"-"`
1282	// HubID: filter on the hub
1283	HubID *string `json:"-"`
1284	// Deprecated: Enabled: deprecated, ignored filter
1285	Enabled *bool `json:"-"`
1286	// AllowInsecure: filter on the allow_insecure flag
1287	AllowInsecure *bool `json:"-"`
1288	// Deprecated: IsConnected: deprecated, ignored filter
1289	IsConnected *bool `json:"-"`
1290}
1291
1292// ListDevices: list devices
1293func (s *API) ListDevices(req *ListDevicesRequest, opts ...scw.RequestOption) (*ListDevicesResponse, error) {
1294	var err error
1295
1296	if req.Region == "" {
1297		defaultRegion, _ := s.client.GetDefaultRegion()
1298		req.Region = defaultRegion
1299	}
1300
1301	defaultPageSize, exist := s.client.GetDefaultPageSize()
1302	if (req.PageSize == nil || *req.PageSize == 0) && exist {
1303		req.PageSize = &defaultPageSize
1304	}
1305
1306	query := url.Values{}
1307	parameter.AddToQuery(query, "page", req.Page)
1308	parameter.AddToQuery(query, "page_size", req.PageSize)
1309	parameter.AddToQuery(query, "order_by", req.OrderBy)
1310	parameter.AddToQuery(query, "organization_id", req.OrganizationID)
1311	parameter.AddToQuery(query, "name", req.Name)
1312	parameter.AddToQuery(query, "hub_id", req.HubID)
1313	parameter.AddToQuery(query, "enabled", req.Enabled)
1314	parameter.AddToQuery(query, "allow_insecure", req.AllowInsecure)
1315	parameter.AddToQuery(query, "is_connected", req.IsConnected)
1316
1317	if fmt.Sprint(req.Region) == "" {
1318		return nil, errors.New("field Region cannot be empty in request")
1319	}
1320
1321	scwReq := &scw.ScalewayRequest{
1322		Method:  "GET",
1323		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices",
1324		Query:   query,
1325		Headers: http.Header{},
1326	}
1327
1328	var resp ListDevicesResponse
1329
1330	err = s.client.Do(scwReq, &resp, opts...)
1331	if err != nil {
1332		return nil, err
1333	}
1334	return &resp, nil
1335}
1336
1337// UnsafeGetTotalCount should not be used
1338// Internal usage only
1339func (r *ListDevicesResponse) UnsafeGetTotalCount() uint32 {
1340	return r.TotalCount
1341}
1342
1343// UnsafeAppend should not be used
1344// Internal usage only
1345func (r *ListDevicesResponse) UnsafeAppend(res interface{}) (uint32, error) {
1346	results, ok := res.(*ListDevicesResponse)
1347	if !ok {
1348		return 0, errors.New("%T type cannot be appended to type %T", res, r)
1349	}
1350
1351	r.Devices = append(r.Devices, results.Devices...)
1352	r.TotalCount += uint32(len(results.Devices))
1353	return uint32(len(results.Devices)), nil
1354}
1355
1356type CreateDeviceRequest struct {
1357	Region scw.Region `json:"-"`
1358	// Name: device name
1359	Name string `json:"name"`
1360	// HubID: ID of the device's hub
1361	HubID string `json:"hub_id"`
1362	// AllowInsecure: allow plain and server-authenticated SSL connections in addition to mutually-authenticated ones
1363	AllowInsecure bool `json:"allow_insecure"`
1364	// AllowMultipleConnections: allow multiple physical devices to connect with this device's credentials
1365	AllowMultipleConnections bool `json:"allow_multiple_connections"`
1366	// MessageFilters: filter-sets to authorize or deny the device to publish/subscribe to specific topics
1367	MessageFilters *DeviceMessageFilters `json:"message_filters"`
1368}
1369
1370// CreateDevice: add a device
1371func (s *API) CreateDevice(req *CreateDeviceRequest, opts ...scw.RequestOption) (*CreateDeviceResponse, error) {
1372	var err error
1373
1374	if req.Region == "" {
1375		defaultRegion, _ := s.client.GetDefaultRegion()
1376		req.Region = defaultRegion
1377	}
1378
1379	if req.Name == "" {
1380		req.Name = namegenerator.GetRandomName("device")
1381	}
1382
1383	if fmt.Sprint(req.Region) == "" {
1384		return nil, errors.New("field Region cannot be empty in request")
1385	}
1386
1387	scwReq := &scw.ScalewayRequest{
1388		Method:  "POST",
1389		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices",
1390		Headers: http.Header{},
1391	}
1392
1393	err = scwReq.SetBody(req)
1394	if err != nil {
1395		return nil, err
1396	}
1397
1398	var resp CreateDeviceResponse
1399
1400	err = s.client.Do(scwReq, &resp, opts...)
1401	if err != nil {
1402		return nil, err
1403	}
1404	return &resp, nil
1405}
1406
1407type GetDeviceRequest struct {
1408	Region scw.Region `json:"-"`
1409	// DeviceID: device ID
1410	DeviceID string `json:"-"`
1411}
1412
1413// GetDevice: get a device
1414func (s *API) GetDevice(req *GetDeviceRequest, opts ...scw.RequestOption) (*Device, error) {
1415	var err error
1416
1417	if req.Region == "" {
1418		defaultRegion, _ := s.client.GetDefaultRegion()
1419		req.Region = defaultRegion
1420	}
1421
1422	if fmt.Sprint(req.Region) == "" {
1423		return nil, errors.New("field Region cannot be empty in request")
1424	}
1425
1426	if fmt.Sprint(req.DeviceID) == "" {
1427		return nil, errors.New("field DeviceID cannot be empty in request")
1428	}
1429
1430	scwReq := &scw.ScalewayRequest{
1431		Method:  "GET",
1432		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices/" + fmt.Sprint(req.DeviceID) + "",
1433		Headers: http.Header{},
1434	}
1435
1436	var resp Device
1437
1438	err = s.client.Do(scwReq, &resp, opts...)
1439	if err != nil {
1440		return nil, err
1441	}
1442	return &resp, nil
1443}
1444
1445type UpdateDeviceRequest struct {
1446	Region scw.Region `json:"-"`
1447	// DeviceID: device ID
1448	DeviceID string `json:"-"`
1449	// Name: device name
1450	Name *string `json:"name"`
1451	// AllowInsecure: allow plain and server-authenticated SSL connections in addition to mutually-authenticated ones
1452	AllowInsecure *bool `json:"allow_insecure"`
1453	// AllowMultipleConnections: allow multiple physical devices to connect with this device's credentials
1454	AllowMultipleConnections *bool `json:"allow_multiple_connections"`
1455	// MessageFilters: filter-sets to restrict the topics the device can publish/subscribe to
1456	MessageFilters *DeviceMessageFilters `json:"message_filters"`
1457	// HubID: change Hub for this device, additional fees may apply, see IoT Hub pricing
1458	HubID *string `json:"hub_id"`
1459}
1460
1461// UpdateDevice: update a device
1462func (s *API) UpdateDevice(req *UpdateDeviceRequest, opts ...scw.RequestOption) (*Device, error) {
1463	var err error
1464
1465	if req.Region == "" {
1466		defaultRegion, _ := s.client.GetDefaultRegion()
1467		req.Region = defaultRegion
1468	}
1469
1470	if fmt.Sprint(req.Region) == "" {
1471		return nil, errors.New("field Region cannot be empty in request")
1472	}
1473
1474	if fmt.Sprint(req.DeviceID) == "" {
1475		return nil, errors.New("field DeviceID cannot be empty in request")
1476	}
1477
1478	scwReq := &scw.ScalewayRequest{
1479		Method:  "PATCH",
1480		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices/" + fmt.Sprint(req.DeviceID) + "",
1481		Headers: http.Header{},
1482	}
1483
1484	err = scwReq.SetBody(req)
1485	if err != nil {
1486		return nil, err
1487	}
1488
1489	var resp Device
1490
1491	err = s.client.Do(scwReq, &resp, opts...)
1492	if err != nil {
1493		return nil, err
1494	}
1495	return &resp, nil
1496}
1497
1498type EnableDeviceRequest struct {
1499	Region scw.Region `json:"-"`
1500	// DeviceID: device ID
1501	DeviceID string `json:"-"`
1502}
1503
1504// EnableDevice: enable a device
1505func (s *API) EnableDevice(req *EnableDeviceRequest, opts ...scw.RequestOption) (*Device, error) {
1506	var err error
1507
1508	if req.Region == "" {
1509		defaultRegion, _ := s.client.GetDefaultRegion()
1510		req.Region = defaultRegion
1511	}
1512
1513	if fmt.Sprint(req.Region) == "" {
1514		return nil, errors.New("field Region cannot be empty in request")
1515	}
1516
1517	if fmt.Sprint(req.DeviceID) == "" {
1518		return nil, errors.New("field DeviceID cannot be empty in request")
1519	}
1520
1521	scwReq := &scw.ScalewayRequest{
1522		Method:  "POST",
1523		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices/" + fmt.Sprint(req.DeviceID) + "/enable",
1524		Headers: http.Header{},
1525	}
1526
1527	var resp Device
1528
1529	err = s.client.Do(scwReq, &resp, opts...)
1530	if err != nil {
1531		return nil, err
1532	}
1533	return &resp, nil
1534}
1535
1536type DisableDeviceRequest struct {
1537	Region scw.Region `json:"-"`
1538	// DeviceID: device ID
1539	DeviceID string `json:"-"`
1540}
1541
1542// DisableDevice: disable a device
1543func (s *API) DisableDevice(req *DisableDeviceRequest, opts ...scw.RequestOption) (*Device, error) {
1544	var err error
1545
1546	if req.Region == "" {
1547		defaultRegion, _ := s.client.GetDefaultRegion()
1548		req.Region = defaultRegion
1549	}
1550
1551	if fmt.Sprint(req.Region) == "" {
1552		return nil, errors.New("field Region cannot be empty in request")
1553	}
1554
1555	if fmt.Sprint(req.DeviceID) == "" {
1556		return nil, errors.New("field DeviceID cannot be empty in request")
1557	}
1558
1559	scwReq := &scw.ScalewayRequest{
1560		Method:  "POST",
1561		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices/" + fmt.Sprint(req.DeviceID) + "/disable",
1562		Headers: http.Header{},
1563	}
1564
1565	var resp Device
1566
1567	err = s.client.Do(scwReq, &resp, opts...)
1568	if err != nil {
1569		return nil, err
1570	}
1571	return &resp, nil
1572}
1573
1574type DeleteDeviceRequest struct {
1575	Region scw.Region `json:"-"`
1576	// DeviceID: device ID
1577	DeviceID string `json:"-"`
1578}
1579
1580// DeleteDevice: remove a device
1581func (s *API) DeleteDevice(req *DeleteDeviceRequest, opts ...scw.RequestOption) error {
1582	var err error
1583
1584	if req.Region == "" {
1585		defaultRegion, _ := s.client.GetDefaultRegion()
1586		req.Region = defaultRegion
1587	}
1588
1589	if fmt.Sprint(req.Region) == "" {
1590		return errors.New("field Region cannot be empty in request")
1591	}
1592
1593	if fmt.Sprint(req.DeviceID) == "" {
1594		return errors.New("field DeviceID cannot be empty in request")
1595	}
1596
1597	scwReq := &scw.ScalewayRequest{
1598		Method:  "DELETE",
1599		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices/" + fmt.Sprint(req.DeviceID) + "",
1600		Headers: http.Header{},
1601	}
1602
1603	err = s.client.Do(scwReq, nil, opts...)
1604	if err != nil {
1605		return err
1606	}
1607	return nil
1608}
1609
1610type GetDeviceMetricsRequest struct {
1611	Region scw.Region `json:"-"`
1612	// DeviceID: device ID
1613	DeviceID string `json:"-"`
1614	// Period: period over which the metrics span
1615	//
1616	// Default value: hour
1617	Period MetricsPeriod `json:"-"`
1618}
1619
1620// GetDeviceMetrics: get a device's metrics
1621func (s *API) GetDeviceMetrics(req *GetDeviceMetricsRequest, opts ...scw.RequestOption) (*Metrics, error) {
1622	var err error
1623
1624	if req.Region == "" {
1625		defaultRegion, _ := s.client.GetDefaultRegion()
1626		req.Region = defaultRegion
1627	}
1628
1629	query := url.Values{}
1630	parameter.AddToQuery(query, "period", req.Period)
1631
1632	if fmt.Sprint(req.Region) == "" {
1633		return nil, errors.New("field Region cannot be empty in request")
1634	}
1635
1636	if fmt.Sprint(req.DeviceID) == "" {
1637		return nil, errors.New("field DeviceID cannot be empty in request")
1638	}
1639
1640	scwReq := &scw.ScalewayRequest{
1641		Method:  "GET",
1642		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/devices/" + fmt.Sprint(req.DeviceID) + "/metrics",
1643		Query:   query,
1644		Headers: http.Header{},
1645	}
1646
1647	var resp Metrics
1648
1649	err = s.client.Do(scwReq, &resp, opts...)
1650	if err != nil {
1651		return nil, err
1652	}
1653	return &resp, nil
1654}
1655
1656type ListRoutesRequest struct {
1657	Region scw.Region `json:"-"`
1658	// Page: page number
1659	Page *int32 `json:"-"`
1660	// PageSize: page size. The maximum value is 100
1661	PageSize *uint32 `json:"-"`
1662	// OrderBy: ordering of requested routes
1663	//
1664	// Default value: name_asc
1665	OrderBy ListRoutesRequestOrderBy `json:"-"`
1666	// OrganizationID: filter on the organization
1667	OrganizationID *string `json:"-"`
1668	// HubID: filter on the hub
1669	HubID *string `json:"-"`
1670	// Name: filter on route's name
1671	Name *string `json:"-"`
1672}
1673
1674// ListRoutes: list routes
1675func (s *API) ListRoutes(req *ListRoutesRequest, opts ...scw.RequestOption) (*ListRoutesResponse, error) {
1676	var err error
1677
1678	if req.Region == "" {
1679		defaultRegion, _ := s.client.GetDefaultRegion()
1680		req.Region = defaultRegion
1681	}
1682
1683	defaultPageSize, exist := s.client.GetDefaultPageSize()
1684	if (req.PageSize == nil || *req.PageSize == 0) && exist {
1685		req.PageSize = &defaultPageSize
1686	}
1687
1688	query := url.Values{}
1689	parameter.AddToQuery(query, "page", req.Page)
1690	parameter.AddToQuery(query, "page_size", req.PageSize)
1691	parameter.AddToQuery(query, "order_by", req.OrderBy)
1692	parameter.AddToQuery(query, "organization_id", req.OrganizationID)
1693	parameter.AddToQuery(query, "hub_id", req.HubID)
1694	parameter.AddToQuery(query, "name", req.Name)
1695
1696	if fmt.Sprint(req.Region) == "" {
1697		return nil, errors.New("field Region cannot be empty in request")
1698	}
1699
1700	scwReq := &scw.ScalewayRequest{
1701		Method:  "GET",
1702		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes",
1703		Query:   query,
1704		Headers: http.Header{},
1705	}
1706
1707	var resp ListRoutesResponse
1708
1709	err = s.client.Do(scwReq, &resp, opts...)
1710	if err != nil {
1711		return nil, err
1712	}
1713	return &resp, nil
1714}
1715
1716// UnsafeGetTotalCount should not be used
1717// Internal usage only
1718func (r *ListRoutesResponse) UnsafeGetTotalCount() uint32 {
1719	return r.TotalCount
1720}
1721
1722// UnsafeAppend should not be used
1723// Internal usage only
1724func (r *ListRoutesResponse) UnsafeAppend(res interface{}) (uint32, error) {
1725	results, ok := res.(*ListRoutesResponse)
1726	if !ok {
1727		return 0, errors.New("%T type cannot be appended to type %T", res, r)
1728	}
1729
1730	r.Routes = append(r.Routes, results.Routes...)
1731	r.TotalCount += uint32(len(results.Routes))
1732	return uint32(len(results.Routes)), nil
1733}
1734
1735type CreateS3RouteRequest struct {
1736	Region scw.Region `json:"-"`
1737	// Name: name of the route
1738	Name string `json:"name"`
1739	// HubID: ID of the route's hub
1740	HubID string `json:"hub_id"`
1741	// Topic: topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters
1742	Topic string `json:"topic"`
1743	// BucketRegion: region of the S3 route's destination bucket (eg 'fr-par')
1744	BucketRegion string `json:"bucket_region"`
1745	// BucketName: name of the S3 route's destination bucket
1746	BucketName string `json:"bucket_name"`
1747	// ObjectPrefix: optional string to prefix object names with
1748	ObjectPrefix string `json:"object_prefix"`
1749	// Strategy: how the S3 route's objects will be created: one per topic or one per message
1750	//
1751	// Default value: per_topic
1752	Strategy S3RouteStrategy `json:"strategy"`
1753}
1754
1755// CreateS3Route: create an S3 route
1756//
1757// Create a route that will put subscribed MQTT messages into an S3 bucket.
1758// You need to create the bucket yourself and grant us write access:
1759// ```bash
1760// > s3cmd setacl s3://<my-bucket> --acl-grant=write:555c69c3-87d0-4bf8-80f1-99a2f757d031:555c69c3-87d0-4bf8-80f1-99a2f757d031
1761// ```
1762//
1763func (s *API) CreateS3Route(req *CreateS3RouteRequest, opts ...scw.RequestOption) (*S3Route, error) {
1764	var err error
1765
1766	if req.Region == "" {
1767		defaultRegion, _ := s.client.GetDefaultRegion()
1768		req.Region = defaultRegion
1769	}
1770
1771	if fmt.Sprint(req.Region) == "" {
1772		return nil, errors.New("field Region cannot be empty in request")
1773	}
1774
1775	scwReq := &scw.ScalewayRequest{
1776		Method:  "POST",
1777		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/s3",
1778		Headers: http.Header{},
1779	}
1780
1781	err = scwReq.SetBody(req)
1782	if err != nil {
1783		return nil, err
1784	}
1785
1786	var resp S3Route
1787
1788	err = s.client.Do(scwReq, &resp, opts...)
1789	if err != nil {
1790		return nil, err
1791	}
1792	return &resp, nil
1793}
1794
1795type GetS3RouteRequest struct {
1796	Region scw.Region `json:"-"`
1797	// RouteID: route ID
1798	RouteID string `json:"-"`
1799}
1800
1801// GetS3Route: get an S3 route
1802func (s *API) GetS3Route(req *GetS3RouteRequest, opts ...scw.RequestOption) (*S3Route, error) {
1803	var err error
1804
1805	if req.Region == "" {
1806		defaultRegion, _ := s.client.GetDefaultRegion()
1807		req.Region = defaultRegion
1808	}
1809
1810	if fmt.Sprint(req.Region) == "" {
1811		return nil, errors.New("field Region cannot be empty in request")
1812	}
1813
1814	if fmt.Sprint(req.RouteID) == "" {
1815		return nil, errors.New("field RouteID cannot be empty in request")
1816	}
1817
1818	scwReq := &scw.ScalewayRequest{
1819		Method:  "GET",
1820		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/s3/" + fmt.Sprint(req.RouteID) + "",
1821		Headers: http.Header{},
1822	}
1823
1824	var resp S3Route
1825
1826	err = s.client.Do(scwReq, &resp, opts...)
1827	if err != nil {
1828		return nil, err
1829	}
1830	return &resp, nil
1831}
1832
1833type DeleteS3RouteRequest struct {
1834	Region scw.Region `json:"-"`
1835	// RouteID: route ID
1836	RouteID string `json:"-"`
1837}
1838
1839// DeleteS3Route: delete an S3 route
1840func (s *API) DeleteS3Route(req *DeleteS3RouteRequest, opts ...scw.RequestOption) error {
1841	var err error
1842
1843	if req.Region == "" {
1844		defaultRegion, _ := s.client.GetDefaultRegion()
1845		req.Region = defaultRegion
1846	}
1847
1848	if fmt.Sprint(req.Region) == "" {
1849		return errors.New("field Region cannot be empty in request")
1850	}
1851
1852	if fmt.Sprint(req.RouteID) == "" {
1853		return errors.New("field RouteID cannot be empty in request")
1854	}
1855
1856	scwReq := &scw.ScalewayRequest{
1857		Method:  "DELETE",
1858		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/s3/" + fmt.Sprint(req.RouteID) + "",
1859		Headers: http.Header{},
1860	}
1861
1862	err = s.client.Do(scwReq, nil, opts...)
1863	if err != nil {
1864		return err
1865	}
1866	return nil
1867}
1868
1869type CreateDatabaseRouteRequest struct {
1870	Region scw.Region `json:"-"`
1871	// Name: name of the route
1872	Name string `json:"name"`
1873	// HubID: ID of the route's hub
1874	HubID string `json:"hub_id"`
1875	// Topic: topic the route subscribes to (wildcards allowed). It must be a valid MQTT topic and up to 65535 characters
1876	Topic string `json:"topic"`
1877	// Query: SQL query to be executed ($TOPIC and $PAYLOAD variables are available, see documentation)
1878	Query string `json:"query"`
1879	// Database: database settings
1880	Database *DatabaseSettings `json:"database"`
1881}
1882
1883// CreateDatabaseRoute: create a Database route
1884//
1885// Create a route that will record subscribed MQTT messages into your database.
1886// <b>You need to manage the database by yourself</b>.
1887//
1888func (s *API) CreateDatabaseRoute(req *CreateDatabaseRouteRequest, opts ...scw.RequestOption) (*DatabaseRoute, error) {
1889	var err error
1890
1891	if req.Region == "" {
1892		defaultRegion, _ := s.client.GetDefaultRegion()
1893		req.Region = defaultRegion
1894	}
1895
1896	if fmt.Sprint(req.Region) == "" {
1897		return nil, errors.New("field Region cannot be empty in request")
1898	}
1899
1900	scwReq := &scw.ScalewayRequest{
1901		Method:  "POST",
1902		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/database",
1903		Headers: http.Header{},
1904	}
1905
1906	err = scwReq.SetBody(req)
1907	if err != nil {
1908		return nil, err
1909	}
1910
1911	var resp DatabaseRoute
1912
1913	err = s.client.Do(scwReq, &resp, opts...)
1914	if err != nil {
1915		return nil, err
1916	}
1917	return &resp, nil
1918}
1919
1920type GetDatabaseRouteRequest struct {
1921	Region scw.Region `json:"-"`
1922	// RouteID: route ID
1923	RouteID string `json:"-"`
1924}
1925
1926// GetDatabaseRoute: get a Database route
1927func (s *API) GetDatabaseRoute(req *GetDatabaseRouteRequest, opts ...scw.RequestOption) (*DatabaseRoute, error) {
1928	var err error
1929
1930	if req.Region == "" {
1931		defaultRegion, _ := s.client.GetDefaultRegion()
1932		req.Region = defaultRegion
1933	}
1934
1935	if fmt.Sprint(req.Region) == "" {
1936		return nil, errors.New("field Region cannot be empty in request")
1937	}
1938
1939	if fmt.Sprint(req.RouteID) == "" {
1940		return nil, errors.New("field RouteID cannot be empty in request")
1941	}
1942
1943	scwReq := &scw.ScalewayRequest{
1944		Method:  "GET",
1945		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/database/" + fmt.Sprint(req.RouteID) + "",
1946		Headers: http.Header{},
1947	}
1948
1949	var resp DatabaseRoute
1950
1951	err = s.client.Do(scwReq, &resp, opts...)
1952	if err != nil {
1953		return nil, err
1954	}
1955	return &resp, nil
1956}
1957
1958type DeleteDatabaseRouteRequest struct {
1959	Region scw.Region `json:"-"`
1960	// RouteID: route ID
1961	RouteID string `json:"-"`
1962}
1963
1964// DeleteDatabaseRoute: delete a Database route
1965func (s *API) DeleteDatabaseRoute(req *DeleteDatabaseRouteRequest, opts ...scw.RequestOption) error {
1966	var err error
1967
1968	if req.Region == "" {
1969		defaultRegion, _ := s.client.GetDefaultRegion()
1970		req.Region = defaultRegion
1971	}
1972
1973	if fmt.Sprint(req.Region) == "" {
1974		return errors.New("field Region cannot be empty in request")
1975	}
1976
1977	if fmt.Sprint(req.RouteID) == "" {
1978		return errors.New("field RouteID cannot be empty in request")
1979	}
1980
1981	scwReq := &scw.ScalewayRequest{
1982		Method:  "DELETE",
1983		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/database/" + fmt.Sprint(req.RouteID) + "",
1984		Headers: http.Header{},
1985	}
1986
1987	err = s.client.Do(scwReq, nil, opts...)
1988	if err != nil {
1989		return err
1990	}
1991	return nil
1992}
1993
1994type CreateRestRouteRequest struct {
1995	Region scw.Region `json:"-"`
1996	// Name: name of the route
1997	Name string `json:"name"`
1998	// HubID: ID of the route's hub
1999	HubID string `json:"hub_id"`
2000	// Topic: topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters
2001	Topic string `json:"topic"`
2002	// Verb: HTTP Verb used to call REST URI
2003	//
2004	// Default value: get
2005	Verb RestRouteHTTPVerb `json:"verb"`
2006	// URI: URI of the REST endpoint
2007	URI string `json:"uri"`
2008	// Headers: HTTP call extra headers
2009	Headers map[string]string `json:"headers"`
2010}
2011
2012// CreateRestRoute: create a Rest route
2013//
2014// Create a route that will call a REST API on received subscribed MQTT messages.
2015//
2016func (s *API) CreateRestRoute(req *CreateRestRouteRequest, opts ...scw.RequestOption) (*RestRoute, error) {
2017	var err error
2018
2019	if req.Region == "" {
2020		defaultRegion, _ := s.client.GetDefaultRegion()
2021		req.Region = defaultRegion
2022	}
2023
2024	if fmt.Sprint(req.Region) == "" {
2025		return nil, errors.New("field Region cannot be empty in request")
2026	}
2027
2028	scwReq := &scw.ScalewayRequest{
2029		Method:  "POST",
2030		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/rest",
2031		Headers: http.Header{},
2032	}
2033
2034	err = scwReq.SetBody(req)
2035	if err != nil {
2036		return nil, err
2037	}
2038
2039	var resp RestRoute
2040
2041	err = s.client.Do(scwReq, &resp, opts...)
2042	if err != nil {
2043		return nil, err
2044	}
2045	return &resp, nil
2046}
2047
2048type GetRestRouteRequest struct {
2049	Region scw.Region `json:"-"`
2050	// RouteID: route ID
2051	RouteID string `json:"-"`
2052}
2053
2054// GetRestRoute: get a Rest route
2055func (s *API) GetRestRoute(req *GetRestRouteRequest, opts ...scw.RequestOption) (*RestRoute, error) {
2056	var err error
2057
2058	if req.Region == "" {
2059		defaultRegion, _ := s.client.GetDefaultRegion()
2060		req.Region = defaultRegion
2061	}
2062
2063	if fmt.Sprint(req.Region) == "" {
2064		return nil, errors.New("field Region cannot be empty in request")
2065	}
2066
2067	if fmt.Sprint(req.RouteID) == "" {
2068		return nil, errors.New("field RouteID cannot be empty in request")
2069	}
2070
2071	scwReq := &scw.ScalewayRequest{
2072		Method:  "GET",
2073		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/rest/" + fmt.Sprint(req.RouteID) + "",
2074		Headers: http.Header{},
2075	}
2076
2077	var resp RestRoute
2078
2079	err = s.client.Do(scwReq, &resp, opts...)
2080	if err != nil {
2081		return nil, err
2082	}
2083	return &resp, nil
2084}
2085
2086type DeleteRestRouteRequest struct {
2087	Region scw.Region `json:"-"`
2088	// RouteID: route ID
2089	RouteID string `json:"-"`
2090}
2091
2092// DeleteRestRoute: delete a Rest route
2093func (s *API) DeleteRestRoute(req *DeleteRestRouteRequest, opts ...scw.RequestOption) error {
2094	var err error
2095
2096	if req.Region == "" {
2097		defaultRegion, _ := s.client.GetDefaultRegion()
2098		req.Region = defaultRegion
2099	}
2100
2101	if fmt.Sprint(req.Region) == "" {
2102		return errors.New("field Region cannot be empty in request")
2103	}
2104
2105	if fmt.Sprint(req.RouteID) == "" {
2106		return errors.New("field RouteID cannot be empty in request")
2107	}
2108
2109	scwReq := &scw.ScalewayRequest{
2110		Method:  "DELETE",
2111		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routes/rest/" + fmt.Sprint(req.RouteID) + "",
2112		Headers: http.Header{},
2113	}
2114
2115	err = s.client.Do(scwReq, nil, opts...)
2116	if err != nil {
2117		return err
2118	}
2119	return nil
2120}
2121
2122type ListNetworksRequest struct {
2123	Region scw.Region `json:"-"`
2124	// Page: page number
2125	Page *int32 `json:"-"`
2126	// PageSize: page size. The maximum value is 100
2127	PageSize *uint32 `json:"-"`
2128	// OrderBy: ordering of requested routes
2129	//
2130	// Default value: name_asc
2131	OrderBy ListNetworksRequestOrderBy `json:"-"`
2132	// OrganizationID: filter on the organization
2133	OrganizationID *string `json:"-"`
2134	// Name: filter on Network name
2135	Name *string `json:"-"`
2136	// HubID: filter on the hub
2137	HubID *string `json:"-"`
2138	// TopicPrefix: filter on the topic prefix
2139	TopicPrefix *string `json:"-"`
2140}
2141
2142// ListNetworks: list the Networks
2143func (s *API) ListNetworks(req *ListNetworksRequest, opts ...scw.RequestOption) (*ListNetworksResponse, error) {
2144	var err error
2145
2146	if req.Region == "" {
2147		defaultRegion, _ := s.client.GetDefaultRegion()
2148		req.Region = defaultRegion
2149	}
2150
2151	defaultPageSize, exist := s.client.GetDefaultPageSize()
2152	if (req.PageSize == nil || *req.PageSize == 0) && exist {
2153		req.PageSize = &defaultPageSize
2154	}
2155
2156	query := url.Values{}
2157	parameter.AddToQuery(query, "page", req.Page)
2158	parameter.AddToQuery(query, "page_size", req.PageSize)
2159	parameter.AddToQuery(query, "order_by", req.OrderBy)
2160	parameter.AddToQuery(query, "organization_id", req.OrganizationID)
2161	parameter.AddToQuery(query, "name", req.Name)
2162	parameter.AddToQuery(query, "hub_id", req.HubID)
2163	parameter.AddToQuery(query, "topic_prefix", req.TopicPrefix)
2164
2165	if fmt.Sprint(req.Region) == "" {
2166		return nil, errors.New("field Region cannot be empty in request")
2167	}
2168
2169	scwReq := &scw.ScalewayRequest{
2170		Method:  "GET",
2171		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/networks",
2172		Query:   query,
2173		Headers: http.Header{},
2174	}
2175
2176	var resp ListNetworksResponse
2177
2178	err = s.client.Do(scwReq, &resp, opts...)
2179	if err != nil {
2180		return nil, err
2181	}
2182	return &resp, nil
2183}
2184
2185// UnsafeGetTotalCount should not be used
2186// Internal usage only
2187func (r *ListNetworksResponse) UnsafeGetTotalCount() uint32 {
2188	return r.TotalCount
2189}
2190
2191// UnsafeAppend should not be used
2192// Internal usage only
2193func (r *ListNetworksResponse) UnsafeAppend(res interface{}) (uint32, error) {
2194	results, ok := res.(*ListNetworksResponse)
2195	if !ok {
2196		return 0, errors.New("%T type cannot be appended to type %T", res, r)
2197	}
2198
2199	r.Networks = append(r.Networks, results.Networks...)
2200	r.TotalCount += uint32(len(results.Networks))
2201	return uint32(len(results.Networks)), nil
2202}
2203
2204type CreateNetworkRequest struct {
2205	Region scw.Region `json:"-"`
2206	// Name: network name
2207	Name string `json:"name"`
2208	// Deprecated: OrganizationID: deprecated: Organization owning the resource, do not use
2209	//
2210	// Will always be assigned to the organization owning the IoT hub.
2211	OrganizationID string `json:"organization_id"`
2212	// Type: type of network to connect with
2213	//
2214	// Default value: unknown
2215	Type NetworkNetworkType `json:"type"`
2216	// HubID: hub ID to connect the Network to
2217	HubID string `json:"hub_id"`
2218	// TopicPrefix: topic prefix for the Network
2219	TopicPrefix string `json:"topic_prefix"`
2220}
2221
2222// CreateNetwork: create a new Network
2223func (s *API) CreateNetwork(req *CreateNetworkRequest, opts ...scw.RequestOption) (*CreateNetworkResponse, error) {
2224	var err error
2225
2226	if req.OrganizationID == "" {
2227		defaultOrganizationID, _ := s.client.GetDefaultOrganizationID()
2228		req.OrganizationID = defaultOrganizationID
2229	}
2230
2231	if req.Region == "" {
2232		defaultRegion, _ := s.client.GetDefaultRegion()
2233		req.Region = defaultRegion
2234	}
2235
2236	if req.Name == "" {
2237		req.Name = namegenerator.GetRandomName("network")
2238	}
2239
2240	if fmt.Sprint(req.Region) == "" {
2241		return nil, errors.New("field Region cannot be empty in request")
2242	}
2243
2244	scwReq := &scw.ScalewayRequest{
2245		Method:  "POST",
2246		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/networks",
2247		Headers: http.Header{},
2248	}
2249
2250	err = scwReq.SetBody(req)
2251	if err != nil {
2252		return nil, err
2253	}
2254
2255	var resp CreateNetworkResponse
2256
2257	err = s.client.Do(scwReq, &resp, opts...)
2258	if err != nil {
2259		return nil, err
2260	}
2261	return &resp, nil
2262}
2263
2264type GetNetworkRequest struct {
2265	Region scw.Region `json:"-"`
2266	// NetworkID: network ID
2267	NetworkID string `json:"-"`
2268}
2269
2270// GetNetwork: retrieve a specific Network
2271func (s *API) GetNetwork(req *GetNetworkRequest, opts ...scw.RequestOption) (*Network, error) {
2272	var err error
2273
2274	if req.Region == "" {
2275		defaultRegion, _ := s.client.GetDefaultRegion()
2276		req.Region = defaultRegion
2277	}
2278
2279	if fmt.Sprint(req.Region) == "" {
2280		return nil, errors.New("field Region cannot be empty in request")
2281	}
2282
2283	if fmt.Sprint(req.NetworkID) == "" {
2284		return nil, errors.New("field NetworkID cannot be empty in request")
2285	}
2286
2287	scwReq := &scw.ScalewayRequest{
2288		Method:  "GET",
2289		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/networks/" + fmt.Sprint(req.NetworkID) + "",
2290		Headers: http.Header{},
2291	}
2292
2293	var resp Network
2294
2295	err = s.client.Do(scwReq, &resp, opts...)
2296	if err != nil {
2297		return nil, err
2298	}
2299	return &resp, nil
2300}
2301
2302type DeleteNetworkRequest struct {
2303	Region scw.Region `json:"-"`
2304	// NetworkID: network ID
2305	NetworkID string `json:"-"`
2306}
2307
2308// DeleteNetwork: delete a Network
2309func (s *API) DeleteNetwork(req *DeleteNetworkRequest, opts ...scw.RequestOption) error {
2310	var err error
2311
2312	if req.Region == "" {
2313		defaultRegion, _ := s.client.GetDefaultRegion()
2314		req.Region = defaultRegion
2315	}
2316
2317	if fmt.Sprint(req.Region) == "" {
2318		return errors.New("field Region cannot be empty in request")
2319	}
2320
2321	if fmt.Sprint(req.NetworkID) == "" {
2322		return errors.New("field NetworkID cannot be empty in request")
2323	}
2324
2325	scwReq := &scw.ScalewayRequest{
2326		Method:  "DELETE",
2327		Path:    "/iot/v1beta1/regions/" + fmt.Sprint(req.Region) + "/networks/" + fmt.Sprint(req.NetworkID) + "",
2328		Headers: http.Header{},
2329	}
2330
2331	err = s.client.Do(scwReq, nil, opts...)
2332	if err != nil {
2333		return err
2334	}
2335	return nil
2336}
2337