From 9954178217aa4145734bdfd892981d8a56c851a0 Mon Sep 17 00:00:00 2001 From: David Newhall II Date: Thu, 15 Apr 2021 03:08:18 -0700 Subject: [PATCH] add error wraps --- cameras.go | 36 ++++++++++++++++++++++++++++++------ cameras_types.go | 7 ++++++- ptz.go | 6 +++++- schedules.go | 6 +++++- server/server.go | 7 ++++++- server/server_test.go | 2 +- 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/cameras.go b/cameras.go index 8c20f73..e353a40 100644 --- a/cameras.go +++ b/cameras.go @@ -209,7 +209,11 @@ func (c *Camera) ToggleContinuous(arm CameraArmMode) error { params := make(url.Values) params.Set("arm", string(arm)) - return c.server.SimpleReq("++ssControlContinuous", params, c.Number) + if err := c.server.SimpleReq("++ssControlContinuous", params, c.Number); err != nil { + return fmt.Errorf("request failed: %w", err) + } + + return nil } // ToggleMotion arms (true) or disarms (false) a camera's motion capture mode. @@ -217,7 +221,11 @@ func (c *Camera) ToggleMotion(arm CameraArmMode) error { params := make(url.Values) params.Set("arm", string(arm)) - return c.server.SimpleReq("++ssControlMotionCapture", params, c.Number) + if err := c.server.SimpleReq("++ssControlMotionCapture", params, c.Number); err != nil { + return fmt.Errorf("request failed: %w", err) + } + + return nil } // ToggleActions arms (true) or disarms (false) a camera's actions. @@ -225,13 +233,21 @@ func (c *Camera) ToggleActions(arm CameraArmMode) error { params := make(url.Values) params.Set("arm", string(arm)) - return c.server.SimpleReq("++ssControlActions", params, c.Number) + if err := c.server.SimpleReq("++ssControlActions", params, c.Number); err != nil { + return fmt.Errorf("request failed: %w", err) + } + + return nil } // TriggerMotion sets a camera as currently seeing motion. // Other actions likely occur because of this! func (c *Camera) TriggerMotion() error { - return c.server.SimpleReq("++triggermd", make(url.Values), c.Number) + if err := c.server.SimpleReq("++triggermd", make(url.Values), c.Number); err != nil { + return fmt.Errorf("request failed: %w", err) + } + + return nil } // SetSchedule configures a camera mode's primary schedule. @@ -242,7 +258,11 @@ func (c *Camera) SetSchedule(mode CameraMode, scheduleID int) error { params.Set("mode", string(mode)) params.Set("id", strconv.Itoa(scheduleID)) - return c.server.SimpleReq("++ssSetSchedule", params, c.Number) + if err := c.server.SimpleReq("++ssSetSchedule", params, c.Number); err != nil { + return fmt.Errorf("request failed: %w", err) + } + + return nil } // SetScheduleOverride temporarily overrides a camera mode's current schedule. @@ -253,7 +273,11 @@ func (c *Camera) SetScheduleOverride(mode CameraMode, overrideID int) error { params.Set("mode", string(mode)) params.Set("id", strconv.Itoa(overrideID)) - return c.server.SimpleReq("++ssSetOverride", params, c.Number) + if err := c.server.SimpleReq("++ssSetOverride", params, c.Number); err != nil { + return fmt.Errorf("request failed: %w", err) + } + + return nil } /* INTERFACE HELPER METHODS FOLLOW */ diff --git a/cameras_types.go b/cameras_types.go index 87a8343..01ce66a 100644 --- a/cameras_types.go +++ b/cameras_types.go @@ -2,6 +2,7 @@ package securityspy import ( "encoding/xml" + "fmt" ) // Encoder is the path to ffmpeg. @@ -44,7 +45,11 @@ type CameraSchedule struct { // UnmarshalXML stores a schedule ID into a CameraSchedule type. // This isn't a method you should ever call directly; it is only used during data initialization. func (bit *CameraSchedule) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - return d.DecodeElement(&bit.ID, &start) + if err := d.DecodeElement(&bit.ID, &start); err != nil { + return fmt.Errorf("decoding xml: %w", err) + } + + return nil } // Camera defines the data returned from the SecuritySpy API. This data is directly diff --git a/ptz.go b/ptz.go index 41083c1..98bb428 100644 --- a/ptz.go +++ b/ptz.go @@ -203,7 +203,11 @@ func (z *PTZ) ptzReq(command ptzCommand) error { params := make(url.Values) params.Set("command", strconv.Itoa(int(command))) - return z.camera.server.SimpleReq("++ptz/command", params, z.camera.Number) + if err := z.camera.server.SimpleReq("++ptz/command", params, z.camera.Number); err != nil { + return fmt.Errorf("ptz failed: %w", err) + } + + return nil } // UnmarshalXML method converts ptzCapbilities bitmask from an XML payload into true/false abilities. diff --git a/schedules.go b/schedules.go index 483a0b5..32b6fb2 100644 --- a/schedules.go +++ b/schedules.go @@ -65,5 +65,9 @@ func (s *Server) SetSchedulePreset(presetID int) error { params := make(url.Values) params.Set("id", strconv.Itoa(presetID)) - return s.SimpleReq("++ssSetPreset", params, -1) + if err := s.SimpleReq("++ssSetPreset", params, -1); err != nil { + return fmt.Errorf("http request: %w", err) + } + + return nil } diff --git a/server/server.go b/server/server.go index 6b82772..00111a1 100644 --- a/server/server.go +++ b/server/server.go @@ -106,7 +106,12 @@ func (s *Config) GetContextClient(ctx context.Context, api string, params url.Va req.URL.RawQuery = params.Encode() - return client.Do(req) + resp, err := client.Do(req) + if err != nil { + return resp, fmt.Errorf("http request: %w", err) + } + + return resp, nil } // GetContext is the same as Get except you can pass in your own context. diff --git a/server/server_test.go b/server/server_test.go index 630827d..b413493 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -56,7 +56,7 @@ func testingHTTPClient(handler http.Handler) (*http.Client, *httptest.Server) { client := &http.Client{ Transport: &http.Transport{ DialContext: func(_ context.Context, network, _ string) (net.Conn, error) { - return net.Dial(network, fakeServer.Listener.Addr().String()) + return net.Dial(network, fakeServer.Listener.Addr().String()) //nolint:wrapcheck }, }, }