Package path refactor.

This commit is contained in:
go-jet 2019-06-21 13:56:57 +02:00
parent 829736279b
commit 83d4c5ad03
72 changed files with 162 additions and 188 deletions

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type alias struct {
expression Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type BoolExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type cast struct {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"bytes"

View file

@ -1,6 +1,6 @@
// Modeling of columns
package sqlbuilder
package jet
type column interface {
Name() string

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
//------------------------------------------------------//
type ColumnBool interface {

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type DateExpression interface {
Expression

View file

@ -1,10 +1,10 @@
package sqlbuilder
package jet
import (
"context"
"database/sql"
"errors"
"github.com/go-jet/jet/sqlbuilder/execution"
"github.com/go-jet/jet/execution"
)
type DeleteStatement interface {

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

3
doc.go Normal file
View file

@ -0,0 +1,3 @@
//
package jet

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type enumValue struct {
expressionInterfaceImpl

View file

@ -436,11 +436,6 @@ func valueToString(value reflect.Value) string {
return fmt.Sprintf("%#v", valueInterface)
}
var timeType = reflect.TypeOf(time.Now())
var floatType = reflect.TypeOf(1.0)
var stringType = reflect.TypeOf("str")
var intType = reflect.TypeOf(1)
func isGoBaseType(objType reflect.Type) bool {
typeStr := objType.String()

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"errors"
@ -69,11 +69,11 @@ func (e *expressionInterfaceImpl) AS(alias string) projection {
}
func (e *expressionInterfaceImpl) ASC() OrderByClause {
return &orderByClauseImpl{expression: e.parent, ascent: true}
return newOrderByClause(e.parent, true)
}
func (e *expressionInterfaceImpl) DESC() OrderByClause {
return &orderByClauseImpl{expression: e.parent, ascent: false}
return newOrderByClause(e.parent, false)
}
func (e *expressionInterfaceImpl) TO(dbType string) Expression {

View file

@ -1,9 +1,8 @@
// Query building functions for expressions components
package sqlbuilder
package jet
import (
"strconv"
"strings"
"time"
)
@ -51,9 +50,3 @@ func (c *intervalExpression) serialize(statement statementType, out *queryData,
//
// return intervalExp
//}
var likeEscaper = strings.NewReplacer("_", "\\_", "%", "\\%")
func EscapeForLike(s string) string {
return likeEscaper.Replace(s)
}

View file

@ -1,6 +1,6 @@
// +build disabled
package sqlbuilder
package jet
import (
"bytes"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "errors"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type FloatExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "errors"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"gotest.tools/assert"

View file

@ -23,18 +23,18 @@ var sqlBuilderTableTemplate = `
package table
import (
"github.com/go-jet/jet/sqlbuilder"
"github.com/go-jet/jet"
)
type {{.GoStructName}} struct {
sqlbuilder.Table
jet.Table
//Columns
{{- range .Columns}}
{{camelize .Name}} sqlbuilder.Column{{.SqlBuilderColumnType}}
{{camelize .Name}} jet.Column{{.SqlBuilderColumnType}}
{{- end}}
AllColumns sqlbuilder.ColumnList
AllColumns jet.ColumnList
}
var {{camelize .Name}} = new{{.GoStructName}}()
@ -42,19 +42,19 @@ var {{camelize .Name}} = new{{.GoStructName}}()
func new{{.GoStructName}}() *{{.GoStructName}} {
var (
{{- range .Columns}}
{{camelize .Name}}Column = sqlbuilder.{{.SqlBuilderColumnType}}Column("{{.Name}}")
{{camelize .Name}}Column = jet.{{.SqlBuilderColumnType}}Column("{{.Name}}")
{{- end}}
)
return &{{.GoStructName}}{
Table: sqlbuilder.NewTable("{{.SchemaName}}", "{{.Name}}", {{template "column-list" .Columns}}),
Table: jet.NewTable("{{.SchemaName}}", "{{.Name}}", {{template "column-list" .Columns}}),
//Columns
{{- range .Columns}}
{{camelize .Name}}: {{camelize .Name}}Column,
{{- end}}
AllColumns: sqlbuilder.ColumnList{ {{template "column-list" .Columns}} },
AllColumns: jet.ColumnList{ {{template "column-list" .Columns}} },
}
}
@ -122,15 +122,15 @@ func (e {{camelize $.Name}}) String() string {
`
var enumTypeTemplate = `package enum
import "github.com/go-jet/jet/sqlbuilder"
import "github.com/go-jet/jet"
var {{camelize $.Name}} = &struct {
{{- range $index, $element := .Values}}
{{camelize $element}} sqlbuilder.StringExpression
{{camelize $element}} jet.StringExpression
{{- end}}
} {
{{- range $index, $element := .Values}}
{{camelize $element}}: sqlbuilder.NewEnumValue("{{$element}}"),
{{camelize $element}}: jet.NewEnumValue("{{$element}}"),
{{- end}}
}
`

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type groupByClause interface {
serializeForGroupBy(statement statementType, out *queryData) error

View file

@ -1,10 +1,10 @@
package sqlbuilder
package jet
import (
"context"
"database/sql"
"errors"
"github.com/go-jet/jet/sqlbuilder/execution"
"github.com/go-jet/jet/execution"
)
type InsertStatement interface {

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"gotest.tools/assert"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type IntegerExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
const (
DEFAULT keywordClause = "DEFAULT"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "fmt"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "testing"

View file

@ -1,9 +1,9 @@
package sqlbuilder
package jet
import (
"context"
"database/sql"
"github.com/go-jet/jet/sqlbuilder/execution"
"github.com/go-jet/jet/execution"
"github.com/pkg/errors"
)

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type NumericExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "errors"
@ -55,12 +55,12 @@ func EXISTS(subQuery SelectStatement) BoolExpression {
// --------------- CASE operator -------------------//
type caseOperatorExpression interface {
type CaseOperatorExpression interface {
Expression
WHEN(condition Expression) caseOperatorExpression
THEN(then Expression) caseOperatorExpression
ELSE(els Expression) caseOperatorExpression
WHEN(condition Expression) CaseOperatorExpression
THEN(then Expression) CaseOperatorExpression
ELSE(els Expression) CaseOperatorExpression
}
type caseOperatorImpl struct {
@ -72,7 +72,7 @@ type caseOperatorImpl struct {
els Expression
}
func CASE(expression ...Expression) caseOperatorExpression {
func CASE(expression ...Expression) CaseOperatorExpression {
caseExp := &caseOperatorImpl{}
if len(expression) > 0 {
@ -84,17 +84,17 @@ func CASE(expression ...Expression) caseOperatorExpression {
return caseExp
}
func (c *caseOperatorImpl) WHEN(when Expression) caseOperatorExpression {
func (c *caseOperatorImpl) WHEN(when Expression) CaseOperatorExpression {
c.when = append(c.when, when)
return c
}
func (c *caseOperatorImpl) THEN(then Expression) caseOperatorExpression {
func (c *caseOperatorImpl) THEN(then Expression) CaseOperatorExpression {
c.then = append(c.then, then)
return c
}
func (c *caseOperatorImpl) ELSE(els Expression) caseOperatorExpression {
func (c *caseOperatorImpl) ELSE(els Expression) CaseOperatorExpression {
c.els = els
return c

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "errors"
@ -29,10 +29,6 @@ func (o *orderByClauseImpl) serializeForOrderBy(statement statementType, out *qu
return nil
}
func ASC(expression Expression) OrderByClause {
return &orderByClauseImpl{expression: expression, ascent: true}
}
func DESC(expression Expression) OrderByClause {
return &orderByClauseImpl{expression: expression, ascent: false}
func newOrderByClause(expression Expression, ascent bool) OrderByClause {
return &orderByClauseImpl{expression: expression, ascent: ascent}
}

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type projection interface {
serializeForProjection(statement statementType, out *queryData) error

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type rowsType interface {
clause

View file

@ -1,10 +1,10 @@
package sqlbuilder
package jet
import (
"context"
"database/sql"
"errors"
"github.com/go-jet/jet/sqlbuilder/execution"
"github.com/go-jet/jet/execution"
)
var (

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import "testing"

View file

@ -1,10 +1,10 @@
package sqlbuilder
package jet
import (
"context"
"database/sql"
"errors"
"github.com/go-jet/jet/sqlbuilder/execution"
"github.com/go-jet/jet/execution"
)
type SetStatement interface {

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"gotest.tools/assert"

View file

@ -1,3 +0,0 @@
//
package sqlbuilder

View file

@ -1,9 +1,9 @@
package sqlbuilder
package jet
import (
"context"
"database/sql"
"github.com/go-jet/jet/sqlbuilder/execution"
"github.com/go-jet/jet/execution"
"strconv"
"strings"
)
@ -22,20 +22,20 @@ type Statement interface {
}
func DebugSql(statement Statement) (string, error) {
sql, args, err := statement.Sql()
sqlQuery, args, err := statement.Sql()
if err != nil {
return "", err
}
debugSql := sql
debugSqlQuery := sqlQuery
for i, arg := range args {
argPlaceholder := "$" + strconv.Itoa(i+1)
debugSql = strings.Replace(debugSql, argPlaceholder, ArgToString(arg), 1)
debugSqlQuery = strings.Replace(debugSqlQuery, argPlaceholder, ArgToString(arg), 1)
}
return debugSql, nil
return debugSqlQuery, nil
}
func Query(statement Statement, db execution.Db, destination interface{}) error {

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type StringExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,6 +1,6 @@
// Modeling of tables. This is where query preparation starts
package sqlbuilder
package jet
import (
"errors"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"gotest.tools/assert"
@ -67,7 +67,7 @@ func assertClauseSerializeErr(t *testing.T, clause clause, errString string) {
//fmt.Println(out.buff.String())
assert.Assert(t, err != nil)
assert.Equal(t, err.Error(), errString)
assert.Error(t, err, errString)
}
func assertProjectionSerialize(t *testing.T, projection projection, query string, args ...interface{}) {
@ -93,5 +93,5 @@ func assertStatementErr(t *testing.T, stmt Statement, errorStr string) {
_, _, err := stmt.Sql()
assert.Assert(t, err != nil)
assert.Equal(t, err.Error(), errorStr)
assert.Error(t, err, errorStr)
}

View file

@ -2,7 +2,7 @@ package tests
import (
"fmt"
. "github.com/go-jet/jet/sqlbuilder"
. "github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/model"
. "github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/table"
"github.com/google/uuid"
@ -11,7 +11,6 @@ import (
)
func TestAllTypesSelect(t *testing.T) {
dest := []model.AllTypes{}
err := AllTypes.SELECT(AllTypes.AllColumns).Query(db, &dest)

View file

@ -5,7 +5,7 @@ import (
"encoding/json"
"fmt"
"github.com/davecgh/go-spew/spew"
. "github.com/go-jet/jet/sqlbuilder"
. "github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/chinook/model"
. "github.com/go-jet/jet/tests/.test_files/dvd_rental/chinook/table"
"gotest.tools/assert"
@ -254,14 +254,14 @@ func assertJson(t *testing.T, jsonFilePath string, data interface{}) {
}
func jsonPrint(v interface{}) {
json, _ := json.MarshalIndent(v, "", "\t")
fmt.Println(string(json))
jsonText, _ := json.MarshalIndent(v, "", "\t")
fmt.Println(string(jsonText))
}
func jsonSave(path string, v interface{}) {
json, _ := json.MarshalIndent(v, "", "\t")
jsonText, _ := json.MarshalIndent(v, "", "\t")
err := ioutil.WriteFile(path, json, 0644)
err := ioutil.WriteFile(path, jsonText, 0644)
if err != nil {
panic(err)

View file

@ -2,6 +2,7 @@ package main
import (
"database/sql"
"fmt"
"github.com/go-jet/jet/generator"
"github.com/go-jet/jet/tests/dbconfig"
"io/ioutil"
@ -12,45 +13,35 @@ func main() {
if err != nil {
panic("Failed to connect to test db")
}
defer db.Close()
defer func() {
err := db.Close()
printOnError(err)
}()
testSampleSql, err := ioutil.ReadFile("./init/data/test_sample.sql")
schemaNames := []string{
"dvds",
"test_sample",
"chinook",
}
for _, schemaName := range schemaNames {
testSampleSql, err := ioutil.ReadFile("./init/data/" + schemaName + ".sql")
panicOnError(err)
_, err = db.Exec(string(testSampleSql))
panicOnError(err)
dvdsSql, err := ioutil.ReadFile("./init/data/dvds.sql")
panicOnError(err)
_, err = db.Exec(string(dvdsSql))
panicOnError(err)
err = generator.Generate("./.test_files", generator.GeneratorData{
Host: dbconfig.Host,
Port: "5432",
User: dbconfig.User,
Password: dbconfig.Password,
DBName: dbconfig.DBName,
SchemaName: "dvds",
})
panicOnError(err)
err = generator.Generate("./.test_files", generator.GeneratorData{
Host: dbconfig.Host,
Port: "5432",
User: dbconfig.User,
Password: dbconfig.Password,
DBName: dbconfig.DBName,
SchemaName: "test_sample",
SchemaName: schemaName,
})
panicOnError(err)
}
}
func panicOnError(err error) {
@ -58,3 +49,9 @@ func panicOnError(err error) {
panic(err)
}
}
func printOnError(err error) {
if err != nil {
fmt.Println(err.Error())
}
}

View file

@ -1,7 +1,7 @@
package tests
import (
. "github.com/go-jet/jet/sqlbuilder"
. "github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/model"
. "github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/table"
"gotest.tools/assert"

View file

@ -3,7 +3,7 @@ package tests
import (
"fmt"
"github.com/davecgh/go-spew/spew"
. "github.com/go-jet/jet/sqlbuilder"
. "github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/model"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/table"
"gotest.tools/assert"

View file

@ -3,7 +3,7 @@ package tests
import (
"fmt"
"github.com/davecgh/go-spew/spew"
. "github.com/go-jet/jet/sqlbuilder"
. "github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/dvds/model"
. "github.com/go-jet/jet/tests/.test_files/dvd_rental/dvds/table"
"github.com/google/uuid"

View file

@ -3,7 +3,7 @@ package tests
import (
"fmt"
"github.com/davecgh/go-spew/spew"
. "github.com/go-jet/jet/sqlbuilder"
. "github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/dvds/enum"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/dvds/model"
. "github.com/go-jet/jet/tests/.test_files/dvd_rental/dvds/table"
@ -1129,7 +1129,9 @@ LOCK TABLE dvds.address IN`
assert.NilError(t, err)
tx.Rollback()
err = tx.Rollback()
assert.NilError(t, err)
}
for _, lockMode := range testData {
@ -1143,7 +1145,9 @@ LOCK TABLE dvds.address IN`
assert.NilError(t, err)
tx.Rollback()
err = tx.Rollback()
assert.NilError(t, err)
}
}
@ -1178,7 +1182,8 @@ FOR`
rowsAffected, _ := res.RowsAffected()
assert.Equal(t, rowsAffected, int64(3))
tx.Rollback()
err = tx.Rollback()
assert.NilError(t, err)
}
for lockType, lockTypeStr := range getRowLockTestData() {
@ -1193,7 +1198,8 @@ FOR`
rowsAffected, _ := res.RowsAffected()
assert.Equal(t, rowsAffected, int64(3))
tx.Rollback()
err = tx.Rollback()
assert.NilError(t, err)
}
for lockType, lockTypeStr := range getRowLockTestData() {
@ -1208,6 +1214,7 @@ FOR`
rowsAffected, _ := res.RowsAffected()
assert.Equal(t, rowsAffected, int64(3))
tx.Rollback()
err = tx.Rollback()
assert.NilError(t, err)
}
}

View file

@ -2,7 +2,7 @@ package tests
import (
"fmt"
. "github.com/go-jet/jet/sqlbuilder"
. "github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/model"
. "github.com/go-jet/jet/tests/.test_files/dvd_rental/test_sample/table"
"gotest.tools/assert"

View file

@ -1,7 +1,7 @@
package tests
import (
"github.com/go-jet/jet/sqlbuilder"
"github.com/go-jet/jet"
"github.com/go-jet/jet/tests/.test_files/dvd_rental/dvds/model"
"github.com/google/uuid"
"gotest.tools/assert"
@ -10,7 +10,7 @@ import (
"time"
)
func assertStatementSql(t *testing.T, query sqlbuilder.Statement, expectedQuery string, expectedArgs ...interface{}) {
func assertStatementSql(t *testing.T, query jet.Statement, expectedQuery string, expectedArgs ...interface{}) {
_, args, err := query.Sql()
assert.NilError(t, err)
//assert.Equal(t, queryStr, expectedQuery)
@ -22,7 +22,7 @@ func assertStatementSql(t *testing.T, query sqlbuilder.Statement, expectedQuery
assert.Equal(t, debuqSql, expectedQuery)
}
func assertExec(t *testing.T, stmt sqlbuilder.Statement, rowsAffected int64) {
func assertExec(t *testing.T, stmt jet.Statement, rowsAffected int64) {
res, err := stmt.Exec(db)
assert.NilError(t, err)
@ -31,10 +31,10 @@ func assertExec(t *testing.T, stmt sqlbuilder.Statement, rowsAffected int64) {
assert.Equal(t, rows, rowsAffected)
}
func assertExecErr(t *testing.T, stmt sqlbuilder.Statement, errorStr string) {
func assertExecErr(t *testing.T, stmt jet.Statement, errorStr string) {
_, err := stmt.Exec(db)
assert.Equal(t, err.Error(), errorStr)
assert.Error(t, err, errorStr)
}
func boolPtr(b bool) *bool {
return &b
@ -68,29 +68,29 @@ func float64Ptr(f float64) *float64 {
}
func uuidPtr(u string) *uuid.UUID {
uuid := uuid.MustParse(u)
newUUID := uuid.MustParse(u)
return &uuid
return &newUUID
}
func timeWithoutTimeZone(t string) *time.Time {
time, err := time.Parse("15:04:05", t)
newTime, err := time.Parse("15:04:05", t)
if err != nil {
panic(err)
}
return &time
return &newTime
}
func timeWithTimeZone(t string) *time.Time {
time, err := time.Parse("15:04:05 -0700", t)
newTimez, err := time.Parse("15:04:05 -0700", t)
if err != nil {
panic(err)
}
return &time
return &newTimez
}
func timestampWithoutTimeZone(t string, precision int) *time.Time {
@ -101,13 +101,13 @@ func timestampWithoutTimeZone(t string, precision int) *time.Time {
precisionStr = "." + strings.Repeat("9", precision)
}
time, err := time.Parse("2006-01-02 15:04:05"+precisionStr+" +0000", t+" +0000")
newTime, err := time.Parse("2006-01-02 15:04:05"+precisionStr+" +0000", t+" +0000")
if err != nil {
panic(err)
}
return &time
return &newTime
}
func timestampWithTimeZone(t string, precision int) *time.Time {
@ -118,17 +118,13 @@ func timestampWithTimeZone(t string, precision int) *time.Time {
precisionStr = "." + strings.Repeat("9", precision)
}
time, err := time.Parse("2006-01-02 15:04:05"+precisionStr+" -0700 MST", t)
newTime, err := time.Parse("2006-01-02 15:04:05"+precisionStr+" -0700 MST", t)
if err != nil {
panic(err)
}
return &time
}
func M3(a, b, c interface{}) []interface{} {
return []interface{}{a, b, c}
return &newTime
}
var customer0 = model.Customer{

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type TimeExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type TimestampExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type TimestampzExpression interface {
Expression

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
type TimezExpression interface {
Expression

View file

@ -1,10 +1,10 @@
package sqlbuilder
package jet
import (
"context"
"database/sql"
"errors"
"github.com/go-jet/jet/sqlbuilder/execution"
"github.com/go-jet/jet/execution"
)
type UpdateStatement interface {

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"testing"

View file

@ -1,4 +1,4 @@
package sqlbuilder
package jet
import (
"errors"