github.com/google/go-github/v33@v33.0.0/github/misc.go (about) 1 // Copyright 2014 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 "bytes" 10 "context" 11 "fmt" 12 "net/url" 13 ) 14 15 // MarkdownOptions specifies optional parameters to the Markdown method. 16 type MarkdownOptions struct { 17 // Mode identifies the rendering mode. Possible values are: 18 // markdown - render a document as plain Markdown, just like 19 // README files are rendered. 20 // 21 // gfm - to render a document as user-content, e.g. like user 22 // comments or issues are rendered. In GFM mode, hard line breaks are 23 // always taken into account, and issue and user mentions are linked 24 // accordingly. 25 // 26 // Default is "markdown". 27 Mode string 28 29 // Context identifies the repository context. Only taken into account 30 // when rendering as "gfm". 31 Context string 32 } 33 34 type markdownRequest struct { 35 Text *string `json:"text,omitempty"` 36 Mode *string `json:"mode,omitempty"` 37 Context *string `json:"context,omitempty"` 38 } 39 40 // Markdown renders an arbitrary Markdown document. 41 // 42 // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/markdown/ 43 func (c *Client) Markdown(ctx context.Context, text string, opts *MarkdownOptions) (string, *Response, error) { 44 request := &markdownRequest{Text: String(text)} 45 if opts != nil { 46 if opts.Mode != "" { 47 request.Mode = String(opts.Mode) 48 } 49 if opts.Context != "" { 50 request.Context = String(opts.Context) 51 } 52 } 53 54 req, err := c.NewRequest("POST", "markdown", request) 55 if err != nil { 56 return "", nil, err 57 } 58 59 buf := new(bytes.Buffer) 60 resp, err := c.Do(ctx, req, buf) 61 if err != nil { 62 return "", resp, err 63 } 64 65 return buf.String(), resp, nil 66 } 67 68 // ListEmojis returns the emojis available to use on GitHub. 69 // 70 // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/emojis/ 71 func (c *Client) ListEmojis(ctx context.Context) (map[string]string, *Response, error) { 72 req, err := c.NewRequest("GET", "emojis", nil) 73 if err != nil { 74 return nil, nil, err 75 } 76 77 var emoji map[string]string 78 resp, err := c.Do(ctx, req, &emoji) 79 if err != nil { 80 return nil, resp, err 81 } 82 83 return emoji, resp, nil 84 } 85 86 // CodeOfConduct represents a code of conduct. 87 type CodeOfConduct struct { 88 Name *string `json:"name,omitempty"` 89 Key *string `json:"key,omitempty"` 90 URL *string `json:"url,omitempty"` 91 Body *string `json:"body,omitempty"` 92 } 93 94 func (c *CodeOfConduct) String() string { 95 return Stringify(c) 96 } 97 98 // ListCodesOfConduct returns all codes of conduct. 99 // 100 // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/codes_of_conduct/#list-all-codes-of-conduct 101 func (c *Client) ListCodesOfConduct(ctx context.Context) ([]*CodeOfConduct, *Response, error) { 102 req, err := c.NewRequest("GET", "codes_of_conduct", nil) 103 if err != nil { 104 return nil, nil, err 105 } 106 107 // TODO: remove custom Accept header when this API fully launches. 108 req.Header.Set("Accept", mediaTypeCodesOfConductPreview) 109 110 var cs []*CodeOfConduct 111 resp, err := c.Do(ctx, req, &cs) 112 if err != nil { 113 return nil, resp, err 114 } 115 116 return cs, resp, nil 117 } 118 119 // GetCodeOfConduct returns an individual code of conduct. 120 // 121 // https://docs.github.com/en/free-pro-team@latest/rest/reference/codes_of_conduct/#get-an-individual-code-of-conduct 122 func (c *Client) GetCodeOfConduct(ctx context.Context, key string) (*CodeOfConduct, *Response, error) { 123 u := fmt.Sprintf("codes_of_conduct/%s", key) 124 req, err := c.NewRequest("GET", u, nil) 125 if err != nil { 126 return nil, nil, err 127 } 128 129 // TODO: remove custom Accept header when this API fully launches. 130 req.Header.Set("Accept", mediaTypeCodesOfConductPreview) 131 132 coc := new(CodeOfConduct) 133 resp, err := c.Do(ctx, req, coc) 134 if err != nil { 135 return nil, resp, err 136 } 137 138 return coc, resp, nil 139 } 140 141 // APIMeta represents metadata about the GitHub API. 142 type APIMeta struct { 143 // An Array of IP addresses in CIDR format specifying the addresses 144 // that incoming service hooks will originate from on GitHub.com. 145 Hooks []string `json:"hooks,omitempty"` 146 147 // An Array of IP addresses in CIDR format specifying the Git servers 148 // for GitHub.com. 149 Git []string `json:"git,omitempty"` 150 151 // Whether authentication with username and password is supported. 152 // (GitHub Enterprise instances using CAS or OAuth for authentication 153 // will return false. Features like Basic Authentication with a 154 // username and password, sudo mode, and two-factor authentication are 155 // not supported on these servers.) 156 VerifiablePasswordAuthentication *bool `json:"verifiable_password_authentication,omitempty"` 157 158 // An array of IP addresses in CIDR format specifying the addresses 159 // which serve GitHub Pages websites. 160 Pages []string `json:"pages,omitempty"` 161 162 // An Array of IP addresses specifying the addresses that source imports 163 // will originate from on GitHub.com. 164 Importer []string `json:"importer,omitempty"` 165 } 166 167 // APIMeta returns information about GitHub.com, the service. Or, if you access 168 // this endpoint on your organization’s GitHub Enterprise installation, this 169 // endpoint provides information about that installation. 170 // 171 // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/meta/ 172 func (c *Client) APIMeta(ctx context.Context) (*APIMeta, *Response, error) { 173 req, err := c.NewRequest("GET", "meta", nil) 174 if err != nil { 175 return nil, nil, err 176 } 177 178 meta := new(APIMeta) 179 resp, err := c.Do(ctx, req, meta) 180 if err != nil { 181 return nil, resp, err 182 } 183 184 return meta, resp, nil 185 } 186 187 // Octocat returns an ASCII art octocat with the specified message in a speech 188 // bubble. If message is empty, a random zen phrase is used. 189 func (c *Client) Octocat(ctx context.Context, message string) (string, *Response, error) { 190 u := "octocat" 191 if message != "" { 192 u = fmt.Sprintf("%s?s=%s", u, url.QueryEscape(message)) 193 } 194 195 req, err := c.NewRequest("GET", u, nil) 196 if err != nil { 197 return "", nil, err 198 } 199 200 buf := new(bytes.Buffer) 201 resp, err := c.Do(ctx, req, buf) 202 if err != nil { 203 return "", resp, err 204 } 205 206 return buf.String(), resp, nil 207 } 208 209 // Zen returns a random line from The Zen of GitHub. 210 // 211 // see also: http://warpspire.com/posts/taste/ 212 func (c *Client) Zen(ctx context.Context) (string, *Response, error) { 213 req, err := c.NewRequest("GET", "zen", nil) 214 if err != nil { 215 return "", nil, err 216 } 217 218 buf := new(bytes.Buffer) 219 resp, err := c.Do(ctx, req, buf) 220 if err != nil { 221 return "", resp, err 222 } 223 224 return buf.String(), resp, nil 225 } 226 227 // ServiceHook represents a hook that has configuration settings, a list of 228 // available events, and default events. 229 type ServiceHook struct { 230 Name *string `json:"name,omitempty"` 231 Events []string `json:"events,omitempty"` 232 SupportedEvents []string `json:"supported_events,omitempty"` 233 Schema [][]string `json:"schema,omitempty"` 234 } 235 236 func (s *ServiceHook) String() string { 237 return Stringify(s) 238 } 239 240 // ListServiceHooks lists all of the available service hooks. 241 // 242 // GitHub API docs: https://developer.github.com/webhooks/#services 243 func (c *Client) ListServiceHooks(ctx context.Context) ([]*ServiceHook, *Response, error) { 244 u := "hooks" 245 req, err := c.NewRequest("GET", u, nil) 246 if err != nil { 247 return nil, nil, err 248 } 249 250 var hooks []*ServiceHook 251 resp, err := c.Do(ctx, req, &hooks) 252 if err != nil { 253 return nil, resp, err 254 } 255 256 return hooks, resp, nil 257 }