// Package models provides data models for the Yandex Music API. package models import ( "encoding/json" ) // Landing represents a landing page from the Yandex Music API. type Landing struct { BaseModel ID JSONID `json:"id"` Title string `json:"title"` Description string `json:"description"` CoverURI string `json:"cover_uri"` Type string `json:"type"` Blocks []LandingBlock `json:"blocks"` Available bool `json:"available"` } // DeJSON deserializes a Landing from JSON data. func (l *Landing) DeJSON(data []byte, c ClientInterface) (Model, error) { var raw map[string]json.RawMessage if err := json.Unmarshal(data, &raw); err != nil { return nil, err } landing := &Landing{BaseModel: *NewBaseModel(c)} if v, ok := raw["id"]; ok { json.Unmarshal(v, &landing.ID) } if v, ok := raw["title"]; ok { json.Unmarshal(v, &landing.Title) } if v, ok := raw["description"]; ok { json.Unmarshal(v, &landing.Description) } if v, ok := raw["cover_uri"]; ok { json.Unmarshal(v, &landing.CoverURI) } if v, ok := raw["type"]; ok { json.Unmarshal(v, &landing.Type) } if v, ok := raw["available"]; ok { json.Unmarshal(v, &landing.Available) } if v, ok := raw["blocks"]; ok { var blocks []LandingBlock json.Unmarshal(v, &blocks) landing.Blocks = blocks } return landing, nil } // DeList deserializes a list of Landings from JSON data. func (l *Landing) DeList(data []byte, c ClientInterface) ([]Model, error) { var rawList []json.RawMessage if err := json.Unmarshal(data, &rawList); err != nil { return nil, err } result := make([]Model, 0, len(rawList)) for _, item := range rawList { landing := &Landing{BaseModel: *NewBaseModel(c)} if err := json.Unmarshal(item, landing); err != nil { continue } result = append(result, landing) } return result, nil } // LandingBlock represents a block in a landing. type LandingBlock struct { BaseModel ID JSONID `json:"id"` Type string `json:"type"` Title string `json:"title"` Description string `json:"description"` Data *LandingBlockData `json:"data"` } // LandingBlockData represents data in a landing block. type LandingBlockData struct { Tracks []Track `json:"tracks"` Playlists []Playlist `json:"playlists"` Albums []Album `json:"albums"` Artists []Artist `json:"artists"` GeneratedPlaylist *GeneratedPlaylist `json:"generated_playlist"` } // LandingList represents a list of landings. type LandingList struct { BaseModel Landings []Landing `json:"landings"` Total int `json:"total"` Page int `json:"page"` PageSize int `json:"page_size"` } // DeJSON deserializes a LandingList from JSON data. func (ll *LandingList) DeJSON(data []byte, c ClientInterface) (Model, error) { var raw map[string]json.RawMessage if err := json.Unmarshal(data, &raw); err != nil { return nil, err } list := &LandingList{BaseModel: *NewBaseModel(c)} if v, ok := raw["landings"]; ok { var landings []Landing json.Unmarshal(v, &landings) list.Landings = landings } if v, ok := raw["total"]; ok { json.Unmarshal(v, &list.Total) } if v, ok := raw["page"]; ok { json.Unmarshal(v, &list.Page) } if v, ok := raw["page_size"]; ok { json.Unmarshal(v, &list.PageSize) } return list, nil } // DeList deserializes a list of LandingLists from JSON data. func (ll *LandingList) DeList(data []byte, c ClientInterface) ([]Model, error) { var rawList []json.RawMessage if err := json.Unmarshal(data, &rawList); err != nil { return nil, err } result := make([]Model, 0, len(rawList)) for _, item := range rawList { list := &LandingList{BaseModel: *NewBaseModel(c)} if err := json.Unmarshal(item, list); err != nil { continue } result = append(result, list) } return result, nil }