in messaging/messaging.go [731:775]
func (a *Aps) UnmarshalJSON(b []byte) error {
type apsInternal Aps
temp := struct {
AlertObject *json.RawMessage `json:"alert,omitempty"`
SoundObject *json.RawMessage `json:"sound,omitempty"`
ContentAvailableInt int `json:"content-available,omitempty"`
MutableContentInt int `json:"mutable-content,omitempty"`
*apsInternal
}{
apsInternal: (*apsInternal)(a),
}
if err := json.Unmarshal(b, &temp); err != nil {
return err
}
a.ContentAvailable = (temp.ContentAvailableInt == 1)
a.MutableContent = (temp.MutableContentInt == 1)
if temp.AlertObject != nil {
if err := json.Unmarshal(*temp.AlertObject, &a.Alert); err != nil {
a.Alert = nil
if err := json.Unmarshal(*temp.AlertObject, &a.AlertString); err != nil {
return fmt.Errorf("failed to unmarshal alert as a struct or a string: %v", err)
}
}
}
if temp.SoundObject != nil {
if err := json.Unmarshal(*temp.SoundObject, &a.CriticalSound); err != nil {
a.CriticalSound = nil
if err := json.Unmarshal(*temp.SoundObject, &a.Sound); err != nil {
return fmt.Errorf("failed to unmarshal sound as a struct or a string")
}
}
}
allFields := make(map[string]interface{})
if err := json.Unmarshal(b, &allFields); err != nil {
return err
}
for k := range a.standardFields() {
delete(allFields, k)
}
if len(allFields) > 0 {
a.CustomData = allFields
}
return nil
}