From aa1de298124f763479068b6ab26ba0a7f52eca62 Mon Sep 17 00:00:00 2001 From: Vartan Benohanian Date: Tue, 11 Aug 2020 21:06:34 -0400 Subject: [PATCH] Unexport some structs, rename root struct to thing Signed-off-by: Vartan Benohanian --- comment.go | 8 ++- moderation.go | 2 +- post.go | 8 ++- things.go | 142 +++++++++++++++++--------------------------------- 4 files changed, 56 insertions(+), 104 deletions(-) diff --git a/comment.go b/comment.go index 2897e56..5bc4462 100644 --- a/comment.go +++ b/comment.go @@ -95,15 +95,13 @@ func (s *CommentService) LoadMoreReplies(ctx context.Context, comment *Comment) return nil, err } - type rootResponse struct { + root := new(struct { JSON struct { Data struct { - Things Things `json:"things"` + Things things `json:"things"` } `json:"data"` } `json:"json"` - } - - root := new(rootResponse) + }) resp, err := s.client.Do(ctx, req, root) if err != nil { return resp, err diff --git a/moderation.go b/moderation.go index 1a52a3f..8bc5715 100644 --- a/moderation.go +++ b/moderation.go @@ -83,7 +83,7 @@ func (s *ModerationService) GetActionsByType(ctx context.Context, subreddit stri return nil, resp, err } - return root.getModeratorActions(), resp, nil + return root.getModActions(), resp, nil } // AcceptInvite accepts a pending invite to moderate the specified subreddit. diff --git a/post.go b/post.go index 1595b44..98b5a08 100644 --- a/post.go +++ b/post.go @@ -463,15 +463,13 @@ func (s *PostService) LoadMoreComments(ctx context.Context, pc *PostAndComments) return nil, err } - type rootResponse struct { + root := new(struct { JSON struct { Data struct { - Things Things `json:"things"` + Things things `json:"things"` } `json:"data"` } `json:"json"` - } - - root := new(rootResponse) + }) resp, err := s.client.Do(ctx, req, root) if err != nil { return resp, err diff --git a/things.go b/things.go index 9a07ba3..166ed51 100644 --- a/things.go +++ b/things.go @@ -2,7 +2,6 @@ package reddit import ( "encoding/json" - "errors" "fmt" "strings" ) @@ -10,7 +9,7 @@ import ( const ( kindComment = "t1" kindAccount = "t2" - kindLink = "t3" // a link is a post + kindPost = "t3" kindMessage = "t4" kindSubreddit = "t5" kindAward = "t6" @@ -37,64 +36,50 @@ func (p *Permalink) UnmarshalJSON(data []byte) error { return nil } -// todo: rename this to thing -type root struct { - Kind string `json:"kind,omitempty"` - Data interface{} `json:"data,omitempty"` +// thing is an entity on Reddit. +// Its kind reprsents what it is and what is stored in the Data field +// e.g. t1 = comment, t2 = user, t3 = post, etc. +type thing struct { + Kind string `json:"kind"` + Data json.RawMessage `json:"data"` } type rootListing struct { - Kind string `json:"kind,omitempty"` - Data *Listing `json:"data"` + Kind string `json:"kind"` + Data listing `json:"data"` } -// Listing holds things coming from the Reddit API +// listing holds things coming from the Reddit API // It also contains the after/before anchors useful for subsequent requests -type Listing struct { - Things Things `json:"children"` +type listing struct { + Things things `json:"children"` After string `json:"after"` Before string `json:"before"` } -// Things are objects/entities coming from the Reddit API. -type Things struct { +type things struct { Comments []*Comment MoreComments *More - - Users []*User - Posts []*Post - Subreddits []*Subreddit - ModActions []*ModAction + Users []*User + Posts []*Post + Subreddits []*Subreddit + ModActions []*ModAction // todo: add the other kinds of things } -func (t *Things) init() { - if t.Comments == nil { - t.Comments = make([]*Comment, 0) - } - if t.Users == nil { - t.Users = make([]*User, 0) - } - if t.Posts == nil { - t.Posts = make([]*Post, 0) - } - if t.Subreddits == nil { - t.Subreddits = make([]*Subreddit, 0) - } - if t.ModActions == nil { - t.ModActions = make([]*ModAction, 0) - } +// init initializes or clears the listing. +func (t *things) init() { + t.Comments = make([]*Comment, 0) + t.Users = make([]*User, 0) + t.Posts = make([]*Post, 0) + t.Subreddits = make([]*Subreddit, 0) + t.ModActions = make([]*ModAction, 0) } // UnmarshalJSON implements the json.Unmarshaler interface. -func (t *Things) UnmarshalJSON(b []byte) error { +func (t *things) UnmarshalJSON(b []byte) error { t.init() - type thing struct { - Kind string `json:"kind"` - Data json.RawMessage `json:"data"` - } - var things []thing if err := json.Unmarshal(b, &things); err != nil { return err @@ -117,7 +102,7 @@ func (t *Things) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(thing.Data, v); err == nil { t.Users = append(t.Users, v) } - case kindLink: + case kindPost: v := new(Post) if err := json.Unmarshal(thing.Data, v); err == nil { t.Posts = append(t.Posts, v) @@ -216,10 +201,8 @@ func (r *Replies) UnmarshalJSON(data []byte) error { return err } - if root.Data != nil { - r.Comments = root.Data.Things.Comments - r.MoreComments = root.Data.Things.MoreComments - } + r.Comments = root.Data.Things.Comments + r.MoreComments = root.Data.Things.MoreComments return nil } @@ -307,75 +290,48 @@ type Subreddit struct { Favorite bool `json:"user_has_favorited"` } -func (rl *rootListing) getAfter() string { - if rl == nil || rl.Data == nil { - return "" - } - return rl.Data.After -} - -func (rl *rootListing) getBefore() string { - if rl == nil || rl.Data == nil { - return "" - } - return rl.Data.Before -} - func (rl *rootListing) getComments() *Comments { - v := new(Comments) - if rl != nil && rl.Data != nil { - v.Comments = rl.Data.Things.Comments - v.After = rl.Data.After - v.Before = rl.Data.Before + return &Comments{ + Comments: rl.Data.Things.Comments, + After: rl.Data.After, + Before: rl.Data.Before, } - return v } func (rl *rootListing) getMoreComments() *More { - if rl == nil || rl.Data == nil { - return nil - } return rl.Data.Things.MoreComments } func (rl *rootListing) getUsers() *Users { - v := new(Users) - if rl != nil && rl.Data != nil { - v.Users = rl.Data.Things.Users - v.After = rl.Data.After - v.Before = rl.Data.Before + return &Users{ + Users: rl.Data.Things.Users, + After: rl.Data.After, + Before: rl.Data.Before, } - return v } func (rl *rootListing) getPosts() *Posts { - v := new(Posts) - if rl != nil && rl.Data != nil { - v.Posts = rl.Data.Things.Posts - v.After = rl.Data.After - v.Before = rl.Data.Before + return &Posts{ + Posts: rl.Data.Things.Posts, + After: rl.Data.After, + Before: rl.Data.Before, } - return v } func (rl *rootListing) getSubreddits() *Subreddits { - v := new(Subreddits) - if rl != nil && rl.Data != nil { - v.Subreddits = rl.Data.Things.Subreddits - v.After = rl.Data.After - v.Before = rl.Data.Before + return &Subreddits{ + Subreddits: rl.Data.Things.Subreddits, + After: rl.Data.After, + Before: rl.Data.Before, } - return v } -func (rl *rootListing) getModeratorActions() *ModActions { - v := new(ModActions) - if rl != nil && rl.Data != nil { - v.ModActions = rl.Data.Things.ModActions - v.After = rl.Data.After - v.Before = rl.Data.Before +func (rl *rootListing) getModActions() *ModActions { + return &ModActions{ + ModActions: rl.Data.Things.ModActions, + After: rl.Data.After, + Before: rl.Data.Before, } - return v } // Comments is a list of comments