github.com/google/go-github/v71@v71.0.0/github/gists.go (about) 1 // Copyright 2013 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "context" 10 "fmt" 11 "time" 12 ) 13 14 // GistsService handles communication with the Gist related 15 // methods of the GitHub API. 16 // 17 // GitHub API docs: https://docs.github.com/rest/gists 18 type GistsService service 19 20 // Gist represents a GitHub's gist. 21 type Gist struct { 22 ID *string `json:"id,omitempty"` 23 Description *string `json:"description,omitempty"` 24 Public *bool `json:"public,omitempty"` 25 Owner *User `json:"owner,omitempty"` 26 Files map[GistFilename]GistFile `json:"files,omitempty"` 27 Comments *int `json:"comments,omitempty"` 28 HTMLURL *string `json:"html_url,omitempty"` 29 GitPullURL *string `json:"git_pull_url,omitempty"` 30 GitPushURL *string `json:"git_push_url,omitempty"` 31 CreatedAt *Timestamp `json:"created_at,omitempty"` 32 UpdatedAt *Timestamp `json:"updated_at,omitempty"` 33 NodeID *string `json:"node_id,omitempty"` 34 } 35 36 func (g Gist) String() string { 37 return Stringify(g) 38 } 39 40 // GistFilename represents filename on a gist. 41 type GistFilename string 42 43 // GistFile represents a file on a gist. 44 type GistFile struct { 45 Size *int `json:"size,omitempty"` 46 Filename *string `json:"filename,omitempty"` 47 Language *string `json:"language,omitempty"` 48 Type *string `json:"type,omitempty"` 49 RawURL *string `json:"raw_url,omitempty"` 50 Content *string `json:"content,omitempty"` 51 } 52 53 func (g GistFile) String() string { 54 return Stringify(g) 55 } 56 57 // GistCommit represents a commit on a gist. 58 type GistCommit struct { 59 URL *string `json:"url,omitempty"` 60 Version *string `json:"version,omitempty"` 61 User *User `json:"user,omitempty"` 62 ChangeStatus *CommitStats `json:"change_status,omitempty"` 63 CommittedAt *Timestamp `json:"committed_at,omitempty"` 64 NodeID *string `json:"node_id,omitempty"` 65 } 66 67 func (gc GistCommit) String() string { 68 return Stringify(gc) 69 } 70 71 // GistFork represents a fork of a gist. 72 type GistFork struct { 73 URL *string `json:"url,omitempty"` 74 User *User `json:"user,omitempty"` 75 ID *string `json:"id,omitempty"` 76 CreatedAt *Timestamp `json:"created_at,omitempty"` 77 UpdatedAt *Timestamp `json:"updated_at,omitempty"` 78 NodeID *string `json:"node_id,omitempty"` 79 } 80 81 func (gf GistFork) String() string { 82 return Stringify(gf) 83 } 84 85 // GistListOptions specifies the optional parameters to the 86 // GistsService.List, GistsService.ListAll, and GistsService.ListStarred methods. 87 type GistListOptions struct { 88 // Since filters Gists by time. 89 Since time.Time `url:"since,omitempty"` 90 91 ListOptions 92 } 93 94 // List gists for a user. Passing the empty string will list 95 // all public gists if called anonymously. However, if the call 96 // is authenticated, it will returns all gists for the authenticated 97 // user. 98 // 99 // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gists-for-a-user 100 // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gists-for-the-authenticated-user 101 // 102 //meta:operation GET /gists 103 //meta:operation GET /users/{username}/gists 104 func (s *GistsService) List(ctx context.Context, user string, opts *GistListOptions) ([]*Gist, *Response, error) { 105 var u string 106 if user != "" { 107 u = fmt.Sprintf("users/%v/gists", user) 108 } else { 109 u = "gists" 110 } 111 u, err := addOptions(u, opts) 112 if err != nil { 113 return nil, nil, err 114 } 115 116 req, err := s.client.NewRequest("GET", u, nil) 117 if err != nil { 118 return nil, nil, err 119 } 120 121 var gists []*Gist 122 resp, err := s.client.Do(ctx, req, &gists) 123 if err != nil { 124 return nil, resp, err 125 } 126 127 return gists, resp, nil 128 } 129 130 // ListAll lists all public gists. 131 // 132 // GitHub API docs: https://docs.github.com/rest/gists/gists#list-public-gists 133 // 134 //meta:operation GET /gists/public 135 func (s *GistsService) ListAll(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) { 136 u, err := addOptions("gists/public", opts) 137 if err != nil { 138 return nil, nil, err 139 } 140 141 req, err := s.client.NewRequest("GET", u, nil) 142 if err != nil { 143 return nil, nil, err 144 } 145 146 var gists []*Gist 147 resp, err := s.client.Do(ctx, req, &gists) 148 if err != nil { 149 return nil, resp, err 150 } 151 152 return gists, resp, nil 153 } 154 155 // ListStarred lists starred gists of authenticated user. 156 // 157 // GitHub API docs: https://docs.github.com/rest/gists/gists#list-starred-gists 158 // 159 //meta:operation GET /gists/starred 160 func (s *GistsService) ListStarred(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) { 161 u, err := addOptions("gists/starred", opts) 162 if err != nil { 163 return nil, nil, err 164 } 165 166 req, err := s.client.NewRequest("GET", u, nil) 167 if err != nil { 168 return nil, nil, err 169 } 170 171 var gists []*Gist 172 resp, err := s.client.Do(ctx, req, &gists) 173 if err != nil { 174 return nil, resp, err 175 } 176 177 return gists, resp, nil 178 } 179 180 // Get a single gist. 181 // 182 // GitHub API docs: https://docs.github.com/rest/gists/gists#get-a-gist 183 // 184 //meta:operation GET /gists/{gist_id} 185 func (s *GistsService) Get(ctx context.Context, id string) (*Gist, *Response, error) { 186 u := fmt.Sprintf("gists/%v", id) 187 req, err := s.client.NewRequest("GET", u, nil) 188 if err != nil { 189 return nil, nil, err 190 } 191 192 gist := new(Gist) 193 resp, err := s.client.Do(ctx, req, gist) 194 if err != nil { 195 return nil, resp, err 196 } 197 198 return gist, resp, nil 199 } 200 201 // GetRevision gets a specific revision of a gist. 202 // 203 // GitHub API docs: https://docs.github.com/rest/gists/gists#get-a-gist-revision 204 // 205 //meta:operation GET /gists/{gist_id}/{sha} 206 func (s *GistsService) GetRevision(ctx context.Context, id, sha string) (*Gist, *Response, error) { 207 u := fmt.Sprintf("gists/%v/%v", id, sha) 208 req, err := s.client.NewRequest("GET", u, nil) 209 if err != nil { 210 return nil, nil, err 211 } 212 213 gist := new(Gist) 214 resp, err := s.client.Do(ctx, req, gist) 215 if err != nil { 216 return nil, resp, err 217 } 218 219 return gist, resp, nil 220 } 221 222 // Create a gist for authenticated user. 223 // 224 // GitHub API docs: https://docs.github.com/rest/gists/gists#create-a-gist 225 // 226 //meta:operation POST /gists 227 func (s *GistsService) Create(ctx context.Context, gist *Gist) (*Gist, *Response, error) { 228 u := "gists" 229 req, err := s.client.NewRequest("POST", u, gist) 230 if err != nil { 231 return nil, nil, err 232 } 233 234 g := new(Gist) 235 resp, err := s.client.Do(ctx, req, g) 236 if err != nil { 237 return nil, resp, err 238 } 239 240 return g, resp, nil 241 } 242 243 // Edit a gist. 244 // 245 // GitHub API docs: https://docs.github.com/rest/gists/gists#update-a-gist 246 // 247 //meta:operation PATCH /gists/{gist_id} 248 func (s *GistsService) Edit(ctx context.Context, id string, gist *Gist) (*Gist, *Response, error) { 249 u := fmt.Sprintf("gists/%v", id) 250 req, err := s.client.NewRequest("PATCH", u, gist) 251 if err != nil { 252 return nil, nil, err 253 } 254 255 g := new(Gist) 256 resp, err := s.client.Do(ctx, req, g) 257 if err != nil { 258 return nil, resp, err 259 } 260 261 return g, resp, nil 262 } 263 264 // ListCommits lists commits of a gist. 265 // 266 // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gist-commits 267 // 268 //meta:operation GET /gists/{gist_id}/commits 269 func (s *GistsService) ListCommits(ctx context.Context, id string, opts *ListOptions) ([]*GistCommit, *Response, error) { 270 u := fmt.Sprintf("gists/%v/commits", id) 271 u, err := addOptions(u, opts) 272 if err != nil { 273 return nil, nil, err 274 } 275 276 req, err := s.client.NewRequest("GET", u, nil) 277 if err != nil { 278 return nil, nil, err 279 } 280 281 var gistCommits []*GistCommit 282 resp, err := s.client.Do(ctx, req, &gistCommits) 283 if err != nil { 284 return nil, resp, err 285 } 286 287 return gistCommits, resp, nil 288 } 289 290 // Delete a gist. 291 // 292 // GitHub API docs: https://docs.github.com/rest/gists/gists#delete-a-gist 293 // 294 //meta:operation DELETE /gists/{gist_id} 295 func (s *GistsService) Delete(ctx context.Context, id string) (*Response, error) { 296 u := fmt.Sprintf("gists/%v", id) 297 req, err := s.client.NewRequest("DELETE", u, nil) 298 if err != nil { 299 return nil, err 300 } 301 302 return s.client.Do(ctx, req, nil) 303 } 304 305 // Star a gist on behalf of authenticated user. 306 // 307 // GitHub API docs: https://docs.github.com/rest/gists/gists#star-a-gist 308 // 309 //meta:operation PUT /gists/{gist_id}/star 310 func (s *GistsService) Star(ctx context.Context, id string) (*Response, error) { 311 u := fmt.Sprintf("gists/%v/star", id) 312 req, err := s.client.NewRequest("PUT", u, nil) 313 if err != nil { 314 return nil, err 315 } 316 317 return s.client.Do(ctx, req, nil) 318 } 319 320 // Unstar a gist on a behalf of authenticated user. 321 // 322 // GitHub API docs: https://docs.github.com/rest/gists/gists#unstar-a-gist 323 // 324 //meta:operation DELETE /gists/{gist_id}/star 325 func (s *GistsService) Unstar(ctx context.Context, id string) (*Response, error) { 326 u := fmt.Sprintf("gists/%v/star", id) 327 req, err := s.client.NewRequest("DELETE", u, nil) 328 if err != nil { 329 return nil, err 330 } 331 332 return s.client.Do(ctx, req, nil) 333 } 334 335 // IsStarred checks if a gist is starred by authenticated user. 336 // 337 // GitHub API docs: https://docs.github.com/rest/gists/gists#check-if-a-gist-is-starred 338 // 339 //meta:operation GET /gists/{gist_id}/star 340 func (s *GistsService) IsStarred(ctx context.Context, id string) (bool, *Response, error) { 341 u := fmt.Sprintf("gists/%v/star", id) 342 req, err := s.client.NewRequest("GET", u, nil) 343 if err != nil { 344 return false, nil, err 345 } 346 347 resp, err := s.client.Do(ctx, req, nil) 348 starred, err := parseBoolResponse(err) 349 return starred, resp, err 350 } 351 352 // Fork a gist. 353 // 354 // GitHub API docs: https://docs.github.com/rest/gists/gists#fork-a-gist 355 // 356 //meta:operation POST /gists/{gist_id}/forks 357 func (s *GistsService) Fork(ctx context.Context, id string) (*Gist, *Response, error) { 358 u := fmt.Sprintf("gists/%v/forks", id) 359 req, err := s.client.NewRequest("POST", u, nil) 360 if err != nil { 361 return nil, nil, err 362 } 363 364 g := new(Gist) 365 resp, err := s.client.Do(ctx, req, g) 366 if err != nil { 367 return nil, resp, err 368 } 369 370 return g, resp, nil 371 } 372 373 // ListForks lists forks of a gist. 374 // 375 // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gist-forks 376 // 377 //meta:operation GET /gists/{gist_id}/forks 378 func (s *GistsService) ListForks(ctx context.Context, id string, opts *ListOptions) ([]*GistFork, *Response, error) { 379 u := fmt.Sprintf("gists/%v/forks", id) 380 u, err := addOptions(u, opts) 381 if err != nil { 382 return nil, nil, err 383 } 384 385 req, err := s.client.NewRequest("GET", u, nil) 386 if err != nil { 387 return nil, nil, err 388 } 389 390 var gistForks []*GistFork 391 resp, err := s.client.Do(ctx, req, &gistForks) 392 if err != nil { 393 return nil, resp, err 394 } 395 396 return gistForks, resp, nil 397 }