shoot 中文
A pack of tools for "go generate".
BETA VERSION. USE WITH CAUTION!
Usage: shoot <subcommand> [options]
These are all the sub commands supported as of now:
new [-opt] [-getset] [-json][-type=<Type> | -file=<GoFile>] [dir] [-s] [-v]
enum [-json] [-text] -[bit] [-json][-type=<Type> | -file=<GoFile>] [dir] [-v]
rest [-type=<Type> | -file=<GoFile>] [dir] [-v]go get -tool github.com/lopolopen/shoot/cmd/shoot@latest//go:generate go tool shoot new -getset -json -type=YourType
//go:generate go tool shoot new -getset -json -file=$GOFILE
//go:generate go tool shoot enum -json -type=YourEnum
//go:generate go tool shoot rest -type=YourClientgo generate # run in the current directory
go generate ./... # recursively run in the current directory and its subdirectoriesgo install github.com/lopolopen/shoot/cmd/shoot@latest
go get github.com/lopolopen/shoot@latest # manual installation is necessary for legacy-version projects//go:generate shoot new -getset -json -type=YourType
//go:generate shoot new -getset -json -file=$GOFILE
//go:generate shoot enum -json -type=YourEnum
//go:generate shoot rest -type=YourClient// Code generated by "shoot new -getset -type=User"; DO NOT EDIT.
package example
// NewUser constructs a new instance of type User
func NewUser(id int, name string, age int) *User {
return &User{
id: id,
name: name,
age: age,
}
}
// Id gets the value of field id
func (u *User) Id() int {
return u.id
}
// Name gets the value of field name
func (u *User) Name() string {
return u.name
}
// Age gets the value of field age
func (u *User) Age() int {
return u.age
}
// SetId sets the value of field id
func (u *User) SetId(id_ int) {
u.id = id_
}
// SetName sets the value of field name
func (u *User) SetName(name_ string) {
u.name = name_
}
// SetAge sets the value of field age
func (u *User) SetAge(age_ int) {
u.age = age_
}// Code generated by "shoot rest -type=Client"; DO NOT EDIT.
package example
import (
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"strings"
"time"
"github.com/lopolopen/shoot"
)
type client struct {
client *http.Client
conf *shoot.RestConf
}
func (c *client) GetUser(ctx context.Context, userID string, pageSize int, pageIdx *int) (*User, *http.Response, error) {
path_ := "/users/{id}"
path_ = strings.Replace(path_, "{id}", fmt.Sprintf("%v", userID), 1)
url_, err := url.JoinPath(c.conf.BaseURL(), path_)
if err != nil {
return nil, nil, err
}
req_, err := http.NewRequestWithContext(ctx, "GET", url_, nil)
if err != nil {
return nil, nil, err
}
query_ := req_.URL.Query()
query_.Set("size", fmt.Sprintf("%v", pageSize))
if pageIdx != nil {
query_.Set("page_idx", fmt.Sprintf("%v", *pageIdx))
}
req_.URL.RawQuery = query_.Encode()
req_.Header.Add("Accept", "application/json")
req_.Header.Add("Tenant-Id", "123")
resp_, err := c.client.Do(req_)
if err != nil {
return nil, nil, err
}
defer resp_.Body.Close()
switch {
case resp_.StatusCode >= 500:
body_, _ := io.ReadAll(resp_.Body)
err = fmt.Errorf("server error %d: %s", resp_.StatusCode, string(body_))
case resp_.StatusCode >= 400:
body_, _ := io.ReadAll(resp_.Body)
err = fmt.Errorf("client error %d: %s", resp_.StatusCode, string(body_))
case resp_.StatusCode >= 300 || resp_.StatusCode < 200:
err = fmt.Errorf("not supported error %d", resp_.StatusCode)
}
if err != nil {
return nil, resp_, err
}
var r_ User
err = json.NewDecoder(resp_.Body).Decode(&r_)
if err == io.EOF {
err = nil //ignore EOF errors caused by empty response body
}
if err != nil {
return nil, resp_, err
}
return &r_, resp_, nil
}- shoot new -getset -type=YourType
- shoot new: field instruction like get;default=1
- shoot new -opt|option -type=YourType
- shoot new -json -type=YourType
- shoot new: embed struct
- shoot new: external package
- shoot new -file=YourFile
- shoot new: type instruction like ignore
- shoot new: -separate
- shoot enum -bit|bitwise -type=YourEnum
- shoot enum -json -type=YourEnum
- refactor: duplicated code