From cb8db99099a3a314e71dcbcf4701cccb684f76f4 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Fri, 7 Oct 2022 10:56:59 +0300 Subject: [PATCH 01/16] readme updated --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bfbf10b..aca581b 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ ## Description This mini-project s used mainly to convert Ethiopian date(yy-mm-dd) into Gregorian and vise versa. Ethiopia has its own calander, having 13 months and always have 30 days within a month. -Anybody can use this api-it has easy to use, simply by sending the date along the predefined endpoints,one can get the date as a JSON response. -* * [wikipedia](https://en.wikipedia.org/wiki/Ethiopian_calendar) +Anybody can use this api; it has easy to use, simply by sending the date along the predefined endpoints,one can get the date as a JSON response. +* [wikipedia](https://en.wikipedia.org/wiki/Ethiopian_calendar) ### contents If you are newbie to golang, this project will guide and help you on testing(BDD-with Godog), using gin weebframwork and more. @@ -12,13 +12,15 @@ If you are newbie to golang, this project will guide and help you on testing(BDD ## Installation 1. install using below go command: -- - go get gitlab.com/Yinebeb-01/ethiopiandateconverter +- ```go get gitlab.com/Yinebeb-01/ethiopiandateconverter``` 2. import onto your project code -- - import "gitlab.com/Yinebeb-01/ethiopiandateconverter" +- ```import "gitlab.com/Yinebeb-01/ethiopiandateconverter"``` ## Authors and acknowledgment -[Yinebeb T.](https://gitlab.com/Yinebeb-01/) +- [Yinebeb T.](https://gitlab.com/Yinebeb-01/) + +- You can check the [python version](https://github.com/dimagi/ethiopian-date-converter) ## Project status First version, I will come soon with updates From 20ddc27df0a266165a31113c2ef7f5ba8d422bfa Mon Sep 17 00:00:00 2001 From: Yinebeb Tariku <84726535+Yinebeb-01@users.noreply.github.com> Date: Sat, 15 Oct 2022 11:58:54 +0300 Subject: [PATCH 02/16] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3b6dbed --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Yinebeb Tariku + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From c5454f727396d6779b508290744973242957ae0d Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Sat, 15 Oct 2022 12:24:35 +0300 Subject: [PATCH 03/16] version retracted --- .idea/.gitignore | 8 ++++++++ .idea/ethiopianDateConverter.iml | 9 +++++++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ go.mod | 2 ++ 5 files changed, 33 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/ethiopianDateConverter.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/ethiopianDateConverter.iml b/.idea/ethiopianDateConverter.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/ethiopianDateConverter.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..46daffe --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/go.mod b/go.mod index 934020e..d7f60b6 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module gitlab.com/Yinebeb-01/ethiopiandateconverter go 1.19 +retract v0.0.0-20221007075659-cb8db99099a3 + require ( github.com/cucumber/godog v0.12.5 github.com/gin-gonic/gin v1.8.1 From 4426671eeac749610ce2797d6fe306e6f055ad64 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Sat, 15 Oct 2022 12:54:00 +0300 Subject: [PATCH 04/16] versionv0.1.0 added --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index d7f60b6..934020e 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module gitlab.com/Yinebeb-01/ethiopiandateconverter go 1.19 -retract v0.0.0-20221007075659-cb8db99099a3 - require ( github.com/cucumber/godog v0.12.5 github.com/gin-gonic/gin v1.8.1 From aa64a4271cb502a46dc6259b363890761f9a2a5a Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Mon, 24 Oct 2022 12:30:13 +0300 Subject: [PATCH 05/16] link to pkg.dev.go added on readme --- .gitlab-ci.yml | 0 .idea/.gitignore | 0 .idea/ethiopianDateConverter.iml | 0 .idea/modules.xml | 0 .idea/vcs.xml | 0 LICENSE | 0 README.md | 4 ++++ ethioGrego/helper.go | 0 ethioGrego/to_ethiopian.go | 0 ethioGrego/to_gregorian.go | 0 ethioGrego_test.go | 0 features/AD_to_ET.feature | 0 features/ET_to_AD.feature | 0 go.mod | 0 go.sum | 0 main.go | 1 - 16 files changed, 4 insertions(+), 1 deletion(-) mode change 100644 => 100755 .gitlab-ci.yml mode change 100644 => 100755 .idea/.gitignore mode change 100644 => 100755 .idea/ethiopianDateConverter.iml mode change 100644 => 100755 .idea/modules.xml mode change 100644 => 100755 .idea/vcs.xml mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 ethioGrego/helper.go mode change 100644 => 100755 ethioGrego/to_ethiopian.go mode change 100644 => 100755 ethioGrego/to_gregorian.go mode change 100644 => 100755 ethioGrego_test.go mode change 100644 => 100755 features/AD_to_ET.feature mode change 100644 => 100755 features/ET_to_AD.feature mode change 100644 => 100755 go.mod mode change 100644 => 100755 go.sum mode change 100644 => 100755 main.go diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml old mode 100644 new mode 100755 diff --git a/.idea/.gitignore b/.idea/.gitignore old mode 100644 new mode 100755 diff --git a/.idea/ethiopianDateConverter.iml b/.idea/ethiopianDateConverter.iml old mode 100644 new mode 100755 diff --git a/.idea/modules.xml b/.idea/modules.xml old mode 100644 new mode 100755 diff --git a/.idea/vcs.xml b/.idea/vcs.xml old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index aca581b..cb9bdd5 --- a/README.md +++ b/README.md @@ -22,5 +22,9 @@ If you are newbie to golang, this project will guide and help you on testing(BDD - You can check the [python version](https://github.com/dimagi/ethiopian-date-converter) +## Documentation + Read on [pkg.go.dev](https://pkg.go.dev/gitlab.com/Yinebeb-01/ethiopiandateconverter) + ## Project status First version, I will come soon with updates + diff --git a/ethioGrego/helper.go b/ethioGrego/helper.go old mode 100644 new mode 100755 diff --git a/ethioGrego/to_ethiopian.go b/ethioGrego/to_ethiopian.go old mode 100644 new mode 100755 diff --git a/ethioGrego/to_gregorian.go b/ethioGrego/to_gregorian.go old mode 100644 new mode 100755 diff --git a/ethioGrego_test.go b/ethioGrego_test.go old mode 100644 new mode 100755 diff --git a/features/AD_to_ET.feature b/features/AD_to_ET.feature old mode 100644 new mode 100755 diff --git a/features/ET_to_AD.feature b/features/ET_to_AD.feature old mode 100644 new mode 100755 diff --git a/go.mod b/go.mod old mode 100644 new mode 100755 diff --git a/go.sum b/go.sum old mode 100644 new mode 100755 diff --git a/main.go b/main.go old mode 100644 new mode 100755 index 3351743..8e50d0b --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ Ethiopian Calendar tool for Golang Copyright (c) 2022 Yinebeb Tariku */ - package main import ( From 113443db037d206c5121e6374efb3eac1cdc6ec7 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Thu, 27 Oct 2022 17:23:20 +0300 Subject: [PATCH 06/16] swagger docs added --- api/getAdFromEt.go | 56 ++++++++++++++++++ api/getEtFromAd.go | 49 ++++++++++++++++ api/home.go | 12 ++++ docs/docs.go | 138 +++++++++++++++++++++++++++++++++++++++++++++ docs/swagger.json | 115 +++++++++++++++++++++++++++++++++++++ docs/swagger.yaml | 79 ++++++++++++++++++++++++++ go.mod | 32 ++++++++--- go.sum | 92 ++++++++++++++++++++++++++++++ main.go | 109 +++++++++++------------------------ 9 files changed, 596 insertions(+), 86 deletions(-) create mode 100644 api/getAdFromEt.go create mode 100644 api/getEtFromAd.go create mode 100644 api/home.go create mode 100644 docs/docs.go create mode 100644 docs/swagger.json create mode 100644 docs/swagger.yaml diff --git a/api/getAdFromEt.go b/api/getAdFromEt.go new file mode 100644 index 0000000..020516d --- /dev/null +++ b/api/getAdFromEt.go @@ -0,0 +1,56 @@ +package api + +import ( + "errors" + "github.com/gin-gonic/gin" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" + "net/http" + "strconv" + "strings" +) + +// Show AdToEt godoc +// @Summary Convert date +// @Description get string by date +// @Tags AdToEt +// @Accept json +// @Produce json +// @Param date path string true "date" +// @Success 200 {object} time.Time +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /ad-from-et/{date} [get] +// Ethiopian to Gregorian to handler +func GetAdFromEt(ctx *gin.Context) { + dateString, state := ctx.Params.Get("date") + if state { + dateString = strings.TrimPrefix(dateString, "date=") + } + var splitedDate = strings.Split(dateString, "-") + if len(splitedDate) > 3 { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": "not a valid date", + }) + } else { + day, _ := strconv.Atoi(splitedDate[2]) + month, _ := strconv.Atoi(splitedDate[1]) + year, _ := strconv.Atoi(splitedDate[0]) + + date, err := ethioGrego.To_gregorian(year, month, day) + if err == nil { + ctx.JSON(http.StatusOK, gin.H{ + "response": date.Format("2006-01-02"), + }) + } + if err.Error() == "not a valid date" { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": err.Error(), + }) + } else { + ctx.JSON(http.StatusInternalServerError, gin.H{ + "response": errors.New("internal server error"), + }) + } + } +} diff --git a/api/getEtFromAd.go b/api/getEtFromAd.go new file mode 100644 index 0000000..4c0868d --- /dev/null +++ b/api/getEtFromAd.go @@ -0,0 +1,49 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" + "net/http" + "strconv" + "strings" +) + +// Show EtToAd godoc +// @Summary Convert date +// @Description get string by date +// @Tags EtToAd +// @Accept json +// @Produce json +// @Param date path string true "date" +// @Success 200 {object} time.Time +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /et-from-ad/{date} [get] +// Gregorian to Ethiopian handler +func GetEtFromAd(ctx *gin.Context) { + dateString, state := ctx.Params.Get("date") + if state { + dateString = strings.TrimPrefix(dateString, "date=") + } + var splitedDate = strings.Split(dateString, "-") + if len(splitedDate) > 3 { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": "not a valid date", + }) + } else { + day, _ := strconv.Atoi(splitedDate[2]) + month, _ := strconv.Atoi(splitedDate[1]) + year, _ := strconv.Atoi(splitedDate[0]) + EtDate, err := ethioGrego.To_ethiopian(year, month, day) + if err == nil { + ctx.JSON(http.StatusOK, gin.H{ + "response": EtDate.Format("2006-01-02"), + }) + } else { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": err.Error(), + }) + } + } +} diff --git a/api/home.go b/api/home.go new file mode 100644 index 0000000..e8898a0 --- /dev/null +++ b/api/home.go @@ -0,0 +1,12 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "net/http" +) + +func HomePage(ctx *gin.Context) { + ctx.JSON(http.StatusOK, gin.H{ + "Message": "EthioGrego Server", + }) +} diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 0000000..bdebc80 --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,138 @@ +// Package docs GENERATED BY SWAG; DO NOT EDIT +// This file was generated by swaggo/swag +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/ad-from-et/{date}": { + "get": { + "description": "get string by date", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "AdToEt" + ], + "summary": "Convert date", + "parameters": [ + { + "type": "string", + "description": "date", + "name": "date", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/et-from-ad/{date}": { + "get": { + "description": "get string by date", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "EtToAd" + ], + "summary": "Convert date", + "parameters": [ + { + "type": "string", + "description": "date", + "name": "date", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + } + }, + "securityDefinitions": { + "BasicAuth": { + "type": "basic" + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "localhost:8080", + BasePath: "/api/v1", + Schemes: []string{}, + Title: "Swagger API", + Description: "This is a sample swagger server.", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/docs/swagger.json b/docs/swagger.json new file mode 100644 index 0000000..c092d48 --- /dev/null +++ b/docs/swagger.json @@ -0,0 +1,115 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample swagger server.", + "title": "Swagger API", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0" + }, + "host": "localhost:8080", + "basePath": "/api/v1", + "paths": { + "/ad-from-et/{date}": { + "get": { + "description": "get string by date", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "AdToEt" + ], + "summary": "Convert date", + "parameters": [ + { + "type": "string", + "description": "date", + "name": "date", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/et-from-ad/{date}": { + "get": { + "description": "get string by date", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "EtToAd" + ], + "summary": "Convert date", + "parameters": [ + { + "type": "string", + "description": "date", + "name": "date", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + } + }, + "securityDefinitions": { + "BasicAuth": { + "type": "basic" + } + } +} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 0000000..fef7a14 --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,79 @@ +basePath: /api/v1 +host: localhost:8080 +info: + contact: + email: support@swagger.io + name: API Support + url: http://www.swagger.io/support + description: This is a sample swagger server. + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + termsOfService: http://swagger.io/terms/ + title: Swagger API + version: "1.0" +paths: + /ad-from-et/{date}: + get: + consumes: + - application/json + description: get string by date + parameters: + - description: date + in: path + name: date + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + "400": + description: Bad Request + schema: {} + "404": + description: Not Found + schema: {} + "500": + description: Internal Server Error + schema: {} + summary: Convert date + tags: + - AdToEt + /et-from-ad/{date}: + get: + consumes: + - application/json + description: get string by date + parameters: + - description: date + in: path + name: date + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + "400": + description: Bad Request + schema: {} + "404": + description: Not Found + schema: {} + "500": + description: Internal Server Error + schema: {} + summary: Convert date + tags: + - EtToAd +securityDefinitions: + BasicAuth: + type: basic +swagger: "2.0" diff --git a/go.mod b/go.mod index 934020e..edd47d7 100755 --- a/go.mod +++ b/go.mod @@ -8,29 +8,43 @@ require ( ) require ( + github.com/KyleBanks/depth v1.2.1 // indirect + github.com/PuerkitoBio/purell v1.2.0 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect github.com/cucumber/messages-go/v16 v16.0.1 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/spec v0.20.7 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.10.0 // indirect - github.com/goccy/go-json v0.9.7 // indirect + github.com/go-playground/validator/v10 v10.11.1 // indirect + github.com/goccy/go-json v0.9.11 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/hashicorp/go-immutable-radix v1.3.0 // indirect github.com/hashicorp/go-memdb v1.3.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/leodido/go-urn v1.2.1 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a // indirect + github.com/swaggo/gin-swagger v1.5.3 // indirect + github.com/swaggo/swag v1.8.7 // indirect github.com/ugorji/go/codec v1.2.7 // indirect - golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect - golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b // indirect - golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect - golang.org/x/text v0.3.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect + golang.org/x/crypto v0.1.0 // indirect + golang.org/x/net v0.1.0 // indirect + golang.org/x/sys v0.1.0 // indirect + golang.org/x/text v0.4.0 // indirect + golang.org/x/tools v0.2.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index fd377d4..947a0be 100755 --- a/go.sum +++ b/go.sum @@ -13,7 +13,15 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.2.0 h1:/Jdm5QfyM8zdlqT6WVZU4cfP23sot6CEHA4CS49Ezig= +github.com/PuerkitoBio/purell v1.2.0/go.mod h1:OhLRTaaIzhvIyofkJfB24gokC7tM42Px5UhoT32THBk= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -30,6 +38,7 @@ github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE= @@ -47,6 +56,7 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= @@ -55,6 +65,19 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI= +github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= @@ -63,9 +86,13 @@ github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/j github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -128,6 +155,8 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -150,10 +179,17 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -171,11 +207,19 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -217,18 +261,30 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a h1:kAe4YSu0O0UFn1DowNo2MY5p6xzqtJ/wQ7LZynSvGaY= +github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= +github.com/swaggo/gin-swagger v1.5.3 h1:8mWmHLolIbrhJJTflsaFoZzRBYVmEE7JZGIq08EiC0Q= +github.com/swaggo/gin-swagger v1.5.3/go.mod h1:3XJKSfHjDMB5dBo/0rrTXidPmgLeqsX89Yp4uA50HpI= +github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ= +github.com/swaggo/swag v1.8.7 h1:2K9ivTD3teEO+2fXV6zrZKDqk5IuU2aJtBDo8U7omWU= +github.com/swaggo/swag v1.8.7/go.mod h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -240,8 +296,12 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -260,6 +320,7 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -275,8 +336,14 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -285,6 +352,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -299,12 +367,20 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -312,6 +388,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -331,9 +409,16 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -358,9 +443,12 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -368,6 +456,8 @@ gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -376,6 +466,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index 8e50d0b..79a5d3b 100755 --- a/main.go +++ b/main.go @@ -5,90 +5,45 @@ Copyright (c) 2022 Yinebeb Tariku package main import ( - "errors" - "net/http" - "strconv" - "strings" - - "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" - "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/api" + docs "gitlab.com/Yinebeb-01/ethiopiandateconverter/docs" ) +// @title Swagger API +// @version 1.0 +// @description This is a sample swagger server. +// @termsOfService http://swagger.io/terms/ +// @contact.name API Support +// @contact.url http://www.swagger.io/support +// @contact.email support@swagger.io +// @license.name Apache 2.0 +// @license.url http://www.apache.org/licenses/LICENSE-2.0.html +// @host localhost:8080 +// @BasePath /api/v1 +// @securityDefinitions.basic BasicAuth func main() { - router := gin.Default() - - router.GET("/", homePage) - router.GET("/ad-from-et/:date", getAdFromEt) - router.GET("/et-from-ad/:date", getEtFromAd) - - router.Run(":8080") -} + // programmatically set swagger info + //docs.SwaggerInfo.Title = "Swagger Example API" + //docs.SwaggerInfo.Description = "This is a sample server Petstore server." + //docs.SwaggerInfo.Version = "1.0" + //docs.SwaggerInfo.Host = "petstore.swagger.io" + //docs.SwaggerInfo.BasePath = "api/v1" + //docs.SwaggerInfo.Schemes = []string{"http", "https"} -func homePage(ctx *gin.Context) { - ctx.JSON(http.StatusOK, gin.H{ - "Message": "EthioGrego Server", - }) -} + router := gin.Default() + docs.SwaggerInfo.BasePath = "/api/v1" -// Ethiopian to Gregorian to handler -func getAdFromEt(ctx *gin.Context) { - dateString, state := ctx.Params.Get("date") - if state { - dateString = strings.TrimPrefix(dateString, "date=") + v1 := router.Group(docs.SwaggerInfo.BasePath) + { + v1.GET("/", api.HomePage) + v1.GET("/ad-from-et/:date", api.GetAdFromEt) + v1.GET("/et-from-ad/:date", api.GetEtFromAd) } - var splitedDate = strings.Split(dateString, "-") - if len(splitedDate) > 3 { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": "not a valid date", - }) - } else { - day, _ := strconv.Atoi(splitedDate[2]) - month, _ := strconv.Atoi(splitedDate[1]) - year, _ := strconv.Atoi(splitedDate[0]) - date, err := ethioGrego.To_gregorian(year, month, day) - if err == nil { - ctx.JSON(http.StatusOK, gin.H{ - "response": date.Format("2006-01-02"), - }) - } - if err.Error() == "not a valid date" { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": err.Error(), - }) - } else { - ctx.JSON(http.StatusInternalServerError, gin.H{ - "response": errors.New("internal server error"), - }) - } - } -} + router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) -// Gregorian to Ethiopian handler -func getEtFromAd(ctx *gin.Context) { - dateString, state := ctx.Params.Get("date") - if state { - dateString = strings.TrimPrefix(dateString, "date=") - } - var splitedDate = strings.Split(dateString, "-") - if len(splitedDate) > 3 { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": "not a valid date", - }) - } else { - day, _ := strconv.Atoi(splitedDate[2]) - month, _ := strconv.Atoi(splitedDate[1]) - year, _ := strconv.Atoi(splitedDate[0]) - EtDate, err := ethioGrego.To_ethiopian(year, month, day) - if err == nil { - ctx.JSON(http.StatusOK, gin.H{ - "response": EtDate.Format("2006-01-02"), - }) - } else { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": err.Error(), - }) - } - } + router.Run(":8080") } From e4a840ba1f01add92996d97664a1ff95cb954163 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Thu, 27 Oct 2022 18:11:31 +0300 Subject: [PATCH 07/16] git repo changed --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index edd47d7..30a7805 100755 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module gitlab.com/Yinebeb-01/ethiopiandateconverter +module github.com/Yinebeb-01/ethiopiandateconverter go 1.19 From 4fad9a98481088e2a0c36a983b691decd9191186 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Thu, 27 Oct 2022 20:33:37 +0300 Subject: [PATCH 08/16] pkg set to github.com/... --- api/getAdFromEt.go | 2 +- api/getEtFromAd.go | 2 +- api/home.go | 11 +++++++++++ main.go | 4 ++-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/api/getAdFromEt.go b/api/getAdFromEt.go index 020516d..84b1afe 100644 --- a/api/getAdFromEt.go +++ b/api/getAdFromEt.go @@ -2,8 +2,8 @@ package api import ( "errors" + "github.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "github.com/gin-gonic/gin" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "net/http" "strconv" "strings" diff --git a/api/getEtFromAd.go b/api/getEtFromAd.go index 4c0868d..8ab48a0 100644 --- a/api/getEtFromAd.go +++ b/api/getEtFromAd.go @@ -1,8 +1,8 @@ package api import ( + "github.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "github.com/gin-gonic/gin" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "net/http" "strconv" "strings" diff --git a/api/home.go b/api/home.go index e8898a0..b45e3a6 100644 --- a/api/home.go +++ b/api/home.go @@ -5,6 +5,17 @@ import ( "net/http" ) +// Show Homepage godoc +// @Summary Home page +// @Description Home_page +// @Tags homepage +// @Accept json +// @Produce json +// @Success 200 {object} json +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router / [get] func HomePage(ctx *gin.Context) { ctx.JSON(http.StatusOK, gin.H{ "Message": "EthioGrego Server", diff --git a/main.go b/main.go index 79a5d3b..4969b7d 100755 --- a/main.go +++ b/main.go @@ -5,11 +5,11 @@ Copyright (c) 2022 Yinebeb Tariku package main import ( + "github.com/Yinebeb-01/ethiopiandateconverter/api" + docs "github.com/Yinebeb-01/ethiopiandateconverter/docs" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/api" - docs "gitlab.com/Yinebeb-01/ethiopiandateconverter/docs" ) // @title Swagger API From 00a73e5ea99b239642859e0becad7258d49bab28 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Fri, 28 Oct 2022 09:08:31 +0300 Subject: [PATCH 09/16] pkg repo reverte --- api/getAdFromEt.go | 2 +- api/getEtFromAd.go | 2 +- api/home.go | 3 +-- docs/docs.go | 33 +++++++++++++++++++++++++++++++++ docs/swagger.json | 33 +++++++++++++++++++++++++++++++++ docs/swagger.yaml | 23 +++++++++++++++++++++++ go.mod | 2 +- main.go | 4 ++-- 8 files changed, 95 insertions(+), 7 deletions(-) diff --git a/api/getAdFromEt.go b/api/getAdFromEt.go index 84b1afe..020516d 100644 --- a/api/getAdFromEt.go +++ b/api/getAdFromEt.go @@ -2,8 +2,8 @@ package api import ( "errors" - "github.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "github.com/gin-gonic/gin" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "net/http" "strconv" "strings" diff --git a/api/getEtFromAd.go b/api/getEtFromAd.go index 8ab48a0..4c0868d 100644 --- a/api/getEtFromAd.go +++ b/api/getEtFromAd.go @@ -1,8 +1,8 @@ package api import ( - "github.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "github.com/gin-gonic/gin" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "net/http" "strconv" "strings" diff --git a/api/home.go b/api/home.go index b45e3a6..47cbdbd 100644 --- a/api/home.go +++ b/api/home.go @@ -9,9 +9,8 @@ import ( // @Summary Home page // @Description Home_page // @Tags homepage -// @Accept json // @Produce json -// @Success 200 {object} json +// @Success 200 {object} map[string]any // @Failure 400 {object} error // @Failure 404 {object} error // @Failure 500 {object} error diff --git a/docs/docs.go b/docs/docs.go index bdebc80..fca63ff 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -25,6 +25,39 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { + "/": { + "get": { + "description": "Home_page", + "produces": [ + "application/json" + ], + "tags": [ + "homepage" + ], + "summary": "Home page", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, "/ad-from-et/{date}": { "get": { "description": "get string by date", diff --git a/docs/swagger.json b/docs/swagger.json index c092d48..2aa4bc6 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -18,6 +18,39 @@ "host": "localhost:8080", "basePath": "/api/v1", "paths": { + "/": { + "get": { + "description": "Home_page", + "produces": [ + "application/json" + ], + "tags": [ + "homepage" + ], + "summary": "Home page", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, "/ad-from-et/{date}": { "get": { "description": "get string by date", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index fef7a14..b1c6b49 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -13,6 +13,29 @@ info: title: Swagger API version: "1.0" paths: + /: + get: + description: Home_page + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + "400": + description: Bad Request + schema: {} + "404": + description: Not Found + schema: {} + "500": + description: Internal Server Error + schema: {} + summary: Home page + tags: + - homepage /ad-from-et/{date}: get: consumes: diff --git a/go.mod b/go.mod index 30a7805..edd47d7 100755 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/Yinebeb-01/ethiopiandateconverter +module gitlab.com/Yinebeb-01/ethiopiandateconverter go 1.19 diff --git a/main.go b/main.go index 4969b7d..79a5d3b 100755 --- a/main.go +++ b/main.go @@ -5,11 +5,11 @@ Copyright (c) 2022 Yinebeb Tariku package main import ( - "github.com/Yinebeb-01/ethiopiandateconverter/api" - docs "github.com/Yinebeb-01/ethiopiandateconverter/docs" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/api" + docs "gitlab.com/Yinebeb-01/ethiopiandateconverter/docs" ) // @title Swagger API From 140557138e398325046b6e9012d5d72ed611bbda Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Fri, 18 Nov 2022 14:11:48 +0300 Subject: [PATCH 10/16] project structure refactored --- Makefile | 10 ++++++++++ README.md | 12 ++++++++---- api/getAdFromEt.go | 5 +++-- api/getEtFromAd.go | 5 +++-- main.go => cmd/main.go | 0 {ethioGrego => internal/ethioGrego}/helper.go | 0 {ethioGrego => internal/ethioGrego}/to_ethiopian.go | 0 {ethioGrego => internal/ethioGrego}/to_gregorian.go | 0 ethioGrego_test.go => test/ethioGrego_test.go | 9 ++++----- {features => test/features}/AD_to_ET.feature | 0 {features => test/features}/ET_to_AD.feature | 0 11 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 Makefile rename main.go => cmd/main.go (100%) rename {ethioGrego => internal/ethioGrego}/helper.go (100%) rename {ethioGrego => internal/ethioGrego}/to_ethiopian.go (100%) rename {ethioGrego => internal/ethioGrego}/to_gregorian.go (100%) rename ethioGrego_test.go => test/ethioGrego_test.go (91%) rename {features => test/features}/AD_to_ET.feature (100%) rename {features => test/features}/ET_to_AD.feature (100%) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..85a1bf4 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +swag: + swag init -g cmd/main.go + +test: + go test -v -cover ./test/... + +run: + go run ./cmd/main.go + +.PHONY: swag test run \ No newline at end of file diff --git a/README.md b/README.md index cb9bdd5..40e7c09 100755 --- a/README.md +++ b/README.md @@ -7,15 +7,19 @@ Anybody can use this api; it has easy to use, simply by sending the date along t * [wikipedia](https://en.wikipedia.org/wiki/Ethiopian_calendar) ### contents -If you are newbie to golang, this project will guide and help you on testing(BDD-with Godog), using gin weebframwork and more. +If you are newbie to golang, this project will guide and help you on testing(BDD-with Godog), using gin webframwork and more. ## Installation 1. install using below go command: -- ```go get gitlab.com/Yinebeb-01/ethiopiandateconverter``` +```bash + go get gitlab.com/Yinebeb-01/ethiopiandateconverter +``` 2. import onto your project code -- ```import "gitlab.com/Yinebeb-01/ethiopiandateconverter"``` +```bash + import "gitlab.com/Yinebeb-01/ethiopiandateconverter" +``` ## Authors and acknowledgment - [Yinebeb T.](https://gitlab.com/Yinebeb-01/) @@ -26,5 +30,5 @@ If you are newbie to golang, this project will guide and help you on testing(BDD Read on [pkg.go.dev](https://pkg.go.dev/gitlab.com/Yinebeb-01/ethiopiandateconverter) ## Project status -First version, I will come soon with updates +First version | for learning purpose diff --git a/api/getAdFromEt.go b/api/getAdFromEt.go index 020516d..091e9e8 100644 --- a/api/getAdFromEt.go +++ b/api/getAdFromEt.go @@ -2,11 +2,12 @@ package api import ( "errors" - "github.com/gin-gonic/gin" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "net/http" "strconv" "strings" + + "github.com/gin-gonic/gin" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" ) // Show AdToEt godoc diff --git a/api/getEtFromAd.go b/api/getEtFromAd.go index 4c0868d..5bf1014 100644 --- a/api/getEtFromAd.go +++ b/api/getEtFromAd.go @@ -1,11 +1,12 @@ package api import ( - "github.com/gin-gonic/gin" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" "net/http" "strconv" "strings" + + "github.com/gin-gonic/gin" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" ) // Show EtToAd godoc diff --git a/main.go b/cmd/main.go similarity index 100% rename from main.go rename to cmd/main.go diff --git a/ethioGrego/helper.go b/internal/ethioGrego/helper.go similarity index 100% rename from ethioGrego/helper.go rename to internal/ethioGrego/helper.go diff --git a/ethioGrego/to_ethiopian.go b/internal/ethioGrego/to_ethiopian.go similarity index 100% rename from ethioGrego/to_ethiopian.go rename to internal/ethioGrego/to_ethiopian.go diff --git a/ethioGrego/to_gregorian.go b/internal/ethioGrego/to_gregorian.go similarity index 100% rename from ethioGrego/to_gregorian.go rename to internal/ethioGrego/to_gregorian.go diff --git a/ethioGrego_test.go b/test/ethioGrego_test.go similarity index 91% rename from ethioGrego_test.go rename to test/ethioGrego_test.go index a16a514..515c274 100755 --- a/ethioGrego_test.go +++ b/test/ethioGrego_test.go @@ -1,4 +1,4 @@ -package main +package test import ( "encoding/json" @@ -9,9 +9,8 @@ import ( "strings" "testing" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" - "github.com/cucumber/godog" + ethioGrego2 "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" ) var host = "http://localhost:8080" @@ -32,11 +31,11 @@ func TestEthiopianDate(t *testing.T) { ethiopianDate := "2015-01-18 00:00:00 +0000 UTC" gregorianDate := "2022-09-28 00:00:00 +0000 UTC" - time, err := ethioGrego.To_ethiopian(2022, 9, 28) + time, err := ethioGrego2.To_ethiopian(2022, 9, 28) if err == nil { expectedEthio = time.String() } - time, err = ethioGrego.To_gregorian(2015, 1, 18) + time, err = ethioGrego2.To_gregorian(2015, 1, 18) if err == nil { expectedGrego = time.String() } diff --git a/features/AD_to_ET.feature b/test/features/AD_to_ET.feature similarity index 100% rename from features/AD_to_ET.feature rename to test/features/AD_to_ET.feature diff --git a/features/ET_to_AD.feature b/test/features/ET_to_AD.feature similarity index 100% rename from features/ET_to_AD.feature rename to test/features/ET_to_AD.feature From e2623472bdfe4e8e1711a53d79b6aca4b8f29539 Mon Sep 17 00:00:00 2001 From: Yinebeb Tariku Date: Sun, 4 Dec 2022 18:52:42 +0000 Subject: [PATCH 11/16] Update .gitlab-ci.yml file --- .gitlab-ci.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 32cae60..d643a29 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,25 @@ +image: golang:1.19 + +.go-cache: + variables: + GOPATH: $CI_PROJECT_DIR/.go + before_script: + - mkdir -p .go + cache: + paths: + - .go/pkg/mod/ + stages: - test - + test: + extends: .go-cache stage: test - image: golang:latest + services: + - name: cockroachdb/cockroach:latest + alias: db + command: ["start-single-node", "--insecure"] + tags: + - gitlab-runner script: - - go test . \ No newline at end of file + - go test ./... \ No newline at end of file From b07b29b2490fbf90d9659dc12d2ce0f67f410942 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Thu, 12 Jan 2023 15:09:01 +0300 Subject: [PATCH 12/16] dev - gitlabcicd modified --- .gitlab-ci.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d643a29..8bb680a 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,10 +15,6 @@ stages: test: extends: .go-cache stage: test - services: - - name: cockroachdb/cockroach:latest - alias: db - command: ["start-single-node", "--insecure"] tags: - gitlab-runner script: From 2a14c3f096c76196c799dab0334f411abcee48de Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Thu, 12 Jan 2023 15:12:24 +0300 Subject: [PATCH 13/16] ci-cd file edited --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8bb680a..f1f6db9 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,7 +14,6 @@ stages: test: extends: .go-cache - stage: test tags: - gitlab-runner script: From 551ba58add50b8bd49ed609edc10de48d3dcb8ff Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Thu, 12 Jan 2023 15:25:29 +0300 Subject: [PATCH 14/16] dev - gitlabcicd modified --- .gitlab-ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f1f6db9..17bf8c0 100755 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,11 +9,9 @@ image: golang:1.19 paths: - .go/pkg/mod/ -stages: - - test - test: extends: .go-cache + stage: test tags: - gitlab-runner script: From 187124a4197cbcb4d6f9fbeb780eb966dd1f2f45 Mon Sep 17 00:00:00 2001 From: Yinebeb Tariku <12098948-Yinebeb-01@users.noreply.gitlab.com> Date: Thu, 29 Feb 2024 08:31:06 +0000 Subject: [PATCH 15/16] Goc 5 justify api naming conventions and chose one --- .gitignore | 1 + Makefile | 6 +- README.md | 84 ++++-- api/getAdFromEt.go | 57 ---- api/getEtFromAd.go | 50 ---- cmd/main.go | 45 ++- config/config.go | 23 ++ config/config.yaml | 5 + docs/docs.go | 43 +-- docs/swagger.json | 38 +-- docs/swagger.yaml | 38 +-- go.mod | 72 +++-- go.sum | 268 +++++++++--------- internal/api/date_converter.go | 98 +++++++ {api => internal/api}/home.go | 16 +- internal/assets/favicon.ico | Bin 0 -> 77283 bytes internal/assets/index.html | 113 ++++++++ internal/assets/logo.jpeg | Bin 0 -> 77283 bytes internal/assets/logo_medium.png | Bin 0 -> 23371 bytes .../{to_ethiopian.go => ethiopian.go} | 72 ++--- .../{to_gregorian.go => gregorian.go} | 44 +-- internal/ethioGrego/helper.go | 16 +- test/ethioGrego_test.go | 15 +- 23 files changed, 650 insertions(+), 454 deletions(-) create mode 100644 .gitignore delete mode 100644 api/getAdFromEt.go delete mode 100644 api/getEtFromAd.go create mode 100644 config/config.go create mode 100644 config/config.yaml create mode 100644 internal/api/date_converter.go rename {api => internal/api}/home.go (57%) create mode 100644 internal/assets/favicon.ico create mode 100644 internal/assets/index.html create mode 100644 internal/assets/logo.jpeg create mode 100644 internal/assets/logo_medium.png rename internal/ethioGrego/{to_ethiopian.go => ethiopian.go} (53%) rename internal/ethioGrego/{to_gregorian.go => gregorian.go} (61%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6750dba --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/app diff --git a/Makefile b/Makefile index 85a1bf4..c08ef44 100644 --- a/Makefile +++ b/Makefile @@ -7,4 +7,8 @@ test: run: go run ./cmd/main.go -.PHONY: swag test run \ No newline at end of file +build: + rm app + go build -o app ./cmd/main.go + +.PHONY: swag test run build \ No newline at end of file diff --git a/README.md b/README.md index 40e7c09..018631b 100755 --- a/README.md +++ b/README.md @@ -1,34 +1,76 @@ -# ethiopianDateConverter +

+logo +

+

Ethiopian Date Converter

## Description -This mini-project s used mainly to convert Ethiopian date(yy-mm-dd) into Gregorian and vise versa. -Ethiopia has its own calander, having 13 months and always have 30 days within a month. -Anybody can use this api; it has easy to use, simply by sending the date along the predefined endpoints,one can get the date as a JSON response. -* [wikipedia](https://en.wikipedia.org/wiki/Ethiopian_calendar) +The Ethiopian Date Converter API is designed to facilitate the conversion between Ethiopian dates +(in the format yy-mm-dd) and Gregorian dates. Ethiopia follows its own calendar system, which consists of 13 months, +each with 30 days. -### contents -If you are newbie to golang, this project will guide and help you on testing(BDD-with Godog), using gin webframwork and more. +### Functionality +This API allows users to: +* Convert Ethiopian dates to Gregorian dates. +* Convert Gregorian dates to Ethiopian dates. -## Installation +### Usage +To utilize the API, simply send a date using the specified endpoints. The API will respond with the converted date +in JSON format. + +#### Example Usage + +1. Convert Gregorian Date to Ethiopian Date -1. install using below go command: -```bash - go get gitlab.com/Yinebeb-01/ethiopiandateconverter +```curl +GET /ad-to-et/{date} ``` -2. import onto your project code -```bash - import "gitlab.com/Yinebeb-01/ethiopiandateconverter" +* Parameters: + + `date:` The Gregorian date to convert (in _yy-mm-dd_ format). + +**Example**: + +```curl +GET /ad-to-et/2013-09-11 ``` -## Authors and acknowledgment -- [Yinebeb T.](https://gitlab.com/Yinebeb-01/) +Response: + +```json +{ +"gregorian_date": "2021-05-22" +} +``` -- You can check the [python version](https://github.com/dimagi/ethiopian-date-converter) +2. Convert Gregorian Date to Ethiopian Date -## Documentation - Read on [pkg.go.dev](https://pkg.go.dev/gitlab.com/Yinebeb-01/ethiopiandateconverter) +```curl +GET /et-to-ad/{date} +``` -## Project status -First version | for learning purpose +* Parameters: + + `date:` The Ethiopia date to convert (in _yy-mm-dd_ format). + +**Example**: +```curl +GET /et-to-ad/2021-05-22 +``` +Response: +```json +{ +"ethiopian_date": "2013-09-11" +} +``` + +## Installation + +Install using below go command: +```bash +go get gitlab.com/Yinebeb-01/ethiopiandateconverter +``` +## Author +- [Yinebeb T.](https://github.com/Yinebeb-01/) +- [python version](https://github.com/dimagi/ethiopian-date-converter) \ No newline at end of file diff --git a/api/getAdFromEt.go b/api/getAdFromEt.go deleted file mode 100644 index 091e9e8..0000000 --- a/api/getAdFromEt.go +++ /dev/null @@ -1,57 +0,0 @@ -package api - -import ( - "errors" - "net/http" - "strconv" - "strings" - - "github.com/gin-gonic/gin" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" -) - -// Show AdToEt godoc -// @Summary Convert date -// @Description get string by date -// @Tags AdToEt -// @Accept json -// @Produce json -// @Param date path string true "date" -// @Success 200 {object} time.Time -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /ad-from-et/{date} [get] -// Ethiopian to Gregorian to handler -func GetAdFromEt(ctx *gin.Context) { - dateString, state := ctx.Params.Get("date") - if state { - dateString = strings.TrimPrefix(dateString, "date=") - } - var splitedDate = strings.Split(dateString, "-") - if len(splitedDate) > 3 { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": "not a valid date", - }) - } else { - day, _ := strconv.Atoi(splitedDate[2]) - month, _ := strconv.Atoi(splitedDate[1]) - year, _ := strconv.Atoi(splitedDate[0]) - - date, err := ethioGrego.To_gregorian(year, month, day) - if err == nil { - ctx.JSON(http.StatusOK, gin.H{ - "response": date.Format("2006-01-02"), - }) - } - if err.Error() == "not a valid date" { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": err.Error(), - }) - } else { - ctx.JSON(http.StatusInternalServerError, gin.H{ - "response": errors.New("internal server error"), - }) - } - } -} diff --git a/api/getEtFromAd.go b/api/getEtFromAd.go deleted file mode 100644 index 5bf1014..0000000 --- a/api/getEtFromAd.go +++ /dev/null @@ -1,50 +0,0 @@ -package api - -import ( - "net/http" - "strconv" - "strings" - - "github.com/gin-gonic/gin" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" -) - -// Show EtToAd godoc -// @Summary Convert date -// @Description get string by date -// @Tags EtToAd -// @Accept json -// @Produce json -// @Param date path string true "date" -// @Success 200 {object} time.Time -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /et-from-ad/{date} [get] -// Gregorian to Ethiopian handler -func GetEtFromAd(ctx *gin.Context) { - dateString, state := ctx.Params.Get("date") - if state { - dateString = strings.TrimPrefix(dateString, "date=") - } - var splitedDate = strings.Split(dateString, "-") - if len(splitedDate) > 3 { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": "not a valid date", - }) - } else { - day, _ := strconv.Atoi(splitedDate[2]) - month, _ := strconv.Atoi(splitedDate[1]) - year, _ := strconv.Atoi(splitedDate[0]) - EtDate, err := ethioGrego.To_ethiopian(year, month, day) - if err == nil { - ctx.JSON(http.StatusOK, gin.H{ - "response": EtDate.Format("2006-01-02"), - }) - } else { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": err.Error(), - }) - } - } -} diff --git a/cmd/main.go b/cmd/main.go index 79a5d3b..6ca78b3 100755 --- a/cmd/main.go +++ b/cmd/main.go @@ -6,44 +6,43 @@ package main import ( "github.com/gin-gonic/gin" + "github.com/spf13/viper" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/api" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/config" docs "gitlab.com/Yinebeb-01/ethiopiandateconverter/docs" + api2 "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/api" ) -// @title Swagger API +// @title EthioGrego // @version 1.0 -// @description This is a sample swagger server. -// @termsOfService http://swagger.io/terms/ +// @description Ethiopian to Gregorian date converter server. +// @termsOfService https://st-son.com/terms/ // @contact.name API Support -// @contact.url http://www.swagger.io/support -// @contact.email support@swagger.io +// @contact.url https://st-son.com/support +// @contact.email support@st-son.com // @license.name Apache 2.0 -// @license.url http://www.apache.org/licenses/LICENSE-2.0.html -// @host localhost:8080 -// @BasePath /api/v1 +// @license.url https://www.apache.org/licenses/LICENSE-2.0.html +// @host calendar.st-son.com +// @BasePath /v1 // @securityDefinitions.basic BasicAuth func main() { - // programmatically set swagger info - //docs.SwaggerInfo.Title = "Swagger Example API" - //docs.SwaggerInfo.Description = "This is a sample server Petstore server." - //docs.SwaggerInfo.Version = "1.0" - //docs.SwaggerInfo.Host = "petstore.swagger.io" - //docs.SwaggerInfo.BasePath = "api/v1" - //docs.SwaggerInfo.Schemes = []string{"http", "https"} + config.InitConfig("config/config.yaml") + docs.SwaggerInfo.Schemes = viper.GetStringSlice("server.schemes") + docs.SwaggerInfo.Host = viper.GetString("server.host") router := gin.Default() - docs.SwaggerInfo.BasePath = "/api/v1" - + docs.SwaggerInfo.BasePath = "/v1" + router.Static("/assets", "./internal/assets") + router.StaticFile("favicon.ico", "internal/assets/favicon.ico") v1 := router.Group(docs.SwaggerInfo.BasePath) { - v1.GET("/", api.HomePage) - v1.GET("/ad-from-et/:date", api.GetAdFromEt) - v1.GET("/et-from-ad/:date", api.GetEtFromAd) - } + v1.GET("", api2.HomePage) + v1.GET("/et-to-ad/:date", api2.Gregorian) + v1.GET("/ad-to-et/:date", api2.Ethiopian) - router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + } router.Run(":8080") } diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..2d99a8e --- /dev/null +++ b/config/config.go @@ -0,0 +1,23 @@ +package config + +import ( + "context" + "fmt" + "github.com/fsnotify/fsnotify" + "github.com/spf13/viper" + "go.uber.org/zap" + "log" +) + +func InitConfig(path string) { + viper.SetConfigFile(path) + err := viper.ReadInConfig() + if err != nil { + log.Panic(context.Background(), fmt.Sprintf("Failed to read config: %v", err)) + } + + viper.WatchConfig() + viper.OnConfigChange(func(e fsnotify.Event) { + log.Panic(context.Background(), "Config file changed:", zap.String("file", e.Name)) + }) +} diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 0000000..9ae8800 --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,5 @@ +server: + host: localhost:8080 + schemes: + - http + - https \ No newline at end of file diff --git a/docs/docs.go b/docs/docs.go index fca63ff..8c7353d 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1,5 +1,4 @@ -// Package docs GENERATED BY SWAG; DO NOT EDIT -// This file was generated by swaggo/swag +// Package docs Code generated by swaggo/swag. DO NOT EDIT package docs import "github.com/swaggo/swag" @@ -10,15 +9,15 @@ const docTemplate = `{ "info": { "description": "{{escape .Description}}", "title": "{{.Title}}", - "termsOfService": "http://swagger.io/terms/", + "termsOfService": "https://st-son.com/terms/", "contact": { "name": "API Support", - "url": "http://www.swagger.io/support", - "email": "support@swagger.io" + "url": "https://st-son.com/support", + "email": "support@st-son.com" }, "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "version": "{{.Version}}" }, @@ -27,12 +26,12 @@ const docTemplate = `{ "paths": { "/": { "get": { - "description": "Home_page", + "description": "Home Page", "produces": [ - "application/json" + "text/html" ], "tags": [ - "homepage" + "Date-Converter" ], "summary": "Home page", "responses": { @@ -58,9 +57,9 @@ const docTemplate = `{ } } }, - "/ad-from-et/{date}": { + "/ad-to-et/{date}": { "get": { - "description": "get string by date", + "description": "Get ethiopian date string from gregorian date", "consumes": [ "application/json" ], @@ -68,9 +67,9 @@ const docTemplate = `{ "application/json" ], "tags": [ - "AdToEt" + "Date-Conversion" ], - "summary": "Convert date", + "summary": "Gregorian to Ethiopian", "parameters": [ { "type": "string", @@ -102,9 +101,9 @@ const docTemplate = `{ } } }, - "/et-from-ad/{date}": { + "/et-to-ad/{date}": { "get": { - "description": "get string by date", + "description": "Get gregorian date string from ethiopian date", "consumes": [ "application/json" ], @@ -112,9 +111,9 @@ const docTemplate = `{ "application/json" ], "tags": [ - "EtToAd" + "Date-Conversion" ], - "summary": "Convert date", + "summary": "Ethiopian to Gregorian", "parameters": [ { "type": "string", @@ -157,13 +156,15 @@ const docTemplate = `{ // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ Version: "1.0", - Host: "localhost:8080", - BasePath: "/api/v1", + Host: "calendar.st-son.com", + BasePath: "/v1", Schemes: []string{}, - Title: "Swagger API", - Description: "This is a sample swagger server.", + Title: "EthioGrego", + Description: "Ethiopian to Gregorian date converter server.", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", } func init() { diff --git a/docs/swagger.json b/docs/swagger.json index 2aa4bc6..b3e7455 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1,31 +1,31 @@ { "swagger": "2.0", "info": { - "description": "This is a sample swagger server.", - "title": "Swagger API", - "termsOfService": "http://swagger.io/terms/", + "description": "Ethiopian to Gregorian date converter server.", + "title": "EthioGrego", + "termsOfService": "https://st-son.com/terms/", "contact": { "name": "API Support", - "url": "http://www.swagger.io/support", - "email": "support@swagger.io" + "url": "https://st-son.com/support", + "email": "support@st-son.com" }, "license": { "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "version": "1.0" }, - "host": "localhost:8080", - "basePath": "/api/v1", + "host": "calendar.st-son.com", + "basePath": "/v1", "paths": { "/": { "get": { - "description": "Home_page", + "description": "Home Page", "produces": [ - "application/json" + "text/html" ], "tags": [ - "homepage" + "Date-Converter" ], "summary": "Home page", "responses": { @@ -51,9 +51,9 @@ } } }, - "/ad-from-et/{date}": { + "/ad-to-et/{date}": { "get": { - "description": "get string by date", + "description": "Get ethiopian date string from gregorian date", "consumes": [ "application/json" ], @@ -61,9 +61,9 @@ "application/json" ], "tags": [ - "AdToEt" + "Date-Conversion" ], - "summary": "Convert date", + "summary": "Gregorian to Ethiopian", "parameters": [ { "type": "string", @@ -95,9 +95,9 @@ } } }, - "/et-from-ad/{date}": { + "/et-to-ad/{date}": { "get": { - "description": "get string by date", + "description": "Get gregorian date string from ethiopian date", "consumes": [ "application/json" ], @@ -105,9 +105,9 @@ "application/json" ], "tags": [ - "EtToAd" + "Date-Conversion" ], - "summary": "Convert date", + "summary": "Ethiopian to Gregorian", "parameters": [ { "type": "string", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index b1c6b49..6384b66 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,23 +1,23 @@ -basePath: /api/v1 -host: localhost:8080 +basePath: /v1 +host: calendar.st-son.com info: contact: - email: support@swagger.io + email: support@st-son.com name: API Support - url: http://www.swagger.io/support - description: This is a sample swagger server. + url: https://st-son.com/support + description: Ethiopian to Gregorian date converter server. license: name: Apache 2.0 - url: http://www.apache.org/licenses/LICENSE-2.0.html - termsOfService: http://swagger.io/terms/ - title: Swagger API + url: https://www.apache.org/licenses/LICENSE-2.0.html + termsOfService: https://st-son.com/terms/ + title: EthioGrego version: "1.0" paths: /: get: - description: Home_page + description: Home Page produces: - - application/json + - text/html responses: "200": description: OK @@ -35,12 +35,12 @@ paths: schema: {} summary: Home page tags: - - homepage - /ad-from-et/{date}: + - Date-Converter + /ad-to-et/{date}: get: consumes: - application/json - description: get string by date + description: Get ethiopian date string from gregorian date parameters: - description: date in: path @@ -63,14 +63,14 @@ paths: "500": description: Internal Server Error schema: {} - summary: Convert date + summary: Gregorian to Ethiopian tags: - - AdToEt - /et-from-ad/{date}: + - Date-Conversion + /et-to-ad/{date}: get: consumes: - application/json - description: get string by date + description: Get gregorian date string from ethiopian date parameters: - description: date in: path @@ -93,9 +93,9 @@ paths: "500": description: Internal Server Error schema: {} - summary: Convert date + summary: Ethiopian to Gregorian tags: - - EtToAd + - Date-Conversion securityDefinitions: BasicAuth: type: basic diff --git a/go.mod b/go.mod index edd47d7..6f5a924 100755 --- a/go.mod +++ b/go.mod @@ -4,47 +4,67 @@ go 1.19 require ( github.com/cucumber/godog v0.12.5 - github.com/gin-gonic/gin v1.8.1 + github.com/fsnotify/fsnotify v1.7.0 + github.com/gin-gonic/gin v1.9.1 + github.com/spf13/viper v1.18.2 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.3 + go.uber.org/zap v1.21.0 ) require ( github.com/KyleBanks/depth v1.2.1 // indirect - github.com/PuerkitoBio/purell v1.2.0 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/bytedance/sonic v1.11.1 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect + github.com/chenzhuoyu/iasm v0.9.1 // indirect github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect github.com/cucumber/messages-go/v16 v16.0.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/spec v0.20.7 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-playground/locales v0.14.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.11.1 // indirect - github.com/goccy/go-json v0.9.11 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/swag v0.22.9 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.18.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect - github.com/hashicorp/go-immutable-radix v1.3.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-memdb v1.3.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/leodido/go-urn v1.2.1 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a // indirect - github.com/swaggo/gin-swagger v1.5.3 // indirect - github.com/swaggo/swag v1.8.7 // indirect - github.com/ugorji/go/codec v1.2.7 // indirect - golang.org/x/crypto v0.1.0 // indirect - golang.org/x/net v0.1.0 // indirect - golang.org/x/sys v0.1.0 // indirect - golang.org/x/text v0.4.0 // indirect - golang.org/x/tools v0.2.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/arch v0.7.0 // indirect + golang.org/x/crypto v0.20.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.18.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 947a0be..c8e720f 100755 --- a/go.sum +++ b/go.sum @@ -16,31 +16,36 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.2.0 h1:/Jdm5QfyM8zdlqT6WVZU4cfP23sot6CEHA4CS49Ezig= -github.com/PuerkitoBio/purell v1.2.0/go.mod h1:OhLRTaaIzhvIyofkJfB24gokC7tM42Px5UhoT32THBk= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= +github.com/bytedance/sonic v1.11.1 h1:JC0+6c9FoWYYxakaoa+c5QTtJeiSZNeByOBhXtAFSn4= +github.com/bytedance/sonic v1.11.1/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= +github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE= github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= github.com/cucumber/godog v0.12.5 h1:FZIy6VCfMbmGHts9qd6UjBMT9abctws/pQYO/ZcwOVs= @@ -49,50 +54,45 @@ github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK3 github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY= github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI= -github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= +github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U= +github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -105,13 +105,11 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -130,8 +128,9 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE= github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.0 h1:xdXq34gBOMEloa9rlGStLxmfX/dyIK8htOv36dQUwHU= github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -148,6 +147,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -166,30 +166,29 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -200,6 +199,8 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -207,24 +208,16 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -237,11 +230,13 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -250,63 +245,87 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a h1:kAe4YSu0O0UFn1DowNo2MY5p6xzqtJ/wQ7LZynSvGaY= -github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= -github.com/swaggo/gin-swagger v1.5.3 h1:8mWmHLolIbrhJJTflsaFoZzRBYVmEE7JZGIq08EiC0Q= -github.com/swaggo/gin-swagger v1.5.3/go.mod h1:3XJKSfHjDMB5dBo/0rrTXidPmgLeqsX89Yp4uA50HpI= -github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ= -github.com/swaggo/swag v1.8.7 h1:2K9ivTD3teEO+2fXV6zrZKDqk5IuU2aJtBDo8U7omWU= -github.com/swaggo/swag v1.8.7/go.mod h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= +github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= +github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= +github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= +golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -321,6 +340,8 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -336,14 +357,11 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -353,6 +371,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -367,29 +386,26 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -410,14 +426,12 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -440,31 +454,25 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -472,4 +480,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/api/date_converter.go b/internal/api/date_converter.go new file mode 100644 index 0000000..2a62cef --- /dev/null +++ b/internal/api/date_converter.go @@ -0,0 +1,98 @@ +package api + +import ( + "errors" + "net/http" + "strconv" + "strings" + + "github.com/gin-gonic/gin" + "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" +) + +// Ethiopian : Gregorian to Ethiopian date converter +// @Summary Gregorian to Ethiopian +// @Description Get ethiopian date string from gregorian date +// @Tags Date-Conversion +// @Accept json +// @Produce json +// @Param date path string true "date" +// @Success 200 {object} time.Time +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /ad-to-et/{date} [get] +func Ethiopian(ctx *gin.Context) { + dateString, state := ctx.Params.Get("date") + if state { + dateString = strings.TrimPrefix(dateString, "date=") + } + var date = strings.Split(dateString, "-") + if len(date) > 3 { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": "not a valid date", + }) + return + } + + day, _ := strconv.Atoi(date[2]) + month, _ := strconv.Atoi(date[1]) + year, _ := strconv.Atoi(date[0]) + EtDate, err := ethioGrego.Ethiopian(year, month, day) + if err != nil { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": err.Error(), + }) + return + } + ctx.JSON(http.StatusOK, gin.H{ + "ethiopian_date": EtDate.Format("2006-01-02"), + }) +} + +// Gregorian : Ethiopian to Gregorian date converter +// @Summary Ethiopian to Gregorian +// @Description Get gregorian date string from ethiopian date +// @Tags Date-Conversion +// @Accept json +// @Produce json +// @Param date path string true "date" +// @Success 200 {object} time.Time +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /et-to-ad/{date} [get] +func Gregorian(ctx *gin.Context) { + dateString, state := ctx.Params.Get("date") + if state { + dateString = strings.TrimPrefix(dateString, "date=") + } + var date = strings.Split(dateString, "-") + if len(date) > 3 { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": "not a valid date", + }) + return + } + + day, _ := strconv.Atoi(date[2]) + month, _ := strconv.Atoi(date[1]) + year, _ := strconv.Atoi(date[0]) + + resDate, err := ethioGrego.Gregorian(year, month, day) + if err != nil { + if err.Error() == "not a valid date" { + ctx.JSON(http.StatusBadRequest, gin.H{ + "response": err.Error(), + }) + } else { + ctx.JSON(http.StatusInternalServerError, gin.H{ + "response": errors.New("internal server error"), + }) + } + return + } + ctx.JSON(http.StatusOK, gin.H{ + "gregorian_date": resDate.Format("2006-01-02"), + }) +} diff --git a/api/home.go b/internal/api/home.go similarity index 57% rename from api/home.go rename to internal/api/home.go index 47cbdbd..e4bc188 100644 --- a/api/home.go +++ b/internal/api/home.go @@ -2,21 +2,19 @@ package api import ( "github.com/gin-gonic/gin" - "net/http" ) -// Show Homepage godoc -// @Summary Home page -// @Description Home_page -// @Tags homepage -// @Produce json +// HomePage : root path +// @Summary Home page +// @Description Home Page +// @Tags Date-Converter +// @Produce html // @Success 200 {object} map[string]any // @Failure 400 {object} error // @Failure 404 {object} error // @Failure 500 {object} error // @Router / [get] func HomePage(ctx *gin.Context) { - ctx.JSON(http.StatusOK, gin.H{ - "Message": "EthioGrego Server", - }) + ctx.Header("Content-Type", "text/html") + ctx.File("internal/assets/index.html") } diff --git a/internal/assets/favicon.ico b/internal/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..43be365756eb0fb33d3fb89973b85d68f5eea26a GIT binary patch literal 77283 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 + + + + + EthioGrego API Documentation + + + +
+ +

EthioGrego API Documentation

+

Ethiopian to Gregorian date converter server.

+

Contact: support@st-son.com

+

License: Apache 2.0

+

Terms of Service: https://st-son.com/terms/

+ +

API Endpoints

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
PathMethodDescriptionTags
/v1GETHome PageDate-Converter
/v1/ad-to-et/{date}GETGet Ethiopian date string from Gregorian dateDate-Conversion
/v1/et-to-ad/{date}GETGet Gregorian date string from Ethiopian dateDate-Conversion
+ +

Documentation

+ +

pkg.go.dev

+ +
+ + diff --git a/internal/assets/logo.jpeg b/internal/assets/logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..43be365756eb0fb33d3fb89973b85d68f5eea26a GIT binary patch literal 77283 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 literal 0 HcmV?d00001 diff --git a/internal/ethioGrego/to_ethiopian.go b/internal/ethioGrego/ethiopian.go similarity index 53% rename from internal/ethioGrego/to_ethiopian.go rename to internal/ethioGrego/ethiopian.go index acf72db..f9f8f84 100755 --- a/internal/ethioGrego/to_ethiopian.go +++ b/internal/ethioGrego/ethiopian.go @@ -7,10 +7,10 @@ import ( "time" ) -// Ethiopian date string representation of provided Gregorian date -func To_ethiopian(year, month, date int) (time.Time, error) { - var tahissas int - var ethiopian_date int +// Ethiopian return date string representation of provided Gregorian date +func Ethiopian(year, month, date int) (time.Time, error) { + var december int + var ethiopianDate int var dateResult string if !isValid(year, month, date) { @@ -25,77 +25,77 @@ func To_ethiopian(year, month, date int) (time.Time, error) { // Number of days in gregorian months starting with January (index 1) // Index 0 is reserved for leap years switches. - gregorian_months := []int{0, 31, 28, 31, 30, 31, 30, + gregorianMonths := []int{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} - ethiopian_months := []int{0, 30, 30, 30, 30, 30, 30, 30, + ethiopianMonths := []int{0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 5, 30, 30, 30, 30} // if gregorian leap year, February has 29 days. if (year%4 == 0 && year%100 != 0) || year%400 == 0 { - gregorian_months[2] = 29 + gregorianMonths[2] = 29 } // September sees 8y difference - ethiopian_year := year - 8 + ethiopianYear := year - 8 // if ethiopian leap year pagumain has 6 days - if ethiopian_year%4 == 3 { - ethiopian_months[10] = 6 + if ethiopianYear%4 == 3 { + ethiopianMonths[10] = 6 } else { - ethiopian_months[10] = 5 + ethiopianMonths[10] = 5 } // Ethiopian new year in Gregorian calendar - new_year_day := start_day_of_ethiopian(year - 8) + newYearDay := startDayOfEthiopian(year - 8) // calculate number of days up to that date until := 0 for i := 1; i < month; i++ { - until += gregorian_months[i] + until += gregorianMonths[i] } until += date - // # update tahissas (december) to match january 1st - if ethiopian_year%4 == 0 { - tahissas = 26 + // # update december (december) to match january 1st + if ethiopianYear%4 == 0 { + december = 26 } else { - tahissas = 25 + december = 25 } // take into account the 1582 change if year < 1582 { - ethiopian_months[1] = 0 - ethiopian_months[2] = tahissas + ethiopianMonths[1] = 0 + ethiopianMonths[2] = december } else if until <= 277 && year == 1582 { - ethiopian_months[1] = 0 - ethiopian_months[2] = tahissas + ethiopianMonths[1] = 0 + ethiopianMonths[2] = december } else { - tahissas = new_year_day - 3 - ethiopian_months[1] = tahissas + december = newYearDay - 3 + ethiopianMonths[1] = december } - // calculate month and date incremently + // calculate month and date incrementally m := 0 - for m = range ethiopian_months { - if until <= ethiopian_months[m] { - if m == 1 || ethiopian_months[m] == 0 { - ethiopian_date = until + (30 - tahissas) + for m = range ethiopianMonths { + if until <= ethiopianMonths[m] { + if m == 1 || ethiopianMonths[m] == 0 { + ethiopianDate = until + (30 - december) } else { - ethiopian_date = until + ethiopianDate = until } break } else { - until -= ethiopian_months[m] + until -= ethiopianMonths[m] } } // if m > 4, we're already on next Ethiopian year if m > 10 { - ethiopian_year += 1 + ethiopianYear += 1 } // Ethiopian months ordered according to Gregorian order := []int{0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 2, 3, 4} - ethiopian_month := order[m] + ethiopianMonth := order[m] - da := strconv.Itoa(ethiopian_date) - mon := strconv.Itoa(ethiopian_month) + da := strconv.Itoa(ethiopianDate) + mon := strconv.Itoa(ethiopianMonth) if len(da) == 1 { da = "0" + da } @@ -103,10 +103,10 @@ func To_ethiopian(year, month, date int) (time.Time, error) { mon = "0" + mon } - dateResult = strconv.Itoa(ethiopian_year) + "-" + mon + "-" + da + dateResult = strconv.Itoa(ethiopianYear) + "-" + mon + "-" + da res, err := time.Parse("2006-01-02", dateResult) if err != nil { - fmt.Print("unabe to parse dateResult.", err) //for debugging purpose + fmt.Print("unable to parse dateResult", err) return time.Time{}, errors.New("not a valid date") } return res, nil diff --git a/internal/ethioGrego/to_gregorian.go b/internal/ethioGrego/gregorian.go similarity index 61% rename from internal/ethioGrego/to_gregorian.go rename to internal/ethioGrego/gregorian.go index 48a9891..0f35639 100755 --- a/internal/ethioGrego/to_gregorian.go +++ b/internal/ethioGrego/gregorian.go @@ -8,36 +8,37 @@ import ( ) // Gregorian date object representation of provided Ethiopian date -func To_gregorian(year, month, date int) (time.Time, error) { - var gregorian_date int +func Gregorian(year, month, date int) (time.Time, error) { + var gregorianDate int var dateResult string if !isValid(year, month, date) { return time.Time{}, errors.New("not a valid date") } // Ethiopian new year in Gregorian calendar - new_year_day := start_day_of_ethiopian(year) + newYearDay := startDayOfEthiopian(year) // September (Ethiopian) sees 7y difference - gregorian_year := year + 7 + gregorianYear := year + 7 // Number of days in gregorian months starting with September (index 1) // Index 0 is reserved for leap years switches. - gregorian_months := []int{0, 30, 31, 30, 31, 31, 28, + gregorianMonths := []int{0, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30} //if next gregorian year is leap year, February has 29 days. - next_year := gregorian_year + 1 - if (next_year%4 == 0 && next_year%100 != 0) || next_year%400 == 0 { - gregorian_months[6] = 29 + nextYear := gregorianYear + 1 + if (nextYear%4 == 0 && nextYear%100 != 0) || nextYear%400 == 0 { + gregorianMonths[6] = 29 } + // calculate number of days up to that date until := ((month - 1) * 30) + date if until <= 37 && year <= 1575 { //mysterious rule until += 28 - gregorian_months[0] = 31 + gregorianMonths[0] = 31 } else { - until += new_year_day - 1 + until += newYearDay - 1 } // if ethiopian year is leap year, paguemain has six days @@ -45,28 +46,28 @@ func To_gregorian(year, month, date int) (time.Time, error) { until += 1 } - //calculate month and date incremently + //calculate month and date incrementally m := 0 - for i := range gregorian_months { - if until <= gregorian_months[i] { + for i := range gregorianMonths { + if until <= gregorianMonths[i] { m = i - gregorian_date = until + gregorianDate = until break } else { m = i - until -= gregorian_months[i] + until -= gregorianMonths[i] } } // if m > 4, we're already on next Gregorian year if m > 4 { - gregorian_year += 1 + gregorianYear += 1 } // Gregorian months ordered according to Ethiopian order := []int{8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9} - gregorian_month := order[m] + gregorianMonth := order[m] - da := strconv.Itoa(gregorian_date) - mon := strconv.Itoa(gregorian_month) + da := strconv.Itoa(gregorianDate) + mon := strconv.Itoa(gregorianMonth) if len(da) == 1 { da = "0" + da } @@ -74,12 +75,11 @@ func To_gregorian(year, month, date int) (time.Time, error) { mon = "0" + mon } - dateResult = "" + strconv.Itoa(gregorian_year) + "-" + mon + "-" + da + dateResult = "" + strconv.Itoa(gregorianYear) + "-" + mon + "-" + da res, err := time.Parse("2006-01-02", dateResult) if err != nil { - fmt.Print("unabe to parse dateResult.", err) + fmt.Print("unable to parse dateResult", err) return time.Time{}, errors.New("not a valid date") - } return res, nil } diff --git a/internal/ethioGrego/helper.go b/internal/ethioGrego/helper.go index 1502751..c6c630f 100755 --- a/internal/ethioGrego/helper.go +++ b/internal/ethioGrego/helper.go @@ -1,22 +1,16 @@ package ethioGrego -type response struct { - msg string -} - -// returns first day of that Ethiopian year -func start_day_of_ethiopian(year int) int { +func startDayOfEthiopian(year int) int { //magic formula gives start of year - new_year_day := (year / 100) - (year / 400) - 4 + newYearDay := (year / 100) - (year / 400) - 4 - //if the prev ethiopian year is a leap year, new-year occrus on 12th + // if the prev ethiopian year is a leap year, new-year occurs on 12th if (year-1)%4 == 3 { - new_year_day += 1 + newYearDay += 1 } - return new_year_day + return newYearDay } -// prevent incorect input func isValid(year, month, date int) bool { inputs := []int{year, month, date} for i := range inputs { diff --git a/test/ethioGrego_test.go b/test/ethioGrego_test.go index 515c274..e5e5043 100755 --- a/test/ethioGrego_test.go +++ b/test/ethioGrego_test.go @@ -3,6 +3,7 @@ package test import ( "encoding/json" "fmt" + "github.com/spf13/viper" "io/ioutil" "net/http" "reflect" @@ -13,16 +14,11 @@ import ( ethioGrego2 "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" ) -var host = "http://localhost:8080" - var res *http.Response type response struct { Msg string `json:"response"` } -type notFound struct { - Msg string -} var expectedEthio, expectedGrego string @@ -31,11 +27,11 @@ func TestEthiopianDate(t *testing.T) { ethiopianDate := "2015-01-18 00:00:00 +0000 UTC" gregorianDate := "2022-09-28 00:00:00 +0000 UTC" - time, err := ethioGrego2.To_ethiopian(2022, 9, 28) + time, err := ethioGrego2.Ethiopian(2022, 9, 28) if err == nil { expectedEthio = time.String() } - time, err = ethioGrego2.To_gregorian(2015, 1, 18) + time, err = ethioGrego2.Gregorian(2015, 1, 18) if err == nil { expectedGrego = time.String() } @@ -44,12 +40,11 @@ func TestEthiopianDate(t *testing.T) { } } -//feature file steps definition- BDD - +// feature file steps definition // sending a request func aRequestIsSentToTheEndpoint(method, endpoint string) error { var reader = strings.NewReader("") - var request, err = http.NewRequest(method, host+endpoint, reader) + var request, err = http.NewRequest(method, viper.GetString("server.host")+endpoint, reader) if err != nil { return fmt.Errorf("could not create request %s", err.Error()) } From e15b513f6d05131a9cb7d9b3b5d6c7ee3f1b69b6 Mon Sep 17 00:00:00 2001 From: Yinebeb-01 Date: Thu, 29 Feb 2024 12:18:53 +0300 Subject: [PATCH 16/16] conflict resolved --- api/getAdFromEt.go | 56 ---------------------------------- api/getEtFromAd.go | 49 ----------------------------- api/home.go | 23 -------------- cmd/main.go | 12 ++++---- internal/api/date_converter.go | 2 +- test/ethioGrego_test.go | 6 ++-- 6 files changed, 10 insertions(+), 138 deletions(-) delete mode 100644 api/getAdFromEt.go delete mode 100644 api/getEtFromAd.go delete mode 100644 api/home.go diff --git a/api/getAdFromEt.go b/api/getAdFromEt.go deleted file mode 100644 index 67b4b3a..0000000 --- a/api/getAdFromEt.go +++ /dev/null @@ -1,56 +0,0 @@ -package api - -import ( - "errors" - "github.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" - "github.com/gin-gonic/gin" - "net/http" - "strconv" - "strings" -) - -// Show AdToEt godoc -// @Summary Convert date -// @Description get string by date -// @Tags AdToEt -// @Accept json -// @Produce json -// @Param date path string true "date" -// @Success 200 {object} time.Time -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /ad-from-et/{date} [get] -// Ethiopian to Gregorian to handler -func GetAdFromEt(ctx *gin.Context) { - dateString, state := ctx.Params.Get("date") - if state { - dateString = strings.TrimPrefix(dateString, "date=") - } - var splitDate = strings.Split(dateString, "-") - if len(splitDate) > 3 { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": "not a valid date", - }) - } else { - day, _ := strconv.Atoi(splitDate[2]) - month, _ := strconv.Atoi(splitDate[1]) - year, _ := strconv.Atoi(splitDate[0]) - - date, err := ethioGrego.ToGregorian(year, month, day) - if err == nil { - ctx.JSON(http.StatusOK, gin.H{ - "response": date.Format("2006-01-02"), - }) - } - if err.Error() == "not a valid date" { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": err.Error(), - }) - } else { - ctx.JSON(http.StatusInternalServerError, gin.H{ - "response": errors.New("internal server error"), - }) - } - } -} diff --git a/api/getEtFromAd.go b/api/getEtFromAd.go deleted file mode 100644 index 6af3576..0000000 --- a/api/getEtFromAd.go +++ /dev/null @@ -1,49 +0,0 @@ -package api - -import ( - "github.com/Yinebeb-01/ethiopiandateconverter/ethioGrego" - "github.com/gin-gonic/gin" - "net/http" - "strconv" - "strings" -) - -// Show EtToAd godoc -// @Summary Convert date -// @Description get string by date -// @Tags EtToAd -// @Accept json -// @Produce json -// @Param date path string true "date" -// @Success 200 {object} time.Time -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /et-from-ad/{date} [get] -// Gregorian to Ethiopian handler -func GetEtFromAd(ctx *gin.Context) { - dateString, state := ctx.Params.Get("date") - if state { - dateString = strings.TrimPrefix(dateString, "date=") - } - var splitDate = strings.Split(dateString, "-") - if len(splitDate) > 3 { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": "not a valid date", - }) - } else { - day, _ := strconv.Atoi(splitDate[2]) - month, _ := strconv.Atoi(splitDate[1]) - year, _ := strconv.Atoi(splitDate[0]) - EtDate, err := ethioGrego.ToEthiopian(year, month, day) - if err == nil { - ctx.JSON(http.StatusOK, gin.H{ - "response": EtDate.Format("2006-01-02"), - }) - } else { - ctx.JSON(http.StatusBadRequest, gin.H{ - "response": err.Error(), - }) - } - } -} diff --git a/api/home.go b/api/home.go deleted file mode 100644 index b45e3a6..0000000 --- a/api/home.go +++ /dev/null @@ -1,23 +0,0 @@ -package api - -import ( - "github.com/gin-gonic/gin" - "net/http" -) - -// Show Homepage godoc -// @Summary Home page -// @Description Home_page -// @Tags homepage -// @Accept json -// @Produce json -// @Success 200 {object} json -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router / [get] -func HomePage(ctx *gin.Context) { - ctx.JSON(http.StatusOK, gin.H{ - "Message": "EthioGrego Server", - }) -} diff --git a/cmd/main.go b/cmd/main.go index 6ca78b3..135ca28 100755 --- a/cmd/main.go +++ b/cmd/main.go @@ -5,13 +5,13 @@ Copyright (c) 2022 Yinebeb Tariku package main import ( + "github.com/Yinebeb-01/ethiopiandateconverter/config" + "github.com/Yinebeb-01/ethiopiandateconverter/docs" + "github.com/Yinebeb-01/ethiopiandateconverter/internal/api" "github.com/gin-gonic/gin" "github.com/spf13/viper" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/config" - docs "gitlab.com/Yinebeb-01/ethiopiandateconverter/docs" - api2 "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/api" ) // @title EthioGrego @@ -37,9 +37,9 @@ func main() { router.StaticFile("favicon.ico", "internal/assets/favicon.ico") v1 := router.Group(docs.SwaggerInfo.BasePath) { - v1.GET("", api2.HomePage) - v1.GET("/et-to-ad/:date", api2.Gregorian) - v1.GET("/ad-to-et/:date", api2.Ethiopian) + v1.GET("", api.HomePage) + v1.GET("/et-to-ad/:date", api.Gregorian) + v1.GET("/ad-to-et/:date", api.Ethiopian) router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) } diff --git a/internal/api/date_converter.go b/internal/api/date_converter.go index 2a62cef..b2c07fb 100644 --- a/internal/api/date_converter.go +++ b/internal/api/date_converter.go @@ -6,8 +6,8 @@ import ( "strconv" "strings" + "github.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" "github.com/gin-gonic/gin" - "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" ) // Ethiopian : Gregorian to Ethiopian date converter diff --git a/test/ethioGrego_test.go b/test/ethioGrego_test.go index e5e5043..87ffe9d 100755 --- a/test/ethioGrego_test.go +++ b/test/ethioGrego_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" + "github.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" "github.com/cucumber/godog" - ethioGrego2 "gitlab.com/Yinebeb-01/ethiopiandateconverter/internal/ethioGrego" ) var res *http.Response @@ -27,11 +27,11 @@ func TestEthiopianDate(t *testing.T) { ethiopianDate := "2015-01-18 00:00:00 +0000 UTC" gregorianDate := "2022-09-28 00:00:00 +0000 UTC" - time, err := ethioGrego2.Ethiopian(2022, 9, 28) + time, err := ethioGrego.Ethiopian(2022, 9, 28) if err == nil { expectedEthio = time.String() } - time, err = ethioGrego2.Gregorian(2015, 1, 18) + time, err = ethioGrego.Gregorian(2015, 1, 18) if err == nil { expectedGrego = time.String() }