/* Ċ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 2 1 ĠN y Code Ċ Ġ* Ċ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġdev . ny code . github Ċ Ċ import Ġdev . ny code . github . auth . Auth Provider Ċ import Ġdev . ny code . github . ktor . GitHub Api Wrapper Plugin Ċ import Ġdev . ny code . github . request . GitHub ErrorResponse Ċ import Ġdev . ny code . github . request . GitHub RequestException Ċ import Ġdev . ny code . github . utils . receive OrNull Ċ import Ġio . ktor . client . HttpClient Ċ import Ġio . ktor . client . engine . HttpClient Engine Ċ import Ġio . ktor . client . features . Client RequestException Ċ import Ġio . ktor . client . features . HttpResponse Validator Ċ import Ġio . ktor . client . features . default Request Ċ import Ġio . ktor . client . features . json . Json Feature Ċ import Ġio . ktor . client . features . json . serializer . Kotlin x Serializer Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . userAgent Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlin . contracts . Invocation Kind Ċ import Ġkotlin . contracts . contract Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġnew Ġ[ GitHub Client ] Ġby Ġapplying Ġ[ builder ]. Ċ Ġ*/ Ċ public Ġinline Ġfun ĠGitHub Client ( builder : ĠGitHub Client Builder . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠGitHub Client Ġ{ ĊĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls In Place ( builder , ĠInvocation Kind . EX ACT LY _ ON CE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠGitHub Client Builder (). apply ( builder ). build () Ċ } Ċ Ċ /** Ċ Ġ* ĠShared ĠAPI Ġof Ġ[ GitHub Client Builder ] Ġon Ġall Ġplatforms . Ċ Ġ*/ Ċ public Ġabstract Ġclass ĠGitHub Client Builder Base Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbase Ġurl Ġof Ġthe ĠGitHub ĠAPI . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġvar ĠbaseUrl : ĠString Ġ= Ġ" https :// api . github . com " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Auth Provider ] Ġused Ġto Ġauthenticate Ġwith Ġthe ĠGitHub ĠAPI . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠDefault : Ġ[ Auth Provider . None ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠAuth Provider ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġvar Ġauth Provider : ĠAuth Provider Ġ= ĠAuth Provider . None ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġ[ HttpClient Engine ] Ġused Ġfor Ġcommunication Ġwith Ġthe ĠGitHub ĠAPI . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġacts Ġas Ġa Ġshortcut Ġto Ġ` httpClient Ġ= ĠHttpClient ( ENGINE )` Ġso Ġsetting Ġboth Ġat Ġthe Ġsame Ġtime Ġdoesn 't Ġwork ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠhttpClient ĊĠĠĠĠ Ġ* Ġ@ see ĠhttpClient Engine ĊĠĠĠĠ Ġ* Ġ@ see ĠHttpClient Engine ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġvar ĠhttpClient Engine : ĠHttpClient Engine ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( httpClient Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġset ĠhttpClient Ġand ĠhttpClient Engine Ġat Ġthe Ġsame Ġtime " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use ĠHttpClient ( ENGINE ) Ġinstead ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient Ġ= ĠHttpClient ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġ[ HttpClient ] Ġused Ġfor Ġcommunication Ġwith Ġthe ĠGitHub ĠAPI . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġif Ġyou Ġjust Ġwant Ġto Ġset Ġthe Ġengine Ġuse Ġ[ httpClient Engine ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠhttpClient Engine ĊĠĠĠĠ Ġ* Ġ@ see ĠHttpClient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġvar ĠhttpClient : ĠHttpClient ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( httpClient Engine Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġset ĠhttpClient Ġand ĠhttpClient Engine Ġat Ġthe Ġsame Ġtime " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use ĠHttpClient ( ENGINE ) Ġinstead ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDec ides Ġhow Ġto Ġcreate Ġan Ġ[ HttpClient ] Ġbased Ġon Ġ[ httpClient ] Ġand Ġ[ httpClient Engine ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġdecide On Client (): ĠHttpClient Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpre configured Client Ġ= ĠhttpClient ĊĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠhttpClient Engine ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre configured Client Ġ!= Ġnull Ġ-> Ġpre configured Client ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine Ġ!= Ġnull Ġ-> ĠHttpClient ( engine ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠHttpClient () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclient . configure () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHttpClient . configure (): ĠHttpClient Ġ= Ġconfig Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( auth Provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Client () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinstall ( Json Feature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJson Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Unknown Keys Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Ġ= ĠKotlin x Serializer ( json ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinstall ( GitHub Api Wrapper Plugin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe ĠAccept ĠHeader Ġaccording Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// docs . github . com / en / rest / overview / resources - in - the - rest - api # current - version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Accept Ġ= ĠContentType (" application ", Ġ" vnd . github . v 3 + json ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdefault Request Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( auth Provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Auth () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Agent (" Ny Code GH G / github - api - wrapper ") Ġ// ĠTODO : Ġreplace Ġhardcoded Ġrepo Ġwith Ġbuild Ġvariable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠHttpResponse Validator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Response Exception Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Ġ! is ĠClient RequestException ) Ġreturn @ handle Response Exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Response Ġ= Ġexception . response . receive OrNull < GitHub ErrorResponse >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Response Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠGitHub RequestException ( error Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ[ GitHub Client ] Ġwith Ġthe Ġspecified Ġoptions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġopen Ġfun Ġbuild (): ĠGitHub Client Ġ= ĠGitHub Client Impl ( baseUrl , Ġdecide On Client ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠPlatform Ġag nost ic Ġbuilder Ġfor Ġ[ GitHub Client ]. Ċ Ġ*/ Ċ public Ġexpect Ġclass ĠGitHub Client Builder Ġconstructor () Ġ: ĠGitHub Client Builder Base Ċ