forked from ebhomengo/niki
1
0
Fork 0

fix: rebase

This commit is contained in:
alikafy 2024-06-14 12:11:36 +03:30 committed by hossein
parent 620db23582
commit 4185ef594b
118 changed files with 654 additions and 624 deletions

View File

@ -16,7 +16,7 @@ import (
// @Param Request body adminserviceparam.LoginWithPhoneNumberRequest true "Admin login request body" // @Param Request body adminserviceparam.LoginWithPhoneNumberRequest true "Admin login request body"
// @Success 200 {object} adminserviceparam.LoginWithPhoneNumberResponse // @Success 200 {object} adminserviceparam.LoginWithPhoneNumberResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Router /admins/login-by-phone [post] // @Router /admins/login-by-phone [post].
func (h Handler) LoginByPhoneNumber(c echo.Context) error { func (h Handler) LoginByPhoneNumber(c echo.Context) error {
var req adminserviceparam.LoginWithPhoneNumberRequest var req adminserviceparam.LoginWithPhoneNumberRequest

View File

@ -17,7 +17,7 @@ import (
// @Success 200 {object} adminserviceparam.RegisterResponse // @Success 200 {object} adminserviceparam.RegisterResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerAdmin // @Security AuthBearerAdmin
// @Router /admins/register [post] // @Router /admins/register [post].
func (h Handler) Register(c echo.Context) error { func (h Handler) Register(c echo.Context) error {
var req adminserviceparam.RegisterRequest var req adminserviceparam.RegisterRequest

View File

@ -20,7 +20,7 @@ import (
// @Success 200 {object} param.KindBoxReqAcceptResponse // @Success 200 {object} param.KindBoxReqAcceptResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerAdmin // @Security AuthBearerAdmin
// @Router /admin/kindboxreqs/accept-kind-box-req/{id} [patch] // @Router /admin/kindboxreqs/accept-kind-box-req/{id} [patch].
func (h Handler) Accept(c echo.Context) error { func (h Handler) Accept(c echo.Context) error {
var req param.KindBoxReqAcceptRequest var req param.KindBoxReqAcceptRequest
if bErr := c.Bind(&req); bErr != nil { if bErr := c.Bind(&req); bErr != nil {

View File

@ -20,7 +20,7 @@ import (
// @Success 200 {object} param.AssignSenderResponse // @Success 200 {object} param.AssignSenderResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerAdmin // @Security AuthBearerAdmin
// @Router /admin/kindboxreqs/assign-sender-agent/{id} [patch] // @Router /admin/kindboxreqs/assign-sender-agent/{id} [patch].
func (h Handler) AssignSenderAgent(c echo.Context) error { func (h Handler) AssignSenderAgent(c echo.Context) error {
var req param.AssignSenderRequest var req param.AssignSenderRequest

View File

@ -19,7 +19,7 @@ import (
// @Success 200 {object} param.DeliverKindBoxReqResponse // @Success 200 {object} param.DeliverKindBoxReqResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerAdmin // @Security AuthBearerAdmin
// @Router /admin/kindboxreqs/deliver-kind-box-req/{id} [patch] // @Router /admin/kindboxreqs/deliver-kind-box-req/{id} [patch].
func (h Handler) Deliver(c echo.Context) error { func (h Handler) Deliver(c echo.Context) error {
var req param.DeliverKindBoxReqRequest var req param.DeliverKindBoxReqRequest

View File

@ -17,7 +17,7 @@ import (
// @Success 200 {object} param.KindBoxReqGetAllResponse // @Success 200 {object} param.KindBoxReqGetAllResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerAdmin // @Security AuthBearerAdmin
// @Router /admin/kindboxreqs [get] // @Router /admin/kindboxreqs [get].
func (h Handler) GetAll(c echo.Context) error { func (h Handler) GetAll(c echo.Context) error {
var req param.KindBoxReqGetAllRequest var req param.KindBoxReqGetAllRequest
if bErr := c.Bind(&req); bErr != nil { if bErr := c.Bind(&req); bErr != nil {

View File

@ -20,7 +20,7 @@ import (
// @Success 200 {object} param.KindBoxReqRejectResponse // @Success 200 {object} param.KindBoxReqRejectResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerAdmin // @Security AuthBearerAdmin
// @Router /admin/kindboxreqs/reject-kind-box-req/{id} [patch] // @Router /admin/kindboxreqs/reject-kind-box-req/{id} [patch].
func (h Handler) Reject(c echo.Context) error { func (h Handler) Reject(c echo.Context) error {
var req param.KindBoxReqRejectRequest var req param.KindBoxReqRejectRequest
if bErr := c.Bind(&req); bErr != nil { if bErr := c.Bind(&req); bErr != nil {

View File

@ -10,6 +10,7 @@ func (h Handler) SetRoutes(e *echo.Echo) {
r := e.Group("/admin/kindboxreqs") r := e.Group("/admin/kindboxreqs")
r.Use(middleware.Auth(h.authSvc, h.authConfig)) r.Use(middleware.Auth(h.authSvc, h.authConfig))
r.POST("", h.AddKindBoxReq, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqAddPermission))
r.PATCH("/accept-kind-box-req/:id", h.Accept, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqAcceptPermission)) r.PATCH("/accept-kind-box-req/:id", h.Accept, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqAcceptPermission))
r.PATCH("/reject-kind-box-req/:id", h.Reject, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqRejectPermission)) r.PATCH("/reject-kind-box-req/:id", h.Reject, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqRejectPermission))
r.PATCH("/deliver-kind-box-req/:id", h.Deliver, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqDeliverPermission)) r.PATCH("/deliver-kind-box-req/:id", h.Deliver, middleware.AdminAuthorization(h.adminAuthorizeSvc, entity.AdminKindBoxReqDeliverPermission))

View File

@ -19,7 +19,7 @@ import (
// @Success 201 {object} param.BenefactorAddAddressResponse // @Success 201 {object} param.BenefactorAddAddressResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerBenefactor // @Security AuthBearerBenefactor
// @Router /address/ [post] // @Router /address/ [post].
func (h Handler) AddAddress(c echo.Context) error { func (h Handler) AddAddress(c echo.Context) error {
req := param.BenefactorAddAddressRequest{} req := param.BenefactorAddAddressRequest{}
if bErr := c.Bind(&req); bErr != nil { if bErr := c.Bind(&req); bErr != nil {

View File

@ -18,7 +18,7 @@ import (
// @Success 200 {object} param.GetAddressResponse // @Success 200 {object} param.GetAddressResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerBenefactor // @Security AuthBearerBenefactor
// @Router /address/{id} [get] // @Router /address/{id} [get].
func (h Handler) GetAddress(c echo.Context) error { func (h Handler) GetAddress(c echo.Context) error {
var req param.GetAddressRequest var req param.GetAddressRequest
if bErr := echo.PathParamsBinder(c).Uint("id", &req.AddressID).BindError(); bErr != nil { if bErr := echo.PathParamsBinder(c).Uint("id", &req.AddressID).BindError(); bErr != nil {

View File

@ -17,7 +17,7 @@ import (
// @Success 200 {object} param.GetAllAddressesResponse // @Success 200 {object} param.GetAllAddressesResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerBenefactor // @Security AuthBearerBenefactor
// @Router /address/ [get] // @Router /address/ [get].
func (h Handler) GetAddresses(c echo.Context) error { func (h Handler) GetAddresses(c echo.Context) error {
var req param.GetAllAddressesRequest var req param.GetAllAddressesRequest

View File

@ -15,7 +15,7 @@ import (
// @Produce json // @Produce json
// @Success 200 {object} addressparam.GetAllCitiesResponse // @Success 200 {object} addressparam.GetAllCitiesResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Router /address/cities [get] // @Router /address/cities [get].
func (h Handler) GetAllCities(c echo.Context) error { func (h Handler) GetAllCities(c echo.Context) error {
var req addressparam.GetAllCitiesRequest var req addressparam.GetAllCitiesRequest

View File

@ -15,7 +15,7 @@ import (
// @Produce json // @Produce json
// @Success 200 {object} addressparam.GetAllProvincesResponse // @Success 200 {object} addressparam.GetAllProvincesResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Router /address/provinces [get] // @Router /address/provinces [get].
func (h Handler) GetAllProvinces(c echo.Context) error { func (h Handler) GetAllProvinces(c echo.Context) error {
var req addressparam.GetAllProvincesRequest var req addressparam.GetAllProvincesRequest

View File

@ -17,7 +17,7 @@ import (
// @Param Request body benefactoreparam.LoginOrRegisterRequest true "Login or register request details" // @Param Request body benefactoreparam.LoginOrRegisterRequest true "Login or register request details"
// @Success 200 {object} benefactoreparam.LoginOrRegisterResponse // @Success 200 {object} benefactoreparam.LoginOrRegisterResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Router /benefactor/login-register [post] // @Router /benefactor/login-register [post].
func (h Handler) loginOrRegister(c echo.Context) error { func (h Handler) loginOrRegister(c echo.Context) error {
var req benefactoreparam.LoginOrRegisterRequest var req benefactoreparam.LoginOrRegisterRequest

View File

@ -17,7 +17,7 @@ import (
// @Param Request body benefactoreparam.SendOtpRequest true "Send OTP request details" // @Param Request body benefactoreparam.SendOtpRequest true "Send OTP request details"
// @Success 200 {object} benefactoreparam.SendOtpResponse // @Success 200 {object} benefactoreparam.SendOtpResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Router /benefactor/send-otp [post] // @Router /benefactor/send-otp [post].
func (h Handler) SendOtp(c echo.Context) error { func (h Handler) SendOtp(c echo.Context) error {
var req benefactoreparam.SendOtpRequest var req benefactoreparam.SendOtpRequest

View File

@ -18,7 +18,7 @@ import (
// @Success 200 {object} param.KindBoxGetResponse // @Success 200 {object} param.KindBoxGetResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerBenefactor // @Security AuthBearerBenefactor
// @Router /benefactor/kindboxes/{id} [get] // @Router /benefactor/kindboxes/{id} [get].
func (h Handler) Get(c echo.Context) error { func (h Handler) Get(c echo.Context) error {
var req param.KindBoxGetRequest var req param.KindBoxGetRequest
if bErr := c.Bind(&req); bErr != nil { if bErr := c.Bind(&req); bErr != nil {

View File

@ -18,11 +18,10 @@ import (
// @Success 200 {object} param.KindBoxReqAddResponse // @Success 200 {object} param.KindBoxReqAddResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerBenefactor // @Security AuthBearerBenefactor
// @Router /benefactor/kindboxreqs/ [post] // @Router /benefactor/kindboxreqs/ [post].
func (h Handler) Add(c echo.Context) error { func (h Handler) Add(c echo.Context) error {
req := param.KindBoxReqAddRequest{} req := param.KindBoxReqAddRequest{}
if err := c.Bind(&req); err != nil { if err := c.Bind(&req); err != nil {
return c.JSON(http.StatusBadRequest, echo.Map{ return c.JSON(http.StatusBadRequest, echo.Map{
"message": errmsg.ErrBadRequest, "message": errmsg.ErrBadRequest,
}) })

View File

@ -1,11 +1,12 @@
package benefactorkindboxreqhandler package benefactorkindboxreqhandler
import ( import (
"net/http"
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req" param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
"git.gocasts.ir/ebhomengo/niki/pkg/claim" "git.gocasts.ir/ebhomengo/niki/pkg/claim"
httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg" httpmsg "git.gocasts.ir/ebhomengo/niki/pkg/http_msg"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"net/http"
) )
// delete godoc // delete godoc
@ -18,11 +19,10 @@ import (
// @Success 200 {object} param.KindBoxReqDeleteResponse // @Success 200 {object} param.KindBoxReqDeleteResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerBenefactor // @Security AuthBearerBenefactor
// @Router /benefactor/kindboxreqs/{id} [delete] // @Router /benefactor/kindboxreqs/{id} [delete].
func (h Handler) Delete(c echo.Context) error { func (h Handler) Delete(c echo.Context) error {
req := param.KindBoxReqDeleteRequest{} req := param.KindBoxReqDeleteRequest{}
if bErr := echo.PathParamsBinder(c).Uint("id", &req.KindBoxReqID).BindError(); bErr != nil { if bErr := echo.PathParamsBinder(c).Uint("id", &req.KindBoxReqID).BindError(); bErr != nil {
return echo.NewHTTPError(http.StatusBadRequest) return echo.NewHTTPError(http.StatusBadRequest)
} }
claims := claim.GetClaimsFromEchoContext(c) claims := claim.GetClaimsFromEchoContext(c)

View File

@ -18,7 +18,7 @@ import (
// @Success 200 {object} param.KindBoxReqGetResponse // @Success 200 {object} param.KindBoxReqGetResponse
// @Failure 400 {string} "Bad request" // @Failure 400 {string} "Bad request"
// @Security AuthBearerBenefactor // @Security AuthBearerBenefactor
// @Router /benefactor/kindboxreqs/{id} [get] // @Router /benefactor/kindboxreqs/{id} [get].
func (h Handler) Get(c echo.Context) error { func (h Handler) Get(c echo.Context) error {
var req param.KindBoxReqGetRequest var req param.KindBoxReqGetRequest
if bErr := echo.PathParamsBinder(c).Uint("id", &req.KindBoxReqID).BindError(); bErr != nil { if bErr := echo.PathParamsBinder(c).Uint("id", &req.KindBoxReqID).BindError(); bErr != nil {

View File

@ -2,6 +2,7 @@ package httpserver
import ( import (
"fmt" "fmt"
config "git.gocasts.ir/ebhomengo/niki/config" config "git.gocasts.ir/ebhomengo/niki/config"
adminhandler "git.gocasts.ir/ebhomengo/niki/delivery/http_server/admin/admin" adminhandler "git.gocasts.ir/ebhomengo/niki/delivery/http_server/admin/admin"
adminkindboxreqhandler "git.gocasts.ir/ebhomengo/niki/delivery/http_server/admin/kind_box_req" adminkindboxreqhandler "git.gocasts.ir/ebhomengo/niki/delivery/http_server/admin/kind_box_req"
@ -92,11 +93,11 @@ func (s Server) Serve() {
} }
func RegisterSwagger(s *echo.Echo, config config.Config) { func RegisterSwagger(s *echo.Echo, config config.Config) {
//TODO: move this to a better place and make it more dynamic and configurable // TODO: move this to a better place and make it more dynamic and configurable
docs.SwaggerInfo.Title = "NIKI API" docs.SwaggerInfo.Title = "NIKI API"
docs.SwaggerInfo.Description = "This is the API documentation for the NIKI project" docs.SwaggerInfo.Description = "This is the API documentation for the NIKI project"
docs.SwaggerInfo.Version = "1.0.0" docs.SwaggerInfo.Version = "1.0.0"
//docs.SwaggerInfo.BasePath = "/api/v1" // docs.SwaggerInfo.BasePath = "/api/v1"
docs.SwaggerInfo.Host = fmt.Sprintf("localhost:%d", config.HTTPServer.Port) docs.SwaggerInfo.Host = fmt.Sprintf("localhost:%d", config.HTTPServer.Port)
s.GET("/swagger/*any", echoSwagger.WrapHandler) s.GET("/swagger/*any", echoSwagger.WrapHandler)

View File

@ -5,6 +5,7 @@ type AdminPermission string
const ( const (
AdminAdminRegisterPermission = AdminPermission("admin-register") AdminAdminRegisterPermission = AdminPermission("admin-register")
AdminKindBoxReqAcceptPermission = AdminPermission("kindboxreq-accept") AdminKindBoxReqAcceptPermission = AdminPermission("kindboxreq-accept")
AdminKindBoxReqAddPermission = AdminPermission("kindboxreq-add")
AdminKindBoxReqRejectPermission = AdminPermission("kindboxreq-reject") AdminKindBoxReqRejectPermission = AdminPermission("kindboxreq-reject")
AdminKindBoxReqGetAllPermission = AdminPermission("kindboxreq-getall") AdminKindBoxReqGetAllPermission = AdminPermission("kindboxreq-getall")
AdminKindBoxReqDeliverPermission = AdminPermission("kindboxreq-deliver") AdminKindBoxReqDeliverPermission = AdminPermission("kindboxreq-deliver")

2
go.mod
View File

@ -16,6 +16,7 @@ require (
github.com/rubenv/sql-migrate v1.6.0 github.com/rubenv/sql-migrate v1.6.0
github.com/stretchr/testify v1.9.0 github.com/stretchr/testify v1.9.0
github.com/swaggo/echo-swagger v1.4.1 github.com/swaggo/echo-swagger v1.4.1
github.com/swaggo/swag v1.16.3
golang.org/x/crypto v0.23.0 golang.org/x/crypto v0.23.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/natefinch/lumberjack.v2 v2.2.1
) )
@ -46,7 +47,6 @@ require (
github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/swaggo/files/v2 v2.0.0 // indirect github.com/swaggo/files/v2 v2.0.0 // indirect
github.com/swaggo/swag v1.16.3 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect
golang.org/x/net v0.25.0 // indirect golang.org/x/net v0.25.0 // indirect

View File

@ -1,8 +1,9 @@
package adminkindboxparam package adminkindboxparam
import ( import (
entity "git.gocasts.ir/ebhomengo/niki/entity"
"time" "time"
entity "git.gocasts.ir/ebhomengo/niki/entity"
) )
type AddKindBoxRequest struct { type AddKindBoxRequest struct {

View File

@ -3,9 +3,11 @@ package adminkindboxreqparam
import entity "git.gocasts.ir/ebhomengo/niki/entity" import entity "git.gocasts.ir/ebhomengo/niki/entity"
type KindBoxReqAddRequest struct { type KindBoxReqAddRequest struct {
BenefactorID uint BenefactorID uint `json:"benefactor_id" example:"1"`
TypeID uint TypeID entity.KindBoxType `json:"type_id" example:"1"`
CountRequested uint DeliverAddressID uint `json:"deliver_address_id" example:"1"`
DeliverReferDate string `json:"deliver_refer_date" example:"2025-01-02 15:04:05"`
CountRequested uint `json:"count_requested" example:"2"`
} }
type KindBoxReqAddResponse struct { type KindBoxReqAddResponse struct {

View File

@ -2,6 +2,7 @@ package mysqladmin
import ( import (
"context" "context"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -4,11 +4,12 @@ import (
"context" "context"
"database/sql" "database/sql"
"errors" "errors"
"time"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
"git.gocasts.ir/ebhomengo/niki/repository/mysql" "git.gocasts.ir/ebhomengo/niki/repository/mysql"
"time"
) )
func (d DB) IsExistBenefactorByPhoneNumber(ctx context.Context, phoneNumber string) (bool, entity.Benefactor, error) { func (d DB) IsExistBenefactorByPhoneNumber(ctx context.Context, phoneNumber string) (bool, entity.Benefactor, error) {
@ -56,7 +57,6 @@ func (d *DB) IsExistBenefactorByID(ctx context.Context, id uint) (bool, error) {
} }
func scanBenefactor(scanner mysql.Scanner) (entity.Benefactor, error) { func scanBenefactor(scanner mysql.Scanner) (entity.Benefactor, error) {
var createdAt, updatedAt time.Time var createdAt, updatedAt time.Time
var benefactor entity.Benefactor var benefactor entity.Benefactor
// TODO - use db model and mapper between entity and db model OR use this approach // TODO - use db model and mapper between entity and db model OR use this approach

View File

@ -2,6 +2,7 @@ package mysqlkindboxreq
import ( import (
"context" "context"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -2,6 +2,7 @@ package mysqlkindboxreq
import ( import (
"context" "context"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -2,6 +2,7 @@ package mysqlkindboxreq
import ( import (
"context" "context"
entity "git.gocasts.ir/ebhomengo/niki/entity" entity "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -2,9 +2,10 @@ package mysqlkindboxreq
import ( import (
"context" "context"
"time"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
"time"
) )
func (d DB) DeleteKindBoxReqByID(ctx context.Context, kindBoxReqID uint) error { func (d DB) DeleteKindBoxReqByID(ctx context.Context, kindBoxReqID uint) error {

View File

@ -3,6 +3,7 @@ package mysqlkindboxreq
import ( import (
"context" "context"
"database/sql" "database/sql"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"database/sql" "database/sql"
"errors" "errors"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -2,6 +2,7 @@ package mysqlkindboxreq
import ( import (
"context" "context"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -19,6 +19,8 @@ type Repository interface {
GetAdminByPhoneNumber(ctx context.Context, phoneNumber string) (entity.Admin, error) GetAdminByPhoneNumber(ctx context.Context, phoneNumber string) (entity.Admin, error)
GetAdminByID(ctx context.Context, adminID uint) (entity.Admin, error) GetAdminByID(ctx context.Context, adminID uint) (entity.Admin, error)
GetAllAgent(ctx context.Context) ([]entity.Admin, error) GetAllAgent(ctx context.Context) ([]entity.Admin, error)
IsExistBenefactorByID(ctx context.Context, id uint) (bool, error)
GetAddressByID(ctx context.Context, id uint) (*entity.Address, error)
} }
type Service struct { type Service struct {

View File

@ -17,6 +17,7 @@ type Repository interface {
DeliverKindBoxReq(ctx context.Context, kindBoxReqID uint) error DeliverKindBoxReq(ctx context.Context, kindBoxReqID uint) error
GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBoxReq, uint, error) GetAllKindBoxReq(ctx context.Context, filter params.FilterRequest, pagination params.PaginationRequest, sort params.SortRequest) ([]entity.KindBoxReq, uint, error)
GetAwaitingDeliveryByAgent(ctx context.Context, kindBoxReqID uint, agentID uint) (entity.KindBoxReq, error) GetAwaitingDeliveryByAgent(ctx context.Context, kindBoxReqID uint, agentID uint) (entity.KindBoxReq, error)
AddKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) (entity.KindBoxReq, error)
} }
type KindBoxSvc interface { type KindBoxSvc interface {

View File

@ -2,6 +2,7 @@ package benefactoraddressservice
import ( import (
"context" "context"
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/address" param "git.gocasts.ir/ebhomengo/niki/param/benefactor/address"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
) )

View File

@ -2,6 +2,7 @@ package benefactorkindboxreqservice
import ( import (
"context" "context"
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req" param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"
) )

View File

@ -6,7 +6,6 @@ import (
"git.gocasts.ir/ebhomengo/niki/repository/migrator" "git.gocasts.ir/ebhomengo/niki/repository/migrator"
"git.gocasts.ir/ebhomengo/niki/repository/mysql" "git.gocasts.ir/ebhomengo/niki/repository/mysql"
//nolint //nolint
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
) )

View File

@ -72,7 +72,7 @@ func SendOTP(t *testing.T) benefactoreparam.SendOtpResponse {
return resp return resp
} }
//nolint // nolint
func CreateBenefactorWithSvc(t *testing.T, req benefactoreparam.LoginOrRegisterRequest) (benefactoreparam.LoginOrRegisterResponse, func()) { func CreateBenefactorWithSvc(t *testing.T, req benefactoreparam.LoginOrRegisterRequest) (benefactoreparam.LoginOrRegisterResponse, func()) {
t.Helper() t.Helper()
ctx := context.Background() ctx := context.Background()
@ -88,7 +88,7 @@ func CreateBenefactorWithSvc(t *testing.T, req benefactoreparam.LoginOrRegisterR
} }
} }
//nolint // nolint
func CreateAddressWithSvc(t *testing.T, req addressparam.BenefactorAddAddressRequest) (addressparam.BenefactorAddAddressResponse, func()) { func CreateAddressWithSvc(t *testing.T, req addressparam.BenefactorAddAddressRequest) (addressparam.BenefactorAddAddressResponse, func()) {
t.Helper() t.Helper()
ctx := context.Background() ctx := context.Background()

View File

@ -52,7 +52,7 @@ func NewMockRepository(hasErr bool) *MockRepository {
} }
} }
//nolint // nolint
func (m *MockRepository) AddKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) (entity.KindBoxReq, error) { func (m *MockRepository) AddKindBoxReq(ctx context.Context, kindBoxReq entity.KindBoxReq) (entity.KindBoxReq, error) {
if m.hasErr { if m.hasErr {
return entity.KindBoxReq{}, fmt.Errorf(RepoErr) return entity.KindBoxReq{}, fmt.Errorf(RepoErr)

View File

@ -11,7 +11,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
//nolint // nolint
func CreateBenefactor(t *testing.T, db *mysql.DB) (*entity.Benefactor, func()) { func CreateBenefactor(t *testing.T, db *mysql.DB) (*entity.Benefactor, func()) {
t.Helper() t.Helper()
benefactor := &entity.Benefactor{ benefactor := &entity.Benefactor{
@ -42,7 +42,7 @@ func CreateBenefactor(t *testing.T, db *mysql.DB) (*entity.Benefactor, func()) {
} }
} }
//nolint // nolint
func CreateAddress(t *testing.T, db *mysql.DB, benfactorID uint) (*entity.Address, func()) { func CreateAddress(t *testing.T, db *mysql.DB, benfactorID uint) (*entity.Address, func()) {
t.Helper() t.Helper()
address := &entity.Address{ address := &entity.Address{

View File

@ -25,11 +25,17 @@ type Repository interface {
type AdminSvc interface { type AdminSvc interface {
AdminExistByID(ctx context.Context, req param.AdminExistByIDRequest) (param.AdminExistByIDResponse, error) AdminExistByID(ctx context.Context, req param.AdminExistByIDRequest) (param.AdminExistByIDResponse, error)
BenefactorExistByID(ctx context.Context, request param.BenefactorExistByIDRequest) (param.BenefactorExistByIDResponse, error)
}
type AddressSvc interface {
AddressExistByID(ctx context.Context, request param.GetAddressByIDRequest) (param.GetAddressByIDResponse, error)
} }
type Validator struct { type Validator struct {
repo Repository repo Repository
adminSvc AdminSvc adminSvc AdminSvc
addressSvc AddressSvc
} }
func New(repo Repository, adminSvc AdminSvc) Validator { func New(repo Repository, adminSvc AdminSvc) Validator {

View File

@ -2,6 +2,7 @@ package benefactorkindboxreqvalidator
import ( import (
"errors" "errors"
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req" param "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error"

View File

@ -3,13 +3,14 @@ package benefactorkindboxreqvalidator
import ( import (
"context" "context"
"fmt" "fmt"
"time"
"git.gocasts.ir/ebhomengo/niki/entity" "git.gocasts.ir/ebhomengo/niki/entity"
refertimeparam "git.gocasts.ir/ebhomengo/niki/param/admin/refer_time" refertimeparam "git.gocasts.ir/ebhomengo/niki/param/admin/refer_time"
addressparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/address" addressparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/address"
param "git.gocasts.ir/ebhomengo/niki/param/benefactor/benefactore" param "git.gocasts.ir/ebhomengo/niki/param/benefactor/benefactore"
errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
validation "github.com/go-ozzo/ozzo-validation/v4" validation "github.com/go-ozzo/ozzo-validation/v4"
"time"
) )
const ( const (

View File

@ -3,27 +3,27 @@
// //
// For example, the dependencies of the stdlib `strings` package can be resolved like so: // For example, the dependencies of the stdlib `strings` package can be resolved like so:
// //
// import "github.com/KyleBanks/depth" // import "github.com/KyleBanks/depth"
// //
// var t depth.Tree // var t depth.Tree
// err := t.Resolve("strings") // err := t.Resolve("strings")
// if err != nil { // if err != nil {
// log.Fatal(err) // log.Fatal(err)
// } // }
// //
// // Output: "strings has 4 dependencies." // // Output: "strings has 4 dependencies."
// log.Printf("%v has %v dependencies.", t.Root.Name, len(t.Root.Deps)) // log.Printf("%v has %v dependencies.", t.Root.Name, len(t.Root.Deps))
// //
// For additional customization, simply set the appropriate flags on the `Tree` before resolving: // For additional customization, simply set the appropriate flags on the `Tree` before resolving:
// //
// import "github.com/KyleBanks/depth" // import "github.com/KyleBanks/depth"
// //
// t := depth.Tree { // t := depth.Tree {
// ResolveInternal: true, // ResolveInternal: true,
// ResolveTest: true, // ResolveTest: true,
// MaxDepth: 10, // MaxDepth: 10,
// } // }
// err := t.Resolve("strings") // err := t.Resolve("strings")
package depth package depth
import ( import (

View File

@ -72,13 +72,13 @@ var ParamTagMap = map[string]ParamValidator{
// ParamTagRegexMap maps param tags to their respective regexes. // ParamTagRegexMap maps param tags to their respective regexes.
var ParamTagRegexMap = map[string]*regexp.Regexp{ var ParamTagRegexMap = map[string]*regexp.Regexp{
"range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"), "range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"),
"length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"), "length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"),
"runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"), "runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"),
"stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"), "stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"),
"in": regexp.MustCompile(`^in\((.*)\)`), "in": regexp.MustCompile(`^in\((.*)\)`),
"matches": regexp.MustCompile(`^matches\((.+)\)$`), "matches": regexp.MustCompile(`^matches\((.+)\)$`),
"rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), "rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"),
"minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), "minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"),
"maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), "maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"),
} }
@ -173,7 +173,7 @@ type ISO3166Entry struct {
Numeric string Numeric string
} }
//ISO3166List based on https://www.iso.org/obp/ui/#search/code/ Code Type "Officially Assigned Codes" // ISO3166List based on https://www.iso.org/obp/ui/#search/code/ Code Type "Officially Assigned Codes"
var ISO3166List = []ISO3166Entry{ var ISO3166List = []ISO3166Entry{
{"Afghanistan", "Afghanistan (l')", "AF", "AFG", "004"}, {"Afghanistan", "Afghanistan (l')", "AF", "AFG", "004"},
{"Albania", "Albanie (l')", "AL", "ALB", "008"}, {"Albania", "Albanie (l')", "AL", "ALB", "008"},
@ -463,7 +463,7 @@ type ISO693Entry struct {
English string English string
} }
//ISO693List based on http://data.okfn.org/data/core/language-codes/r/language-codes-3b2.json // ISO693List based on http://data.okfn.org/data/core/language-codes/r/language-codes-3b2.json
var ISO693List = []ISO693Entry{ var ISO693List = []ISO693Entry{
{Alpha3bCode: "aar", Alpha2Code: "aa", English: "Afar"}, {Alpha3bCode: "aar", Alpha2Code: "aa", English: "Afar"},
{Alpha3bCode: "abk", Alpha2Code: "ab", English: "Abkhazian"}, {Alpha3bCode: "abk", Alpha2Code: "ab", English: "Abkhazian"},

View File

@ -37,25 +37,32 @@ const RF3339WithoutZone = "2006-01-02T15:04:05"
// SetFieldsRequiredByDefault causes validation to fail when struct fields // SetFieldsRequiredByDefault causes validation to fail when struct fields
// do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). // do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`).
// This struct definition will fail govalidator.ValidateStruct() (and the field values do not matter): // This struct definition will fail govalidator.ValidateStruct() (and the field values do not matter):
// type exampleStruct struct { //
// Name string `` // type exampleStruct struct {
// Email string `valid:"email"` // Name string ``
// Email string `valid:"email"`
//
// This, however, will only fail when Email is empty or an invalid email address: // This, however, will only fail when Email is empty or an invalid email address:
// type exampleStruct2 struct { //
// Name string `valid:"-"` // type exampleStruct2 struct {
// Email string `valid:"email"` // Name string `valid:"-"`
// Email string `valid:"email"`
//
// Lastly, this will only fail when Email is an invalid email address but not when it's empty: // Lastly, this will only fail when Email is an invalid email address but not when it's empty:
// type exampleStruct2 struct { //
// Name string `valid:"-"` // type exampleStruct2 struct {
// Email string `valid:"email,optional"` // Name string `valid:"-"`
// Email string `valid:"email,optional"`
func SetFieldsRequiredByDefault(value bool) { func SetFieldsRequiredByDefault(value bool) {
fieldsRequiredByDefault = value fieldsRequiredByDefault = value
} }
// SetNilPtrAllowedByRequired causes validation to pass for nil ptrs when a field is set to required. // SetNilPtrAllowedByRequired causes validation to pass for nil ptrs when a field is set to required.
// The validation will still reject ptr fields in their zero value state. Example with this enabled: // The validation will still reject ptr fields in their zero value state. Example with this enabled:
// type exampleStruct struct { //
// Name *string `valid:"required"` // type exampleStruct struct {
// Name *string `valid:"required"`
//
// With `Name` set to "", this will be considered invalid input and will cause a validation error. // With `Name` set to "", this will be considered invalid input and will cause a validation error.
// With `Name` set to nil, this will be considered valid by validation. // With `Name` set to nil, this will be considered valid by validation.
// By default this is disabled. // By default this is disabled.
@ -154,8 +161,8 @@ func IsAlpha(str string) bool {
return rxAlpha.MatchString(str) return rxAlpha.MatchString(str)
} }
//IsUTFLetter check if the string contains only unicode letter characters. // IsUTFLetter check if the string contains only unicode letter characters.
//Similar to IsAlpha but for all languages. Empty string is valid. // Similar to IsAlpha but for all languages. Empty string is valid.
func IsUTFLetter(str string) bool { func IsUTFLetter(str string) bool {
if IsNull(str) { if IsNull(str) {
return true return true

View File

@ -3,13 +3,12 @@ package gofakeit
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"strconv"
"time"
"math/rand" "math/rand"
"reflect" "reflect"
"strconv"
"strings" "strings"
"text/template" "text/template"
"time"
) )
// TemplateOptions defines values needed for template document generation // TemplateOptions defines values needed for template document generation

View File

@ -18,6 +18,7 @@
// tag is deprecated and thus should not be used. // tag is deprecated and thus should not be used.
// Go versions prior to 1.4 are disabled because they use a different layout // Go versions prior to 1.4 are disabled because they use a different layout
// for interfaces which make the implementation of unsafeReflectValue more complex. // for interfaces which make the implementation of unsafeReflectValue more complex.
//go:build !js && !appengine && !safe && !disableunsafe && go1.4
// +build !js,!appengine,!safe,!disableunsafe,go1.4 // +build !js,!appengine,!safe,!disableunsafe,go1.4
package spew package spew

View File

@ -254,15 +254,15 @@ pointer addresses used to indirect to the final value. It provides the
following features over the built-in printing facilities provided by the fmt following features over the built-in printing facilities provided by the fmt
package: package:
* Pointers are dereferenced and followed - Pointers are dereferenced and followed
* Circular data structures are detected and handled properly - Circular data structures are detected and handled properly
* Custom Stringer/error interfaces are optionally invoked, including - Custom Stringer/error interfaces are optionally invoked, including
on unexported types on unexported types
* Custom types which only implement the Stringer/error interfaces via - Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer a pointer receiver are optionally invoked when passing non-pointer
variables variables
* Byte arrays and slices are dumped like the hexdump -C command which - Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output includes offsets, byte values in hex, and ASCII output
The configuration options are controlled by modifying the public members The configuration options are controlled by modifying the public members
of c. See ConfigState for options documentation. of c. See ConfigState for options documentation.
@ -295,12 +295,12 @@ func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{})
// NewDefaultConfig returns a ConfigState with the following default settings. // NewDefaultConfig returns a ConfigState with the following default settings.
// //
// Indent: " " // Indent: " "
// MaxDepth: 0 // MaxDepth: 0
// DisableMethods: false // DisableMethods: false
// DisablePointerMethods: false // DisablePointerMethods: false
// ContinueOnMethod: false // ContinueOnMethod: false
// SortKeys: false // SortKeys: false
func NewDefaultConfig() *ConfigState { func NewDefaultConfig() *ConfigState {
return &ConfigState{Indent: " "} return &ConfigState{Indent: " "}
} }

View File

@ -488,15 +488,15 @@ pointer addresses used to indirect to the final value. It provides the
following features over the built-in printing facilities provided by the fmt following features over the built-in printing facilities provided by the fmt
package: package:
* Pointers are dereferenced and followed - Pointers are dereferenced and followed
* Circular data structures are detected and handled properly - Circular data structures are detected and handled properly
* Custom Stringer/error interfaces are optionally invoked, including - Custom Stringer/error interfaces are optionally invoked, including
on unexported types on unexported types
* Custom types which only implement the Stringer/error interfaces via - Custom types which only implement the Stringer/error interfaces via
a pointer receiver are optionally invoked when passing non-pointer a pointer receiver are optionally invoked when passing non-pointer
variables variables
* Byte arrays and slices are dumped like the hexdump -C command which - Byte arrays and slices are dumped like the hexdump -C command which
includes offsets, byte values in hex, and ASCII output includes offsets, byte values in hex, and ASCII output
The configuration options are controlled by an exported package global, The configuration options are controlled by an exported package global,
spew.Config. See ConfigState for options documentation. spew.Config. See ConfigState for options documentation.

View File

@ -95,8 +95,8 @@ func (f *Field) Zero() error {
// of a nested struct . A struct tag with the content of "-" ignores the // of a nested struct . A struct tag with the content of "-" ignores the
// checking of that particular field. Example: // checking of that particular field. Example:
// //
// // Field is ignored by this package. // // Field is ignored by this package.
// Field *http.Request `structs:"-"` // Field *http.Request `structs:"-"`
// //
// It panics if field is not exported or if field's kind is not struct // It panics if field is not exported or if field's kind is not struct
func (f *Field) Fields() []*Field { func (f *Field) Fields() []*Field {

View File

@ -3,7 +3,6 @@ package structs
import ( import (
"fmt" "fmt"
"reflect" "reflect"
) )
@ -38,43 +37,43 @@ func New(s interface{}) *Struct {
// can be changed in the struct field's tag value. The "structs" key in the // can be changed in the struct field's tag value. The "structs" key in the
// struct's field tag value is the key name. Example: // struct's field tag value is the key name. Example:
// //
// // Field appears in map as key "myName". // // Field appears in map as key "myName".
// Name string `structs:"myName"` // Name string `structs:"myName"`
// //
// A tag value with the content of "-" ignores that particular field. Example: // A tag value with the content of "-" ignores that particular field. Example:
// //
// // Field is ignored by this package. // // Field is ignored by this package.
// Field bool `structs:"-"` // Field bool `structs:"-"`
// //
// A tag value with the content of "string" uses the stringer to get the value. Example: // A tag value with the content of "string" uses the stringer to get the value. Example:
// //
// // The value will be output of Animal's String() func. // // The value will be output of Animal's String() func.
// // Map will panic if Animal does not implement String(). // // Map will panic if Animal does not implement String().
// Field *Animal `structs:"field,string"` // Field *Animal `structs:"field,string"`
// //
// A tag value with the option of "flatten" used in a struct field is to flatten its fields // A tag value with the option of "flatten" used in a struct field is to flatten its fields
// in the output map. Example: // in the output map. Example:
// //
// // The FieldStruct's fields will be flattened into the output map. // // The FieldStruct's fields will be flattened into the output map.
// FieldStruct time.Time `structs:",flatten"` // FieldStruct time.Time `structs:",flatten"`
// //
// A tag value with the option of "omitnested" stops iterating further if the type // A tag value with the option of "omitnested" stops iterating further if the type
// is a struct. Example: // is a struct. Example:
// //
// // Field is not processed further by this package. // // Field is not processed further by this package.
// Field time.Time `structs:"myName,omitnested"` // Field time.Time `structs:"myName,omitnested"`
// Field *http.Request `structs:",omitnested"` // Field *http.Request `structs:",omitnested"`
// //
// A tag value with the option of "omitempty" ignores that particular field if // A tag value with the option of "omitempty" ignores that particular field if
// the field value is empty. Example: // the field value is empty. Example:
// //
// // Field appears in map as key "myName", but the field is // // Field appears in map as key "myName", but the field is
// // skipped if empty. // // skipped if empty.
// Field string `structs:"myName,omitempty"` // Field string `structs:"myName,omitempty"`
// //
// // Field appears in map as key "Field" (the default), but // // Field appears in map as key "Field" (the default), but
// // the field is skipped if empty. // // the field is skipped if empty.
// Field string `structs:",omitempty"` // Field string `structs:",omitempty"`
// //
// Note that only exported fields of a struct can be accessed, non exported // Note that only exported fields of a struct can be accessed, non exported
// fields will be neglected. // fields will be neglected.
@ -153,21 +152,21 @@ func (s *Struct) FillMap(out map[string]interface{}) {
// struct tag with the content of "-" ignores the that particular field. // struct tag with the content of "-" ignores the that particular field.
// Example: // Example:
// //
// // Field is ignored by this package. // // Field is ignored by this package.
// Field int `structs:"-"` // Field int `structs:"-"`
// //
// A value with the option of "omitnested" stops iterating further if the type // A value with the option of "omitnested" stops iterating further if the type
// is a struct. Example: // is a struct. Example:
// //
// // Fields is not processed further by this package. // // Fields is not processed further by this package.
// Field time.Time `structs:",omitnested"` // Field time.Time `structs:",omitnested"`
// Field *http.Request `structs:",omitnested"` // Field *http.Request `structs:",omitnested"`
// //
// A tag value with the option of "omitempty" ignores that particular field and // A tag value with the option of "omitempty" ignores that particular field and
// is not added to the values if the field value is empty. Example: // is not added to the values if the field value is empty. Example:
// //
// // Field is skipped if empty // // Field is skipped if empty
// Field string `structs:",omitempty"` // Field string `structs:",omitempty"`
// //
// Note that only exported fields of a struct can be accessed, non exported // Note that only exported fields of a struct can be accessed, non exported
// fields will be neglected. // fields will be neglected.
@ -215,8 +214,8 @@ func (s *Struct) Values() []interface{} {
// Fields returns a slice of Fields. A struct tag with the content of "-" // Fields returns a slice of Fields. A struct tag with the content of "-"
// ignores the checking of that particular field. Example: // ignores the checking of that particular field. Example:
// //
// // Field is ignored by this package. // // Field is ignored by this package.
// Field bool `structs:"-"` // Field bool `structs:"-"`
// //
// It panics if s's kind is not struct. // It panics if s's kind is not struct.
func (s *Struct) Fields() []*Field { func (s *Struct) Fields() []*Field {
@ -226,8 +225,8 @@ func (s *Struct) Fields() []*Field {
// Names returns a slice of field names. A struct tag with the content of "-" // Names returns a slice of field names. A struct tag with the content of "-"
// ignores the checking of that particular field. Example: // ignores the checking of that particular field. Example:
// //
// // Field is ignored by this package. // // Field is ignored by this package.
// Field bool `structs:"-"` // Field bool `structs:"-"`
// //
// It panics if s's kind is not struct. // It panics if s's kind is not struct.
func (s *Struct) Names() []string { func (s *Struct) Names() []string {
@ -303,15 +302,15 @@ func (s *Struct) FieldOk(name string) (*Field, bool) {
// initialized) A struct tag with the content of "-" ignores the checking of // initialized) A struct tag with the content of "-" ignores the checking of
// that particular field. Example: // that particular field. Example:
// //
// // Field is ignored by this package. // // Field is ignored by this package.
// Field bool `structs:"-"` // Field bool `structs:"-"`
// //
// A value with the option of "omitnested" stops iterating further if the type // A value with the option of "omitnested" stops iterating further if the type
// is a struct. Example: // is a struct. Example:
// //
// // Field is not processed further by this package. // // Field is not processed further by this package.
// Field time.Time `structs:"myName,omitnested"` // Field time.Time `structs:"myName,omitnested"`
// Field *http.Request `structs:",omitnested"` // Field *http.Request `structs:",omitnested"`
// //
// Note that only exported fields of a struct can be accessed, non exported // Note that only exported fields of a struct can be accessed, non exported
// fields will be neglected. It panics if s's kind is not struct. // fields will be neglected. It panics if s's kind is not struct.
@ -350,15 +349,15 @@ func (s *Struct) IsZero() bool {
// A struct tag with the content of "-" ignores the checking of that particular // A struct tag with the content of "-" ignores the checking of that particular
// field. Example: // field. Example:
// //
// // Field is ignored by this package. // // Field is ignored by this package.
// Field bool `structs:"-"` // Field bool `structs:"-"`
// //
// A value with the option of "omitnested" stops iterating further if the type // A value with the option of "omitnested" stops iterating further if the type
// is a struct. Example: // is a struct. Example:
// //
// // Field is not processed further by this package. // // Field is not processed further by this package.
// Field time.Time `structs:"myName,omitnested"` // Field time.Time `structs:"myName,omitnested"`
// Field *http.Request `structs:",omitnested"` // Field *http.Request `structs:",omitnested"`
// //
// Note that only exported fields of a struct can be accessed, non exported // Note that only exported fields of a struct can be accessed, non exported
// fields will be neglected. It panics if s's kind is not struct. // fields will be neglected. It panics if s's kind is not struct.

View File

@ -347,8 +347,9 @@ const (
// 4) simpleLetterEqualFold, no specials, no non-letters. // 4) simpleLetterEqualFold, no specials, no non-letters.
// //
// The letters S and K are special because they map to 3 runes, not just 2: // The letters S and K are special because they map to 3 runes, not just 2:
// * S maps to s and to U+017F 'ſ' Latin small letter long s // - S maps to s and to U+017F 'ſ' Latin small letter long s
// * k maps to K and to U+212A '' Kelvin sign // - k maps to K and to U+212A '' Kelvin sign
//
// See http://play.golang.org/p/tTxjOc0OGo // See http://play.golang.org/p/tTxjOc0OGo
// //
// The returned function is specialized for matching against s and // The returned function is specialized for matching against s and

View File

@ -64,12 +64,12 @@ func JSONToYAML(j []byte) ([]byte, error) {
// this method should be a no-op. // this method should be a no-op.
// //
// Things YAML can do that are not supported by JSON: // Things YAML can do that are not supported by JSON:
// * In YAML you can have binary and null keys in your maps. These are invalid // - In YAML you can have binary and null keys in your maps. These are invalid
// in JSON. (int and float keys are converted to strings.) // in JSON. (int and float keys are converted to strings.)
// * Binary data in YAML with the !!binary tag is not supported. If you want to // - Binary data in YAML with the !!binary tag is not supported. If you want to
// use binary data with this library, encode the data as base64 as usual but do // use binary data with this library, encode the data as base64 as usual but do
// not use the !!binary tag in your YAML. This will ensure the original base64 // not use the !!binary tag in your YAML. This will ensure the original base64
// encoded data makes it all the way through to the JSON. // encoded data makes it all the way through to the JSON.
func YAMLToJSON(y []byte) ([]byte, error) { func YAMLToJSON(y []byte) ([]byte, error) {
return yamlToJSON(y, nil) return yamlToJSON(y, nil)
} }

View File

@ -24,9 +24,8 @@ import (
// //
// Example: // Example:
// //
// dialect := gorp.MySQLDialect{"InnoDB", "UTF8"} // dialect := gorp.MySQLDialect{"InnoDB", "UTF8"}
// dbmap := &gorp.DbMap{Db: db, Dialect: dialect} // dbmap := &gorp.DbMap{Db: db, Dialect: dialect}
//
type DbMap struct { type DbMap struct {
ctx context.Context ctx context.Context

View File

@ -5,148 +5,148 @@
package gorp package gorp
import ( import (
"fmt" "fmt"
"reflect" "reflect"
"strings" "strings"
) )
type SnowflakeDialect struct { type SnowflakeDialect struct {
suffix string suffix string
LowercaseFields bool LowercaseFields bool
} }
func (d SnowflakeDialect) QuerySuffix() string { return ";" } func (d SnowflakeDialect) QuerySuffix() string { return ";" }
func (d SnowflakeDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string { func (d SnowflakeDialect) ToSqlType(val reflect.Type, maxsize int, isAutoIncr bool) string {
switch val.Kind() { switch val.Kind() {
case reflect.Ptr: case reflect.Ptr:
return d.ToSqlType(val.Elem(), maxsize, isAutoIncr) return d.ToSqlType(val.Elem(), maxsize, isAutoIncr)
case reflect.Bool: case reflect.Bool:
return "boolean" return "boolean"
case reflect.Int, case reflect.Int,
reflect.Int8, reflect.Int8,
reflect.Int16, reflect.Int16,
reflect.Int32, reflect.Int32,
reflect.Uint, reflect.Uint,
reflect.Uint8, reflect.Uint8,
reflect.Uint16, reflect.Uint16,
reflect.Uint32: reflect.Uint32:
if isAutoIncr { if isAutoIncr {
return "serial" return "serial"
} }
return "integer" return "integer"
case reflect.Int64, reflect.Uint64: case reflect.Int64, reflect.Uint64:
if isAutoIncr { if isAutoIncr {
return "bigserial" return "bigserial"
} }
return "bigint" return "bigint"
case reflect.Float64: case reflect.Float64:
return "double precision" return "double precision"
case reflect.Float32: case reflect.Float32:
return "real" return "real"
case reflect.Slice: case reflect.Slice:
if val.Elem().Kind() == reflect.Uint8 { if val.Elem().Kind() == reflect.Uint8 {
return "binary" return "binary"
} }
} }
switch val.Name() { switch val.Name() {
case "NullInt64": case "NullInt64":
return "bigint" return "bigint"
case "NullFloat64": case "NullFloat64":
return "double precision" return "double precision"
case "NullBool": case "NullBool":
return "boolean" return "boolean"
case "Time", "NullTime": case "Time", "NullTime":
return "timestamp with time zone" return "timestamp with time zone"
} }
if maxsize > 0 { if maxsize > 0 {
return fmt.Sprintf("varchar(%d)", maxsize) return fmt.Sprintf("varchar(%d)", maxsize)
} else { } else {
return "text" return "text"
} }
} }
// Returns empty string // Returns empty string
func (d SnowflakeDialect) AutoIncrStr() string { func (d SnowflakeDialect) AutoIncrStr() string {
return "" return ""
} }
func (d SnowflakeDialect) AutoIncrBindValue() string { func (d SnowflakeDialect) AutoIncrBindValue() string {
return "default" return "default"
} }
func (d SnowflakeDialect) AutoIncrInsertSuffix(col *ColumnMap) string { func (d SnowflakeDialect) AutoIncrInsertSuffix(col *ColumnMap) string {
return "" return ""
} }
// Returns suffix // Returns suffix
func (d SnowflakeDialect) CreateTableSuffix() string { func (d SnowflakeDialect) CreateTableSuffix() string {
return d.suffix return d.suffix
} }
func (d SnowflakeDialect) CreateIndexSuffix() string { func (d SnowflakeDialect) CreateIndexSuffix() string {
return "" return ""
} }
func (d SnowflakeDialect) DropIndexSuffix() string { func (d SnowflakeDialect) DropIndexSuffix() string {
return "" return ""
} }
func (d SnowflakeDialect) TruncateClause() string { func (d SnowflakeDialect) TruncateClause() string {
return "truncate" return "truncate"
} }
// Returns "$(i+1)" // Returns "$(i+1)"
func (d SnowflakeDialect) BindVar(i int) string { func (d SnowflakeDialect) BindVar(i int) string {
return "?" return "?"
} }
func (d SnowflakeDialect) InsertAutoIncrToTarget(exec SqlExecutor, insertSql string, target interface{}, params ...interface{}) error { func (d SnowflakeDialect) InsertAutoIncrToTarget(exec SqlExecutor, insertSql string, target interface{}, params ...interface{}) error {
rows, err := exec.Query(insertSql, params...) rows, err := exec.Query(insertSql, params...)
if err != nil { if err != nil {
return err return err
} }
defer rows.Close() defer rows.Close()
if !rows.Next() { if !rows.Next() {
return fmt.Errorf("No serial value returned for insert: %s Encountered error: %s", insertSql, rows.Err()) return fmt.Errorf("No serial value returned for insert: %s Encountered error: %s", insertSql, rows.Err())
} }
if err := rows.Scan(target); err != nil { if err := rows.Scan(target); err != nil {
return err return err
} }
if rows.Next() { if rows.Next() {
return fmt.Errorf("more than two serial value returned for insert: %s", insertSql) return fmt.Errorf("more than two serial value returned for insert: %s", insertSql)
} }
return rows.Err() return rows.Err()
} }
func (d SnowflakeDialect) QuoteField(f string) string { func (d SnowflakeDialect) QuoteField(f string) string {
if d.LowercaseFields { if d.LowercaseFields {
return `"` + strings.ToLower(f) + `"` return `"` + strings.ToLower(f) + `"`
} }
return `"` + f + `"` return `"` + f + `"`
} }
func (d SnowflakeDialect) QuotedTableForQuery(schema string, table string) string { func (d SnowflakeDialect) QuotedTableForQuery(schema string, table string) string {
if strings.TrimSpace(schema) == "" { if strings.TrimSpace(schema) == "" {
return d.QuoteField(table) return d.QuoteField(table)
} }
return schema + "." + d.QuoteField(table) return schema + "." + d.QuoteField(table)
} }
func (d SnowflakeDialect) IfSchemaNotExists(command, schema string) string { func (d SnowflakeDialect) IfSchemaNotExists(command, schema string) string {
return fmt.Sprintf("%s if not exists", command) return fmt.Sprintf("%s if not exists", command)
} }
func (d SnowflakeDialect) IfTableExists(command, schema, table string) string { func (d SnowflakeDialect) IfTableExists(command, schema, table string) string {
return fmt.Sprintf("%s if exists", command) return fmt.Sprintf("%s if exists", command)
} }
func (d SnowflakeDialect) IfTableNotExists(command, schema, table string) string { func (d SnowflakeDialect) IfTableNotExists(command, schema, table string) string {
return fmt.Sprintf("%s if not exists", command) return fmt.Sprintf("%s if not exists", command)
} }

View File

@ -86,10 +86,9 @@ func SelectNullStr(e SqlExecutor, query string, args ...interface{}) (sql.NullSt
// SelectOne executes the given query (which should be a SELECT statement) // SelectOne executes the given query (which should be a SELECT statement)
// and binds the result to holder, which must be a pointer. // and binds the result to holder, which must be a pointer.
// //
// If no row is found, an error (sql.ErrNoRows specifically) will be returned // # If no row is found, an error (sql.ErrNoRows specifically) will be returned
// //
// If more than one row is found, an error will be returned. // If more than one row is found, an error will be returned.
//
func SelectOne(m *DbMap, e SqlExecutor, holder interface{}, query string, args ...interface{}) error { func SelectOne(m *DbMap, e SqlExecutor, holder interface{}, query string, args ...interface{}) error {
t := reflect.TypeOf(holder) t := reflect.TypeOf(holder)
if t.Kind() == reflect.Ptr { if t.Kind() == reflect.Ptr {

View File

@ -47,7 +47,6 @@ func (t *TableMap) ResetSql() {
// Automatically calls ResetSql() to ensure SQL statements are regenerated. // Automatically calls ResetSql() to ensure SQL statements are regenerated.
// //
// Panics if isAutoIncr is true, and fieldNames length != 1 // Panics if isAutoIncr is true, and fieldNames length != 1
//
func (t *TableMap) SetKeys(isAutoIncr bool, fieldNames ...string) *TableMap { func (t *TableMap) SetKeys(isAutoIncr bool, fieldNames ...string) *TableMap {
if isAutoIncr && len(fieldNames) != 1 { if isAutoIncr && len(fieldNames) != 1 {
panic(fmt.Sprintf( panic(fmt.Sprintf(
@ -73,7 +72,6 @@ func (t *TableMap) SetKeys(isAutoIncr bool, fieldNames ...string) *TableMap {
// Automatically calls ResetSql() to ensure SQL statements are regenerated. // Automatically calls ResetSql() to ensure SQL statements are regenerated.
// //
// Panics if fieldNames length < 2. // Panics if fieldNames length < 2.
//
func (t *TableMap) SetUniqueTogether(fieldNames ...string) *TableMap { func (t *TableMap) SetUniqueTogether(fieldNames ...string) *TableMap {
if len(fieldNames) < 2 { if len(fieldNames) < 2 {
panic(fmt.Sprintf( panic(fmt.Sprintf(
@ -135,7 +133,6 @@ func (t *TableMap) IdxMap(field string) *IndexMap {
// Function will panic if one of the given for index columns does not exists // Function will panic if one of the given for index columns does not exists
// //
// Automatically calls ResetSql() to ensure SQL statements are regenerated. // Automatically calls ResetSql() to ensure SQL statements are regenerated.
//
func (t *TableMap) AddIndex(name string, idxtype string, columns []string) *IndexMap { func (t *TableMap) AddIndex(name string, idxtype string, columns []string) *IndexMap {
// check if we have a index with this name already // check if we have a index with this name already
for _, idx := range t.indexes { for _, idx := range t.indexes {

View File

@ -19,9 +19,10 @@ type DateRule struct {
// Date returns a validation rule that checks if a string value is in a format that can be parsed into a date. // Date returns a validation rule that checks if a string value is in a format that can be parsed into a date.
// The format of the date should be specified as the layout parameter which accepts the same value as that for time.Parse. // The format of the date should be specified as the layout parameter which accepts the same value as that for time.Parse.
// For example, // For example,
// validation.Date(time.ANSIC) //
// validation.Date("02 Jan 06 15:04 MST") // validation.Date(time.ANSIC)
// validation.Date("2006-01-02") // validation.Date("02 Jan 06 15:04 MST")
// validation.Date("2006-01-02")
// //
// By calling Min() and/or Max(), you can let the Date rule to check if a parsed date value is within // By calling Min() and/or Max(), you can let the Date rule to check if a parsed date value is within
// the specified date range. // the specified date range.

View File

@ -24,7 +24,6 @@ func (r *multipleOfRule) Error(message string) *multipleOfRule {
return r return r
} }
func (r *multipleOfRule) Validate(value interface{}) error { func (r *multipleOfRule) Validate(value interface{}) error {
rv := reflect.ValueOf(r.threshold) rv := reflect.ValueOf(r.threshold)

View File

@ -46,16 +46,16 @@ func (e ErrFieldNotFound) Error() string {
// should be specified as a pointer to the field. A field can be associated with multiple rules. // should be specified as a pointer to the field. A field can be associated with multiple rules.
// For example, // For example,
// //
// value := struct { // value := struct {
// Name string // Name string
// Value string // Value string
// }{"name", "demo"} // }{"name", "demo"}
// err := validation.ValidateStruct(&value, // err := validation.ValidateStruct(&value,
// validation.Field(&a.Name, validation.Required), // validation.Field(&a.Name, validation.Required),
// validation.Field(&a.Value, validation.Required, validation.Length(5, 10)), // validation.Field(&a.Value, validation.Required, validation.Length(5, 10)),
// ) // )
// fmt.Println(err) // fmt.Println(err)
// // Value: the length must be between 5 and 10. // // Value: the length must be between 5 and 10.
// //
// An error will be returned if validation fails. // An error will be returned if validation fails.
func ValidateStruct(structPtr interface{}, fields ...*FieldRules) error { func ValidateStruct(structPtr interface{}, fields ...*FieldRules) error {

View File

@ -41,10 +41,11 @@ type (
// Use Key() to specify map keys that need to be validated. Each Key() call specifies a single key which can // Use Key() to specify map keys that need to be validated. Each Key() call specifies a single key which can
// be associated with multiple rules. // be associated with multiple rules.
// For example, // For example,
// validation.Map( //
// validation.Key("Name", validation.Required), // validation.Map(
// validation.Key("Value", validation.Required, validation.Length(5, 10)), // validation.Key("Name", validation.Required),
// ) // validation.Key("Value", validation.Required, validation.Length(5, 10)),
// )
// //
// A nil value is considered valid. Use the Required rule to make sure a map value is present. // A nil value is considered valid. Use the Required rule to make sure a map value is present.
func Map(keys ...*KeyRules) MapRule { func Map(keys ...*KeyRules) MapRule {

View File

@ -47,16 +47,16 @@ func (e ErrFieldNotFound) Error() string {
// should be specified as a pointer to the field. A field can be associated with multiple rules. // should be specified as a pointer to the field. A field can be associated with multiple rules.
// For example, // For example,
// //
// value := struct { // value := struct {
// Name string // Name string
// Value string // Value string
// }{"name", "demo"} // }{"name", "demo"}
// err := validation.ValidateStruct(&value, // err := validation.ValidateStruct(&value,
// validation.Field(&a.Name, validation.Required), // validation.Field(&a.Name, validation.Required),
// validation.Field(&a.Value, validation.Required, validation.Length(5, 10)), // validation.Field(&a.Value, validation.Required, validation.Length(5, 10)),
// ) // )
// fmt.Println(err) // fmt.Println(err)
// // Value: the length must be between 5 and 10. // // Value: the length must be between 5 and 10.
// //
// An error will be returned if validation fails. // An error will be returned if validation fails.
func ValidateStruct(structPtr interface{}, fields ...*FieldRules) error { func ValidateStruct(structPtr interface{}, fields ...*FieldRules) error {

View File

@ -60,11 +60,11 @@ var (
// Validate validates the given value and returns the validation error, if any. // Validate validates the given value and returns the validation error, if any.
// //
// Validate performs validation using the following steps: // Validate performs validation using the following steps:
// 1. For each rule, call its `Validate()` to validate the value. Return if any error is found. // 1. For each rule, call its `Validate()` to validate the value. Return if any error is found.
// 2. If the value being validated implements `Validatable`, call the value's `Validate()`. // 2. If the value being validated implements `Validatable`, call the value's `Validate()`.
// Return with the validation result. // Return with the validation result.
// 3. If the value being validated is a map/slice/array, and the element type implements `Validatable`, // 3. If the value being validated is a map/slice/array, and the element type implements `Validatable`,
// for each element call the element value's `Validate()`. Return with the validation result. // for each element call the element value's `Validate()`. Return with the validation result.
func Validate(value interface{}, rules ...Rule) error { func Validate(value interface{}, rules ...Rule) error {
for _, rule := range rules { for _, rule := range rules {
if s, ok := rule.(skipRule); ok && s.skip { if s, ok := rule.(skipRule); ok && s.skip {
@ -103,16 +103,16 @@ func Validate(value interface{}, rules ...Rule) error {
// ValidateWithContext validates the given value with the given context and returns the validation error, if any. // ValidateWithContext validates the given value with the given context and returns the validation error, if any.
// //
// ValidateWithContext performs validation using the following steps: // ValidateWithContext performs validation using the following steps:
// 1. For each rule, call its `ValidateWithContext()` to validate the value if the rule implements `RuleWithContext`. // 1. For each rule, call its `ValidateWithContext()` to validate the value if the rule implements `RuleWithContext`.
// Otherwise call `Validate()` of the rule. Return if any error is found. // Otherwise call `Validate()` of the rule. Return if any error is found.
// 2. If the value being validated implements `ValidatableWithContext`, call the value's `ValidateWithContext()` // 2. If the value being validated implements `ValidatableWithContext`, call the value's `ValidateWithContext()`
// and return with the validation result. // and return with the validation result.
// 3. If the value being validated implements `Validatable`, call the value's `Validate()` // 3. If the value being validated implements `Validatable`, call the value's `Validate()`
// and return with the validation result. // and return with the validation result.
// 4. If the value being validated is a map/slice/array, and the element type implements `ValidatableWithContext`, // 4. If the value being validated is a map/slice/array, and the element type implements `ValidatableWithContext`,
// for each element call the element value's `ValidateWithContext()`. Return with the validation result. // for each element call the element value's `ValidateWithContext()`. Return with the validation result.
// 5. If the value being validated is a map/slice/array, and the element type implements `Validatable`, // 5. If the value being validated is a map/slice/array, and the element type implements `Validatable`,
// for each element call the element value's `Validate()`. Return with the validation result. // for each element call the element value's `Validate()`. Return with the validation result.
func ValidateWithContext(ctx context.Context, value interface{}, rules ...Rule) error { func ValidateWithContext(ctx context.Context, value interface{}, rules ...Rule) error {
for _, rule := range rules { for _, rule := range rules {
if s, ok := rule.(skipRule); ok && s.skip { if s, ok := rule.(skipRule); ok && s.skip {

View File

@ -33,27 +33,26 @@ var (
// Note: The provided rsa.PublicKey instance is exclusively owned by the driver // Note: The provided rsa.PublicKey instance is exclusively owned by the driver
// after registering it and may not be modified. // after registering it and may not be modified.
// //
// data, err := ioutil.ReadFile("mykey.pem") // data, err := ioutil.ReadFile("mykey.pem")
// if err != nil { // if err != nil {
// log.Fatal(err) // log.Fatal(err)
// } // }
// //
// block, _ := pem.Decode(data) // block, _ := pem.Decode(data)
// if block == nil || block.Type != "PUBLIC KEY" { // if block == nil || block.Type != "PUBLIC KEY" {
// log.Fatal("failed to decode PEM block containing public key") // log.Fatal("failed to decode PEM block containing public key")
// } // }
// //
// pub, err := x509.ParsePKIXPublicKey(block.Bytes) // pub, err := x509.ParsePKIXPublicKey(block.Bytes)
// if err != nil { // if err != nil {
// log.Fatal(err) // log.Fatal(err)
// } // }
//
// if rsaPubKey, ok := pub.(*rsa.PublicKey); ok {
// mysql.RegisterServerPubKey("mykey", rsaPubKey)
// } else {
// log.Fatal("not a RSA public key")
// }
// //
// if rsaPubKey, ok := pub.(*rsa.PublicKey); ok {
// mysql.RegisterServerPubKey("mykey", rsaPubKey)
// } else {
// log.Fatal("not a RSA public key")
// }
func RegisterServerPubKey(name string, pubKey *rsa.PublicKey) { func RegisterServerPubKey(name string, pubKey *rsa.PublicKey) {
serverPubKeyLock.Lock() serverPubKeyLock.Lock()
if serverPubKeyRegistry == nil { if serverPubKeyRegistry == nil {

View File

@ -6,6 +6,7 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this file, // License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at http://mozilla.org/MPL/2.0/. // You can obtain one at http://mozilla.org/MPL/2.0/.
//go:build linux || darwin || dragonfly || freebsd || netbsd || openbsd || solaris || illumos
// +build linux darwin dragonfly freebsd netbsd openbsd solaris illumos // +build linux darwin dragonfly freebsd netbsd openbsd solaris illumos
package mysql package mysql

View File

@ -8,10 +8,10 @@
// //
// The driver should be used via the database/sql package: // The driver should be used via the database/sql package:
// //
// import "database/sql" // import "database/sql"
// import _ "github.com/go-sql-driver/mysql" // import _ "github.com/go-sql-driver/mysql"
// //
// db, err := sql.Open("mysql", "user:password@/dbname") // db, err := sql.Open("mysql", "user:password@/dbname")
// //
// See https://github.com/go-sql-driver/mysql#usage for details // See https://github.com/go-sql-driver/mysql#usage for details
package mysql package mysql

View File

@ -28,12 +28,11 @@ var (
// Alternatively you can allow the use of all local files with // Alternatively you can allow the use of all local files with
// the DSN parameter 'allowAllFiles=true' // the DSN parameter 'allowAllFiles=true'
// //
// filePath := "/home/gopher/data.csv" // filePath := "/home/gopher/data.csv"
// mysql.RegisterLocalFile(filePath) // mysql.RegisterLocalFile(filePath)
// err := db.Exec("LOAD DATA LOCAL INFILE '" + filePath + "' INTO TABLE foo") // err := db.Exec("LOAD DATA LOCAL INFILE '" + filePath + "' INTO TABLE foo")
// if err != nil { // if err != nil {
// ... // ...
//
func RegisterLocalFile(filePath string) { func RegisterLocalFile(filePath string) {
fileRegisterLock.Lock() fileRegisterLock.Lock()
// lazy map init // lazy map init
@ -58,15 +57,14 @@ func DeregisterLocalFile(filePath string) {
// If the handler returns a io.ReadCloser Close() is called when the // If the handler returns a io.ReadCloser Close() is called when the
// request is finished. // request is finished.
// //
// mysql.RegisterReaderHandler("data", func() io.Reader { // mysql.RegisterReaderHandler("data", func() io.Reader {
// var csvReader io.Reader // Some Reader that returns CSV data // var csvReader io.Reader // Some Reader that returns CSV data
// ... // Open Reader here // ... // Open Reader here
// return csvReader // return csvReader
// }) // })
// err := db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE foo") // err := db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE foo")
// if err != nil { // if err != nil {
// ... // ...
//
func RegisterReaderHandler(name string, handler func() io.Reader) { func RegisterReaderHandler(name string, handler func() io.Reader) {
readerRegisterLock.Lock() readerRegisterLock.Lock()
// lazy map init // lazy map init

View File

@ -35,26 +35,25 @@ var (
// Note: The provided tls.Config is exclusively owned by the driver after // Note: The provided tls.Config is exclusively owned by the driver after
// registering it. // registering it.
// //
// rootCertPool := x509.NewCertPool() // rootCertPool := x509.NewCertPool()
// pem, err := ioutil.ReadFile("/path/ca-cert.pem") // pem, err := ioutil.ReadFile("/path/ca-cert.pem")
// if err != nil { // if err != nil {
// log.Fatal(err) // log.Fatal(err)
// } // }
// if ok := rootCertPool.AppendCertsFromPEM(pem); !ok { // if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
// log.Fatal("Failed to append PEM.") // log.Fatal("Failed to append PEM.")
// } // }
// clientCert := make([]tls.Certificate, 0, 1) // clientCert := make([]tls.Certificate, 0, 1)
// certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem") // certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem")
// if err != nil { // if err != nil {
// log.Fatal(err) // log.Fatal(err)
// } // }
// clientCert = append(clientCert, certs) // clientCert = append(clientCert, certs)
// mysql.RegisterTLSConfig("custom", &tls.Config{ // mysql.RegisterTLSConfig("custom", &tls.Config{
// RootCAs: rootCertPool, // RootCAs: rootCertPool,
// Certificates: clientCert, // Certificates: clientCert,
// }) // })
// db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom") // db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom")
//
func RegisterTLSConfig(key string, config *tls.Config) error { func RegisterTLSConfig(key string, config *tls.Config) error {
if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" || strings.ToLower(key) == "preferred" { if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" || strings.ToLower(key) == "preferred" {
return fmt.Errorf("key '%s' is reserved", key) return fmt.Errorf("key '%s' is reserved", key)

View File

@ -1,9 +1,8 @@
package jwt package jwt
import ( import (
"errors"
"crypto/ed25519" "crypto/ed25519"
"errors"
) )
var ( var (

View File

@ -3,7 +3,6 @@ package jwt
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
// "fmt"
) )
// Claims type that uses the map[string]interface{} for JSON decoding // Claims type that uses the map[string]interface{} for JSON decoding

View File

@ -1,3 +1,4 @@
//go:build go1.4
// +build go1.4 // +build go1.4
package jwt package jwt

View File

@ -1,11 +1,10 @@
package jwt package jwt
import ( import (
"errors"
"crypto" "crypto"
"crypto/ed25519" "crypto/ed25519"
"crypto/rand" "crypto/rand"
"errors"
) )
var ( var (

View File

@ -4,7 +4,6 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"time" "time"
// "fmt"
) )
// MapClaims is a claims type that uses the map[string]interface{} for JSON decoding. // MapClaims is a claims type that uses the map[string]interface{} for JSON decoding.

View File

@ -1,11 +1,10 @@
package jwt package jwt
import ( import (
"errors"
"crypto" "crypto"
"crypto/ed25519" "crypto/ed25519"
"crypto/rand" "crypto/rand"
"errors"
) )
var ( var (

View File

@ -5,20 +5,20 @@ import (
"time" "time"
) )
//MessageCountInbox ... // MessageCountInbox ...
type MessageCountInbox struct { type MessageCountInbox struct {
Startdate int `json:"startdate"` Startdate int `json:"startdate"`
Enddate int `json:"enddate"` Enddate int `json:"enddate"`
Sumcount int `json:"sumcount"` Sumcount int `json:"sumcount"`
} }
//MessageCountInboxResult ... // MessageCountInboxResult ...
type MessageCountInboxResult struct { type MessageCountInboxResult struct {
*Return `json:"return"` *Return `json:"return"`
Entries []MessageCountInbox `json:"entries"` Entries []MessageCountInbox `json:"entries"`
} }
//CountInbox ... // CountInbox ...
func (message *MessageService) CountInbox(linenumber string, startdate time.Time, endate time.Time, isread bool) (MessageCountInbox, error) { func (message *MessageService) CountInbox(linenumber string, startdate time.Time, endate time.Time, isread bool) (MessageCountInbox, error) {
v := url.Values{} v := url.Values{}
@ -33,13 +33,13 @@ func (message *MessageService) CountInbox(linenumber string, startdate time.Time
return message.CreateCountInbox(v) return message.CreateCountInbox(v)
} }
//CreateCountInbox ... // CreateCountInbox ...
func (message *MessageService) CreateCountInbox(v url.Values) (MessageCountInbox, error) { func (message *MessageService) CreateCountInbox(v url.Values) (MessageCountInbox, error) {
u := message.client.EndPoint("sms", "countinbox") u := message.client.EndPoint("sms", "countinbox")
m := new(MessageCountInboxResult) m := new(MessageCountInboxResult)
err := message.client.Execute(u.String(), v, m) err := message.client.Execute(u.String(), v, m)
if m.Entries==nil{ if m.Entries == nil {
return MessageCountInbox{},err return MessageCountInbox{}, err
} }
return m.Entries[0], err return m.Entries[0], err
} }

View File

@ -5,19 +5,19 @@ import (
"strconv" "strconv"
) )
//MessageCountPostalCode ... // MessageCountPostalCode ...
type MessageCountPostalCode struct { type MessageCountPostalCode struct {
Section string `json:"section"` Section string `json:"section"`
Value int `json:"value"` Value int `json:"value"`
} }
//MessageCountPostalCodeResult ... // MessageCountPostalCodeResult ...
type MessageCountPostalCodeResult struct { type MessageCountPostalCodeResult struct {
*Return `json:"return"` *Return `json:"return"`
Entries []MessageCountPostalCode `json:"entries"` Entries []MessageCountPostalCode `json:"entries"`
} }
//CountPostalCode ... // CountPostalCode ...
func (message *MessageService) CountPostalCode(postalcode int64) ([]MessageCountPostalCode, error) { func (message *MessageService) CountPostalCode(postalcode int64) ([]MessageCountPostalCode, error) {
u := message.client.EndPoint("sms", "countpostalcode") u := message.client.EndPoint("sms", "countpostalcode")
m := new(MessageCountPostalCodeResult) m := new(MessageCountPostalCodeResult)

View File

@ -5,20 +5,20 @@ import (
"time" "time"
) )
//MessageCountOutbox ... // MessageCountOutbox ...
type MessageCountOutbox struct { type MessageCountOutbox struct {
*MessageCountInbox *MessageCountInbox
Sumpart int `json:"sumpart"` Sumpart int `json:"sumpart"`
Cost int `json:"cost"` Cost int `json:"cost"`
} }
//MessageCountOutboxResult ... // MessageCountOutboxResult ...
type MessageCountOutboxResult struct { type MessageCountOutboxResult struct {
*Return `json:"return"` *Return `json:"return"`
Entries []MessageCountOutbox `json:"entries"` Entries []MessageCountOutbox `json:"entries"`
} }
//CountOutbox ... // CountOutbox ...
func (message *MessageService) CountOutbox(startdate time.Time, endate time.Time, status MessageStatusType) (MessageCountOutbox, error) { func (message *MessageService) CountOutbox(startdate time.Time, endate time.Time, status MessageStatusType) (MessageCountOutbox, error) {
v := url.Values{} v := url.Values{}
v.Set("startdate", ToUnix(startdate)) v.Set("startdate", ToUnix(startdate))
@ -29,13 +29,13 @@ func (message *MessageService) CountOutbox(startdate time.Time, endate time.Time
return message.CreateCountOutbox(v) return message.CreateCountOutbox(v)
} }
//CreateCountOutbox ... // CreateCountOutbox ...
func (message *MessageService) CreateCountOutbox(v url.Values) (MessageCountOutbox, error) { func (message *MessageService) CreateCountOutbox(v url.Values) (MessageCountOutbox, error) {
u := message.client.EndPoint("sms", "countoutbox") u := message.client.EndPoint("sms", "countoutbox")
m := new(MessageCountOutboxResult) m := new(MessageCountOutboxResult)
err := message.client.Execute(u.String(), v, m) err := message.client.Execute(u.String(), v, m)
if m.Entries==nil{ if m.Entries == nil {
return MessageCountOutbox{},err return MessageCountOutbox{}, err
} }
return m.Entries[0], err return m.Entries[0], err
} }

View File

@ -5,7 +5,7 @@ import (
"strconv" "strconv"
) )
//LatestOutbox ... // LatestOutbox ...
func (message *MessageService) LatestOutbox(sender string, pagesize int) ([]Message, error) { func (message *MessageService) LatestOutbox(sender string, pagesize int) ([]Message, error) {
v := url.Values{} v := url.Values{}
v.Set("sender", sender) v.Set("sender", sender)
@ -13,7 +13,7 @@ func (message *MessageService) LatestOutbox(sender string, pagesize int) ([]Mess
return message.CreateLatestOutbox(v) return message.CreateLatestOutbox(v)
} }
//CreateLatestOutbox ... // CreateLatestOutbox ...
func (message *MessageService) CreateLatestOutbox(v url.Values) ([]Message, error) { func (message *MessageService) CreateLatestOutbox(v url.Values) ([]Message, error) {
u := message.client.EndPoint("sms", "latestoutbox") u := message.client.EndPoint("sms", "latestoutbox")
vc := url.Values{} vc := url.Values{}

View File

@ -5,7 +5,7 @@ import (
"time" "time"
) )
//SelectOutbox ... // SelectOutbox ...
func (message *MessageService) SelectOutbox(startdate time.Time, endate time.Time, sender string) ([]Message, error) { func (message *MessageService) SelectOutbox(startdate time.Time, endate time.Time, sender string) ([]Message, error) {
v := url.Values{} v := url.Values{}
@ -23,7 +23,7 @@ func (message *MessageService) SelectOutbox(startdate time.Time, endate time.Tim
return message.CreateSelectOutbox(v) return message.CreateSelectOutbox(v)
} }
//CreateSelectOutbox ... // CreateSelectOutbox ...
func (message *MessageService) CreateSelectOutbox(v url.Values) ([]Message, error) { func (message *MessageService) CreateSelectOutbox(v url.Values) ([]Message, error) {
u := message.client.EndPoint("sms", "selectoutbox") u := message.client.EndPoint("sms", "selectoutbox")
m := new(MessageResult) m := new(MessageResult)

View File

@ -6,7 +6,7 @@ import (
"time" "time"
) )
//SendPostalCode ... // SendPostalCode ...
func (m *MessageService) SendPostalCode(postalcode int64, sender string, message string, mcistartindex int, mcicount int, mtnstartindex int, mtncount int, date time.Time) ([]Message, error) { func (m *MessageService) SendPostalCode(postalcode int64, sender string, message string, mcistartindex int, mcicount int, mtnstartindex int, mtncount int, date time.Time) ([]Message, error) {
v := url.Values{} v := url.Values{}
v.Set("postalcode", strconv.FormatInt(postalcode, 10)) v.Set("postalcode", strconv.FormatInt(postalcode, 10))
@ -20,7 +20,7 @@ func (m *MessageService) SendPostalCode(postalcode int64, sender string, message
return m.CreateSendPostalCode(v) return m.CreateSendPostalCode(v)
} }
//CreateSendPostalCode ... // CreateSendPostalCode ...
func (m *MessageService) CreateSendPostalCode(v url.Values) ([]Message, error) { func (m *MessageService) CreateSendPostalCode(v url.Values) ([]Message, error) {
u := m.client.EndPoint("sms", "sendbypostalcode") u := m.client.EndPoint("sms", "sendbypostalcode")
res := new(MessageResult) res := new(MessageResult)

View File

@ -5,26 +5,26 @@ import (
"strconv" "strconv"
) )
//MessageStatusLocal ... // MessageStatusLocal ...
type MessageStatusLocal struct { type MessageStatusLocal struct {
*MessageStatus *MessageStatus
LocalID string `json:"localid"` LocalID string `json:"localid"`
} }
//MessageStatusLocalResult ... // MessageStatusLocalResult ...
type MessageStatusLocalResult struct { type MessageStatusLocalResult struct {
*Return `json:"return"` *Return `json:"return"`
Entries []MessageStatusLocal `json:"entries"` Entries []MessageStatusLocal `json:"entries"`
} }
//StatusLocal ... // StatusLocal ...
func (message *MessageService) StatusLocal(localid int64) (MessageStatusLocal, error) { func (message *MessageService) StatusLocal(localid int64) (MessageStatusLocal, error) {
u := message.client.EndPoint("sms", "statuslocalmessageid") u := message.client.EndPoint("sms", "statuslocalmessageid")
m := new(MessageStatusLocalResult) m := new(MessageStatusLocalResult)
v := url.Values{} v := url.Values{}
v.Set("localid", strconv.FormatInt(localid, 10)) v.Set("localid", strconv.FormatInt(localid, 10))
err := message.client.Execute(u.String(), v, m) err := message.client.Execute(u.String(), v, m)
if err!=nil{ if err != nil {
return MessageStatusLocal{}, err return MessageStatusLocal{}, err
} }
return m.Entries[0], err return m.Entries[0], err

View File

@ -10,23 +10,23 @@ import (
"time" "time"
) )
//ToString ... // ToString ...
func ToString(i interface{}) string { func ToString(i interface{}) string {
return strings.Trim(strings.Replace(fmt.Sprint(i), " ", ",", -1), "[]") return strings.Trim(strings.Replace(fmt.Sprint(i), " ", ",", -1), "[]")
} }
//ToJson ... // ToJson ...
func ToJson(i interface{}) string { func ToJson(i interface{}) string {
_json, _ := json.Marshal(i) _json, _ := json.Marshal(i)
return string(_json) return string(_json)
} }
//ToUnix ... // ToUnix ...
func ToUnix(t time.Time) string { func ToUnix(t time.Time) string {
return strconv.FormatInt(t.Unix(), 10) return strconv.FormatInt(t.Unix(), 10)
} }
//structToUrlValues ... // structToUrlValues ...
func structToURLValues(i interface{}) url.Values { func structToURLValues(i interface{}) url.Values {
v := url.Values{} v := url.Values{}
if reflect.ValueOf(i).IsNil() { if reflect.ValueOf(i).IsNil() {

View File

@ -5,9 +5,10 @@ package maps
import ( import (
"fmt" "fmt"
"github.com/mitchellh/copystructure"
"reflect" "reflect"
"strings" "strings"
"github.com/mitchellh/copystructure"
) )
// Flatten takes a map[string]interface{} and traverses it and flattens // Flatten takes a map[string]interface{} and traverses it and flattens

View File

@ -6,7 +6,6 @@ import (
"errors" "errors"
"github.com/fatih/structs" "github.com/fatih/structs"
"github.com/knadh/koanf/maps" "github.com/knadh/koanf/maps"
) )

View File

@ -6,10 +6,11 @@ package echojwt
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"net/textproto" "net/textproto"
"strings" "strings"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
) )
const ( const (

View File

@ -4,8 +4,9 @@
package echo package echo
import ( import (
"github.com/labstack/gommon/log"
"io" "io"
"github.com/labstack/gommon/log"
) )
// Logger defines the logging interface. // Logger defines the logging interface.

View File

@ -6,9 +6,10 @@ package middleware
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/labstack/echo/v4"
"net/textproto" "net/textproto"
"strings" "strings"
"github.com/labstack/echo/v4"
) )
const ( const (

View File

@ -9,10 +9,11 @@ package middleware
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/golang-jwt/jwt"
"github.com/labstack/echo/v4"
"net/http" "net/http"
"reflect" "reflect"
"github.com/golang-jwt/jwt"
"github.com/labstack/echo/v4"
) )
// JWTConfig defines the config for JWT middleware. // JWTConfig defines the config for JWT middleware.

View File

@ -5,8 +5,9 @@ package middleware
import ( import (
"errors" "errors"
"github.com/labstack/echo/v4"
"net/http" "net/http"
"github.com/labstack/echo/v4"
) )
// KeyAuthConfig defines the config for KeyAuth middleware. // KeyAuthConfig defines the config for KeyAuth middleware.

View File

@ -5,10 +5,11 @@ package middleware
import ( import (
"context" "context"
"github.com/labstack/echo/v4"
"net/http" "net/http"
"sync" "sync"
"time" "time"
"github.com/labstack/echo/v4"
) )
// --------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------

View File

@ -1,3 +1,4 @@
//go:build !appengine
// +build !appengine // +build !appengine
package log package log

View File

@ -13,10 +13,9 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/labstack/gommon/color"
"github.com/mattn/go-isatty" "github.com/mattn/go-isatty"
"github.com/valyala/fasttemplate" "github.com/valyala/fasttemplate"
"github.com/labstack/gommon/color"
) )
type ( type (

View File

@ -1,3 +1,4 @@
//go:build appengine
// +build appengine // +build appengine
package log package log

View File

@ -2,8 +2,8 @@
// easyjson_nounsafe nor appengine build tag is set. See README notes // easyjson_nounsafe nor appengine build tag is set. See README notes
// for more details. // for more details.
//+build !easyjson_nounsafe //go:build !easyjson_nounsafe && !appengine
//+build !appengine // +build !easyjson_nounsafe,!appengine
package jlexer package jlexer

View File

@ -42,7 +42,8 @@ func IsTerminal(fd uintptr) bool {
// Check pipe name is used for cygwin/msys2 pty. // Check pipe name is used for cygwin/msys2 pty.
// Cygwin/MSYS2 PTY has a name like: // Cygwin/MSYS2 PTY has a name like:
// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master //
// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master
func isCygwinPipeName(name string) bool { func isCygwinPipeName(name string) bool {
token := strings.Split(name, "-") token := strings.Split(name, "-")
if len(token) < 5 { if len(token) < 5 {

View File

@ -18,20 +18,19 @@ const tagKey = "copy"
// //
// For structs, copy behavior can be controlled with struct tags. For example: // For structs, copy behavior can be controlled with struct tags. For example:
// //
// struct { // struct {
// Name string // Name string
// Data *bytes.Buffer `copy:"shallow"` // Data *bytes.Buffer `copy:"shallow"`
// } // }
// //
// The available tag values are: // The available tag values are:
// //
// * "ignore" - The field will be ignored, effectively resulting in it being // - "ignore" - The field will be ignored, effectively resulting in it being
// assigned the zero value in the copy. // assigned the zero value in the copy.
//
// * "shallow" - The field will be be shallow copied. This means that references
// values such as pointers, maps, slices, etc. will be directly assigned
// versus deep copied.
// //
// - "shallow" - The field will be be shallow copied. This means that references
// values such as pointers, maps, slices, etc. will be directly assigned
// versus deep copied.
func Copy(v interface{}) (interface{}, error) { func Copy(v interface{}) (interface{}, error) {
return Config{}.Copy(v) return Config{}.Copy(v)
} }

View File

@ -9,84 +9,84 @@
// //
// The simplest function to start with is Decode. // The simplest function to start with is Decode.
// //
// Field Tags // # Field Tags
// //
// When decoding to a struct, mapstructure will use the field name by // When decoding to a struct, mapstructure will use the field name by
// default to perform the mapping. For example, if a struct has a field // default to perform the mapping. For example, if a struct has a field
// "Username" then mapstructure will look for a key in the source value // "Username" then mapstructure will look for a key in the source value
// of "username" (case insensitive). // of "username" (case insensitive).
// //
// type User struct { // type User struct {
// Username string // Username string
// } // }
// //
// You can change the behavior of mapstructure by using struct tags. // You can change the behavior of mapstructure by using struct tags.
// The default struct tag that mapstructure looks for is "mapstructure" // The default struct tag that mapstructure looks for is "mapstructure"
// but you can customize it using DecoderConfig. // but you can customize it using DecoderConfig.
// //
// Renaming Fields // # Renaming Fields
// //
// To rename the key that mapstructure looks for, use the "mapstructure" // To rename the key that mapstructure looks for, use the "mapstructure"
// tag and set a value directly. For example, to change the "username" example // tag and set a value directly. For example, to change the "username" example
// above to "user": // above to "user":
// //
// type User struct { // type User struct {
// Username string `mapstructure:"user"` // Username string `mapstructure:"user"`
// } // }
// //
// Embedded Structs and Squashing // # Embedded Structs and Squashing
// //
// Embedded structs are treated as if they're another field with that name. // Embedded structs are treated as if they're another field with that name.
// By default, the two structs below are equivalent when decoding with // By default, the two structs below are equivalent when decoding with
// mapstructure: // mapstructure:
// //
// type Person struct { // type Person struct {
// Name string // Name string
// } // }
// //
// type Friend struct { // type Friend struct {
// Person // Person
// } // }
// //
// type Friend struct { // type Friend struct {
// Person Person // Person Person
// } // }
// //
// This would require an input that looks like below: // This would require an input that looks like below:
// //
// map[string]interface{}{ // map[string]interface{}{
// "person": map[string]interface{}{"name": "alice"}, // "person": map[string]interface{}{"name": "alice"},
// } // }
// //
// If your "person" value is NOT nested, then you can append ",squash" to // If your "person" value is NOT nested, then you can append ",squash" to
// your tag value and mapstructure will treat it as if the embedded struct // your tag value and mapstructure will treat it as if the embedded struct
// were part of the struct directly. Example: // were part of the struct directly. Example:
// //
// type Friend struct { // type Friend struct {
// Person `mapstructure:",squash"` // Person `mapstructure:",squash"`
// } // }
// //
// Now the following input would be accepted: // Now the following input would be accepted:
// //
// map[string]interface{}{ // map[string]interface{}{
// "name": "alice", // "name": "alice",
// } // }
// //
// When decoding from a struct to a map, the squash tag squashes the struct // When decoding from a struct to a map, the squash tag squashes the struct
// fields into a single map. Using the example structs from above: // fields into a single map. Using the example structs from above:
// //
// Friend{Person: Person{Name: "alice"}} // Friend{Person: Person{Name: "alice"}}
// //
// Will be decoded into a map: // Will be decoded into a map:
// //
// map[string]interface{}{ // map[string]interface{}{
// "name": "alice", // "name": "alice",
// } // }
// //
// DecoderConfig has a field that changes the behavior of mapstructure // DecoderConfig has a field that changes the behavior of mapstructure
// to always squash embedded structs. // to always squash embedded structs.
// //
// Remainder Values // # Remainder Values
// //
// If there are any unmapped keys in the source value, mapstructure by // If there are any unmapped keys in the source value, mapstructure by
// default will silently ignore them. You can error by setting ErrorUnused // default will silently ignore them. You can error by setting ErrorUnused
@ -98,20 +98,20 @@
// probably be a "map[string]interface{}" or "map[interface{}]interface{}". // probably be a "map[string]interface{}" or "map[interface{}]interface{}".
// See example below: // See example below:
// //
// type Friend struct { // type Friend struct {
// Name string // Name string
// Other map[string]interface{} `mapstructure:",remain"` // Other map[string]interface{} `mapstructure:",remain"`
// } // }
// //
// Given the input below, Other would be populated with the other // Given the input below, Other would be populated with the other
// values that weren't used (everything but "name"): // values that weren't used (everything but "name"):
// //
// map[string]interface{}{ // map[string]interface{}{
// "name": "bob", // "name": "bob",
// "address": "123 Maple St.", // "address": "123 Maple St.",
// } // }
// //
// Omit Empty Values // # Omit Empty Values
// //
// When decoding from a struct to any other value, you may use the // When decoding from a struct to any other value, you may use the
// ",omitempty" suffix on your tag to omit that value if it equates to // ",omitempty" suffix on your tag to omit that value if it equates to
@ -122,37 +122,37 @@
// field value is zero and a numeric type, the field is empty, and it won't // field value is zero and a numeric type, the field is empty, and it won't
// be encoded into the destination type. // be encoded into the destination type.
// //
// type Source struct { // type Source struct {
// Age int `mapstructure:",omitempty"` // Age int `mapstructure:",omitempty"`
// } // }
// //
// Unexported fields // # Unexported fields
// //
// Since unexported (private) struct fields cannot be set outside the package // Since unexported (private) struct fields cannot be set outside the package
// where they are defined, the decoder will simply skip them. // where they are defined, the decoder will simply skip them.
// //
// For this output type definition: // For this output type definition:
// //
// type Exported struct { // type Exported struct {
// private string // this unexported field will be skipped // private string // this unexported field will be skipped
// Public string // Public string
// } // }
// //
// Using this map as input: // Using this map as input:
// //
// map[string]interface{}{ // map[string]interface{}{
// "private": "I will be ignored", // "private": "I will be ignored",
// "Public": "I made it through!", // "Public": "I made it through!",
// } // }
// //
// The following struct will be decoded: // The following struct will be decoded:
// //
// type Exported struct { // type Exported struct {
// private: "" // field is left with an empty string (zero value) // private: "" // field is left with an empty string (zero value)
// Public: "I made it through!" // Public: "I made it through!"
// } // }
// //
// Other Configuration // # Other Configuration
// //
// mapstructure is highly configurable. See the DecoderConfig struct // mapstructure is highly configurable. See the DecoderConfig struct
// for other features and options that are supported. // for other features and options that are supported.

View File

@ -81,7 +81,6 @@ type PointerValueWalker interface {
// //
// - Struct: skips all fields from being walked // - Struct: skips all fields from being walked
// - StructField: skips walking the struct value // - StructField: skips walking the struct value
//
var SkipEntry = errors.New("skip this entry") var SkipEntry = errors.New("skip this entry")
// Walk takes an arbitrary value and an interface and traverses the // Walk takes an arbitrary value and an interface and traverses the

Some files were not shown because too many files have changed in this diff Show More