/** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.4.67 * User agent: apibuilder app.apibuilder.io/flow/github/0.4.67/http4s_0_20 */ package io.flow.github.v0 { import cats.effect._ import cats.implicits._ import io.circe.syntax._ object Constants { val BaseUrl = "https://api.github.com" val Namespace = "io.flow.github.v0" val UserAgent = "apibuilder app.apibuilder.io/flow/github/0.4.67/http4s_0_20" val Version = "0.4.67" val VersionMajor = 0 } class Client[F[_]: Sync]( val baseUrl: org.http4s.Uri = org.http4s.Uri.unsafeFromString("https://api.github.com"), auth: scala.Option[io.flow.github.v0.Authorization] = None, defaultHeaders: Seq[(String, String)] = Nil, httpClient: org.http4s.client.Client[F] ) extends interfaces.Client[F] { import org.http4s.Response import io.flow.github.v0.models.json._ def blobs: Blobs[F] = Blobs def commits: Commits[F] = Commits def contents: Contents[F] = Contents def hooks: Hooks[F] = Hooks def pullRequests: PullRequests[F] = PullRequests def refs: Refs[F] = Refs def repositories: Repositories[F] = Repositories def tags: Tags[F] = Tags def trees: Trees[F] = Trees def userEmails: UserEmails[F] = UserEmails def users: Users[F] = Users object Blobs extends Blobs[F] { override def getBySha( owner: String, repo: String, sha: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Blob] = { val urlPath = Seq("repos", owner, repo, "git", "blobs", sha) _executeRequest[Unit, io.flow.github.v0.models.Blob]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Blob]("io.flow.github.v0.models.Blob", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } override def post( owner: String, repo: String, blobForm: io.flow.github.v0.models.BlobForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.BlobCreated] = { val urlPath = Seq("repos", owner, repo, "git", "blobs") val (payload, formPayload) = (Some(blobForm), None) _executeRequest[io.flow.github.v0.models.BlobForm, io.flow.github.v0.models.BlobCreated]("POST", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.BlobCreated]("io.flow.github.v0.models.BlobCreated", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } } object Commits extends Commits[F] { override def getBySha( owner: String, repo: String, sha: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Commit] = { val urlPath = Seq("repos", owner, repo, "git", "commits", sha) _executeRequest[Unit, io.flow.github.v0.models.Commit]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Commit]("io.flow.github.v0.models.Commit", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404, 422")) } } override def post( owner: String, repo: String, commitForm: io.flow.github.v0.models.CommitForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.CommitResponse] = { val urlPath = Seq("repos", owner, repo, "git", "commits") val (payload, formPayload) = (Some(commitForm), None) _executeRequest[io.flow.github.v0.models.CommitForm, io.flow.github.v0.models.CommitResponse]("POST", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.CommitResponse]("io.flow.github.v0.models.CommitResponse", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } } object Contents extends Contents[F] { override def getReadme( owner: String, repo: String, ref: String = "main", requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Contents] = { val urlPath = Seq("repos", owner, repo, "readme") val queryParameters = Seq( Some("ref" -> ref) ).flatten _executeRequest[Unit, io.flow.github.v0.models.Contents]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Contents]("io.flow.github.v0.models.Contents", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401, 404")) } } override def getContentsByPath( owner: String, repo: String, path: String, ref: String = "main", requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Contents] = { val urlPath = Seq("repos", owner, repo, "contents", path) val queryParameters = Seq( Some("ref" -> ref) ).flatten _executeRequest[Unit, io.flow.github.v0.models.Contents]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Contents]("io.flow.github.v0.models.Contents", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401, 404")) } } } object Hooks extends Hooks[F] { override def get( owner: String, repo: String, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Hook]] = { val urlPath = Seq("repos", owner, repo, "hooks") _executeRequest[Unit, Seq[io.flow.github.v0.models.Hook]]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.Hook]]("Seq[io.flow.github.v0.models.Hook]", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } override def getById( owner: String, repo: String, id: Long, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Hook] = { val urlPath = Seq("repos", owner, repo, "hooks", id.toString) _executeRequest[Unit, io.flow.github.v0.models.Hook]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Hook]("io.flow.github.v0.models.Hook", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } override def post( owner: String, repo: String, hookForm: io.flow.github.v0.models.HookForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Hook] = { val urlPath = Seq("repos", owner, repo, "hooks") val (payload, formPayload) = (Some(hookForm), None) _executeRequest[io.flow.github.v0.models.HookForm, io.flow.github.v0.models.Hook]("POST", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Hook]("io.flow.github.v0.models.Hook", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } override def deleteById( owner: String, repo: String, id: Long, requestHeaders: Seq[(String, String)] = Nil ): F[Unit] = { val urlPath = Seq("repos", owner, repo, "hooks", id.toString) _executeRequest[Unit, Unit]("DELETE", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 204 => Sync[F].pure(()) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 204, 404")) } } } object PullRequests extends PullRequests[F] { override def post( owner: String, repo: String, pullRequestForm: io.flow.github.v0.models.PullRequestForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.PullRequest] = { val urlPath = Seq("repos", owner, repo, "pulls") val (payload, formPayload) = (Some(pullRequestForm), None) _executeRequest[io.flow.github.v0.models.PullRequestForm, io.flow.github.v0.models.PullRequest]("POST", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.PullRequest]("io.flow.github.v0.models.PullRequest", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } override def get( owner: String, repo: String, page: Long = 1L, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.PullRequest]] = { val urlPath = Seq("repos", owner, repo, "pulls") val queryParameters = Seq( Some("page" -> page.toString) ).flatten _executeRequest[Unit, Seq[io.flow.github.v0.models.PullRequest]]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.PullRequest]]("Seq[io.flow.github.v0.models.PullRequest]", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } } object Refs extends Refs[F] { override def get( owner: String, repo: String, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Ref]] = { val urlPath = Seq("repos", owner, repo, "git", "refs") _executeRequest[Unit, Seq[io.flow.github.v0.models.Ref]]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.Ref]]("Seq[io.flow.github.v0.models.Ref]", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } override def getByRef( owner: String, repo: String, ref: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Ref] = { val urlPath = Seq("repos", owner, repo, "git", "refs", ref) _executeRequest[Unit, io.flow.github.v0.models.Ref]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Ref]("io.flow.github.v0.models.Ref", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } override def post( owner: String, repo: String, refForm: io.flow.github.v0.models.RefForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Ref] = { val urlPath = Seq("repos", owner, repo, "git", "refs") val (payload, formPayload) = (Some(refForm), None) _executeRequest[io.flow.github.v0.models.RefForm, io.flow.github.v0.models.Ref]("POST", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Ref]("io.flow.github.v0.models.Ref", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } override def putByRef( owner: String, repo: String, ref: String, refUpdateForm: io.flow.github.v0.models.RefUpdateForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Ref] = { val urlPath = Seq("repos", owner, repo, "git", "refs", ref) val (payload, formPayload) = (Some(refUpdateForm), None) _executeRequest[io.flow.github.v0.models.RefUpdateForm, io.flow.github.v0.models.Ref]("PUT", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Ref]("io.flow.github.v0.models.Ref", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } } object Repositories extends Repositories[F] { override def getUserAndRepos( page: Long = 1L, visibility: io.flow.github.v0.models.Visibility = io.flow.github.v0.models.Visibility.All, affiliation: _root_.scala.Option[String] = None, `type`: _root_.scala.Option[String] = None, sort: String = "full_name", direction: String = "asc", requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Repository]] = { val urlPath = Seq("user", "repos") val queryParameters = Seq( Some("page" -> page.toString), Some("visibility" -> visibility.toString), affiliation.map("affiliation" -> _), `type`.map("type" -> _), Some("sort" -> sort), Some("direction" -> direction) ).flatten _executeRequest[Unit, Seq[io.flow.github.v0.models.Repository]]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.Repository]]("Seq[io.flow.github.v0.models.Repository]", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401")) } } override def getUsersAndReposByUsername( username: String, page: Long = 1L, `type`: String = "owner", sort: String = "full_name", direction: String = "asc", requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Repository]] = { val urlPath = Seq("users", username, "repos") val queryParameters = Seq( Some("page" -> page.toString), Some("type" -> `type`), Some("sort" -> sort), Some("direction" -> direction) ).flatten _executeRequest[Unit, Seq[io.flow.github.v0.models.Repository]]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.Repository]]("Seq[io.flow.github.v0.models.Repository]", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401")) } } override def getOrgsAndReposByOrg( org: String, page: Long = 1L, `type`: String = "all", sort: String = "full_name", direction: String = "asc", requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Repository]] = { val urlPath = Seq("orgs", org, "repos") val queryParameters = Seq( Some("page" -> page.toString), Some("type" -> `type`), Some("sort" -> sort), Some("direction" -> direction) ).flatten _executeRequest[Unit, Seq[io.flow.github.v0.models.Repository]]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.Repository]]("Seq[io.flow.github.v0.models.Repository]", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401")) } } } object Tags extends Tags[F] { override def getTags( owner: String, repo: String, page: Long = 1L, perPage: Long = 30L, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.TagSummary]] = { val urlPath = Seq("repos", owner, repo, "tags") val queryParameters = Seq( Some("page" -> page.toString), Some("per_page" -> perPage.toString) ).flatten _executeRequest[Unit, Seq[io.flow.github.v0.models.TagSummary]]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.TagSummary]]("Seq[io.flow.github.v0.models.TagSummary]", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } override def getTagsBySha( owner: String, repo: String, sha: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Tag] = { val urlPath = Seq("repos", owner, repo, "tags", sha) _executeRequest[Unit, io.flow.github.v0.models.Tag]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Tag]("io.flow.github.v0.models.Tag", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 404")) } } override def postGitAndTags( owner: String, repo: String, tagForm: io.flow.github.v0.models.TagForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Tag] = { val urlPath = Seq("repos", owner, repo, "git", "tags") val (payload, formPayload) = (Some(tagForm), None) _executeRequest[io.flow.github.v0.models.TagForm, io.flow.github.v0.models.Tag]("POST", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.Tag]("io.flow.github.v0.models.Tag", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } } object Trees extends Trees[F] { override def post( owner: String, repo: String, createTreeForm: io.flow.github.v0.models.CreateTreeForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.CreateTreeResponse] = { val urlPath = Seq("repos", owner, repo, "git", "trees") val (payload, formPayload) = (Some(createTreeForm), None) _executeRequest[io.flow.github.v0.models.CreateTreeForm, io.flow.github.v0.models.CreateTreeResponse]("POST", path = urlPath, body = payload, formBody = formPayload, requestHeaders = requestHeaders) { case r if r.status.code == 201 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.CreateTreeResponse]("io.flow.github.v0.models.CreateTreeResponse", r) case r if r.status.code == 404 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r if r.status.code == 422 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.UnprocessableEntity]("io.flow.github.v0.models.UnprocessableEntity", r).flatMap(body => Sync[F].raiseError(new io.flow.github.v0.errors.UnprocessableEntityResponse(r.headers, r.status.code, None, body))) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 201, 404, 422")) } } } object UserEmails extends UserEmails[F] { override def get( requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.UserEmail]] = { val urlPath = Seq("user", "emails") _executeRequest[Unit, Seq[io.flow.github.v0.models.UserEmail]]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.UserEmail]]("Seq[io.flow.github.v0.models.UserEmail]", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401")) } } } object Users extends Users[F] { override def getUser( requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.User] = { val urlPath = Seq("user") _executeRequest[Unit, io.flow.github.v0.models.User]("GET", path = urlPath, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, io.flow.github.v0.models.User]("io.flow.github.v0.models.User", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401")) } } override def getUserAndOrgs( page: Long = 1L, perPage: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.UserOrg]] = { val urlPath = Seq("user", "orgs") val queryParameters = Seq( Some("page" -> page.toString), perPage.map("per_page" -> _.toString) ).flatten _executeRequest[Unit, Seq[io.flow.github.v0.models.UserOrg]]("GET", path = urlPath, queryParameters = queryParameters, requestHeaders = requestHeaders) { case r if r.status.code == 200 => _root_.io.flow.github.v0.Client.parseJson[F, Seq[io.flow.github.v0.models.UserOrg]]("Seq[io.flow.github.v0.models.UserOrg]", r) case r if r.status.code == 401 => Sync[F].raiseError(new io.flow.github.v0.errors.UnitResponse(r.status.code)) case r => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Unsupported response code[${r.status.code}]. Expected: 200, 401")) } } } private lazy val defaultApiHeaders = Seq( ("User-Agent", Constants.UserAgent), ("X-Apidoc-Version", Constants.Version), ("X-Apidoc-Version-Major", Constants.VersionMajor.toString) ) def apiHeaders: Seq[(String, String)] = defaultApiHeaders def modifyRequest(request: org.http4s.Request[F]): org.http4s.Request[F] = request implicit def circeJsonEncoder[F[_]: Sync, A](implicit encoder: io.circe.Encoder[A]) = org.http4s.circe.jsonEncoderOf[F, A] def _executeRequest[T, U]( method: String, path: Seq[String], queryParameters: Seq[(String, String)] = Nil, requestHeaders: Seq[(String, String)] = Nil, body: Option[T] = None, formBody : Option[org.http4s.UrlForm] = None )(handler: org.http4s.Response[F] => F[U] )(implicit encoder: io.circe.Encoder[T]): F[U] = { import org.http4s.QueryParamEncoder._ val m = org.http4s.Method.fromString(method) match { case Right(m) => m case Left(e) => sys.error(e.toString) } val headers = org.http4s.Headers(( apiHeaders ++ defaultHeaders ++ requestHeaders ).groupBy(_._1).map { case (k, l) => org.http4s.Header(k, l.last._2) }.toList) val queryMap = queryParameters.groupBy(_._1).map { case (k, v) => k -> v.map(_._2) } val uri = path.foldLeft(baseUrl){ case (uri, segment) => uri / segment }.setQueryParams(queryMap) val request = org.http4s.Request[F](method = m, uri = uri, headers = headers) val reqAndMaybeAuth = auth.fold(request) { case Authorization.Basic(username, passwordOpt) => { val userpass = s"$username:${passwordOpt.getOrElse("")}" val token = java.util.Base64.getEncoder.encodeToString(userpass.getBytes(java.nio.charset.StandardCharsets.ISO_8859_1)) request.putHeaders(org.http4s.Header("Authorization", s"Basic $token")) } case a => sys.error("Invalid authorization scheme[" + a.getClass + "]") } val reqAndMaybeAuthAndBody = if (formBody.nonEmpty) formBody.fold(reqAndMaybeAuth)(reqAndMaybeAuth.withEntity) else body.fold(reqAndMaybeAuth)(reqAndMaybeAuth.withEntity) httpClient.fetch(modifyRequest(reqAndMaybeAuthAndBody))(handler) } } object Client { import cats.effect._ implicit def circeJsonDecoder[F[_]: Sync, A](implicit decoder: io.circe.Decoder[A]) = org.http4s.circe.jsonOf[F, A] def parseJson[F[_]: Sync, T]( className: String, r: org.http4s.Response[F] )(implicit decoder: io.circe.Decoder[T]): F[T] = r.attemptAs[T].value.flatMap { case Right(value) => Sync[F].pure(value) case Left(error) => Sync[F].raiseError(new io.flow.github.v0.errors.FailedRequest(r.status.code, s"Invalid json for class[" + className + "]", None, error)) } } sealed trait Authorization extends _root_.scala.Product with _root_.scala.Serializable object Authorization { final case class Basic(username: String, password: Option[String] = None) extends Authorization } package interfaces { trait Client[F[_]] { def baseUrl: org.http4s.Uri def blobs: io.flow.github.v0.Blobs[F] def commits: io.flow.github.v0.Commits[F] def contents: io.flow.github.v0.Contents[F] def hooks: io.flow.github.v0.Hooks[F] def pullRequests: io.flow.github.v0.PullRequests[F] def refs: io.flow.github.v0.Refs[F] def repositories: io.flow.github.v0.Repositories[F] def tags: io.flow.github.v0.Tags[F] def trees: io.flow.github.v0.Trees[F] def userEmails: io.flow.github.v0.UserEmails[F] def users: io.flow.github.v0.Users[F] } } trait Blobs[F[_]] { def getBySha( owner: String, repo: String, sha: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Blob] def post( owner: String, repo: String, blobForm: io.flow.github.v0.models.BlobForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.BlobCreated] } trait Commits[F[_]] { def getBySha( owner: String, repo: String, sha: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Commit] def post( owner: String, repo: String, commitForm: io.flow.github.v0.models.CommitForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.CommitResponse] } trait Contents[F[_]] { def getReadme( owner: String, repo: String, ref: String = "main", requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Contents] def getContentsByPath( owner: String, repo: String, path: String, ref: String = "main", requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Contents] } trait Hooks[F[_]] { def get( owner: String, repo: String, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Hook]] def getById( owner: String, repo: String, id: Long, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Hook] def post( owner: String, repo: String, hookForm: io.flow.github.v0.models.HookForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Hook] def deleteById( owner: String, repo: String, id: Long, requestHeaders: Seq[(String, String)] = Nil ): F[Unit] } trait PullRequests[F[_]] { def post( owner: String, repo: String, pullRequestForm: io.flow.github.v0.models.PullRequestForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.PullRequest] def get( owner: String, repo: String, page: Long = 1L, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.PullRequest]] } trait Refs[F[_]] { def get( owner: String, repo: String, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Ref]] def getByRef( owner: String, repo: String, ref: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Ref] def post( owner: String, repo: String, refForm: io.flow.github.v0.models.RefForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Ref] def putByRef( owner: String, repo: String, ref: String, refUpdateForm: io.flow.github.v0.models.RefUpdateForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Ref] } trait Repositories[F[_]] { def getUserAndRepos( page: Long = 1L, visibility: io.flow.github.v0.models.Visibility = io.flow.github.v0.models.Visibility.All, affiliation: _root_.scala.Option[String] = None, `type`: _root_.scala.Option[String] = None, sort: String = "full_name", direction: String = "asc", requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Repository]] /** * List public repositories for the specified user. */ def getUsersAndReposByUsername( username: String, page: Long = 1L, `type`: String = "owner", sort: String = "full_name", direction: String = "asc", requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Repository]] /** * List repositories for the specified org. */ def getOrgsAndReposByOrg( org: String, page: Long = 1L, `type`: String = "all", sort: String = "full_name", direction: String = "asc", requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.Repository]] } trait Tags[F[_]] { def getTags( owner: String, repo: String, page: Long = 1L, perPage: Long = 30L, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.TagSummary]] def getTagsBySha( owner: String, repo: String, sha: String, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Tag] def postGitAndTags( owner: String, repo: String, tagForm: io.flow.github.v0.models.TagForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.Tag] } trait Trees[F[_]] { def post( owner: String, repo: String, createTreeForm: io.flow.github.v0.models.CreateTreeForm, requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.CreateTreeResponse] } trait UserEmails[F[_]] { def get( requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.UserEmail]] } trait Users[F[_]] { def getUser( requestHeaders: Seq[(String, String)] = Nil ): F[io.flow.github.v0.models.User] def getUserAndOrgs( page: Long = 1L, perPage: _root_.scala.Option[Long] = None, requestHeaders: Seq[(String, String)] = Nil ): F[Seq[io.flow.github.v0.models.UserOrg]] } package errors { final case class UnitResponse(status: Int) extends Exception(s"HTTP $status") final case class UnprocessableEntityResponse( headers: org.http4s.Headers, status: Int, message: Option[String] = None, body: io.flow.github.v0.models.UnprocessableEntity ) extends Exception(s"HTTP $status${message.fold("")(m => s": $m")}"){ lazy val unprocessableEntity = body } final case class FailedRequest(responseCode: Int, message: String, requestUri: Option[_root_.java.net.URI] = None, parent: Exception = null) extends _root_.java.lang.Exception(s"HTTP $responseCode: $message", parent) } }