Documentation
¶
Overview ¶
Package httpclient contains issues.Service implementation over HTTP.
Index ¶
- func NewIssues(httpClient *http.Client, scheme, host string) issues.Service
- type Issues
- func (i *Issues) Count(ctx context.Context, repo issues.RepoSpec, opt issues.IssueListOptions) (uint64, error)
- func (*Issues) Create(_ context.Context, repo issues.RepoSpec, issue issues.Issue) (issues.Issue, error)
- func (*Issues) CreateComment(_ context.Context, repo issues.RepoSpec, id uint64, comment issues.Comment) (issues.Comment, error)
- func (*Issues) Edit(_ context.Context, repo issues.RepoSpec, id uint64, ir issues.IssueRequest) (issues.Issue, []issues.Event, error)
- func (i *Issues) EditComment(ctx context.Context, repo issues.RepoSpec, id uint64, cr issues.CommentRequest) (issues.Comment, error)
- func (*Issues) Get(_ context.Context, repo issues.RepoSpec, id uint64) (issues.Issue, error)
- func (i *Issues) List(ctx context.Context, repo issues.RepoSpec, opt issues.IssueListOptions) ([]issues.Issue, error)
- func (i *Issues) ListComments(ctx context.Context, repo issues.RepoSpec, id uint64, opt *issues.ListOptions) ([]issues.Comment, error)
- func (i *Issues) ListEvents(ctx context.Context, repo issues.RepoSpec, id uint64, opt *issues.ListOptions) ([]issues.Event, error)
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewIssues ¶
NewIssues creates a client that implements issues.Service remotely over HTTP. If a nil httpClient is provided, http.DefaultClient will be used. scheme and host can be empty strings to target local service.
Example ¶
package main
import (
"net/http"
"net/http/httptest"
"github.com/shurcooL/issuesapp/httpclient"
)
func main() {
issuesClient := httpclient.NewIssues(nil, "http", "localhost:8080")
// Now you can use any of issuesClient methods.
_ = issuesClient
}
func init() {
http.DefaultTransport.(*http.Transport).RegisterProtocol("", localRoundTripper{})
}
// localRoundTripper is an http.RoundTripper that executes HTTP transactions
// by using http.DefaultServeMux directly, instead of going over an HTTP connection.
type localRoundTripper struct{}
func (localRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
w := httptest.NewRecorder()
http.DefaultServeMux.ServeHTTP(w, req)
return w.Result(), nil
}
Output:
Example (Authenticated) ¶
package main
import (
"context"
"net/http"
"net/http/httptest"
"github.com/shurcooL/issuesapp/httpclient"
"golang.org/x/oauth2"
)
func main() {
// HTTP client with authentication.
src := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: "... your access token ..."},
)
httpClient := oauth2.NewClient(context.Background(), src)
issuesClient := httpclient.NewIssues(httpClient, "http", "localhost:8080")
// Now you can use any of issuesClient methods.
_ = issuesClient
}
func init() {
http.DefaultTransport.(*http.Transport).RegisterProtocol("", localRoundTripper{})
}
// localRoundTripper is an http.RoundTripper that executes HTTP transactions
// by using http.DefaultServeMux directly, instead of going over an HTTP connection.
type localRoundTripper struct{}
func (localRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
w := httptest.NewRecorder()
http.DefaultServeMux.ServeHTTP(w, req)
return w.Result(), nil
}
Output:
Types ¶
type Issues ¶
type Issues struct {
// contains filtered or unexported fields
}
Issues implements issues.Service remotely over HTTP. Use NewIssues for creation, zero value of Issues is unfit for use.
func (*Issues) Count ¶
func (i *Issues) Count(ctx context.Context, repo issues.RepoSpec, opt issues.IssueListOptions) (uint64, error)
Example ¶
package main
import (
"context"
"encoding/json"
"log"
"os"
"github.com/shurcooL/issues"
"github.com/shurcooL/issuesapp/httpclient"
)
var issuesClient = httpclient.NewIssues(nil, "", "")
func main() {
count, err := issuesClient.Count(context.Background(), issues.RepoSpec{URI: "example.org/repo"}, issues.IssueListOptions{
State: issues.AllStates,
})
if err != nil {
log.Fatalln(err)
}
printJSON(count)
}
// printJSON prints v as JSON encoded with indent to stdout. It panics on any error.
// It's meant to be used by examples to print the output.
func printJSON(v interface{}) {
w := json.NewEncoder(os.Stdout)
w.SetIndent("", "\t")
err := w.Encode(v)
if err != nil {
panic(err)
}
}
Output: 1
func (*Issues) CreateComment ¶
func (*Issues) EditComment ¶
func (*Issues) List ¶
func (i *Issues) List(ctx context.Context, repo issues.RepoSpec, opt issues.IssueListOptions) ([]issues.Issue, error)
Example ¶
package main
import (
"context"
"encoding/json"
"log"
"os"
"github.com/shurcooL/issues"
"github.com/shurcooL/issuesapp/httpclient"
)
var issuesClient = httpclient.NewIssues(nil, "", "")
func main() {
is, err := issuesClient.List(context.Background(), issues.RepoSpec{URI: "example.org/repo"}, issues.IssueListOptions{
State: issues.StateFilter(issues.OpenState),
})
if err != nil {
log.Fatalln(err)
}
printJSON(is)
}
// printJSON prints v as JSON encoded with indent to stdout. It panics on any error.
// It's meant to be used by examples to print the output.
func printJSON(v interface{}) {
w := json.NewEncoder(os.Stdout)
w.SetIndent("", "\t")
err := w.Encode(v)
if err != nil {
panic(err)
}
}
Output: [ { "ID": 1, "State": "open", "Title": "Sample title", "Labels": null, "User": { "ID": 1, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "gopher", "Name": "Sample Gopher", "Email": "gopher@example.org", "AvatarURL": "", "HTMLURL": "", "SiteAdmin": false }, "CreatedAt": "2016-09-24T22:00:50.642521756Z", "Edited": null, "Body": "", "Reactions": null, "Editable": false, "Replies": 2 } ]
func (*Issues) ListComments ¶
func (i *Issues) ListComments(ctx context.Context, repo issues.RepoSpec, id uint64, opt *issues.ListOptions) ([]issues.Comment, error)
Example ¶
package main
import (
"context"
"encoding/json"
"log"
"os"
"github.com/shurcooL/issues"
"github.com/shurcooL/issuesapp/httpclient"
)
var issuesClient = httpclient.NewIssues(nil, "", "")
func main() {
is, err := issuesClient.ListComments(context.Background(), issues.RepoSpec{URI: "example.org/repo"}, 1, nil)
if err != nil {
log.Fatalln(err)
}
printJSON(is)
}
// printJSON prints v as JSON encoded with indent to stdout. It panics on any error.
// It's meant to be used by examples to print the output.
func printJSON(v interface{}) {
w := json.NewEncoder(os.Stdout)
w.SetIndent("", "\t")
err := w.Encode(v)
if err != nil {
panic(err)
}
}
Output: [ { "ID": 0, "User": { "ID": 1, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "gopher", "Name": "Sample Gopher", "Email": "gopher@example.org", "AvatarURL": "", "HTMLURL": "", "SiteAdmin": false }, "CreatedAt": "2016-09-24T22:00:50.642521756Z", "Edited": null, "Body": "Sample body.", "Reactions": [ { "Reaction": "grinning", "Users": [ { "ID": 1, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "gopher", "Name": "Sample Gopher", "Email": "gopher@example.org", "AvatarURL": "", "HTMLURL": "", "SiteAdmin": false } ] }, { "Reaction": "+1", "Users": [ { "ID": 2, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "2@example.org", "Name": "", "Email": "", "AvatarURL": "https://secure.gravatar.com/avatar?d=mm\u0026f=y\u0026s=96", "HTMLURL": "", "SiteAdmin": false }, { "ID": 1, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "gopher", "Name": "Sample Gopher", "Email": "gopher@example.org", "AvatarURL": "", "HTMLURL": "", "SiteAdmin": false }, { "ID": 3, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "3@example.org", "Name": "", "Email": "", "AvatarURL": "https://secure.gravatar.com/avatar?d=mm\u0026f=y\u0026s=96", "HTMLURL": "", "SiteAdmin": false } ] }, { "Reaction": "mushroom", "Users": [ { "ID": 3, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "3@example.org", "Name": "", "Email": "", "AvatarURL": "https://secure.gravatar.com/avatar?d=mm\u0026f=y\u0026s=96", "HTMLURL": "", "SiteAdmin": false } ] } ], "Editable": true }, { "ID": 1, "User": { "ID": 2, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "2@example.org", "Name": "", "Email": "", "AvatarURL": "https://secure.gravatar.com/avatar?d=mm\u0026f=y\u0026s=96", "HTMLURL": "", "SiteAdmin": false }, "CreatedAt": "2016-10-02T12:31:50.813167602Z", "Edited": null, "Body": "Sample reply.", "Reactions": null, "Editable": false }, { "ID": 2, "User": { "ID": 1, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "gopher", "Name": "Sample Gopher", "Email": "gopher@example.org", "AvatarURL": "", "HTMLURL": "", "SiteAdmin": false }, "CreatedAt": "2016-10-02T18:51:14.250725508Z", "Edited": { "By": { "ID": 1, "Domain": "example.org", "CanonicalMe": "", "Elsewhere": null, "Login": "gopher", "Name": "Sample Gopher", "Email": "gopher@example.org", "AvatarURL": "", "HTMLURL": "", "SiteAdmin": false }, "At": "2016-10-02T18:57:47.938813179Z" }, "Body": "Sample another reply.", "Reactions": null, "Editable": true } ]
Click to show internal directories.
Click to hide internal directories.