@@ -232,6 +232,39 @@ impl GitHubClient {
232232 let pr: GitHubPullRequest = response. json ( ) . await ?;
233233 Ok ( pr. into ( ) )
234234 }
235+
236+ pub async fn merge_pull_request ( & self , params : & MergePullRequestParams < ' _ > ) -> Result < ( ) > {
237+ #[ derive( Serialize ) ]
238+ struct MergePullRequestBody < ' a > {
239+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
240+ commit_title : Option < & ' a str > ,
241+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
242+ commit_message : Option < & ' a str > ,
243+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
244+ merge_method : Option < & ' a str > ,
245+ }
246+
247+ let url = format ! (
248+ "{}/repos/{}/{}/pulls/{}/merge" ,
249+ self . base_url, params. owner, params. repo, params. pr_number
250+ ) ;
251+
252+ let merge_method = params. merge_method . as_ref ( ) . map ( Into :: into) ;
253+
254+ let body = MergePullRequestBody {
255+ commit_title : params. commit_title ,
256+ commit_message : params. commit_message ,
257+ merge_method,
258+ } ;
259+
260+ let response = self . client . put ( & url) . json ( & body) . send ( ) . await ?;
261+
262+ if !response. status ( ) . is_success ( ) {
263+ bail ! ( "Failed to merge pull request: {}" , response. status( ) ) ;
264+ }
265+
266+ Ok ( ( ) )
267+ }
235268}
236269
237270pub struct CreatePullRequestParams < ' a > {
@@ -254,6 +287,35 @@ pub struct UpdatePullRequestParams<'a> {
254287 pub state : Option < & ' a str > ,
255288}
256289
290+ #[ derive( Debug , Clone , Serialize , Deserialize , Default ) ]
291+ #[ serde( rename_all = "lowercase" ) ]
292+ pub enum MergeMethod {
293+ #[ default]
294+ Merge ,
295+ Squash ,
296+ Rebase ,
297+ }
298+
299+ impl From < & MergeMethod > for & str {
300+ fn from ( val : & MergeMethod ) -> Self {
301+ match val {
302+ MergeMethod :: Merge => "merge" ,
303+ MergeMethod :: Rebase => "rebase" ,
304+ MergeMethod :: Squash => "squash" ,
305+ }
306+ }
307+ }
308+
309+ #[ derive( Debug , Clone ) ]
310+ pub struct MergePullRequestParams < ' a > {
311+ pub owner : & ' a str ,
312+ pub repo : & ' a str ,
313+ pub pr_number : i64 ,
314+ pub commit_title : Option < & ' a str > ,
315+ pub commit_message : Option < & ' a str > ,
316+ pub merge_method : Option < MergeMethod > ,
317+ }
318+
257319#[ derive( Debug , Serialize ) ]
258320pub struct AuthenticatedUser {
259321 pub login : String ,
0 commit comments