diff --git a/api/fiscal.go b/api/fiscal.go index 63e944d..6f5581c 100644 --- a/api/fiscal.go +++ b/api/fiscal.go @@ -8,6 +8,15 @@ import ( "log" ) +type APIError struct { + Code int + Message string +} + +func (e *APIError) Error() string { + return fmt.Sprintf("vchasno api error %d: %s", e.Code, e.Message) +} + func (c *Client) executeRequest(ctx context.Context, request FiscalRequest, response interface{}) error { request.Device = c.device @@ -46,6 +55,16 @@ func (c *Client) executeRequest(ctx context.Context, request FiscalRequest, resp return fmt.Errorf("failed to unmarshal response: %w, body: %s", err, string(body)) } + var baseResp BaseResponse + if err := json.Unmarshal(body, &baseResp); err == nil { + if baseResp.HasError() { + return &APIError{ + Code: baseResp.Res, + Message: baseResp.Errortxt, + } + } + } + return nil } diff --git a/api/responses.go b/api/responses.go index 88d482d..e475a9b 100644 --- a/api/responses.go +++ b/api/responses.go @@ -15,6 +15,17 @@ type BaseResponse struct { ErrorExtra interface{} `json:"error_extra"` } +func (r *BaseResponse) HasError() bool { + return r.Res != 0 +} + +func (r *BaseResponse) Error() string { + if r.Errortxt != "" { + return r.Errortxt + } + return "" +} + type SellResponse struct { BaseResponse Info SellInfo `json:"info"`