package libkiwi import ( "encoding/json" "errors" "net/url" "strconv" ) type LoginResp struct { Status string `json:"status"` Message string `json:"message"` Redirect *url.URL `json:"redirect"` Visitor Visitor `json:"visitor"` } func (lr *LoginResp) UnmarshalJSON(b []byte) error { var jsonMap map[string]any err := json.Unmarshal(b, &jsonMap) if err != nil { return err } for k, v := range jsonMap { switch k { case "status": lr.Status = v.(string) case "message": lr.Message = v.(string) case "redirect": u, err := url.Parse(v.(string)) if err != nil { return err } lr.Redirect = u case "visitor": vst, err := parseVisitorMap(v.(map[string]any)) if err != nil { return err } lr.Visitor = vst } } return nil } var ErrNoXFToken = errors.New("Failed to locate xfToken on page.") type Visitor struct { ConversationsUnread uint32 `json:"conversations_unread"` AlertsUnviewed uint32 `json:"alerts_unviewed"` TotalUnread uint32 `json:"total_unread"` } func (vst *Visitor) UnmarshalJSON(b []byte) error { var jsonMap map[string]any err := json.Unmarshal(b, &jsonMap) if err != nil { return err } newVst, err := parseVisitorMap(jsonMap) if err != nil { return err } *vst = newVst return nil } func parseVisitorMap(jsonMap map[string]any) (Visitor, error) { var out Visitor for k, v := range jsonMap { switch k { case "conversations_unread": convos, err := strconv.Atoi(v.(string)) if err != nil { return out, err } out.ConversationsUnread = uint32(convos) case "alerts_unviewed": alerts, err := strconv.Atoi(v.(string)) if err != nil { return out, err } out.AlertsUnviewed = uint32(alerts) case "total_unread": unread, err := strconv.Atoi(v.(string)) if err != nil { return out, err } out.ConversationsUnread = uint32(unread) } } return out, nil }