Handle marshaling of numbers and strings for channels
This commit is contained in:
@@ -5,6 +5,10 @@
|
|||||||
{{ define "field-emptyStringInt" }}
|
{{ define "field-emptyStringInt" }}
|
||||||
{{- if ne .FieldType "int" }}{{else}}
|
{{- if ne .FieldType "int" }}{{else}}
|
||||||
{{ .FieldName }} {{ if .IsArray }}[]{{end}}emptyStringInt `json:"{{ .JSONName }}{{ if .OmitEmpty }}{{ end }}"`{{ end }} {{- end }}
|
{{ .FieldName }} {{ if .IsArray }}[]{{end}}emptyStringInt `json:"{{ .JSONName }}{{ if .OmitEmpty }}{{ end }}"`{{ end }} {{- end }}
|
||||||
|
{{ define "field-numberOrString" }}
|
||||||
|
{{- /* this is kind of a hack, probably a better way to do this when looking at the normalized validation */ -}}
|
||||||
|
{{- if and (eq .FieldType "string") (or (eq .JSONName "channel") (eq .JSONName "backup_channel")) }}
|
||||||
|
{{ .FieldName }} {{ if .IsArray }}[]{{end}}numberOrString `json:"{{ .JSONName }}{{ if .OmitEmpty }}{{ end }}"`{{ end }} {{- end }}
|
||||||
{{ define "typecast" }}
|
{{ define "typecast" }}
|
||||||
{{- if eq .FieldType "int" }}{{- if .IsArray }}
|
{{- if eq .FieldType "int" }}{{- if .IsArray }}
|
||||||
dst.{{ .FieldName }}= make([]int, len(aux.{{ .FieldName }}))
|
dst.{{ .FieldName }}= make([]int, len(aux.{{ .FieldName }}))
|
||||||
@@ -55,7 +59,7 @@ func (dst *{{ $k }}) UnmarshalJSON(b []byte) error {
|
|||||||
type Alias {{ $k }}
|
type Alias {{ $k }}
|
||||||
aux := &struct {
|
aux := &struct {
|
||||||
{{- range $fk, $fv := $v.Fields }}{{ if not $fv }}
|
{{- range $fk, $fv := $v.Fields }}{{ if not $fv }}
|
||||||
{{- else }}{{- template "field-emptyStringInt" $fv }}{{ end }}{{- end }}
|
{{- else }}{{- template "field-emptyStringInt" $fv }}{{- template "field-numberOrString" $fv }}{{ end }}{{- end }}
|
||||||
|
|
||||||
*Alias
|
*Alias
|
||||||
}{
|
}{
|
||||||
|
|||||||
126
unifi/ap_group.generated.go
Normal file
126
unifi/ap_group.generated.go
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
// Code generated from ace.jar fields *.json files
|
||||||
|
// DO NOT EDIT.
|
||||||
|
|
||||||
|
package unifi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// just to fix compile issues with the import
|
||||||
|
var (
|
||||||
|
_ context.Context
|
||||||
|
_ fmt.Formatter
|
||||||
|
_ json.Marshaler
|
||||||
|
)
|
||||||
|
|
||||||
|
type APGroup struct {
|
||||||
|
ID string `json:"_id,omitempty"`
|
||||||
|
SiteID string `json:"site_id,omitempty"`
|
||||||
|
|
||||||
|
Hidden bool `json:"attr_hidden,omitempty"`
|
||||||
|
HiddenID string `json:"attr_hidden_id,omitempty"`
|
||||||
|
NoDelete bool `json:"attr_no_delete,omitempty"`
|
||||||
|
NoEdit bool `json:"attr_no_edit,omitempty"`
|
||||||
|
|
||||||
|
Name string `json:"name,omitempty"` // .{1,128}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dst *APGroup) UnmarshalJSON(b []byte) error {
|
||||||
|
type Alias APGroup
|
||||||
|
aux := &struct {
|
||||||
|
*Alias
|
||||||
|
}{
|
||||||
|
Alias: (*Alias)(dst),
|
||||||
|
}
|
||||||
|
|
||||||
|
err := json.Unmarshal(b, &aux)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to unmarshal alias: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) listAPGroup(ctx context.Context, site string) ([]APGroup, error) {
|
||||||
|
var respBody struct {
|
||||||
|
Meta meta `json:"meta"`
|
||||||
|
Data []APGroup `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := c.do(ctx, "GET", fmt.Sprintf("s/%s/apgroups", site), nil, &respBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return respBody.Data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) getAPGroup(ctx context.Context, site, id string) (*APGroup, error) {
|
||||||
|
var respBody struct {
|
||||||
|
Meta meta `json:"meta"`
|
||||||
|
Data []APGroup `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := c.do(ctx, "GET", fmt.Sprintf("s/%s/rest/apgroups/%s", site, id), nil, &respBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(respBody.Data) != 1 {
|
||||||
|
return nil, &NotFoundError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
d := respBody.Data[0]
|
||||||
|
return &d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) deleteAPGroup(ctx context.Context, site, id string) error {
|
||||||
|
err := c.do(ctx, "DELETE", fmt.Sprintf("s/%s/rest/apgroups/%s", site, id), struct{}{}, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) createAPGroup(ctx context.Context, site string, d *APGroup) (*APGroup, error) {
|
||||||
|
var respBody struct {
|
||||||
|
Meta meta `json:"meta"`
|
||||||
|
Data []APGroup `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := c.do(ctx, "POST", fmt.Sprintf("s/%s/rest/apgroups", site), d, &respBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(respBody.Data) != 1 {
|
||||||
|
return nil, &NotFoundError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
new := respBody.Data[0]
|
||||||
|
|
||||||
|
return &new, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) updateAPGroup(ctx context.Context, site string, d *APGroup) (*APGroup, error) {
|
||||||
|
var respBody struct {
|
||||||
|
Meta meta `json:"meta"`
|
||||||
|
Data []APGroup `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
err := c.do(ctx, "PUT", fmt.Sprintf("s/%s/rest/apgroups/%s", site, d.ID), d, &respBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(respBody.Data) != 1 {
|
||||||
|
return nil, &NotFoundError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
new := respBody.Data[0]
|
||||||
|
|
||||||
|
return &new, nil
|
||||||
|
}
|
||||||
@@ -119,6 +119,8 @@ type ChannelPlanRadioTable struct {
|
|||||||
func (dst *ChannelPlanRadioTable) UnmarshalJSON(b []byte) error {
|
func (dst *ChannelPlanRadioTable) UnmarshalJSON(b []byte) error {
|
||||||
type Alias ChannelPlanRadioTable
|
type Alias ChannelPlanRadioTable
|
||||||
aux := &struct {
|
aux := &struct {
|
||||||
|
BackupChannel numberOrString `json:"backup_channel"`
|
||||||
|
Channel numberOrString `json:"channel"`
|
||||||
Width emptyStringInt `json:"width"`
|
Width emptyStringInt `json:"width"`
|
||||||
|
|
||||||
*Alias
|
*Alias
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ type DeviceRadioTable struct {
|
|||||||
Ht string `json:"ht,omitempty"` // 20|40|80|160|1080|2160
|
Ht string `json:"ht,omitempty"` // 20|40|80|160|1080|2160
|
||||||
LoadbalanceEnabled bool `json:"loadbalance_enabled,omitempty"`
|
LoadbalanceEnabled bool `json:"loadbalance_enabled,omitempty"`
|
||||||
Maxsta int `json:"maxsta,omitempty"` // [1-9]|[1-9][0-9]|1[0-9]{2}|200|^$
|
Maxsta int `json:"maxsta,omitempty"` // [1-9]|[1-9][0-9]|1[0-9]{2}|200|^$
|
||||||
MinRssi int `json:"min_rssi,omitempty"` // ^-(6[7-9]|[7-8][0-9]|90)$
|
MinRssi int `json:"min_rssi,omitempty"` // ^-([1-9]|[1-8][0-9]|9[0-4])$
|
||||||
MinRssiEnabled bool `json:"min_rssi_enabled,omitempty"`
|
MinRssiEnabled bool `json:"min_rssi_enabled,omitempty"`
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
Radio string `json:"radio,omitempty"` // ng|na|ad
|
Radio string `json:"radio,omitempty"` // ng|na|ad
|
||||||
@@ -297,6 +297,8 @@ func (dst *DeviceRadioTable) UnmarshalJSON(b []byte) error {
|
|||||||
aux := &struct {
|
aux := &struct {
|
||||||
AntennaGain emptyStringInt `json:"antenna_gain"`
|
AntennaGain emptyStringInt `json:"antenna_gain"`
|
||||||
AntennaID emptyStringInt `json:"antenna_id"`
|
AntennaID emptyStringInt `json:"antenna_id"`
|
||||||
|
BackupChannel numberOrString `json:"backup_channel"`
|
||||||
|
Channel numberOrString `json:"channel"`
|
||||||
Maxsta emptyStringInt `json:"maxsta"`
|
Maxsta emptyStringInt `json:"maxsta"`
|
||||||
MinRssi emptyStringInt `json:"min_rssi"`
|
MinRssi emptyStringInt `json:"min_rssi"`
|
||||||
SensLevel emptyStringInt `json:"sens_level"`
|
SensLevel emptyStringInt `json:"sens_level"`
|
||||||
|
|||||||
@@ -5,6 +5,32 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// numberOrString handles strings that can also accept JSON numbers.
|
||||||
|
// For example a field may contain a number or the string "auto".
|
||||||
|
type numberOrString string
|
||||||
|
|
||||||
|
func (e *numberOrString) UnmarshalJSON(b []byte) error {
|
||||||
|
if len(b) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
s := string(b)
|
||||||
|
if s == `""` {
|
||||||
|
*e = ""
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
if strings.HasPrefix(s, `"`) && strings.HasSuffix(s, `"`) {
|
||||||
|
s, err = strconv.Unquote(s)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*e = numberOrString(s)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
*e = numberOrString(string(b))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// emptyStringInt was created due to the behavior change in
|
// emptyStringInt was created due to the behavior change in
|
||||||
// Go 1.14 with json.Number's handling of empty string.
|
// Go 1.14 with json.Number's handling of empty string.
|
||||||
type emptyStringInt int
|
type emptyStringInt int
|
||||||
@@ -13,11 +39,12 @@ func (e *emptyStringInt) UnmarshalJSON(b []byte) error {
|
|||||||
if len(b) == 0 {
|
if len(b) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if string(b) == `""` {
|
s := string(b)
|
||||||
|
if s == `""` {
|
||||||
|
*e = 0
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
s := string(b)
|
|
||||||
if strings.HasPrefix(s, `"`) && strings.HasSuffix(s, `"`) {
|
if strings.HasPrefix(s, `"`) && strings.HasSuffix(s, `"`) {
|
||||||
s, err = strconv.Unquote(s)
|
s, err = strconv.Unquote(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user