From 4743f612ab08b54e0c45b0c502fc9765a0b5519e Mon Sep 17 00:00:00 2001 From: Thibault Pensec <39826516+thibauult@users.noreply.github.com> Date: Wed, 10 Jan 2024 10:26:11 +0100 Subject: [PATCH] Get lights and rooms by their name (#31) This PR mainly allows to find lights and rooms by their name. A pretty big refactoring was necessary in order to ease the implementation of this feature. We introduced a "`Home` Context" that is load at command bootstrap. This context contains all the resources that are necessary to display the information to the user: - bridge_home - rooms - devices - lights - grouped lights We hope that this refactoring will ease future developments. --- cmd/get/get.go | 63 ++-- cmd/get/get_light.go | 62 ++-- cmd/get/get_room.go | 64 ++-- cmd/root.go | 13 +- cmd/set/helper.go | 23 -- cmd/set/set_light.go | 75 +---- go.mod | 1 + go.sum | 447 +--------------------------- openhue/config.go | 3 + openhue/context.go | 1 + openhue/gen/openhue.gen.go | 591 +++++++++++++++++++------------------ openhue/home_helper.go | 90 ++++++ openhue/home_model.go | 176 +++++++++++ openhue/home_service.go | 294 ++++++++++++++++++ util/logger/logger.go | 26 ++ 15 files changed, 1024 insertions(+), 905 deletions(-) delete mode 100644 cmd/set/helper.go create mode 100644 openhue/home_helper.go create mode 100644 openhue/home_model.go create mode 100644 openhue/home_service.go create mode 100644 util/logger/logger.go diff --git a/cmd/get/get.go b/cmd/get/get.go index 049826d..af52a49 100644 --- a/cmd/get/get.go +++ b/cmd/get/get.go @@ -8,14 +8,16 @@ import ( "openhue-cli/util" ) -type GetFlags struct { +type CmdGetOptions struct { Json bool + Name bool } -var GetConfig GetFlags - // NewCmdGet returns an initialized Command instance for 'get' sub command func NewCmdGet(ctx *openhue.Context) *cobra.Command { + + o := CmdGetOptions{} + cmd := &cobra.Command{ Use: "get", Short: "Display one or many resources", @@ -24,29 +26,7 @@ func NewCmdGet(ctx *openhue.Context) *cobra.Command { Retrieve information for any kind of resources exposed by your Hue Bridge: lights, rooms, scenes, etc. `, Run: func(cmd *cobra.Command, args []string) { - resp, err := ctx.Api.GetResourcesWithResponse(context.Background()) - cobra.CheckErr(err) - resources := *(*resp.JSON200).Data - - typeFlag := cmd.Flag("type").Value.String() - - if len(typeFlag) > 0 { - // filter resources by type - n := 0 - for _, r := range resources { - if *r.Type == gen.ResourceGetType(typeFlag) { - resources[n] = r - n++ - } - } - resources = resources[:n] - } - - if GetConfig.Json { - util.PrintJson(ctx.Io, resources) - } else { - util.PrintTable(ctx.Io, resources, PrintResource, "Resource ID", "Resource Type") - } + RunGetAllResources(ctx, cmd.Flag("type").Value.String(), &o) }, } @@ -54,15 +34,40 @@ Retrieve information for any kind of resources exposed by your Hue Bridge: light cmd.Flags().StringP("type", "t", "", "Filter by resource type (light, scene, room...)") // persistence flags - cmd.PersistentFlags().BoolVar(&GetConfig.Json, "json", false, "Format output as JSON") + cmd.PersistentFlags().BoolVarP(&o.Json, "json", "j", false, "Format output as JSON") + cmd.PersistentFlags().BoolVarP(&o.Name, "name", "n", false, "Get resource(s) by name") // sub commands - cmd.AddCommand(NewCmdGetLight(ctx)) - cmd.AddCommand(NewCmdGetRoom(ctx)) + cmd.AddCommand(NewCmdGetLight(ctx, &o)) + cmd.AddCommand(NewCmdGetRoom(ctx, &o)) return cmd } +func RunGetAllResources(ctx *openhue.Context, typeFlag string, o *CmdGetOptions) { + resp, err := ctx.Api.GetResourcesWithResponse(context.Background()) + cobra.CheckErr(err) + resources := *(*resp.JSON200).Data + + if len(typeFlag) > 0 { + // filter resources by type + n := 0 + for _, r := range resources { + if *r.Type == gen.ResourceGetType(typeFlag) { + resources[n] = r + n++ + } + } + resources = resources[:n] + } + + if o.Json { + util.PrintJson(ctx.Io, resources) + } else { + util.PrintTable(ctx.Io, resources, PrintResource, "Resource ID", "Resource Type") + } +} + func PrintResource(resource gen.ResourceGet) string { return *resource.Id + "\t" + string(*resource.Type) } diff --git a/cmd/get/get_light.go b/cmd/get/get_light.go index e307f4b..7dcffb5 100644 --- a/cmd/get/get_light.go +++ b/cmd/get/get_light.go @@ -3,11 +3,8 @@ package get import ( "fmt" "github.com/spf13/cobra" - "golang.org/x/net/context" "openhue-cli/openhue" - "openhue-cli/openhue/gen" "openhue-cli/util" - "os" ) const ( @@ -23,21 +20,29 @@ openhue get light --json # Get details for a single light openhue get light aa31ba26-98a7-4830-8ae9-1b7caa8b5700 --json + +# Get light by name +openhue get light -n "Hue Go" ` ) type LightOptions struct { - LightId string + LightParam string // ID or Name + Json *bool + Name *bool } -func NewGetLightOptions() *LightOptions { - return &LightOptions{} +func NewGetLightOptions(co *CmdGetOptions) *LightOptions { + return &LightOptions{ + Json: &co.Json, + Name: &co.Name, + } } // NewCmdGetLight returns initialized Command instance for the 'get light' sub command -func NewCmdGetLight(ctx *openhue.Context) *cobra.Command { +func NewCmdGetLight(ctx *openhue.Context, co *CmdGetOptions) *cobra.Command { - o := NewGetLightOptions() + o := NewGetLightOptions(co) cmd := &cobra.Command{ Use: "light [lightId]", @@ -46,7 +51,7 @@ func NewCmdGetLight(ctx *openhue.Context) *cobra.Command { Example: docExampleGetLight, Args: cobra.MatchAll(cobra.RangeArgs(0, 1), cobra.OnlyValidArgs), Run: func(cmd *cobra.Command, args []string) { - o.PrepareGetRoomCmd(args) + o.PrepareGetLightCmd(args) o.RunGetLightCmd(ctx) }, } @@ -54,50 +59,47 @@ func NewCmdGetLight(ctx *openhue.Context) *cobra.Command { return cmd } -func (o *LightOptions) PrepareGetRoomCmd(args []string) { +func (o *LightOptions) PrepareGetLightCmd(args []string) { if len(args) > 0 { - o.LightId = args[0] + o.LightParam = args[0] } } func (o *LightOptions) RunGetLightCmd(ctx *openhue.Context) { - var lights *[]gen.LightGet + var lights []openhue.Light - if len(o.LightId) > 0 { - resp, err := ctx.Api.GetLightWithResponse(context.Background(), o.LightId) - cobra.CheckErr(err) + if len(o.LightParam) > 0 { - if resp.JSON200 == nil { - fmt.Println("\nNot light found with ID", o.LightId) - os.Exit(0) + if *o.Name { + lights = openhue.FindLightByName(ctx.Home, o.LightParam) + } else { + lights = openhue.FindLightsByIds(ctx.Home, []string{o.LightParam}) } - lights = (*resp.JSON200).Data } else { - resp, err := ctx.Api.GetLightsWithResponse(context.Background()) - cobra.CheckErr(err) - lights = (*resp.JSON200).Data + lights = openhue.FindAllLights(ctx.Home) } - if !GetConfig.Json { - util.PrintTable(ctx.Io, *lights, PrintLight, "ID", "Name", "Type", "Status", "Brightness") + if *o.Json { + util.PrintJsonArray(ctx.Io, lights) } else { - util.PrintJsonArray(ctx.Io, *lights) + util.PrintTable(ctx.Io, lights, PrintLight, "ID", "Name", "Type", "Status", "Brightness", "Room") } } -func PrintLight(light gen.LightGet) string { +func PrintLight(light openhue.Light) string { status := "[ ]" brightness := "N/A" + room := light.Parent.Parent.Name // parent of a light is the device that belongs to a room - if *light.On.On { + if *light.HueData.On.On { status = "[on]" } - if light.Dimming != nil { - brightness = fmt.Sprint(*light.Dimming.Brightness) + "%" + if light.HueData.Dimming != nil { + brightness = fmt.Sprint(*light.HueData.Dimming.Brightness) + "%" } - return *light.Id + "\t" + *light.Metadata.Name + "\t" + string(*light.Metadata.Archetype) + "\t" + status + "\t" + brightness + return light.Id + "\t" + light.Name + "\t" + string(*light.HueData.Metadata.Archetype) + "\t" + status + "\t" + brightness + "\t" + room } diff --git a/cmd/get/get_room.go b/cmd/get/get_room.go index b92d012..ca29dbf 100644 --- a/cmd/get/get_room.go +++ b/cmd/get/get_room.go @@ -3,11 +3,8 @@ package get import ( "fmt" "github.com/spf13/cobra" - "golang.org/x/net/context" "openhue-cli/openhue" - "openhue-cli/openhue/gen" "openhue-cli/util" - "os" ) const ( @@ -23,21 +20,29 @@ openhue get room --json # Get details for a single room openhue get room aa31ba26-98a7-4830-8ae9-1b7caa8b5700 --json + +# Get room by name +openhue get room -n "Studio" ` ) type RoomOptions struct { - RoomId string + RoomParam string + Json *bool + Name *bool } -func NewGetRoomOptions() *RoomOptions { - return &RoomOptions{} +func NewGetRoomOptions(co *CmdGetOptions) *RoomOptions { + return &RoomOptions{ + Json: &co.Json, + Name: &co.Name, + } } // NewCmdGetRoom returns initialized Command instance for the 'get light' sub command -func NewCmdGetRoom(ctx *openhue.Context) *cobra.Command { +func NewCmdGetRoom(ctx *openhue.Context, co *CmdGetOptions) *cobra.Command { - o := NewGetRoomOptions() + o := NewGetRoomOptions(co) cmd := &cobra.Command{ Use: "room [roomId]", @@ -56,36 +61,45 @@ func NewCmdGetRoom(ctx *openhue.Context) *cobra.Command { func (o *RoomOptions) PrepareGetRoomCmd(args []string) { if len(args) > 0 { - o.RoomId = args[0] + o.RoomParam = args[0] } } func (o *RoomOptions) RunGetRoomCmd(ctx *openhue.Context) { - var rooms *[]gen.RoomGet - if len(o.RoomId) > 0 { - resp, err := ctx.Api.GetRoomWithResponse(context.Background(), o.RoomId) - cobra.CheckErr(err) + var rooms []openhue.Room + + if len(o.RoomParam) > 0 { - if resp.JSON200 == nil { - fmt.Println("\nNot room found with ID", o.RoomId) - os.Exit(0) + if *o.Name { + rooms = openhue.FindRoomByName(ctx.Home, o.RoomParam) + } else { + rooms = openhue.FindRoomById(ctx.Home, o.RoomParam) } - rooms = (*resp.JSON200).Data } else { - resp, err := ctx.Api.GetRoomsWithResponse(context.Background()) - cobra.CheckErr(err) - rooms = (*resp.JSON200).Data + rooms = openhue.FindAllRooms(ctx.Home) } - if !GetConfig.Json { - util.PrintTable(ctx.Io, *rooms, PrintRoom, "ID", "Name", "Type") + if *o.Json { + util.PrintJsonArray(ctx.Io, rooms) } else { - util.PrintJsonArray(ctx.Io, *rooms) + util.PrintTable(ctx.Io, rooms, PrintRoom, "ID", "Name", "Type", "Status", "Brightness") } } -func PrintRoom(room gen.RoomGet) string { - return *room.Id + "\t" + *room.Metadata.Name + "\t" + string(*room.Metadata.Archetype) +func PrintRoom(room openhue.Room) string { + + status := "[ ]" + brightness := "N/A" + + if room.GroupedLight.IsOn() { + status = "[on]" + } + + if room.GroupedLight.HueData.Dimming != nil { + brightness = fmt.Sprint(*room.GroupedLight.HueData.Dimming.Brightness) + "%" + } + + return room.Id + "\t" + room.Name + "\t" + string(*room.HueData.Metadata.Archetype) + "\t" + status + "\t" + brightness } diff --git a/cmd/root.go b/cmd/root.go index 21c84d2..0e2ceb6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,12 +1,15 @@ package cmd import ( + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "openhue-cli/cmd/get" "openhue-cli/cmd/set" "openhue-cli/cmd/setup" "openhue-cli/cmd/version" "openhue-cli/openhue" + "os" + "time" ) // NewCmdOpenHue represents the `openhue` base command, AKA entry point of the CLI @@ -36,8 +39,16 @@ func Execute(buildInfo *openhue.BuildInfo) { api := c.NewOpenHueClient() ctx := openhue.NewContext(openhue.NewIOStreams(), buildInfo, api) + // load the home context + t0 := time.Now() + home, err := openhue.LoadHome(api) + cobra.CheckErr(err) + ctx.Home = home + log.Infof("It took %dms to load the Home Context", time.Since(t0).Milliseconds()) + // create the root command root := NewCmdOpenHue() + log.Infof("Running the '%s' command", os.Args) // init groups initGroups(root) @@ -52,7 +63,7 @@ func Execute(buildInfo *openhue.BuildInfo) { root.AddCommand(get.NewCmdGet(ctx)) // execute the root command - err := root.Execute() + err = root.Execute() cobra.CheckErr(err) } diff --git a/cmd/set/helper.go b/cmd/set/helper.go deleted file mode 100644 index ef21550..0000000 --- a/cmd/set/helper.go +++ /dev/null @@ -1,23 +0,0 @@ -package set - -type LightStatus string - -const ( - On LightStatus = "on" - Off LightStatus = "off" - Undefined LightStatus = "undefined" -) - -// ToBool converts a LightStatus to its bool value. Undefined is considered as false. -func ToBool(status LightStatus) *bool { - - onValue, offValue := true, false - - if status == On { - return &onValue - } else if status == Off { - return &offValue - } else { - return &offValue - } -} diff --git a/cmd/set/set_light.go b/cmd/set/set_light.go index 141d041..38a4120 100644 --- a/cmd/set/set_light.go +++ b/cmd/set/set_light.go @@ -3,9 +3,7 @@ package set import ( "fmt" "github.com/spf13/cobra" - "golang.org/x/net/context" "openhue-cli/openhue" - "openhue-cli/openhue/gen" "openhue-cli/util/color" ) @@ -42,12 +40,6 @@ openhue set light 15f51223-1e83-4e48-9158-0c20dbd5734e --on --color powder_blue ` ) -type LightOptions struct { - Status LightStatus - Brightness float32 - Color color.XY -} - type LightFlags struct { On bool Off bool @@ -58,18 +50,9 @@ type LightFlags struct { ColorName string } -func NewSetLightOptions() *LightOptions { - return &LightOptions{ - Status: Undefined, - Brightness: -1, - Color: color.UndefinedColor, - } -} - // NewCmdSetLight returns initialized Command instance for the 'set light' sub command func NewCmdSetLight(ctx *openhue.Context) *cobra.Command { - o := NewSetLightOptions() f := LightFlags{} cmd := &cobra.Command{ @@ -79,8 +62,14 @@ func NewCmdSetLight(ctx *openhue.Context) *cobra.Command { Example: docExample, Args: cobra.MatchAll(cobra.RangeArgs(1, 10), cobra.OnlyValidArgs), Run: func(cmd *cobra.Command, args []string) { - cobra.CheckErr(o.PrepareCmdSetLight(&f)) - cobra.CheckErr(o.RunCmdSetLight(ctx.Api, args)) + o, err := PrepareCmdSetLight(&f) + cobra.CheckErr(err) + + lights := openhue.FindLightsByIds(ctx.Home, args) + + for _, light := range lights { + light.Set(o) + } }, } @@ -121,19 +110,21 @@ func (f *LightFlags) InitFlags(cmd *cobra.Command) { } // PrepareCmdSetLight makes sure provided values for LightOptions are valid -func (o *LightOptions) PrepareCmdSetLight(flags *LightFlags) error { +func PrepareCmdSetLight(flags *LightFlags) (*openhue.SetLightOptions, error) { + + o := openhue.NewSetLightOptions() if flags.On { - o.Status = On + o.Status = openhue.LightStatusOn } if flags.Off { - o.Status = Off + o.Status = openhue.LightStatusOff } // validate the --brightness flag if flags.Brightness > 100.0 || (flags.Brightness != -1 && flags.Brightness < 0) { - return fmt.Errorf("--brightness flag must be greater than 0.0 and lower than 100.0, current value is %.2f", o.Brightness) + return nil, fmt.Errorf("--brightness flag must be greater than 0.0 and lower than 100.0, current value is %.2f", o.Brightness) } else { o.Brightness = flags.Brightness } @@ -142,7 +133,7 @@ func (o *LightOptions) PrepareCmdSetLight(flags *LightFlags) error { if flags.Rgb != "" { rgb, err := color.NewRGBFomHex(flags.Rgb) if err != nil { - return err + return nil, err } o.Color = *rgb.ToXY() } @@ -165,39 +156,5 @@ func (o *LightOptions) PrepareCmdSetLight(flags *LightFlags) error { } } - return nil -} - -// RunCmdSetLight executes the light update command logic -func (o *LightOptions) RunCmdSetLight(api *gen.ClientWithResponses, args []string) error { - - request := &gen.UpdateLightJSONRequestBody{} - - if o.Status != Undefined { - request.On = &gen.On{ - On: ToBool(o.Status), - } - } - - if o.Brightness >= 0 && o.Brightness <= 100.0 { - request.Dimming = &gen.Dimming{ - Brightness: &o.Brightness, - } - } - - if o.Color != color.UndefinedColor { - request.Color = &gen.Color{ - Xy: &gen.GamutPosition{ - X: &o.Color.X, - Y: &o.Color.Y, - }, - } - } - - for _, lightId := range args { - _, err := api.UpdateLight(context.Background(), lightId, *request) - cobra.CheckErr(err) - } - - return nil + return o, nil } diff --git a/go.mod b/go.mod index 3ba4ea2..b314d4c 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.5.1 // indirect diff --git a/go.sum b/go.sum index 889eacd..c510588 100644 --- a/go.sum +++ b/go.sum @@ -1,57 +1,9 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/brutella/dnssd v1.2.10 h1:Gg0k7+NtJp7TbOMS0eUVg0VEjSdftzKOTQ8QQTzQ0x4= github.com/brutella/dnssd v1.2.10/go.mod h1:yZ+GHHbGhtp5yJeKTnppdFGiy6OhiPoxs0WHW1KUcFA= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -59,103 +11,25 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deepmap/oapi-codegen v1.16.2 h1:xGHx0dNqYfy9gE8a7AVgVM8Sd5oF9SEgePzP+UPAUXI= github.com/deepmap/oapi-codegen v1.16.2/go.mod h1:rdYoEA2GE+riuZ91DvpmBX9hJbQpuY9wchXpfQ3n+ho= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI= -github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -164,26 +38,20 @@ github.com/oapi-codegen/runtime v1.1.0 h1:rJpoNUawn5XTvekgfkvSZr0RqEnoYpFkyvrzfW github.com/oapi-codegen/runtime v1.1.0/go.mod h1:BeSfBkWWWnAnGdyS+S/GnlbmHKzf8/hwkvelJZDeKA8= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= -github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= @@ -199,8 +67,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -208,333 +74,28 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/openhue/config.go b/openhue/config.go index fa11e4d..f957ab8 100644 --- a/openhue/config.go +++ b/openhue/config.go @@ -9,6 +9,7 @@ import ( "github.com/spf13/viper" "net/http" "openhue-cli/openhue/gen" + "openhue-cli/util/logger" "os" "path/filepath" "slices" @@ -33,6 +34,8 @@ func (c *Config) Load() { var configPath = filepath.Join(home, "/.openhue") _ = os.MkdirAll(configPath, os.ModePerm) + logger.Init(configPath) + // Search config in home directory with name ".openhue" (without an extension). viper.AddConfigPath(configPath) viper.SetConfigName("config") diff --git a/openhue/context.go b/openhue/context.go index 63cff15..865cf19 100644 --- a/openhue/context.go +++ b/openhue/context.go @@ -10,6 +10,7 @@ type Context struct { Io IOStreams BuildInfo *BuildInfo Api *gen.ClientWithResponses + Home *Home } // NewContext returns an initialized Context from a given gen.ClientWithResponses API with default IOStreams diff --git a/openhue/gen/openhue.gen.go b/openhue/gen/openhue.gen.go index 930c712..a2ce40c 100644 --- a/openhue/gen/openhue.gen.go +++ b/openhue/gen/openhue.gen.go @@ -237,6 +237,7 @@ const ( // Defines values for ProductArchetype. const ( ProductArchetypeBollard ProductArchetype = "bollard" + ProductArchetypeBridgeV2 ProductArchetype = "bridge_v2" ProductArchetypeCandleBulb ProductArchetype = "candle_bulb" ProductArchetypeCeilingHorizontal ProductArchetype = "ceiling_horizontal" ProductArchetypeCeilingRound ProductArchetype = "ceiling_round" @@ -264,7 +265,6 @@ const ( ProductArchetypeHueTube ProductArchetype = "hue_tube" ProductArchetypeLargeGlobeBulb ProductArchetype = "large_globe_bulb" ProductArchetypeLusterBulb ProductArchetype = "luster_bulb" - ProductArchetypeOneOfBridgeV2 ProductArchetype = "one of bridge_v2" ProductArchetypePendantLong ProductArchetype = "pendant_long" ProductArchetypePendantRound ProductArchetype = "pendant_round" ProductArchetypePendantSpot ProductArchetype = "pendant_spot" @@ -662,7 +662,8 @@ type DeviceGet struct { // IdV1 Clip v1 resource identifier IdV1 *string `json:"id_v1,omitempty"` Metadata *struct { - Archetype *ProductData `json:"archetype,omitempty"` + // Archetype The default archetype given by manufacturer. Can be changed by user. + Archetype *ProductArchetype `json:"archetype,omitempty"` // Name Human readable name of a resource Name *string `json:"name,omitempty"` @@ -729,7 +730,7 @@ type DevicePut struct { Action *DevicePutIdentifyAction `json:"action,omitempty"` } `json:"identify,omitempty"` Metadata *struct { - // Archetype Archetype of the product + // Archetype The default archetype given by manufacturer. Can be changed by user. Archetype *ProductArchetype `json:"archetype,omitempty"` // Name Human readable name of a resource @@ -1261,7 +1262,7 @@ type PowerupOnMode string // PowerupPreset When setting the custom preset the additional properties can be set. For all other presets, no other properties can be included. type PowerupPreset string -// ProductArchetype Archetype of the product +// ProductArchetype The default archetype given by manufacturer. Can be changed by user. type ProductArchetype string // ProductData defines model for ProductData. @@ -1278,7 +1279,7 @@ type ProductData struct { // ModelId Unique identification of device model ModelId *string `json:"model_id,omitempty"` - // ProductArchetype Archetype of the product + // ProductArchetype The default archetype given by manufacturer. Can be changed by user. ProductArchetype *ProductArchetype `json:"product_archetype,omitempty"` // ProductName Name of the product @@ -1643,12 +1644,12 @@ type AuthenticateJSONBody struct { // AuthenticateJSONRequestBody defines body for Authenticate for application/json ContentType. type AuthenticateJSONRequestBody AuthenticateJSONBody -// UpdateDeviceJSONRequestBody defines body for UpdateDevice for application/json ContentType. -type UpdateDeviceJSONRequestBody = DevicePut - // UpdateBridgeJSONRequestBody defines body for UpdateBridge for application/json ContentType. type UpdateBridgeJSONRequestBody = BridgePut +// UpdateDeviceJSONRequestBody defines body for UpdateDevice for application/json ContentType. +type UpdateDeviceJSONRequestBody = DevicePut + // UpdateGroupedLightJSONRequestBody defines body for UpdateGroupedLight for application/json ContentType. type UpdateGroupedLightJSONRequestBody = GroupedLightPut @@ -1757,26 +1758,6 @@ type ClientInterface interface { Authenticate(ctx context.Context, body AuthenticateJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // GetDevices request - GetDevices(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - - // DeleteDevice request - DeleteDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - - // GetDevice request - GetDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - - // UpdateDeviceWithBody request with any body - UpdateDeviceWithBody(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - UpdateDevice(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // GetDevicePowers request - GetDevicePowers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - - // GetDevicePower request - GetDevicePower(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) - // GetResources request GetResources(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -1797,6 +1778,26 @@ type ClientInterface interface { // GetBridgeHome request GetBridgeHome(ctx context.Context, bridgeHomeId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetDevices request + GetDevices(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + + // DeleteDevice request + DeleteDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetDevice request + GetDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + + // UpdateDeviceWithBody request with any body + UpdateDeviceWithBody(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + UpdateDevice(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetDevicePowers request + GetDevicePowers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetDevicePower request + GetDevicePower(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetGroupedLights request GetGroupedLights(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -1923,8 +1924,8 @@ func (c *Client) Authenticate(ctx context.Context, body AuthenticateJSONRequestB return c.Client.Do(req) } -func (c *Client) GetDevices(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetDevicesRequest(c.Server) +func (c *Client) GetResources(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetResourcesRequest(c.Server) if err != nil { return nil, err } @@ -1935,8 +1936,8 @@ func (c *Client) GetDevices(ctx context.Context, reqEditors ...RequestEditorFn) return c.Client.Do(req) } -func (c *Client) DeleteDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteDeviceRequest(c.Server, deviceId) +func (c *Client) GetBridges(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetBridgesRequest(c.Server) if err != nil { return nil, err } @@ -1947,8 +1948,8 @@ func (c *Client) DeleteDevice(ctx context.Context, deviceId string, reqEditors . return c.Client.Do(req) } -func (c *Client) GetDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetDeviceRequest(c.Server, deviceId) +func (c *Client) GetBridge(ctx context.Context, bridgeId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetBridgeRequest(c.Server, bridgeId) if err != nil { return nil, err } @@ -1959,8 +1960,8 @@ func (c *Client) GetDevice(ctx context.Context, deviceId string, reqEditors ...R return c.Client.Do(req) } -func (c *Client) UpdateDeviceWithBody(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateDeviceRequestWithBody(c.Server, deviceId, contentType, body) +func (c *Client) UpdateBridgeWithBody(ctx context.Context, bridgeId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateBridgeRequestWithBody(c.Server, bridgeId, contentType, body) if err != nil { return nil, err } @@ -1971,8 +1972,8 @@ func (c *Client) UpdateDeviceWithBody(ctx context.Context, deviceId string, cont return c.Client.Do(req) } -func (c *Client) UpdateDevice(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateDeviceRequest(c.Server, deviceId, body) +func (c *Client) UpdateBridge(ctx context.Context, bridgeId string, body UpdateBridgeJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateBridgeRequest(c.Server, bridgeId, body) if err != nil { return nil, err } @@ -1983,8 +1984,8 @@ func (c *Client) UpdateDevice(ctx context.Context, deviceId string, body UpdateD return c.Client.Do(req) } -func (c *Client) GetDevicePowers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetDevicePowersRequest(c.Server) +func (c *Client) GetBridgeHomes(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetBridgeHomesRequest(c.Server) if err != nil { return nil, err } @@ -1995,8 +1996,8 @@ func (c *Client) GetDevicePowers(ctx context.Context, reqEditors ...RequestEdito return c.Client.Do(req) } -func (c *Client) GetDevicePower(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetDevicePowerRequest(c.Server, deviceId) +func (c *Client) GetBridgeHome(ctx context.Context, bridgeHomeId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetBridgeHomeRequest(c.Server, bridgeHomeId) if err != nil { return nil, err } @@ -2007,8 +2008,8 @@ func (c *Client) GetDevicePower(ctx context.Context, deviceId string, reqEditors return c.Client.Do(req) } -func (c *Client) GetResources(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetResourcesRequest(c.Server) +func (c *Client) GetDevices(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetDevicesRequest(c.Server) if err != nil { return nil, err } @@ -2019,8 +2020,8 @@ func (c *Client) GetResources(ctx context.Context, reqEditors ...RequestEditorFn return c.Client.Do(req) } -func (c *Client) GetBridges(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetBridgesRequest(c.Server) +func (c *Client) DeleteDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteDeviceRequest(c.Server, deviceId) if err != nil { return nil, err } @@ -2031,8 +2032,8 @@ func (c *Client) GetBridges(ctx context.Context, reqEditors ...RequestEditorFn) return c.Client.Do(req) } -func (c *Client) GetBridge(ctx context.Context, bridgeId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetBridgeRequest(c.Server, bridgeId) +func (c *Client) GetDevice(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetDeviceRequest(c.Server, deviceId) if err != nil { return nil, err } @@ -2043,8 +2044,8 @@ func (c *Client) GetBridge(ctx context.Context, bridgeId string, reqEditors ...R return c.Client.Do(req) } -func (c *Client) UpdateBridgeWithBody(ctx context.Context, bridgeId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateBridgeRequestWithBody(c.Server, bridgeId, contentType, body) +func (c *Client) UpdateDeviceWithBody(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateDeviceRequestWithBody(c.Server, deviceId, contentType, body) if err != nil { return nil, err } @@ -2055,8 +2056,8 @@ func (c *Client) UpdateBridgeWithBody(ctx context.Context, bridgeId string, cont return c.Client.Do(req) } -func (c *Client) UpdateBridge(ctx context.Context, bridgeId string, body UpdateBridgeJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateBridgeRequest(c.Server, bridgeId, body) +func (c *Client) UpdateDevice(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateDeviceRequest(c.Server, deviceId, body) if err != nil { return nil, err } @@ -2067,8 +2068,8 @@ func (c *Client) UpdateBridge(ctx context.Context, bridgeId string, body UpdateB return c.Client.Do(req) } -func (c *Client) GetBridgeHomes(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetBridgeHomesRequest(c.Server) +func (c *Client) GetDevicePowers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetDevicePowersRequest(c.Server) if err != nil { return nil, err } @@ -2079,8 +2080,8 @@ func (c *Client) GetBridgeHomes(ctx context.Context, reqEditors ...RequestEditor return c.Client.Do(req) } -func (c *Client) GetBridgeHome(ctx context.Context, bridgeHomeId string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetBridgeHomeRequest(c.Server, bridgeHomeId) +func (c *Client) GetDevicePower(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetDevicePowerRequest(c.Server, deviceId) if err != nil { return nil, err } @@ -2575,8 +2576,8 @@ func NewAuthenticateRequestWithBody(server string, contentType string, body io.R return req, nil } -// NewGetDevicesRequest generates requests for GetDevices -func NewGetDevicesRequest(server string) (*http.Request, error) { +// NewGetResourcesRequest generates requests for GetResources +func NewGetResourcesRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -2584,7 +2585,7 @@ func NewGetDevicesRequest(server string) (*http.Request, error) { return nil, err } - operationPath := fmt.Sprintf("/clip/v2/device") + operationPath := fmt.Sprintf("/clip/v2/resource") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2602,23 +2603,16 @@ func NewGetDevicesRequest(server string) (*http.Request, error) { return req, nil } -// NewDeleteDeviceRequest generates requests for DeleteDevice -func NewDeleteDeviceRequest(server string, deviceId string) (*http.Request, error) { +// NewGetBridgesRequest generates requests for GetBridges +func NewGetBridgesRequest(server string) (*http.Request, error) { var err error - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) - if err != nil { - return nil, err - } - serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/clip/v2/device/%s", pathParam0) + operationPath := fmt.Sprintf("/clip/v2/resource/bridge") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2628,7 +2622,7 @@ func NewDeleteDeviceRequest(server string, deviceId string) (*http.Request, erro return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } @@ -2636,13 +2630,13 @@ func NewDeleteDeviceRequest(server string, deviceId string) (*http.Request, erro return req, nil } -// NewGetDeviceRequest generates requests for GetDevice -func NewGetDeviceRequest(server string, deviceId string) (*http.Request, error) { +// NewGetBridgeRequest generates requests for GetBridge +func NewGetBridgeRequest(server string, bridgeId string) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "bridgeId", runtime.ParamLocationPath, bridgeId) if err != nil { return nil, err } @@ -2652,7 +2646,7 @@ func NewGetDeviceRequest(server string, deviceId string) (*http.Request, error) return nil, err } - operationPath := fmt.Sprintf("/clip/v2/device/%s", pathParam0) + operationPath := fmt.Sprintf("/clip/v2/resource/bridge/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2670,24 +2664,24 @@ func NewGetDeviceRequest(server string, deviceId string) (*http.Request, error) return req, nil } -// NewUpdateDeviceRequest calls the generic UpdateDevice builder with application/json body -func NewUpdateDeviceRequest(server string, deviceId string, body UpdateDeviceJSONRequestBody) (*http.Request, error) { +// NewUpdateBridgeRequest calls the generic UpdateBridge builder with application/json body +func NewUpdateBridgeRequest(server string, bridgeId string, body UpdateBridgeJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewUpdateDeviceRequestWithBody(server, deviceId, "application/json", bodyReader) + return NewUpdateBridgeRequestWithBody(server, bridgeId, "application/json", bodyReader) } -// NewUpdateDeviceRequestWithBody generates requests for UpdateDevice with any type of body -func NewUpdateDeviceRequestWithBody(server string, deviceId string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateBridgeRequestWithBody generates requests for UpdateBridge with any type of body +func NewUpdateBridgeRequestWithBody(server string, bridgeId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "bridgeId", runtime.ParamLocationPath, bridgeId) if err != nil { return nil, err } @@ -2697,7 +2691,7 @@ func NewUpdateDeviceRequestWithBody(server string, deviceId string, contentType return nil, err } - operationPath := fmt.Sprintf("/clip/v2/device/%s", pathParam0) + operationPath := fmt.Sprintf("/clip/v2/resource/bridge/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2717,8 +2711,8 @@ func NewUpdateDeviceRequestWithBody(server string, deviceId string, contentType return req, nil } -// NewGetDevicePowersRequest generates requests for GetDevicePowers -func NewGetDevicePowersRequest(server string) (*http.Request, error) { +// NewGetBridgeHomesRequest generates requests for GetBridgeHomes +func NewGetBridgeHomesRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -2726,7 +2720,7 @@ func NewGetDevicePowersRequest(server string) (*http.Request, error) { return nil, err } - operationPath := fmt.Sprintf("/clip/v2/device_power") + operationPath := fmt.Sprintf("/clip/v2/resource/bridge_home") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2744,13 +2738,13 @@ func NewGetDevicePowersRequest(server string) (*http.Request, error) { return req, nil } -// NewGetDevicePowerRequest generates requests for GetDevicePower -func NewGetDevicePowerRequest(server string, deviceId string) (*http.Request, error) { +// NewGetBridgeHomeRequest generates requests for GetBridgeHome +func NewGetBridgeHomeRequest(server string, bridgeHomeId string) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "bridgeHomeId", runtime.ParamLocationPath, bridgeHomeId) if err != nil { return nil, err } @@ -2760,7 +2754,7 @@ func NewGetDevicePowerRequest(server string, deviceId string) (*http.Request, er return nil, err } - operationPath := fmt.Sprintf("/clip/v2/device_power/%s", pathParam0) + operationPath := fmt.Sprintf("/clip/v2/resource/bridge_home/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2778,8 +2772,8 @@ func NewGetDevicePowerRequest(server string, deviceId string) (*http.Request, er return req, nil } -// NewGetResourcesRequest generates requests for GetResources -func NewGetResourcesRequest(server string) (*http.Request, error) { +// NewGetDevicesRequest generates requests for GetDevices +func NewGetDevicesRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -2787,7 +2781,7 @@ func NewGetResourcesRequest(server string) (*http.Request, error) { return nil, err } - operationPath := fmt.Sprintf("/clip/v2/resource") + operationPath := fmt.Sprintf("/clip/v2/resource/device") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2805,16 +2799,23 @@ func NewGetResourcesRequest(server string) (*http.Request, error) { return req, nil } -// NewGetBridgesRequest generates requests for GetBridges -func NewGetBridgesRequest(server string) (*http.Request, error) { +// NewDeleteDeviceRequest generates requests for DeleteDevice +func NewDeleteDeviceRequest(server string, deviceId string) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/clip/v2/resource/bridge") + operationPath := fmt.Sprintf("/clip/v2/resource/device/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2824,7 +2825,7 @@ func NewGetBridgesRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("DELETE", queryURL.String(), nil) if err != nil { return nil, err } @@ -2832,13 +2833,13 @@ func NewGetBridgesRequest(server string) (*http.Request, error) { return req, nil } -// NewGetBridgeRequest generates requests for GetBridge -func NewGetBridgeRequest(server string, bridgeId string) (*http.Request, error) { +// NewGetDeviceRequest generates requests for GetDevice +func NewGetDeviceRequest(server string, deviceId string) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "bridgeId", runtime.ParamLocationPath, bridgeId) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) if err != nil { return nil, err } @@ -2848,7 +2849,7 @@ func NewGetBridgeRequest(server string, bridgeId string) (*http.Request, error) return nil, err } - operationPath := fmt.Sprintf("/clip/v2/resource/bridge/%s", pathParam0) + operationPath := fmt.Sprintf("/clip/v2/resource/device/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2866,24 +2867,24 @@ func NewGetBridgeRequest(server string, bridgeId string) (*http.Request, error) return req, nil } -// NewUpdateBridgeRequest calls the generic UpdateBridge builder with application/json body -func NewUpdateBridgeRequest(server string, bridgeId string, body UpdateBridgeJSONRequestBody) (*http.Request, error) { +// NewUpdateDeviceRequest calls the generic UpdateDevice builder with application/json body +func NewUpdateDeviceRequest(server string, deviceId string, body UpdateDeviceJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewUpdateBridgeRequestWithBody(server, bridgeId, "application/json", bodyReader) + return NewUpdateDeviceRequestWithBody(server, deviceId, "application/json", bodyReader) } -// NewUpdateBridgeRequestWithBody generates requests for UpdateBridge with any type of body -func NewUpdateBridgeRequestWithBody(server string, bridgeId string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateDeviceRequestWithBody generates requests for UpdateDevice with any type of body +func NewUpdateDeviceRequestWithBody(server string, deviceId string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "bridgeId", runtime.ParamLocationPath, bridgeId) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) if err != nil { return nil, err } @@ -2893,7 +2894,7 @@ func NewUpdateBridgeRequestWithBody(server string, bridgeId string, contentType return nil, err } - operationPath := fmt.Sprintf("/clip/v2/resource/bridge/%s", pathParam0) + operationPath := fmt.Sprintf("/clip/v2/resource/device/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2913,8 +2914,8 @@ func NewUpdateBridgeRequestWithBody(server string, bridgeId string, contentType return req, nil } -// NewGetBridgeHomesRequest generates requests for GetBridgeHomes -func NewGetBridgeHomesRequest(server string) (*http.Request, error) { +// NewGetDevicePowersRequest generates requests for GetDevicePowers +func NewGetDevicePowersRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -2922,7 +2923,7 @@ func NewGetBridgeHomesRequest(server string) (*http.Request, error) { return nil, err } - operationPath := fmt.Sprintf("/clip/v2/resource/bridge_home") + operationPath := fmt.Sprintf("/clip/v2/resource/device_power") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2940,13 +2941,13 @@ func NewGetBridgeHomesRequest(server string) (*http.Request, error) { return req, nil } -// NewGetBridgeHomeRequest generates requests for GetBridgeHome -func NewGetBridgeHomeRequest(server string, bridgeHomeId string) (*http.Request, error) { +// NewGetDevicePowerRequest generates requests for GetDevicePower +func NewGetDevicePowerRequest(server string, deviceId string) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "bridgeHomeId", runtime.ParamLocationPath, bridgeHomeId) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "deviceId", runtime.ParamLocationPath, deviceId) if err != nil { return nil, err } @@ -2956,7 +2957,7 @@ func NewGetBridgeHomeRequest(server string, bridgeHomeId string) (*http.Request, return nil, err } - operationPath := fmt.Sprintf("/clip/v2/resource/bridge_home/%s", pathParam0) + operationPath := fmt.Sprintf("/clip/v2/resource/device_power/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -4000,26 +4001,6 @@ type ClientWithResponsesInterface interface { AuthenticateWithResponse(ctx context.Context, body AuthenticateJSONRequestBody, reqEditors ...RequestEditorFn) (*AuthenticateResponse, error) - // GetDevicesWithResponse request - GetDevicesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicesResponse, error) - - // DeleteDeviceWithResponse request - DeleteDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*DeleteDeviceResponse, error) - - // GetDeviceWithResponse request - GetDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDeviceResponse, error) - - // UpdateDeviceWithBodyWithResponse request with any body - UpdateDeviceWithBodyWithResponse(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) - - UpdateDeviceWithResponse(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) - - // GetDevicePowersWithResponse request - GetDevicePowersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicePowersResponse, error) - - // GetDevicePowerWithResponse request - GetDevicePowerWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDevicePowerResponse, error) - // GetResourcesWithResponse request GetResourcesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetResourcesResponse, error) @@ -4040,6 +4021,26 @@ type ClientWithResponsesInterface interface { // GetBridgeHomeWithResponse request GetBridgeHomeWithResponse(ctx context.Context, bridgeHomeId string, reqEditors ...RequestEditorFn) (*GetBridgeHomeResponse, error) + // GetDevicesWithResponse request + GetDevicesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicesResponse, error) + + // DeleteDeviceWithResponse request + DeleteDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*DeleteDeviceResponse, error) + + // GetDeviceWithResponse request + GetDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDeviceResponse, error) + + // UpdateDeviceWithBodyWithResponse request with any body + UpdateDeviceWithBodyWithResponse(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) + + UpdateDeviceWithResponse(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) + + // GetDevicePowersWithResponse request + GetDevicePowersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicePowersResponse, error) + + // GetDevicePowerWithResponse request + GetDevicePowerWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDevicePowerResponse, error) + // GetGroupedLightsWithResponse request GetGroupedLightsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetGroupedLightsResponse, error) @@ -4165,12 +4166,12 @@ func (r AuthenticateResponse) StatusCode() int { return 0 } -type GetDevicesResponse struct { +type GetResourcesResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]DeviceGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]ResourceGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4185,7 +4186,7 @@ type GetDevicesResponse struct { } // Status returns HTTPResponse.Status -func (r GetDevicesResponse) Status() string { +func (r GetResourcesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4193,19 +4194,19 @@ func (r GetDevicesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetDevicesResponse) StatusCode() int { +func (r GetResourcesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DeleteDeviceResponse struct { +type GetBridgesResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]ResourceIdentifier `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]BridgeGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4220,7 +4221,7 @@ type DeleteDeviceResponse struct { } // Status returns HTTPResponse.Status -func (r DeleteDeviceResponse) Status() string { +func (r GetBridgesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4228,18 +4229,18 @@ func (r DeleteDeviceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteDeviceResponse) StatusCode() int { +func (r GetBridgesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetDeviceResponse struct { +type GetBridgeResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]DeviceGet `json:"data,omitempty"` + Data *[]BridgeGet `json:"data,omitempty"` Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized @@ -4255,7 +4256,7 @@ type GetDeviceResponse struct { } // Status returns HTTPResponse.Status -func (r GetDeviceResponse) Status() string { +func (r GetBridgeResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4263,14 +4264,14 @@ func (r GetDeviceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetDeviceResponse) StatusCode() int { +func (r GetBridgeResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type UpdateDeviceResponse struct { +type UpdateBridgeResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { @@ -4290,7 +4291,7 @@ type UpdateDeviceResponse struct { } // Status returns HTTPResponse.Status -func (r UpdateDeviceResponse) Status() string { +func (r UpdateBridgeResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4298,19 +4299,19 @@ func (r UpdateDeviceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateDeviceResponse) StatusCode() int { +func (r UpdateBridgeResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetDevicePowersResponse struct { +type GetBridgeHomesResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]DevicePowerGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]BridgeHomeGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4325,7 +4326,7 @@ type GetDevicePowersResponse struct { } // Status returns HTTPResponse.Status -func (r GetDevicePowersResponse) Status() string { +func (r GetBridgeHomesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4333,19 +4334,19 @@ func (r GetDevicePowersResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetDevicePowersResponse) StatusCode() int { +func (r GetBridgeHomesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetDevicePowerResponse struct { +type GetBridgeHomeResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]DevicePowerGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]BridgeHomeGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4360,7 +4361,7 @@ type GetDevicePowerResponse struct { } // Status returns HTTPResponse.Status -func (r GetDevicePowerResponse) Status() string { +func (r GetBridgeHomeResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4368,19 +4369,19 @@ func (r GetDevicePowerResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetDevicePowerResponse) StatusCode() int { +func (r GetBridgeHomeResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetResourcesResponse struct { +type GetDevicesResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]ResourceGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]DeviceGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4395,7 +4396,7 @@ type GetResourcesResponse struct { } // Status returns HTTPResponse.Status -func (r GetResourcesResponse) Status() string { +func (r GetDevicesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4403,19 +4404,19 @@ func (r GetResourcesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetResourcesResponse) StatusCode() int { +func (r GetDevicesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetBridgesResponse struct { +type DeleteDeviceResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]BridgeGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]ResourceIdentifier `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4430,7 +4431,7 @@ type GetBridgesResponse struct { } // Status returns HTTPResponse.Status -func (r GetBridgesResponse) Status() string { +func (r DeleteDeviceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4438,18 +4439,18 @@ func (r GetBridgesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetBridgesResponse) StatusCode() int { +func (r DeleteDeviceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetBridgeResponse struct { +type GetDeviceResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]BridgeGet `json:"data,omitempty"` + Data *[]DeviceGet `json:"data,omitempty"` Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized @@ -4465,7 +4466,7 @@ type GetBridgeResponse struct { } // Status returns HTTPResponse.Status -func (r GetBridgeResponse) Status() string { +func (r GetDeviceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4473,14 +4474,14 @@ func (r GetBridgeResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetBridgeResponse) StatusCode() int { +func (r GetDeviceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type UpdateBridgeResponse struct { +type UpdateDeviceResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { @@ -4500,7 +4501,7 @@ type UpdateBridgeResponse struct { } // Status returns HTTPResponse.Status -func (r UpdateBridgeResponse) Status() string { +func (r UpdateDeviceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4508,19 +4509,19 @@ func (r UpdateBridgeResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateBridgeResponse) StatusCode() int { +func (r UpdateDeviceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetBridgeHomesResponse struct { +type GetDevicePowersResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]BridgeHomeGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]DevicePowerGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4535,7 +4536,7 @@ type GetBridgeHomesResponse struct { } // Status returns HTTPResponse.Status -func (r GetBridgeHomesResponse) Status() string { +func (r GetDevicePowersResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4543,19 +4544,19 @@ func (r GetBridgeHomesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetBridgeHomesResponse) StatusCode() int { +func (r GetDevicePowersResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetBridgeHomeResponse struct { +type GetDevicePowerResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { - Data *[]BridgeHomeGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]DevicePowerGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } JSON401 *Unauthorized JSON403 *Forbidden @@ -4570,7 +4571,7 @@ type GetBridgeHomeResponse struct { } // Status returns HTTPResponse.Status -func (r GetBridgeHomeResponse) Status() string { +func (r GetDevicePowerResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4578,7 +4579,7 @@ func (r GetBridgeHomeResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetBridgeHomeResponse) StatusCode() int { +func (r GetDevicePowerResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -5547,128 +5548,128 @@ func (c *ClientWithResponses) AuthenticateWithResponse(ctx context.Context, body return ParseAuthenticateResponse(rsp) } -// GetDevicesWithResponse request returning *GetDevicesResponse -func (c *ClientWithResponses) GetDevicesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicesResponse, error) { - rsp, err := c.GetDevices(ctx, reqEditors...) +// GetResourcesWithResponse request returning *GetResourcesResponse +func (c *ClientWithResponses) GetResourcesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetResourcesResponse, error) { + rsp, err := c.GetResources(ctx, reqEditors...) if err != nil { return nil, err } - return ParseGetDevicesResponse(rsp) + return ParseGetResourcesResponse(rsp) } -// DeleteDeviceWithResponse request returning *DeleteDeviceResponse -func (c *ClientWithResponses) DeleteDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*DeleteDeviceResponse, error) { - rsp, err := c.DeleteDevice(ctx, deviceId, reqEditors...) +// GetBridgesWithResponse request returning *GetBridgesResponse +func (c *ClientWithResponses) GetBridgesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetBridgesResponse, error) { + rsp, err := c.GetBridges(ctx, reqEditors...) if err != nil { return nil, err } - return ParseDeleteDeviceResponse(rsp) + return ParseGetBridgesResponse(rsp) } -// GetDeviceWithResponse request returning *GetDeviceResponse -func (c *ClientWithResponses) GetDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDeviceResponse, error) { - rsp, err := c.GetDevice(ctx, deviceId, reqEditors...) +// GetBridgeWithResponse request returning *GetBridgeResponse +func (c *ClientWithResponses) GetBridgeWithResponse(ctx context.Context, bridgeId string, reqEditors ...RequestEditorFn) (*GetBridgeResponse, error) { + rsp, err := c.GetBridge(ctx, bridgeId, reqEditors...) if err != nil { return nil, err } - return ParseGetDeviceResponse(rsp) + return ParseGetBridgeResponse(rsp) } -// UpdateDeviceWithBodyWithResponse request with arbitrary body returning *UpdateDeviceResponse -func (c *ClientWithResponses) UpdateDeviceWithBodyWithResponse(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) { - rsp, err := c.UpdateDeviceWithBody(ctx, deviceId, contentType, body, reqEditors...) +// UpdateBridgeWithBodyWithResponse request with arbitrary body returning *UpdateBridgeResponse +func (c *ClientWithResponses) UpdateBridgeWithBodyWithResponse(ctx context.Context, bridgeId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateBridgeResponse, error) { + rsp, err := c.UpdateBridgeWithBody(ctx, bridgeId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateDeviceResponse(rsp) + return ParseUpdateBridgeResponse(rsp) } -func (c *ClientWithResponses) UpdateDeviceWithResponse(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) { - rsp, err := c.UpdateDevice(ctx, deviceId, body, reqEditors...) +func (c *ClientWithResponses) UpdateBridgeWithResponse(ctx context.Context, bridgeId string, body UpdateBridgeJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateBridgeResponse, error) { + rsp, err := c.UpdateBridge(ctx, bridgeId, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateDeviceResponse(rsp) + return ParseUpdateBridgeResponse(rsp) } -// GetDevicePowersWithResponse request returning *GetDevicePowersResponse -func (c *ClientWithResponses) GetDevicePowersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicePowersResponse, error) { - rsp, err := c.GetDevicePowers(ctx, reqEditors...) +// GetBridgeHomesWithResponse request returning *GetBridgeHomesResponse +func (c *ClientWithResponses) GetBridgeHomesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetBridgeHomesResponse, error) { + rsp, err := c.GetBridgeHomes(ctx, reqEditors...) if err != nil { return nil, err } - return ParseGetDevicePowersResponse(rsp) + return ParseGetBridgeHomesResponse(rsp) } -// GetDevicePowerWithResponse request returning *GetDevicePowerResponse -func (c *ClientWithResponses) GetDevicePowerWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDevicePowerResponse, error) { - rsp, err := c.GetDevicePower(ctx, deviceId, reqEditors...) +// GetBridgeHomeWithResponse request returning *GetBridgeHomeResponse +func (c *ClientWithResponses) GetBridgeHomeWithResponse(ctx context.Context, bridgeHomeId string, reqEditors ...RequestEditorFn) (*GetBridgeHomeResponse, error) { + rsp, err := c.GetBridgeHome(ctx, bridgeHomeId, reqEditors...) if err != nil { return nil, err } - return ParseGetDevicePowerResponse(rsp) + return ParseGetBridgeHomeResponse(rsp) } -// GetResourcesWithResponse request returning *GetResourcesResponse -func (c *ClientWithResponses) GetResourcesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetResourcesResponse, error) { - rsp, err := c.GetResources(ctx, reqEditors...) +// GetDevicesWithResponse request returning *GetDevicesResponse +func (c *ClientWithResponses) GetDevicesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicesResponse, error) { + rsp, err := c.GetDevices(ctx, reqEditors...) if err != nil { return nil, err } - return ParseGetResourcesResponse(rsp) + return ParseGetDevicesResponse(rsp) } -// GetBridgesWithResponse request returning *GetBridgesResponse -func (c *ClientWithResponses) GetBridgesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetBridgesResponse, error) { - rsp, err := c.GetBridges(ctx, reqEditors...) +// DeleteDeviceWithResponse request returning *DeleteDeviceResponse +func (c *ClientWithResponses) DeleteDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*DeleteDeviceResponse, error) { + rsp, err := c.DeleteDevice(ctx, deviceId, reqEditors...) if err != nil { return nil, err } - return ParseGetBridgesResponse(rsp) + return ParseDeleteDeviceResponse(rsp) } -// GetBridgeWithResponse request returning *GetBridgeResponse -func (c *ClientWithResponses) GetBridgeWithResponse(ctx context.Context, bridgeId string, reqEditors ...RequestEditorFn) (*GetBridgeResponse, error) { - rsp, err := c.GetBridge(ctx, bridgeId, reqEditors...) +// GetDeviceWithResponse request returning *GetDeviceResponse +func (c *ClientWithResponses) GetDeviceWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDeviceResponse, error) { + rsp, err := c.GetDevice(ctx, deviceId, reqEditors...) if err != nil { return nil, err } - return ParseGetBridgeResponse(rsp) + return ParseGetDeviceResponse(rsp) } -// UpdateBridgeWithBodyWithResponse request with arbitrary body returning *UpdateBridgeResponse -func (c *ClientWithResponses) UpdateBridgeWithBodyWithResponse(ctx context.Context, bridgeId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateBridgeResponse, error) { - rsp, err := c.UpdateBridgeWithBody(ctx, bridgeId, contentType, body, reqEditors...) +// UpdateDeviceWithBodyWithResponse request with arbitrary body returning *UpdateDeviceResponse +func (c *ClientWithResponses) UpdateDeviceWithBodyWithResponse(ctx context.Context, deviceId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) { + rsp, err := c.UpdateDeviceWithBody(ctx, deviceId, contentType, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateBridgeResponse(rsp) + return ParseUpdateDeviceResponse(rsp) } -func (c *ClientWithResponses) UpdateBridgeWithResponse(ctx context.Context, bridgeId string, body UpdateBridgeJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateBridgeResponse, error) { - rsp, err := c.UpdateBridge(ctx, bridgeId, body, reqEditors...) +func (c *ClientWithResponses) UpdateDeviceWithResponse(ctx context.Context, deviceId string, body UpdateDeviceJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDeviceResponse, error) { + rsp, err := c.UpdateDevice(ctx, deviceId, body, reqEditors...) if err != nil { return nil, err } - return ParseUpdateBridgeResponse(rsp) + return ParseUpdateDeviceResponse(rsp) } -// GetBridgeHomesWithResponse request returning *GetBridgeHomesResponse -func (c *ClientWithResponses) GetBridgeHomesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetBridgeHomesResponse, error) { - rsp, err := c.GetBridgeHomes(ctx, reqEditors...) +// GetDevicePowersWithResponse request returning *GetDevicePowersResponse +func (c *ClientWithResponses) GetDevicePowersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetDevicePowersResponse, error) { + rsp, err := c.GetDevicePowers(ctx, reqEditors...) if err != nil { return nil, err } - return ParseGetBridgeHomesResponse(rsp) + return ParseGetDevicePowersResponse(rsp) } -// GetBridgeHomeWithResponse request returning *GetBridgeHomeResponse -func (c *ClientWithResponses) GetBridgeHomeWithResponse(ctx context.Context, bridgeHomeId string, reqEditors ...RequestEditorFn) (*GetBridgeHomeResponse, error) { - rsp, err := c.GetBridgeHome(ctx, bridgeHomeId, reqEditors...) +// GetDevicePowerWithResponse request returning *GetDevicePowerResponse +func (c *ClientWithResponses) GetDevicePowerWithResponse(ctx context.Context, deviceId string, reqEditors ...RequestEditorFn) (*GetDevicePowerResponse, error) { + rsp, err := c.GetDevicePower(ctx, deviceId, reqEditors...) if err != nil { return nil, err } - return ParseGetBridgeHomeResponse(rsp) + return ParseGetDevicePowerResponse(rsp) } // GetGroupedLightsWithResponse request returning *GetGroupedLightsResponse @@ -6027,15 +6028,15 @@ func ParseAuthenticateResponse(rsp *http.Response) (*AuthenticateResponse, error return response, nil } -// ParseGetDevicesResponse parses an HTTP response from a GetDevicesWithResponse call -func ParseGetDevicesResponse(rsp *http.Response) (*GetDevicesResponse, error) { +// ParseGetResourcesResponse parses an HTTP response from a GetResourcesWithResponse call +func ParseGetResourcesResponse(rsp *http.Response) (*GetResourcesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetDevicesResponse{ + response := &GetResourcesResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6043,8 +6044,8 @@ func ParseGetDevicesResponse(rsp *http.Response) (*GetDevicesResponse, error) { switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]DeviceGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]ResourceGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err @@ -6126,15 +6127,15 @@ func ParseGetDevicesResponse(rsp *http.Response) (*GetDevicesResponse, error) { return response, nil } -// ParseDeleteDeviceResponse parses an HTTP response from a DeleteDeviceWithResponse call -func ParseDeleteDeviceResponse(rsp *http.Response) (*DeleteDeviceResponse, error) { +// ParseGetBridgesResponse parses an HTTP response from a GetBridgesWithResponse call +func ParseGetBridgesResponse(rsp *http.Response) (*GetBridgesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DeleteDeviceResponse{ + response := &GetBridgesResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6142,8 +6143,8 @@ func ParseDeleteDeviceResponse(rsp *http.Response) (*DeleteDeviceResponse, error switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]ResourceIdentifier `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]BridgeGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err @@ -6225,15 +6226,15 @@ func ParseDeleteDeviceResponse(rsp *http.Response) (*DeleteDeviceResponse, error return response, nil } -// ParseGetDeviceResponse parses an HTTP response from a GetDeviceWithResponse call -func ParseGetDeviceResponse(rsp *http.Response) (*GetDeviceResponse, error) { +// ParseGetBridgeResponse parses an HTTP response from a GetBridgeWithResponse call +func ParseGetBridgeResponse(rsp *http.Response) (*GetBridgeResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetDeviceResponse{ + response := &GetBridgeResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6241,7 +6242,7 @@ func ParseGetDeviceResponse(rsp *http.Response) (*GetDeviceResponse, error) { switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]DeviceGet `json:"data,omitempty"` + Data *[]BridgeGet `json:"data,omitempty"` Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -6324,15 +6325,15 @@ func ParseGetDeviceResponse(rsp *http.Response) (*GetDeviceResponse, error) { return response, nil } -// ParseUpdateDeviceResponse parses an HTTP response from a UpdateDeviceWithResponse call -func ParseUpdateDeviceResponse(rsp *http.Response) (*UpdateDeviceResponse, error) { +// ParseUpdateBridgeResponse parses an HTTP response from a UpdateBridgeWithResponse call +func ParseUpdateBridgeResponse(rsp *http.Response) (*UpdateBridgeResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateDeviceResponse{ + response := &UpdateBridgeResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6423,15 +6424,15 @@ func ParseUpdateDeviceResponse(rsp *http.Response) (*UpdateDeviceResponse, error return response, nil } -// ParseGetDevicePowersResponse parses an HTTP response from a GetDevicePowersWithResponse call -func ParseGetDevicePowersResponse(rsp *http.Response) (*GetDevicePowersResponse, error) { +// ParseGetBridgeHomesResponse parses an HTTP response from a GetBridgeHomesWithResponse call +func ParseGetBridgeHomesResponse(rsp *http.Response) (*GetBridgeHomesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetDevicePowersResponse{ + response := &GetBridgeHomesResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6439,8 +6440,8 @@ func ParseGetDevicePowersResponse(rsp *http.Response) (*GetDevicePowersResponse, switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]DevicePowerGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]BridgeHomeGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err @@ -6522,15 +6523,15 @@ func ParseGetDevicePowersResponse(rsp *http.Response) (*GetDevicePowersResponse, return response, nil } -// ParseGetDevicePowerResponse parses an HTTP response from a GetDevicePowerWithResponse call -func ParseGetDevicePowerResponse(rsp *http.Response) (*GetDevicePowerResponse, error) { +// ParseGetBridgeHomeResponse parses an HTTP response from a GetBridgeHomeWithResponse call +func ParseGetBridgeHomeResponse(rsp *http.Response) (*GetBridgeHomeResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetDevicePowerResponse{ + response := &GetBridgeHomeResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6538,8 +6539,8 @@ func ParseGetDevicePowerResponse(rsp *http.Response) (*GetDevicePowerResponse, e switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]DevicePowerGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]BridgeHomeGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err @@ -6621,15 +6622,15 @@ func ParseGetDevicePowerResponse(rsp *http.Response) (*GetDevicePowerResponse, e return response, nil } -// ParseGetResourcesResponse parses an HTTP response from a GetResourcesWithResponse call -func ParseGetResourcesResponse(rsp *http.Response) (*GetResourcesResponse, error) { +// ParseGetDevicesResponse parses an HTTP response from a GetDevicesWithResponse call +func ParseGetDevicesResponse(rsp *http.Response) (*GetDevicesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetResourcesResponse{ + response := &GetDevicesResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6637,8 +6638,8 @@ func ParseGetResourcesResponse(rsp *http.Response) (*GetResourcesResponse, error switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]ResourceGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]DeviceGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err @@ -6720,15 +6721,15 @@ func ParseGetResourcesResponse(rsp *http.Response) (*GetResourcesResponse, error return response, nil } -// ParseGetBridgesResponse parses an HTTP response from a GetBridgesWithResponse call -func ParseGetBridgesResponse(rsp *http.Response) (*GetBridgesResponse, error) { +// ParseDeleteDeviceResponse parses an HTTP response from a DeleteDeviceWithResponse call +func ParseDeleteDeviceResponse(rsp *http.Response) (*DeleteDeviceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetBridgesResponse{ + response := &DeleteDeviceResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6736,8 +6737,8 @@ func ParseGetBridgesResponse(rsp *http.Response) (*GetBridgesResponse, error) { switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]BridgeGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]ResourceIdentifier `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err @@ -6819,15 +6820,15 @@ func ParseGetBridgesResponse(rsp *http.Response) (*GetBridgesResponse, error) { return response, nil } -// ParseGetBridgeResponse parses an HTTP response from a GetBridgeWithResponse call -func ParseGetBridgeResponse(rsp *http.Response) (*GetBridgeResponse, error) { +// ParseGetDeviceResponse parses an HTTP response from a GetDeviceWithResponse call +func ParseGetDeviceResponse(rsp *http.Response) (*GetDeviceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetBridgeResponse{ + response := &GetDeviceResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -6835,7 +6836,7 @@ func ParseGetBridgeResponse(rsp *http.Response) (*GetBridgeResponse, error) { switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]BridgeGet `json:"data,omitempty"` + Data *[]DeviceGet `json:"data,omitempty"` Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -6918,15 +6919,15 @@ func ParseGetBridgeResponse(rsp *http.Response) (*GetBridgeResponse, error) { return response, nil } -// ParseUpdateBridgeResponse parses an HTTP response from a UpdateBridgeWithResponse call -func ParseUpdateBridgeResponse(rsp *http.Response) (*UpdateBridgeResponse, error) { +// ParseUpdateDeviceResponse parses an HTTP response from a UpdateDeviceWithResponse call +func ParseUpdateDeviceResponse(rsp *http.Response) (*UpdateDeviceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateBridgeResponse{ + response := &UpdateDeviceResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -7017,15 +7018,15 @@ func ParseUpdateBridgeResponse(rsp *http.Response) (*UpdateBridgeResponse, error return response, nil } -// ParseGetBridgeHomesResponse parses an HTTP response from a GetBridgeHomesWithResponse call -func ParseGetBridgeHomesResponse(rsp *http.Response) (*GetBridgeHomesResponse, error) { +// ParseGetDevicePowersResponse parses an HTTP response from a GetDevicePowersWithResponse call +func ParseGetDevicePowersResponse(rsp *http.Response) (*GetDevicePowersResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetBridgeHomesResponse{ + response := &GetDevicePowersResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -7033,8 +7034,8 @@ func ParseGetBridgeHomesResponse(rsp *http.Response) (*GetBridgeHomesResponse, e switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]BridgeHomeGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]DevicePowerGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err @@ -7116,15 +7117,15 @@ func ParseGetBridgeHomesResponse(rsp *http.Response) (*GetBridgeHomesResponse, e return response, nil } -// ParseGetBridgeHomeResponse parses an HTTP response from a GetBridgeHomeWithResponse call -func ParseGetBridgeHomeResponse(rsp *http.Response) (*GetBridgeHomeResponse, error) { +// ParseGetDevicePowerResponse parses an HTTP response from a GetDevicePowerWithResponse call +func ParseGetDevicePowerResponse(rsp *http.Response) (*GetDevicePowerResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetBridgeHomeResponse{ + response := &GetDevicePowerResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -7132,8 +7133,8 @@ func ParseGetBridgeHomeResponse(rsp *http.Response) (*GetBridgeHomeResponse, err switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { - Data *[]BridgeHomeGet `json:"data,omitempty"` - Errors *[]Error `json:"errors,omitempty"` + Data *[]DevicePowerGet `json:"data,omitempty"` + Errors *[]Error `json:"errors,omitempty"` } if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err diff --git a/openhue/home_helper.go b/openhue/home_helper.go new file mode 100644 index 0000000..6caa2ac --- /dev/null +++ b/openhue/home_helper.go @@ -0,0 +1,90 @@ +package openhue + +import ( + log "github.com/sirupsen/logrus" + "slices" +) + +// FindAllLights returns all the lights that belong to a Home +func FindAllLights(home *Home) []Light { + var lights []Light + + for _, room := range home.Rooms { + for _, device := range room.Devices { + if device.Light != nil { + lights = append(lights, *device.Light) + } + } + } + + return lights +} + +// FindLightByName returns a slice containing a single Light. The slice will be empty if no light was found. +func FindLightByName(home *Home, name string) []Light { + for _, room := range home.Rooms { + for _, device := range room.Devices { + if device.Light != nil { + if device.Light.Name == name { + return []Light{*device.Light} + } + } + } + } + + log.Warn("no light found with name ", name) + return []Light{} +} + +func FindLightsByIds(home *Home, ids []string) []Light { + + var lights []Light + + for _, room := range home.Rooms { + for _, device := range room.Devices { + if device.Light != nil { + if slices.Contains(ids, device.Light.Id) { + lights = append(lights, *device.Light) + } + } + } + } + + return lights +} + +// +// Room +// + +func FindRoomById(home *Home, id string) []Room { + for _, room := range home.Rooms { + if room.Id == id { + return []Room{room} + } + } + + log.Warn("no light found with ID ", id) + return []Room{} +} + +func FindRoomByName(home *Home, name string) []Room { + for _, room := range home.Rooms { + if room.Name == name { + return []Room{room} + } + } + + log.Warn("no room found with name ", name) + return []Room{} +} + +func FindAllRooms(home *Home) []Room { + var rooms []Room + + for _, room := range home.Rooms { + rooms = append(rooms, room) + } + + return rooms +} diff --git a/openhue/home_model.go b/openhue/home_model.go new file mode 100644 index 0000000..ab0d9b4 --- /dev/null +++ b/openhue/home_model.go @@ -0,0 +1,176 @@ +package openhue + +import ( + "context" + "github.com/spf13/cobra" + "openhue-cli/openhue/gen" + "openhue-cli/util/color" +) + +type HomeResourceType gen.ResourceIdentifierRtype + +type Resource struct { + Id string + Name string + Type HomeResourceType + Parent *Resource + // internal + ctx *hueHomeCtx +} + +// +// Home +// + +type Home struct { + Resource + Rooms []Room + Devices []Device + HueData *gen.BridgeHomeGet +} + +// +// Room +// + +type Room struct { + Resource + Devices []Device + HueData *gen.RoomGet + + // Services + GroupedLight *GroupedLight +} + +// +// Device +// + +type Device struct { + Resource + HueData *gen.DeviceGet + + // Services + Light *Light +} + +// +// Light +// + +type SetLightOptions struct { + Status LightStatus + Brightness float32 + Color color.XY +} + +func NewSetLightOptions() *SetLightOptions { + return &SetLightOptions{ + Status: LightStatusUndefined, + Brightness: -1, + Color: color.UndefinedColor, + } +} + +type LightStatus string + +const ( + LightStatusOn LightStatus = "on" + LightStatusOff LightStatus = "off" + LightStatusUndefined LightStatus = "undefined" +) + +// ToBool converts a LightStatus to its bool value. LightStatusUndefined is considered as false. +func ToBool(status LightStatus) *bool { + + onValue, offValue := true, false + + if status == LightStatusOn { + return &onValue + } else if status == LightStatusOff { + return &offValue + } else { + return &offValue + } +} + +type LightService interface { + IsOn() bool + Set(options SetLightOptions) +} + +type Light struct { + Resource + LightService + HueData *gen.LightGet +} + +func (light *Light) IsOn() bool { + return *light.HueData.On.On +} + +func (light *Light) Set(o *SetLightOptions) { + request := &gen.UpdateLightJSONRequestBody{} + + if o.Status != LightStatusUndefined { + request.On = &gen.On{ + On: ToBool(o.Status), + } + } + + if o.Brightness >= 0 && o.Brightness <= 100.0 { + request.Dimming = &gen.Dimming{ + Brightness: &o.Brightness, + } + } + + if o.Color != color.UndefinedColor { + request.Color = &gen.Color{ + Xy: &gen.GamutPosition{ + X: &o.Color.X, + Y: &o.Color.Y, + }, + } + } + + _, err := light.ctx.api.UpdateLight(context.Background(), light.Id, *request) + cobra.CheckErr(err) +} + +type GroupedLight struct { + Resource + LightService + HueData *gen.GroupedLightGet +} + +func (groupedLight *GroupedLight) IsOn() bool { + return *groupedLight.HueData.On.On +} + +func (groupedLight *GroupedLight) Set(o SetLightOptions) { + request := &gen.UpdateGroupedLightJSONRequestBody{} + + if o.Status != LightStatusUndefined { + request.On = &gen.On{ + On: ToBool(o.Status), + } + } + + if o.Brightness >= 0 && o.Brightness <= 100.0 { + request.Dimming = &gen.Dimming{ + Brightness: &o.Brightness, + } + } + + if o.Color != color.UndefinedColor { + request.Color = &gen.Color{ + Xy: &gen.GamutPosition{ + X: &o.Color.X, + Y: &o.Color.Y, + }, + } + } + + _, err := groupedLight.ctx.api.UpdateGroupedLight(context.Background(), groupedLight.Id, *request) + cobra.CheckErr(err) +} diff --git a/openhue/home_service.go b/openhue/home_service.go new file mode 100644 index 0000000..cb84166 --- /dev/null +++ b/openhue/home_service.go @@ -0,0 +1,294 @@ +package openhue + +import ( + "context" + "errors" + "fmt" + log "github.com/sirupsen/logrus" + "openhue-cli/openhue/gen" +) + +func LoadHome(api *gen.ClientWithResponses) (*Home, error) { + log.Info("Loading home...") + + ctx, err := loadHueHomeCtx(api) + if err != nil { + return nil, err + } + + home := Home{ + Resource: Resource{ + ctx: ctx, + Id: *ctx.home.Id, + Name: "Home", + Type: HomeResourceType(gen.ResourceIdentifierRtypeBridgeHome), + Parent: nil, // explicitly set Parent to nil as Home is the root object + }, + HueData: ctx.home, + } + + home.Rooms = getRooms(ctx, &home.Resource, home.HueData.Children) + home.Devices = getDevices(ctx, &home.Resource, home.HueData.Children) + + return &home, nil +} + +// +// Private +// + +func (t HomeResourceType) is(r gen.ResourceIdentifierRtype) bool { + + if t == HomeResourceType(r) { + return true + } + + return false +} + +func getRooms(ctx *hueHomeCtx, parent *Resource, children *[]gen.ResourceIdentifier) []Room { + + var rooms []Room + + for _, child := range *children { + rType := HomeResourceType(*child.Rtype) + if rType.is(gen.ResourceIdentifierRtypeRoom) { + hueRoom := ctx.rooms[*child.Rid] + room := Room{ + Resource: Resource{ + ctx: ctx, + Id: *hueRoom.Id, + Name: *hueRoom.Metadata.Name, + Type: rType, + Parent: parent, + }, + HueData: &hueRoom, + } + + room.Devices = getDevices(ctx, &room.Resource, hueRoom.Children) + + groupedLight, err := getGroupedLight(ctx, &room.Resource, hueRoom.Services) + if err != nil { + log.Warning(err) + } else { + room.GroupedLight = groupedLight + } + + rooms = append(rooms, room) + } + } + + return rooms +} + +func getDevices(ctx *hueHomeCtx, parent *Resource, children *[]gen.ResourceIdentifier) []Device { + + var devices []Device + + for _, child := range *children { + rType := HomeResourceType(*child.Rtype) + if rType.is(gen.ResourceIdentifierRtypeDevice) { + hueDevice := ctx.devices[*child.Rid] + device := Device{ + Resource: Resource{ + ctx: ctx, + Id: *hueDevice.Id, + Name: *hueDevice.Metadata.Name, + Type: rType, + Parent: parent, + }, + HueData: &hueDevice, + } + + light, err := getLight(ctx, &device.Resource, hueDevice.Services) + if err != nil { + log.Warning(err) + } else { + device.Light = light + } + + devices = append(devices, device) + } + } + + return devices +} + +func getGroupedLight(ctx *hueHomeCtx, parent *Resource, services *[]gen.ResourceIdentifier) (*GroupedLight, error) { + + for _, service := range *services { + rType := HomeResourceType(*service.Rtype) + if rType.is(gen.ResourceIdentifierRtypeGroupedLight) { + hueGroupedLight := ctx.groupedLights[*service.Rid] + return &GroupedLight{ + Resource: Resource{ + ctx: ctx, + Id: *hueGroupedLight.Id, + Name: "Grouped Light (" + parent.Name + ")", + Type: rType, + Parent: parent.Parent, + }, + HueData: &hueGroupedLight, + }, nil + } + } + + return nil, fmt.Errorf("no 'grouped_light' service found for resource %s (%s)", parent.Id, parent.Name) +} + +func getLight(ctx *hueHomeCtx, parent *Resource, services *[]gen.ResourceIdentifier) (*Light, error) { + + for _, service := range *services { + rType := HomeResourceType(*service.Rtype) + if rType.is(gen.ResourceIdentifierRtypeLight) { + light := ctx.lights[*service.Rid] + return &Light{ + Resource: Resource{ + ctx: ctx, + Id: *light.Id, + Name: *light.Metadata.Name, + Type: rType, + Parent: parent, + }, + HueData: &light, + }, nil + } + } + + return nil, fmt.Errorf("no 'light' service found for resource %s (%s)", parent.Id, parent.Name) +} + +type hueHomeCtx struct { + // api + api *gen.ClientWithResponses + // context + home *gen.BridgeHomeGet + rooms map[string]gen.RoomGet + devices map[string]gen.DeviceGet + lights map[string]gen.LightGet + groupedLights map[string]gen.GroupedLightGet +} + +func loadHueHomeCtx(api *gen.ClientWithResponses) (*hueHomeCtx, error) { + + hueHome, err := fetchBridgeHome(api) + if err != nil { + return nil, err + } + + rooms, err := fetchRooms(api) + if err != nil { + return nil, err + } + + devices, err := fetchDevices(api) + if err != nil { + return nil, err + } + + lights, err := fetchLights(api) + if err != nil { + return nil, err + } + + groupedLights, err := fetchGroupedLights(api) + if err != nil { + return nil, err + } + + return &hueHomeCtx{ + api: api, + home: hueHome, + rooms: rooms, + devices: devices, + lights: lights, + groupedLights: groupedLights, + }, nil +} + +func fetchBridgeHome(api *gen.ClientWithResponses) (*gen.BridgeHomeGet, error) { + log.Info("Fetching home...") + + resp, err := api.GetBridgeHomesWithResponse(context.Background()) + if err != nil { + return nil, err + } + + if len(*(*resp.JSON200).Data) != 1 { + return nil, errors.New("more than 1 home attached to the bridge is not supported yet") + } + + return &(*(*resp.JSON200).Data)[0], nil +} + +func fetchDevices(api *gen.ClientWithResponses) (map[string]gen.DeviceGet, error) { + log.Info("Fetching devices...") + + resp, err := api.GetDevicesWithResponse(context.Background()) + if err != nil { + return nil, err + } + + devices := make(map[string]gen.DeviceGet) + hueDevices := (*resp.JSON200).Data + + for _, device := range *hueDevices { + devices[*device.Id] = device + } + + return devices, err +} + +func fetchRooms(api *gen.ClientWithResponses) (map[string]gen.RoomGet, error) { + log.Info("Fetching rooms...") + + resp, err := api.GetRoomsWithResponse(context.Background()) + if err != nil { + return nil, err + } + + rooms := make(map[string]gen.RoomGet) + hueRooms := (*resp.JSON200).Data + + for _, room := range *hueRooms { + rooms[*room.Id] = room + } + + return rooms, err +} + +func fetchLights(api *gen.ClientWithResponses) (map[string]gen.LightGet, error) { + log.Info("Fetching lights...") + + resp, err := api.GetLightsWithResponse(context.Background()) + if err != nil { + return nil, err + } + + lights := make(map[string]gen.LightGet) + hueLights := (*resp.JSON200).Data + + for _, light := range *hueLights { + lights[*light.Id] = light + } + + return lights, nil +} + +func fetchGroupedLights(api *gen.ClientWithResponses) (map[string]gen.GroupedLightGet, error) { + log.Info("Fetching grouped lights...") + + resp, err := api.GetGroupedLightsWithResponse(context.Background()) + if err != nil { + return nil, err + } + + groupedLights := make(map[string]gen.GroupedLightGet) + hueGroupedLights := (*resp.JSON200).Data + + for _, groupedLight := range *hueGroupedLights { + groupedLights[*groupedLight.Id] = groupedLight + } + + return groupedLights, err +} diff --git a/util/logger/logger.go b/util/logger/logger.go new file mode 100644 index 0000000..2feeb42 --- /dev/null +++ b/util/logger/logger.go @@ -0,0 +1,26 @@ +package logger + +import ( + log "github.com/sirupsen/logrus" + "os" + "path/filepath" +) + +func Init(configPath string) { + + if isProd() { + // If the file doesn't exist, create it or append to the file + file, err := os.OpenFile(filepath.Join(configPath, "openhue.log"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) + if err != nil { + log.Fatal(err) + } + + log.SetOutput(file) + } else { + log.Info("Running in dev mode, logs will be output in the console") + } +} + +func isProd() bool { + return os.Getenv("OPENHUE_ENV") != "dev" +}