From 7a544352456c1e2c552523d48424b028ab712424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E6=96=8C?= Date: Sun, 13 Oct 2024 22:54:33 +0800 Subject: [PATCH 1/2] ... --- go.mod | 65 +++++++++++++++------------- go.sum | 134 +++++++++++++++++++++++++++++---------------------------- 2 files changed, 102 insertions(+), 97 deletions(-) diff --git a/go.mod b/go.mod index 1f6b03b6..1fb2e573 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/go-git/go-billy/v5 v5.4.1 github.com/go-git/go-git/v5 v5.6.1 github.com/go-resty/resty/v2 v2.7.0 - github.com/go-sql-driver/mysql v1.7.1 + github.com/go-sql-driver/mysql v1.8.1 github.com/goccy/go-yaml v1.11.0 github.com/hyperjumptech/jiffy v1.0.0 github.com/iancoleman/strcase v0.2.0 @@ -30,10 +30,10 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.9.0 - github.com/testcontainers/testcontainers-go v0.31.0 + github.com/testcontainers/testcontainers-go v0.33.0 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/uber/jaeger-lib v2.4.1+incompatible - golang.org/x/tools v0.16.1 + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d ) require ( @@ -67,15 +67,15 @@ require ( github.com/rs/cors v1.9.0 github.com/samber/lo v1.39.0 github.com/slok/goresilience v0.2.0 - github.com/wubin1989/clickhouse v0.0.3-0.20240611142627-b655b8690cda - github.com/wubin1989/datatypes v0.0.2-0.20240611143143-56e1066d0d46 - github.com/wubin1989/dbresolver v0.0.2-0.20240611143237-5d31d83b04ba - github.com/wubin1989/gorm v0.0.4 - github.com/wubin1989/hints v0.0.2-0.20240611143337-989d3cd7fd24 - github.com/wubin1989/mysql v0.0.2-0.20240611142742-11722462c1f3 + github.com/wubin1989/clickhouse v0.0.3 + github.com/wubin1989/datatypes v0.0.2 + github.com/wubin1989/dbresolver v0.0.2 + github.com/wubin1989/gorm v0.0.5 + github.com/wubin1989/hints v0.0.2 + github.com/wubin1989/mysql v0.0.2 github.com/wubin1989/prometheus v0.0.2-0.20240611143457-960b4a499cef - github.com/wubin1989/sqlite v0.0.3-0.20240611143051-c35482f79d92 - github.com/wubin1989/sqlserver v0.0.2-0.20240611142955-b9bee6e252c3 + github.com/wubin1989/sqlite v0.0.3 + github.com/wubin1989/sqlserver v0.0.2 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 go.uber.org/mock v0.4.0 gopkg.in/yaml.v3 v3.0.1 @@ -83,8 +83,9 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect github.com/ClickHouse/ch-go v0.61.5 // indirect - github.com/ClickHouse/clickhouse-go/v2 v2.23.2 // indirect + github.com/ClickHouse/clickhouse-go/v2 v2.29.0 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 // indirect @@ -96,15 +97,16 @@ require ( github.com/cockroachdb/redact v1.0.8 // indirect github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect github.com/cpuguy83/dockercfg v0.3.1 // indirect - github.com/distribution/reference v0.5.0 // indirect + github.com/distribution/reference v0.6.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/getsentry/raven-go v0.2.0 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.7.1 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/golang/glog v1.1.2 // indirect + github.com/golang/glog v1.2.0 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect @@ -116,6 +118,7 @@ require ( github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/paulmach/orb v0.11.1 // indirect github.com/pegasus-kv/thrift v0.13.0 // indirect @@ -126,10 +129,12 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.26.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect golang.org/x/arch v0.1.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 // indirect k8s.io/apimachinery v0.26.2 // indirect @@ -137,8 +142,7 @@ require ( require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.11.4 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704 // indirect @@ -234,10 +238,10 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sync v0.6.0 - golang.org/x/sys v0.19.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sync v0.8.0 + golang.org/x/sys v0.23.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/protobuf v1.33.0 // indirect @@ -252,8 +256,7 @@ require ( github.com/apolloconfig/agollo/v4 v4.1.1-0.20220323095621-60ed86180f24 github.com/arl/statsviz v0.6.0 github.com/armon/go-metrics v0.4.1 - github.com/containerd/containerd v1.7.15 // indirect - github.com/docker/docker v26.0.1+incompatible // indirect + github.com/docker/docker v27.3.0+incompatible // indirect github.com/fatih/color v1.12.0 // indirect github.com/getkin/kin-openapi v0.115.0 github.com/ghodss/yaml v1.0.0 @@ -276,8 +279,8 @@ require ( github.com/lithammer/shortuuid/v4 v4.0.0 github.com/mattn/go-colorable v0.1.13 github.com/mattn/go-runewidth v0.0.10 // indirect - github.com/mattn/go-sqlite3 v1.14.17 // indirect - github.com/microsoft/go-mssqldb v1.7.0 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect github.com/miekg/dns v1.1.54 github.com/moby/term v0.5.0 // indirect github.com/morikuni/aec v1.0.0 // indirect @@ -290,12 +293,12 @@ require ( github.com/smartystreets/goconvey v1.7.2 github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb github.com/wubin1989/nacos-sdk-go/v2 v2.1.2-0.20221024120645-0288f53fdaa8 - github.com/wubin1989/postgres v0.0.2-0.20240611142853-f89b1682d931 + github.com/wubin1989/postgres v0.0.2 go.etcd.io/etcd/client/v3 v3.5.14 go.uber.org/automaxprocs v1.5.2 - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.26.0 // indirect golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea - golang.org/x/text v0.14.0 - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/grpc v1.59.0 + golang.org/x/text v0.17.0 + google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 // indirect + google.golang.org/grpc v1.64.1 ) diff --git a/go.sum b/go.sum index 667d645c..24d94b43 100644 --- a/go.sum +++ b/go.sum @@ -598,6 +598,8 @@ cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcP dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= @@ -627,8 +629,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= -github.com/ClickHouse/clickhouse-go/v2 v2.23.2 h1:+DAKPMnxLS7pduQZsrJc8OhdLS2L9MfDEJ2TS+hpYDM= -github.com/ClickHouse/clickhouse-go/v2 v2.23.2/go.mod h1:aNap51J1OM3yxQJRgM+AlP/MPkGBCL8A74uQThoQhR0= +github.com/ClickHouse/clickhouse-go/v2 v2.29.0 h1:Dj1w59RssRyLgGHXtYaWU0eIM1pJsu9nGPi/btmvAqw= +github.com/ClickHouse/clickhouse-go/v2 v2.29.0/go.mod h1:bLookq6qZJ4Ush/6tOAnJGh1Sf3Sa/nQoMn71p7ZCUE= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= @@ -642,10 +644,8 @@ github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0 github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= -github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= @@ -786,10 +786,10 @@ github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 h1:tjT4Jp4gxECvsJcYpAMtW2I3YqzBTPuB67OejxXs86s= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= -github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= -github.com/containerd/containerd v1.7.15/go.mod h1:ISzRRTMF8EXNpJlTzyr2XMhN+j9K302C21/+cr3kUnY= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/coocood/freecache v1.2.4 h1:UdR6Yz/X1HW4fZOuH0Z94KwG851GWOSknua5VUbb/5M= github.com/coocood/freecache v1.2.4/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -828,12 +828,12 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v26.0.1+incompatible h1:t39Hm6lpXuXtgkF0dm1t9a5HkbUfdGy6XbWexmGr+hA= -github.com/docker/docker v26.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.3.0+incompatible h1:BNb1QY6o4JdKpqwi9IB+HUYcRRrVN4aGFUTvDmWYK1A= +github.com/docker/docker v27.3.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -970,9 +970,8 @@ github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= -github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -1013,8 +1012,8 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1380,8 +1379,8 @@ github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRR github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= -github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -1391,8 +1390,8 @@ github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQ github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microsoft/go-mssqldb v1.7.0 h1:sgMPW0HA6Ihd37Yx0MzHyKD726C2kY/8KJsQtXHNaAs= -github.com/microsoft/go-mssqldb v1.7.0/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI= github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= @@ -1417,6 +1416,8 @@ github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5 github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1692,8 +1693,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/testcontainers/testcontainers-go v0.31.0 h1:W0VwIhcEVhRflwL9as3dhY6jXjVCA27AkmbnZ+UTh3U= -github.com/testcontainers/testcontainers-go v0.31.0/go.mod h1:D2lAoA0zUFiSY+eAflqK5mcUx/A5hrrORaEQrd0SefI= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -1732,29 +1733,29 @@ github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9 github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/wubin1989/clickhouse v0.0.3-0.20240611142627-b655b8690cda h1:K8aGeEwIwMVGam4klbiXdxvDVAzh2I9P38QDr1Xubio= -github.com/wubin1989/clickhouse v0.0.3-0.20240611142627-b655b8690cda/go.mod h1:pIVh0MTLUDKIGbkJGtAd3GuWuDXqJKFQtAYyrXftNcg= -github.com/wubin1989/datatypes v0.0.2-0.20240611143143-56e1066d0d46 h1:2PtAVdFagYjrBlGJrtWqd3gHwWUwn6EHMIw9mflEP18= -github.com/wubin1989/datatypes v0.0.2-0.20240611143143-56e1066d0d46/go.mod h1:zf0H8F3yk6l0WxQTtuf6c5cQ1KyMniqPGVi+wsP+Pwo= -github.com/wubin1989/dbresolver v0.0.2-0.20240611143237-5d31d83b04ba h1:t8iGZmi0DDV3fFXQLTbvJo3oi6FIrcW+QoIq1JyaR40= -github.com/wubin1989/dbresolver v0.0.2-0.20240611143237-5d31d83b04ba/go.mod h1:fdp9eyI05mcyy42qGZzxmxX9JMCMjeId9pzIb7ETN2M= +github.com/wubin1989/clickhouse v0.0.3 h1:lHxjVsqgtf9091K45j2jul3Z52XLmyyR8CFby3kwKvw= +github.com/wubin1989/clickhouse v0.0.3/go.mod h1:n6xglwUs3YRK4AaLWsytJio3+07UwpPhYy4lNvsWw1Q= +github.com/wubin1989/datatypes v0.0.2 h1:a2ZiuWjqiYHRS+lkvan8QymxYtB1yvwJHf0kE7mqAnk= +github.com/wubin1989/datatypes v0.0.2/go.mod h1:ifZrSL9ZeEfOqWxCvAx6ugbiMYcMPRyY2mSgN8qRdKE= +github.com/wubin1989/dbresolver v0.0.2 h1:nxZJa7TSPRWvrHyshbBhoiHFt3/cagHi1qOySrCyqjE= +github.com/wubin1989/dbresolver v0.0.2/go.mod h1:QCzD3CTzNXQ8Vk/V0WRdCQw2Mu8d/UGa3AyRIbbe9hc= github.com/wubin1989/gorm v0.0.3/go.mod h1:sv3afa8/Q6XTgEbTTWTjJd0NIlBMH4bMq5VpEnXr/Cc= -github.com/wubin1989/gorm v0.0.4 h1:ItRawZeMeGsGFw9H2biEV2o8Bg3qv+07MWwZrnZfLOE= -github.com/wubin1989/gorm v0.0.4/go.mod h1:sv3afa8/Q6XTgEbTTWTjJd0NIlBMH4bMq5VpEnXr/Cc= -github.com/wubin1989/hints v0.0.2-0.20240611143337-989d3cd7fd24 h1:ZCC6dSYWh4251NNDrQ8LnR8vGVTqJmUJQ6OvGyjj86c= -github.com/wubin1989/hints v0.0.2-0.20240611143337-989d3cd7fd24/go.mod h1:D2RyfIt/EQDPauzJoc21JHaEPRDtkJXjpCyJii6Qowo= -github.com/wubin1989/mysql v0.0.2-0.20240611142742-11722462c1f3 h1:23Whb/nEWyGXOrXs41cvzqZOKrtxE6iq4+9K5yhoRC0= -github.com/wubin1989/mysql v0.0.2-0.20240611142742-11722462c1f3/go.mod h1:feHpEjnhL/oGHaiOwD2wUGhkWFHnTFrgk2/gRqIoit0= +github.com/wubin1989/gorm v0.0.5 h1:eI+zjoQ2GEURnPBEh+H4axSD4sM0wWpJCAQZw+FfZX8= +github.com/wubin1989/gorm v0.0.5/go.mod h1:q/wDV7AJMsbDdtv+K3eNX+VMpC0k1uxCqPBPXzHO90k= +github.com/wubin1989/hints v0.0.2 h1:hPLqrRV4O15zS93mHhcCtQlpAfpG/YByVAo2KU7WdFk= +github.com/wubin1989/hints v0.0.2/go.mod h1:XF4CQtyVTXmGtkHTYrHba/zcz761+71XqB3BDQPYd9s= +github.com/wubin1989/mysql v0.0.2 h1:OgJ3LS6LfCBtWboQ2ghw6UXETMWyNb2fe2MLBELIpDg= +github.com/wubin1989/mysql v0.0.2/go.mod h1:X6kei/oCZkghaulJzYjIEnFQLe59WYFMczj4hDObDN8= github.com/wubin1989/nacos-sdk-go/v2 v2.1.2-0.20221024120645-0288f53fdaa8 h1:lFIaajFUmboXJ/sL/HUyg+9jakQVq5ohPToycWyt9ms= github.com/wubin1989/nacos-sdk-go/v2 v2.1.2-0.20221024120645-0288f53fdaa8/go.mod h1:Z30xHaEyVwGKmbXHGM5uuh7pQkV66p/wiC3mGHCyhWQ= -github.com/wubin1989/postgres v0.0.2-0.20240611142853-f89b1682d931 h1:QTaIX4r0bnus4AkfSbxSN2Qc0shwnkZGxXptx0icccQ= -github.com/wubin1989/postgres v0.0.2-0.20240611142853-f89b1682d931/go.mod h1:v2djFEEBRl6SaR2UI7wRtRVwGXfarCQRU8cWHZKaKJE= +github.com/wubin1989/postgres v0.0.2 h1:skgTBzvhXouB8sk8QW3CIL12IHc4yjxp0HFlmQWk+w0= +github.com/wubin1989/postgres v0.0.2/go.mod h1:ak4xecaBWCvjryICTXlDtHwkK8QV1ibtBF/d2YzI+lw= github.com/wubin1989/prometheus v0.0.2-0.20240611143457-960b4a499cef h1:jzuCPuY2BW5ia5xYfr0u1UL4K4jmB/spzPHZYcihcJA= github.com/wubin1989/prometheus v0.0.2-0.20240611143457-960b4a499cef/go.mod h1:yK1GqsgQank3HXNrHDxpYnmjEu+K5MI4iIxjIhzWrFE= -github.com/wubin1989/sqlite v0.0.3-0.20240611143051-c35482f79d92 h1:NIr2PCLZf2N1YTMkDRKOkGsGf3zNImp75Mq3/711WXU= -github.com/wubin1989/sqlite v0.0.3-0.20240611143051-c35482f79d92/go.mod h1:DMWHq2F64sr/bnVXmbe5VX/6Y4orGPjX/rgcyOW7+K0= -github.com/wubin1989/sqlserver v0.0.2-0.20240611142955-b9bee6e252c3 h1:6RF+iXbNg9iaSchnEsy0QTQld2HFiXlNvo+g5WfbnLs= -github.com/wubin1989/sqlserver v0.0.2-0.20240611142955-b9bee6e252c3/go.mod h1:zoRF5ZmmvErOaz2im1Ef7fAR+KrUORC6LZbqdUeaOLQ= +github.com/wubin1989/sqlite v0.0.3 h1:HpeLMcNQ0pFHCk3QNAYjYUt6OpZiWykBe1o5FC6NxTg= +github.com/wubin1989/sqlite v0.0.3/go.mod h1:sJwi+4OqdP6KL56LUuJsqeubNREEpNpj+/Hp3YZ9zQI= +github.com/wubin1989/sqlserver v0.0.2 h1:9KHzJ2/OC7ORsLO+7Lx/PAVabw9fG5AE6jw3kLDqI/c= +github.com/wubin1989/sqlserver v0.0.2/go.mod h1:INhW70C5Zax3s+KDrU/6R6/2yueRe7gZ2+MUDGcxKUA= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= @@ -1873,8 +1874,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1935,8 +1936,8 @@ golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2018,8 +2019,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2070,8 +2071,8 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2195,8 +2196,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2214,8 +2215,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2236,8 +2237,9 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2320,8 +2322,8 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2545,21 +2547,21 @@ google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 h1:vlzZttNJGVqTsRFU9AmdnrcO1Znh8Ew9kCD//yjigk0= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -2602,8 +2604,8 @@ google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2667,8 +2669,8 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From c27745d879526fb2161045c5a24af6437ee3b29f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A6=E6=96=8C?= Date: Mon, 14 Oct 2024 00:01:03 +0800 Subject: [PATCH 2/2] some refactor --- cmd/crud.go | 6 +- cmd/ddl.go | 8 +- cmd/ddl_test.go | 2 +- cmd/grpc.go | 2 +- cmd/init.go | 4 +- cmd/internal/ddl/codegen/dao.go | 14 +- cmd/internal/ddl/codegen/daosql.go | 2 +- cmd/internal/ddl/codegen/dto.go | 2 +- cmd/internal/ddl/codegen/entity.go | 4 +- cmd/internal/ddl/codegen/idao.go | 4 +- cmd/internal/ddl/ddlast/ast.go | 4 +- cmd/internal/ddl/exec.go | 4 +- cmd/internal/ddl/table/ddl.go | 16 +- cmd/internal/ddl/table/ddl_test.go | 2 +- cmd/internal/ddl/table/table.go | 6 +- cmd/internal/ddl/table/table_test.go | 4 +- cmd/internal/enum/generator.go | 4 +- cmd/internal/modular/work.go | 6 +- cmd/internal/name/exec.go | 4 +- cmd/internal/name/exec_test.go | 2 +- cmd/internal/openapi/v3/codegen/client/go.go | 2 +- cmd/internal/openapi/v3/codegen/common.go | 16 +- .../openapi/v3/codegen/common_test.go | 4 +- cmd/internal/openapi/v3/codegen/server.go | 10 +- cmd/internal/openapi/v3/codegen/server/svc.go | 4 +- .../codegen/testdata/test/downloadclient.go | 4 +- .../v3/codegen/testdata/test/petclient.go | 2 +- .../v3/codegen/testdata/test/textclient.go | 2 +- .../v3/codegen/testdata/test/uploadclient.go | 2 +- cmd/internal/svc/codegen/config.go | 6 +- cmd/internal/svc/codegen/config_test.go | 2 +- cmd/internal/svc/codegen/database/common.go | 8 +- cmd/internal/svc/codegen/database/gorm.go | 16 +- cmd/internal/svc/codegen/db.go | 2 +- cmd/internal/svc/codegen/grpcannotation.go | 2 +- cmd/internal/svc/codegen/grpchttpmain.go | 6 +- cmd/internal/svc/codegen/grpcmain.go | 10 +- cmd/internal/svc/codegen/grpcmod.go | 4 +- cmd/internal/svc/codegen/grpcproto.go | 9 +- cmd/internal/svc/codegen/http.go | 2 +- cmd/internal/svc/codegen/http2grpc.go | 4 +- cmd/internal/svc/codegen/httpclient.go | 12 +- cmd/internal/svc/codegen/httpclient_test.go | 2 +- cmd/internal/svc/codegen/httpclientproxy.go | 12 +- .../svc/codegen/httpclientproxy_test.go | 2 +- cmd/internal/svc/codegen/httphandler.go | 2 +- cmd/internal/svc/codegen/httphandlerimpl.go | 10 +- .../svc/codegen/httphandlerimpl_test.go | 4 +- cmd/internal/svc/codegen/httpiclient.go | 6 +- cmd/internal/svc/codegen/httpiclient_test.go | 2 +- .../svc/codegen/httpintegrationtesting.go | 6 +- .../codegen/httpintegrationtesting_test.go | 2 +- cmd/internal/svc/codegen/init.go | 10 +- cmd/internal/svc/codegen/init_test.go | 2 +- .../svc/codegen/k8sdeployment_test.go | 2 +- .../svc/codegen/k8sstatefulset_test.go | 2 +- cmd/internal/svc/codegen/main.go | 2 +- cmd/internal/svc/codegen/main_test.go | 2 +- cmd/internal/svc/codegen/mainmodule.go | 2 +- cmd/internal/svc/codegen/plugin.go | 2 +- cmd/internal/svc/codegen/svcimpl.go | 6 +- .../codegen/testdata/client/clientproxy.go | 2 +- .../svc/codegen/testdata/client/iclient.go | 2 +- .../svc/codegen/testdata/config/config.go | 2 +- cmd/internal/svc/codegen/testdata/svc.go | 2 +- cmd/internal/svc/codegen/testdata/svcimpl.go | 2 +- cmd/internal/svc/codegen/testdata/svcp.go | 2 +- .../testdata/transport/httpsrv/handlerimpl.go | 4 +- cmd/internal/svc/parser/parser.go | 10 +- cmd/internal/svc/svc.go | 10 +- cmd/internal/svc/svc_test.go | 8 +- cmd/internal/svc/testdata/checkIc2/svc.go | 2 +- cmd/internal/svc/testdata/novo/svc.go | 2 +- cmd/internal/svc/testdata/svc.go | 2 +- cmd/internal/svc/testdata/svcp.go | 2 +- cmd/internal/svc/validate/validate.go | 6 +- cmd/internal/templates/mainmain.go | 4 +- cmd/internal/templates/mainmodule.go | 2 +- cmd/internal/templates/plugin.go | 6 +- cmd/modular/init.go | 4 +- cmd/name_test.go | 2 +- cmd/testdata/testsvc/config/config.go | 2 +- framework/cache/2qcache.go | 2 +- framework/cache/arccache.go | 2 +- framework/cache/cachemanager.go | 18 +- framework/cache/lrucache.go | 2 +- framework/config/config.go | 16 +- framework/configmgr/apollo.go | 2 +- framework/configmgr/nacos.go | 8 +- framework/configmgr/nacos_test.go | 2 +- framework/database/cacheradapter.go | 8 +- framework/database/database.go | 12 +- framework/database/marshaler.go | 8 +- .../grpcx/grpc_resolver_nacos/balancer.go | 2 +- framework/grpcx/grpc_resolver_zk/balancer.go | 2 +- framework/grpcx/grpc_resolver_zk/zk.go | 2 +- framework/grpcx/server.go | 4 +- framework/logger/configure.go | 2 +- framework/logger/entry.go | 4 +- framework/plugin/plugin.go | 2 +- framework/ratelimit/memrate/memorystore.go | 2 +- framework/ratelimit/memrate/rate.go | 2 +- framework/ratelimit/redisrate/gcralimiter.go | 2 +- framework/registry/etcd/balancer.go | 2 +- framework/registry/etcd/node.go | 8 +- framework/registry/memberlist/balancer.go | 2 +- framework/registry/memberlist/config.go | 6 +- framework/registry/memberlist/config_test.go | 2 +- framework/registry/memberlist/delegate.go | 4 +- .../registry/memberlist/delegate_test.go | 2 +- .../registry/memberlist/eventdelegate.go | 2 +- .../registry/memberlist/eventdelegate_test.go | 2 +- framework/registry/memberlist/node.go | 10 +- framework/registry/memberlist/resolver.go | 2 +- .../registry/memberlist/serviceprovider.go | 6 +- .../memberlist/serviceprovider_test.go | 2 +- framework/registry/nacos/node.go | 8 +- framework/registry/node.go | 2 +- framework/registry/pipe/node.go | 4 +- framework/registry/serversets/endpoint.go | 2 +- framework/registry/serversets/watch.go | 4 +- framework/registry/utils/utils.go | 4 +- framework/registry/zk/node.go | 10 +- framework/rest/confighandler.go | 2 +- framework/rest/dochandler.go | 2 +- framework/rest/form.go | 4 +- framework/rest/httprouter/routegroup.go | 2 +- framework/rest/memberlistuihandler.go | 2 +- framework/rest/middleware.go | 4 +- framework/rest/middleware_test.go | 2 +- framework/rest/model.go | 2 +- framework/rest/prommiddleware.go | 4 +- framework/rest/server.go | 4 +- framework/rest/validate.go | 2 +- framework/restclient/restclient.go | 2 +- framework/testdata/checkIc2/svc.go | 2 +- framework/testdata/novo/svc.go | 2 +- framework/testdata/svc.go | 2 +- framework/testdata/svcp.go | 2 +- framework/tracing/tracer.go | 4 +- go.mod | 98 +- go.sum | 131 +- toolkit/assert/assert.go | 36 - toolkit/astutils/enumcollector.go | 107 - toolkit/astutils/enumcollector_test.go | 21 - toolkit/astutils/funcs.go | 493 - toolkit/astutils/funcs_test.go | 463 - toolkit/astutils/helper.go | 70 - toolkit/astutils/helper_test.go | 39 - toolkit/astutils/interfacecollector.go | 303 - toolkit/astutils/interfacecollector_test.go | 106 - toolkit/astutils/rewritejsontag.go | 133 - toolkit/astutils/rewritejsontag_test.go | 149 - toolkit/astutils/staticmethodcollector.go | 67 - toolkit/astutils/structcollector.go | 175 - toolkit/astutils/structcollector_test.go | 252 - toolkit/astutils/testdata/alias.go | 44 - toolkit/astutils/testdata/cat.go | 47 - .../astutils/testdata/demo/config/config.go | 1 - toolkit/astutils/testdata/demo/go.mod | 3 - toolkit/astutils/testdata/embed.go | 13 - toolkit/astutils/testdata/embed1.go | 11 - toolkit/astutils/testdata/embed2.go | 11 - toolkit/astutils/testdata/embed3.go | 11 - toolkit/astutils/testdata/embed4.go | 11 - toolkit/astutils/testdata/embed5.go | 11 - toolkit/astutils/testdata/entity/base.go | 9 - toolkit/astutils/testdata/entity/material.go | 14 - toolkit/astutils/testdata/entity/purchase.go | 17 - toolkit/astutils/testdata/entity/user.go | 14 - toolkit/astutils/testdata/enum.go | 65 - toolkit/astutils/testdata/output.go | 28 - toolkit/astutils/testdata/rewritejsontag.go | 14 - toolkit/astutils/testdata/svc.go | 45 - toolkit/astutils/testdata/vo.go | 145 - toolkit/astutils/testdata/vo/cat.go | 14 - toolkit/cache/.prettierrc.yml | 4 - toolkit/cache/CHANGELOG.md | 9 - toolkit/cache/LICENSE | 25 - toolkit/cache/Makefile | 6 - toolkit/cache/README.md | 122 - toolkit/cache/bench_test.go | 58 - toolkit/cache/cache.go | 404 - toolkit/cache/cache_test.go | 426 - toolkit/cache/example_cache_test.go | 84 - toolkit/cache/local.go | 81 - toolkit/cache/local_test.go | 56 - toolkit/caches/LICENSE | 21 - toolkit/caches/README.md | 235 - toolkit/caches/cacher.go | 7 - toolkit/caches/cacher_test.go | 66 - toolkit/caches/caches.go | 365 - toolkit/caches/caches_test.go | 423 - toolkit/caches/easer.go | 30 - toolkit/caches/easer_test.go | 102 - toolkit/caches/identifier.go | 35 - toolkit/caches/identifier_test.go | 20 - toolkit/caches/query.go | 14 - toolkit/caches/query_task.go | 17 - toolkit/caches/query_task_test.go | 38 - toolkit/caches/reflection.go | 81 - toolkit/caches/reflection_test.go | 215 - toolkit/caches/task.go | 6 - toolkit/caches/task_test.go | 21 - toolkit/caller/caller.go | 28 - toolkit/caller/caller_test.go | 13 - toolkit/cast/string.go | 174 - toolkit/cast/string_test.go | 884 - toolkit/cast/stringslice.go | 300 - toolkit/cast/stringslice_test.go | 976 -- toolkit/common/utils.go | 76 - toolkit/concurrency/do.go | 30 - toolkit/concurrency/signal.go | 124 - toolkit/concurrency/signal_test.go | 95 - toolkit/concurrency/types.go | 30 - toolkit/concurrency/wait.go | 51 - toolkit/constants/constants.go | 53 - toolkit/constants/constants_darwin.go | 3 - toolkit/constants/constants_linux.go | 3 - toolkit/constants/constants_windows.go | 3 - toolkit/copier/copier.go | 30 - toolkit/copier/copier_test.go | 143 - toolkit/customtypes/time.go | 46 - toolkit/customtypes/time_test.go | 35 - toolkit/dotenv/dotenv.go | 32 - toolkit/dotenv/dotenv_test.go | 44 - toolkit/dotenv/testdata/.env | 2 - toolkit/envconfig/LICENSE | 19 - toolkit/envconfig/README.md | 231 - toolkit/envconfig/doc.go | 8 - toolkit/envconfig/env_os.go | 8 - toolkit/envconfig/env_syscall.go | 8 - toolkit/envconfig/envconfig.go | 592 - toolkit/envconfig/envconfig_1.8_test.go | 69 - toolkit/envconfig/envconfig_test.go | 936 - toolkit/envconfig/testdata/custom.txt | 36 - toolkit/envconfig/testdata/default_list.txt | 183 - toolkit/envconfig/testdata/default_table.txt | 40 - toolkit/envconfig/testdata/fault.txt | 36 - toolkit/envconfig/usage.go | 164 - toolkit/envconfig/usage_test.go | 155 - toolkit/errorx/errorx.go | 17 - toolkit/executils/executils.go | 38 - toolkit/executils/executils_test.go | 26 - toolkit/fileutils/fileutils.go | 53 - toolkit/fileutils/fileutils_test.go | 42 - toolkit/fileutils/testfiles | 0 toolkit/form/.gitignore | 28 - toolkit/form/LICENSE | 21 - toolkit/form/Makefile | 13 - toolkit/form/README.md | 323 - .../form/_examples/decoder-embedded/main.go | 65 - toolkit/form/_examples/decoder/full.go | 173 - .../form/_examples/encoder-embedded/main.go | 58 - .../form/_examples/encoder-omitempty/main.go | 41 - toolkit/form/_examples/encoder/full.go | 55 - toolkit/form/benchmarks/benchmarks.md | 31 - toolkit/form/benchmarks/benchmarks_test.go | 653 - toolkit/form/cache.go | 142 - toolkit/form/cache_test.go | 52 - toolkit/form/decoder.go | 814 - toolkit/form/decoder_test.go | 1938 -- toolkit/form/doc.go | 275 - toolkit/form/encoder.go | 261 - toolkit/form/encoder_test.go | 1609 -- toolkit/form/form.go | 49 - toolkit/form/form_decoder.go | 207 - toolkit/form/form_encoder.go | 157 - toolkit/form/logo.jpg | Bin 20388 -> 0 bytes toolkit/form/util.go | 62 - toolkit/gocache/.gitignore | 3 - toolkit/gocache/LICENSE | 19 - toolkit/gocache/Makefile | 30 - toolkit/gocache/README.md | 554 - toolkit/gocache/lib/cache/cache.go | 117 - toolkit/gocache/lib/cache/cache_mock.go | 318 - toolkit/gocache/lib/cache/cache_test.go | 381 - toolkit/gocache/lib/cache/chain.go | 130 - toolkit/gocache/lib/cache/chain_test.go | 453 - toolkit/gocache/lib/cache/interface.go | 39 - toolkit/gocache/lib/cache/loadable.go | 141 - toolkit/gocache/lib/cache/loadable_test.go | 301 - toolkit/gocache/lib/cache/metric.go | 78 - toolkit/gocache/lib/cache/metric_test.go | 291 - toolkit/gocache/lib/codec/codec.go | 142 - toolkit/gocache/lib/codec/codec_mock.go | 162 - toolkit/gocache/lib/codec/codec_test.go | 448 - toolkit/gocache/lib/codec/interface.go | 21 - toolkit/gocache/lib/marshaler/marshaler.go | 67 - .../gocache/lib/marshaler/marshaler_test.go | 327 - toolkit/gocache/lib/metrics/interface.go | 8 - toolkit/gocache/lib/metrics/metrics_mock.go | 47 - toolkit/gocache/lib/metrics/prometheus.go | 102 - .../gocache/lib/metrics/prometheus_test.go | 166 - toolkit/gocache/lib/misc/benchmarks.jpeg | Bin 49481 -> 0 bytes toolkit/gocache/lib/store/errors.go | 27 - toolkit/gocache/lib/store/errors_test.go | 22 - toolkit/gocache/lib/store/interface.go | 17 - .../gocache/lib/store/invalidate_options.go | 39 - .../lib/store/invalidate_options_test.go | 17 - toolkit/gocache/lib/store/options.go | 79 - toolkit/gocache/lib/store/options_test.go | 52 - .../lib/store/options_test_matchers.go | 64 - toolkit/gocache/lib/store/store_mock.go | 147 - toolkit/gocache/store/bigcache/bigcache.go | 152 - .../store/bigcache/bigcache_bench_test.go | 52 - .../gocache/store/bigcache/bigcache_mock.go | 91 - .../gocache/store/bigcache/bigcache_test.go | 340 - toolkit/gocache/store/freecache/freecache.go | 189 - .../store/freecache/freecache_bench_test.go | 54 - .../gocache/store/freecache/freecache_mock.go | 147 - .../gocache/store/freecache/freecache_test.go | 501 - toolkit/gocache/store/go_cache/go_cache.go | 158 - .../store/go_cache/go_cache_bench_test.go | 54 - .../gocache/store/go_cache/go_cache_mock.go | 102 - .../gocache/store/go_cache/go_cache_test.go | 346 - toolkit/gocache/store/hazelcast/hazelcast.go | 184 - .../hazelcast/hazelcast_benchmark_test.go | 58 - .../gocache/store/hazelcast/hazelcast_mock.go | 110 - .../gocache/store/hazelcast/hazelcast_test.go | 201 - toolkit/gocache/store/memcache/memcache.go | 199 - .../store/memcache/memcache_bench_test.go | 56 - .../gocache/store/memcache/memcache_mock.go | 120 - .../gocache/store/memcache/memcache_test.go | 417 - toolkit/gocache/store/pegasus/pegasus.go | 305 - .../store/pegasus/pegasus_bench_test.go | 51 - toolkit/gocache/store/pegasus/pegasus_test.go | 219 - toolkit/gocache/store/redis/redis.go | 140 - .../gocache/store/redis/redis_bench_test.go | 53 - toolkit/gocache/store/redis/redis_mock.go | 159 - toolkit/gocache/store/redis/redis_test.go | 183 - .../store/rediscluster/rediscluster.go | 137 - .../rediscluster/rediscluster_bench_test.go | 57 - .../store/rediscluster/rediscluster_mock.go | 159 - .../store/rediscluster/rediscluster_test.go | 182 - toolkit/gocache/store/ristretto/ristretto.go | 157 - .../store/ristretto/ristretto_bench_test.go | 91 - .../gocache/store/ristretto/ristretto_mock.go | 100 - .../gocache/store/ristretto/ristretto_test.go | 338 - toolkit/gocache/store/rueidis/rueidis.go | 130 - .../store/rueidis/rueidis_bench_test.go | 66 - toolkit/gocache/store/rueidis/rueidis_test.go | 214 - toolkit/gormgen/License | 21 - toolkit/gormgen/README.md | 37 - toolkit/gormgen/condition.go | 66 - toolkit/gormgen/config.go | 159 - toolkit/gormgen/do.go | 1055 -- toolkit/gormgen/do_options.go | 23 - toolkit/gormgen/do_test.go | 395 - toolkit/gormgen/errors.go | 8 - toolkit/gormgen/field/association.go | 255 - toolkit/gormgen/field/asterisk.go | 56 - toolkit/gormgen/field/bool.go | 54 - toolkit/gormgen/field/doc.go | 2 - toolkit/gormgen/field/example_test.go | 21 - toolkit/gormgen/field/export.go | 333 - toolkit/gormgen/field/export_test.go | 582 - toolkit/gormgen/field/expr.go | 408 - toolkit/gormgen/field/field.go | 79 - toolkit/gormgen/field/field_test.go | 61 - toolkit/gormgen/field/float.go | 245 - toolkit/gormgen/field/function.go | 28 - toolkit/gormgen/field/int.go | 1515 -- toolkit/gormgen/field/serializer.go | 91 - toolkit/gormgen/field/string.go | 256 - toolkit/gormgen/field/tag.go | 159 - toolkit/gormgen/field/time.go | 198 - toolkit/gormgen/field_options.go | 272 - toolkit/gormgen/generator.go | 961 - toolkit/gormgen/generator_test.go | 312 - toolkit/gormgen/helper/clause.go | 177 - toolkit/gormgen/helper/object.go | 60 - toolkit/gormgen/import.go | 67 - toolkit/gormgen/interface.go | 90 - toolkit/gormgen/internal/generate/clause.go | 179 - .../gormgen/internal/generate/clause_test.go | 182 - toolkit/gormgen/internal/generate/export.go | 249 - toolkit/gormgen/internal/generate/generate.go | 91 - .../gormgen/internal/generate/interface.go | 494 - toolkit/gormgen/internal/generate/query.go | 241 - toolkit/gormgen/internal/generate/section.go | 700 - toolkit/gormgen/internal/generate/table.go | 70 - toolkit/gormgen/internal/generate/test.go | 54 - toolkit/gormgen/internal/generate/utils.go | 61 - toolkit/gormgen/internal/model/base.go | 267 - toolkit/gormgen/internal/model/config.go | 115 - toolkit/gormgen/internal/model/options.go | 89 - toolkit/gormgen/internal/model/tbl_column.go | 166 - toolkit/gormgen/internal/model/tbl_index.go | 30 - toolkit/gormgen/internal/parser/export.go | 122 - toolkit/gormgen/internal/parser/method.go | 135 - toolkit/gormgen/internal/parser/parser.go | 323 - toolkit/gormgen/internal/parser/utils.go | 39 - .../gormgen/internal/template/appendsvc.go | 24 - .../internal/template/appendsvcimpl.go | 64 - .../internal/template/appendsvcimplgrpc.go | 91 - toolkit/gormgen/internal/template/base.go | 29 - toolkit/gormgen/internal/template/dto.go | 30 - toolkit/gormgen/internal/template/method.go | 438 - toolkit/gormgen/internal/template/model.go | 53 - toolkit/gormgen/internal/template/query.go | 211 - toolkit/gormgen/internal/template/struct.go | 301 - toolkit/gormgen/internal/template/svcimpl.go | 31 - .../internal/template/svcimplimport.go | 15 - .../internal/template/svcimplimportgrpc.go | 10 - toolkit/gormgen/internal/utils/common.go | 1 - .../gormgen/internal/utils/pools/export.go | 9 - toolkit/gormgen/internal/utils/pools/pool.go | 73 - toolkit/gormgen/sec_check.go | 114 - toolkit/gormgen/tests/go.sum | 2231 --- toolkit/gormgen/tools/gentool/README.ZH_CN.md | 128 - toolkit/gormgen/tools/gentool/README.md | 123 - toolkit/gormgen/tools/gentool/gen.yml | 28 - toolkit/gormgen/tools/gentool/gentool.go | 210 - toolkit/hashutils/hashutils.go | 56 - toolkit/hashutils/hashutils_test.go | 91 - toolkit/imgutils/helper.go | 285 - toolkit/imgutils/imgutils.go | 86 - toolkit/imgutils/imgutils_test.go | 71 - toolkit/imgutils/testdata/rgb.gif | Bin 2285 -> 0 bytes toolkit/imgutils/testdata/rgb_result.gif | Bin 1188 -> 0 bytes toolkit/imgutils/testdata/test.gif | Bin 2673994 -> 0 bytes toolkit/imgutils/testdata/test.jpg | Bin 137763 -> 0 bytes toolkit/imgutils/testdata/test.png | Bin 68498 -> 0 bytes toolkit/imgutils/testdata/test_result.gif | Bin 680621 -> 0 bytes toolkit/imgutils/testdata/test_result.jpeg | Bin 18083 -> 0 bytes toolkit/imgutils/testdata/test_result.jpg | Bin 18083 -> 0 bytes toolkit/imgutils/testdata/test_result.png | Bin 21034 -> 0 bytes toolkit/ip/ip.go | 13 - toolkit/ip/ip_test.go | 25 - toolkit/loadbalance/subset.go | 18 - toolkit/loadbalance/subset_test.go | 115 - toolkit/maputils/maputils.go | 193 - toolkit/maputils/maputils_test.go | 265 - toolkit/memberlist/.gitignore | 26 - toolkit/memberlist/LICENSE | 354 - toolkit/memberlist/Makefile | 33 - toolkit/memberlist/README.md | 73 - toolkit/memberlist/alive_delegate.go | 14 - toolkit/memberlist/awareness.go | 69 - toolkit/memberlist/awareness_test.go | 41 - toolkit/memberlist/broadcast.go | 50 - toolkit/memberlist/broadcast_test.go | 38 - toolkit/memberlist/config.go | 378 - toolkit/memberlist/config_test.go | 122 - toolkit/memberlist/conflict_delegate.go | 10 - toolkit/memberlist/delegate.go | 37 - toolkit/memberlist/dns_client_interface.go | 13 - toolkit/memberlist/event_delegate.go | 83 - toolkit/memberlist/event_delegate_test.go | 77 - toolkit/memberlist/integ_test.go | 91 - toolkit/memberlist/keyring.go | 160 - toolkit/memberlist/keyring_test.go | 154 - toolkit/memberlist/logging.go | 30 - toolkit/memberlist/logging_test.go | 47 - toolkit/memberlist/memberlist.go | 765 - toolkit/memberlist/memberlist_interface.go | 26 - toolkit/memberlist/memberlist_test.go | 2368 --- toolkit/memberlist/merge_delegate.go | 14 - .../mock/mock_dns_client_interface.go | 52 - .../mock/mock_memberlist_interface.go | 249 - .../mock/mock_net_conn_interface.go | 150 - toolkit/memberlist/mock/mock_queue.go | 227 - toolkit/memberlist/mock/mock_transport.go | 317 - toolkit/memberlist/net.go | 1345 -- toolkit/memberlist/net_conn_interface.go | 68 - toolkit/memberlist/net_test.go | 910 - toolkit/memberlist/net_transport.go | 353 - toolkit/memberlist/ping_delegate.go | 14 - toolkit/memberlist/queue.go | 429 - toolkit/memberlist/queue_test.go | 228 - toolkit/memberlist/security.go | 199 - toolkit/memberlist/security_test.go | 70 - toolkit/memberlist/state.go | 1438 -- toolkit/memberlist/state_test.go | 2443 --- toolkit/memberlist/suspicion.go | 130 - toolkit/memberlist/suspicion_test.go | 198 - toolkit/memberlist/todo.md | 6 - toolkit/memberlist/transport.go | 121 - toolkit/memberlist/transport_test.go | 101 - toolkit/memberlist/util.go | 309 - toolkit/memberlist/util_test.go | 372 - toolkit/memberlist/weightbroadcast.go | 43 - toolkit/memberlist/weightbroadcast_test.go | 25 - toolkit/numberutils/numberutils.go | 63 - toolkit/numberutils/numberutils_test.go | 50 - toolkit/openapi/v3/helper.go | 356 - toolkit/openapi/v3/helper_test.go | 280 - toolkit/openapi/v3/model.go | 379 - toolkit/openapi/v3/testdata/enum.go | 65 - toolkit/pagination/gorm/LICENSE | 21 - toolkit/pagination/gorm/README.md | 877 - toolkit/pagination/gorm/paginate.go | 801 - toolkit/pagination/gorm/paginate_test.go | 88 - toolkit/pathutils/pathutils.go | 34 - toolkit/pathutils/pathutils_test.go | 82 - toolkit/pipeconn/pipe_listener.go | 103 - toolkit/pipeconn/pipe_listener_test.go | 126 - toolkit/protobuf/v3/message.go | 364 - toolkit/protobuf/v3/service.go | 210 - toolkit/random/rand.go | 12 - toolkit/reflectutils/reflectutils.go | 16 - toolkit/sliceutils/sliceutils.go | 139 - toolkit/sliceutils/sliceutils_test.go | 471 - toolkit/sqlext/.env | 6 - toolkit/sqlext/arithsymbol/arithsymbol.go | 27 - toolkit/sqlext/logger/logger.go | 92 - toolkit/sqlext/logger/logger_test.go | 84 - toolkit/sqlext/logicsymbol/logicsymbol.go | 15 - toolkit/sqlext/query/query.go | 429 - toolkit/sqlext/query/query_test.go | 150 - toolkit/sqlext/sortenum/sortenum.go | 11 - toolkit/sqlext/testdata/domain/base.go | 9 - toolkit/sqlext/testdata/domain/order.go | 10 - toolkit/sqlext/testdata/domain/user.go | 25 - toolkit/sqlext/testdata/domain2/base.go | 9 - toolkit/sqlext/testdata/domain2/book.go | 10 - toolkit/sqlext/testdata/domain2/publisher.go | 9 - toolkit/sqlext/testdata/domain2/user.go | 25 - toolkit/sqlext/testdata/domain3/base.go | 9 - toolkit/sqlext/testdata/domain3/book.go | 10 - toolkit/sqlext/testdata/domain3/publisher.go | 9 - toolkit/sqlext/testdata/domain3/user.go | 25 - toolkit/sqlext/testdata/domain4/base.go | 9 - toolkit/sqlext/testdata/domain4/book.go | 10 - toolkit/sqlext/testdata/domain4/publisher.go | 9 - toolkit/sqlext/testdata/domain4/user.go | 25 - toolkit/sqlext/testdata/go.mod | 3 - toolkit/sqlext/wrapper/wrapper.go | 250 - toolkit/stringutils/LICENSE | 21 - toolkit/stringutils/README.md | 107 - toolkit/stringutils/UNLICENSE | 24 - toolkit/stringutils/common.go | 137 - toolkit/stringutils/common_test.go | 161 - toolkit/stringutils/constants_test.go | 14597 ---------------- toolkit/stringutils/highlight.go | 80 - toolkit/stringutils/highlight_test.go | 169 - toolkit/stringutils/index.go | 318 - toolkit/stringutils/index_benchmark_test.go | 216 - toolkit/stringutils/index_bug_test.go | 39 - toolkit/stringutils/index_fuzz_test.go | 88 - .../index_ignorecase_benchmark_test.go | 513 - toolkit/stringutils/index_test.go | 301 - toolkit/stringutils/stringutils.go | 83 - toolkit/stringutils/stringutils_test.go | 318 - toolkit/templateutils/funcs.go | 37 - toolkit/templateutils/templateutils.go | 92 - toolkit/timeutils/timeutils.go | 40 - toolkit/timeutils/timeutils_test.go | 67 - toolkit/yaml/testdata/.env | 2 - toolkit/yaml/testdata/app-dev-local.yaml | 4 - toolkit/yaml/testdata/app-dev.yml | 2 - toolkit/yaml/testdata/app-local.yaml | 5 - toolkit/yaml/testdata/app-prod.yml | 2 - toolkit/yaml/testdata/app-test.yml | 4 - toolkit/yaml/testdata/app.yml | 5 - toolkit/yaml/yaml.go | 99 - toolkit/yaml/yaml_test.go | 140 - toolkit/zlogger/entry.go | 210 - version/version.go | 2 +- 560 files changed, 368 insertions(+), 85980 deletions(-) delete mode 100644 toolkit/assert/assert.go delete mode 100644 toolkit/astutils/enumcollector.go delete mode 100644 toolkit/astutils/enumcollector_test.go delete mode 100644 toolkit/astutils/funcs.go delete mode 100644 toolkit/astutils/funcs_test.go delete mode 100644 toolkit/astutils/helper.go delete mode 100644 toolkit/astutils/helper_test.go delete mode 100644 toolkit/astutils/interfacecollector.go delete mode 100644 toolkit/astutils/interfacecollector_test.go delete mode 100644 toolkit/astutils/rewritejsontag.go delete mode 100644 toolkit/astutils/rewritejsontag_test.go delete mode 100644 toolkit/astutils/staticmethodcollector.go delete mode 100644 toolkit/astutils/structcollector.go delete mode 100644 toolkit/astutils/structcollector_test.go delete mode 100644 toolkit/astutils/testdata/alias.go delete mode 100644 toolkit/astutils/testdata/cat.go delete mode 100644 toolkit/astutils/testdata/demo/config/config.go delete mode 100644 toolkit/astutils/testdata/demo/go.mod delete mode 100644 toolkit/astutils/testdata/embed.go delete mode 100644 toolkit/astutils/testdata/embed1.go delete mode 100644 toolkit/astutils/testdata/embed2.go delete mode 100644 toolkit/astutils/testdata/embed3.go delete mode 100644 toolkit/astutils/testdata/embed4.go delete mode 100644 toolkit/astutils/testdata/embed5.go delete mode 100644 toolkit/astutils/testdata/entity/base.go delete mode 100644 toolkit/astutils/testdata/entity/material.go delete mode 100644 toolkit/astutils/testdata/entity/purchase.go delete mode 100644 toolkit/astutils/testdata/entity/user.go delete mode 100644 toolkit/astutils/testdata/enum.go delete mode 100644 toolkit/astutils/testdata/output.go delete mode 100644 toolkit/astutils/testdata/rewritejsontag.go delete mode 100644 toolkit/astutils/testdata/svc.go delete mode 100644 toolkit/astutils/testdata/vo.go delete mode 100644 toolkit/astutils/testdata/vo/cat.go delete mode 100644 toolkit/cache/.prettierrc.yml delete mode 100644 toolkit/cache/CHANGELOG.md delete mode 100644 toolkit/cache/LICENSE delete mode 100644 toolkit/cache/Makefile delete mode 100644 toolkit/cache/README.md delete mode 100644 toolkit/cache/bench_test.go delete mode 100644 toolkit/cache/cache.go delete mode 100644 toolkit/cache/cache_test.go delete mode 100644 toolkit/cache/example_cache_test.go delete mode 100644 toolkit/cache/local.go delete mode 100644 toolkit/cache/local_test.go delete mode 100644 toolkit/caches/LICENSE delete mode 100644 toolkit/caches/README.md delete mode 100644 toolkit/caches/cacher.go delete mode 100644 toolkit/caches/cacher_test.go delete mode 100644 toolkit/caches/caches.go delete mode 100644 toolkit/caches/caches_test.go delete mode 100644 toolkit/caches/easer.go delete mode 100644 toolkit/caches/easer_test.go delete mode 100644 toolkit/caches/identifier.go delete mode 100644 toolkit/caches/identifier_test.go delete mode 100644 toolkit/caches/query.go delete mode 100644 toolkit/caches/query_task.go delete mode 100644 toolkit/caches/query_task_test.go delete mode 100644 toolkit/caches/reflection.go delete mode 100644 toolkit/caches/reflection_test.go delete mode 100644 toolkit/caches/task.go delete mode 100644 toolkit/caches/task_test.go delete mode 100644 toolkit/caller/caller.go delete mode 100644 toolkit/caller/caller_test.go delete mode 100644 toolkit/cast/string.go delete mode 100644 toolkit/cast/string_test.go delete mode 100644 toolkit/cast/stringslice.go delete mode 100644 toolkit/cast/stringslice_test.go delete mode 100644 toolkit/common/utils.go delete mode 100644 toolkit/concurrency/do.go delete mode 100644 toolkit/concurrency/signal.go delete mode 100644 toolkit/concurrency/signal_test.go delete mode 100644 toolkit/concurrency/types.go delete mode 100644 toolkit/concurrency/wait.go delete mode 100644 toolkit/constants/constants.go delete mode 100644 toolkit/constants/constants_darwin.go delete mode 100644 toolkit/constants/constants_linux.go delete mode 100644 toolkit/constants/constants_windows.go delete mode 100644 toolkit/copier/copier.go delete mode 100644 toolkit/copier/copier_test.go delete mode 100644 toolkit/customtypes/time.go delete mode 100644 toolkit/customtypes/time_test.go delete mode 100644 toolkit/dotenv/dotenv.go delete mode 100644 toolkit/dotenv/dotenv_test.go delete mode 100644 toolkit/dotenv/testdata/.env delete mode 100644 toolkit/envconfig/LICENSE delete mode 100644 toolkit/envconfig/README.md delete mode 100644 toolkit/envconfig/doc.go delete mode 100644 toolkit/envconfig/env_os.go delete mode 100644 toolkit/envconfig/env_syscall.go delete mode 100644 toolkit/envconfig/envconfig.go delete mode 100644 toolkit/envconfig/envconfig_1.8_test.go delete mode 100644 toolkit/envconfig/envconfig_test.go delete mode 100644 toolkit/envconfig/testdata/custom.txt delete mode 100644 toolkit/envconfig/testdata/default_list.txt delete mode 100644 toolkit/envconfig/testdata/default_table.txt delete mode 100644 toolkit/envconfig/testdata/fault.txt delete mode 100644 toolkit/envconfig/usage.go delete mode 100644 toolkit/envconfig/usage_test.go delete mode 100644 toolkit/errorx/errorx.go delete mode 100644 toolkit/executils/executils.go delete mode 100644 toolkit/executils/executils_test.go delete mode 100644 toolkit/fileutils/fileutils.go delete mode 100644 toolkit/fileutils/fileutils_test.go delete mode 100644 toolkit/fileutils/testfiles delete mode 100644 toolkit/form/.gitignore delete mode 100644 toolkit/form/LICENSE delete mode 100644 toolkit/form/Makefile delete mode 100644 toolkit/form/README.md delete mode 100644 toolkit/form/_examples/decoder-embedded/main.go delete mode 100644 toolkit/form/_examples/decoder/full.go delete mode 100644 toolkit/form/_examples/encoder-embedded/main.go delete mode 100644 toolkit/form/_examples/encoder-omitempty/main.go delete mode 100644 toolkit/form/_examples/encoder/full.go delete mode 100644 toolkit/form/benchmarks/benchmarks.md delete mode 100644 toolkit/form/benchmarks/benchmarks_test.go delete mode 100644 toolkit/form/cache.go delete mode 100644 toolkit/form/cache_test.go delete mode 100644 toolkit/form/decoder.go delete mode 100644 toolkit/form/decoder_test.go delete mode 100644 toolkit/form/doc.go delete mode 100644 toolkit/form/encoder.go delete mode 100644 toolkit/form/encoder_test.go delete mode 100644 toolkit/form/form.go delete mode 100644 toolkit/form/form_decoder.go delete mode 100644 toolkit/form/form_encoder.go delete mode 100644 toolkit/form/logo.jpg delete mode 100644 toolkit/form/util.go delete mode 100644 toolkit/gocache/.gitignore delete mode 100644 toolkit/gocache/LICENSE delete mode 100644 toolkit/gocache/Makefile delete mode 100644 toolkit/gocache/README.md delete mode 100644 toolkit/gocache/lib/cache/cache.go delete mode 100644 toolkit/gocache/lib/cache/cache_mock.go delete mode 100644 toolkit/gocache/lib/cache/cache_test.go delete mode 100644 toolkit/gocache/lib/cache/chain.go delete mode 100644 toolkit/gocache/lib/cache/chain_test.go delete mode 100644 toolkit/gocache/lib/cache/interface.go delete mode 100644 toolkit/gocache/lib/cache/loadable.go delete mode 100644 toolkit/gocache/lib/cache/loadable_test.go delete mode 100644 toolkit/gocache/lib/cache/metric.go delete mode 100644 toolkit/gocache/lib/cache/metric_test.go delete mode 100644 toolkit/gocache/lib/codec/codec.go delete mode 100644 toolkit/gocache/lib/codec/codec_mock.go delete mode 100644 toolkit/gocache/lib/codec/codec_test.go delete mode 100644 toolkit/gocache/lib/codec/interface.go delete mode 100644 toolkit/gocache/lib/marshaler/marshaler.go delete mode 100644 toolkit/gocache/lib/marshaler/marshaler_test.go delete mode 100644 toolkit/gocache/lib/metrics/interface.go delete mode 100644 toolkit/gocache/lib/metrics/metrics_mock.go delete mode 100644 toolkit/gocache/lib/metrics/prometheus.go delete mode 100644 toolkit/gocache/lib/metrics/prometheus_test.go delete mode 100644 toolkit/gocache/lib/misc/benchmarks.jpeg delete mode 100644 toolkit/gocache/lib/store/errors.go delete mode 100644 toolkit/gocache/lib/store/errors_test.go delete mode 100644 toolkit/gocache/lib/store/interface.go delete mode 100644 toolkit/gocache/lib/store/invalidate_options.go delete mode 100644 toolkit/gocache/lib/store/invalidate_options_test.go delete mode 100644 toolkit/gocache/lib/store/options.go delete mode 100644 toolkit/gocache/lib/store/options_test.go delete mode 100644 toolkit/gocache/lib/store/options_test_matchers.go delete mode 100644 toolkit/gocache/lib/store/store_mock.go delete mode 100644 toolkit/gocache/store/bigcache/bigcache.go delete mode 100644 toolkit/gocache/store/bigcache/bigcache_bench_test.go delete mode 100644 toolkit/gocache/store/bigcache/bigcache_mock.go delete mode 100644 toolkit/gocache/store/bigcache/bigcache_test.go delete mode 100644 toolkit/gocache/store/freecache/freecache.go delete mode 100644 toolkit/gocache/store/freecache/freecache_bench_test.go delete mode 100644 toolkit/gocache/store/freecache/freecache_mock.go delete mode 100644 toolkit/gocache/store/freecache/freecache_test.go delete mode 100644 toolkit/gocache/store/go_cache/go_cache.go delete mode 100644 toolkit/gocache/store/go_cache/go_cache_bench_test.go delete mode 100644 toolkit/gocache/store/go_cache/go_cache_mock.go delete mode 100644 toolkit/gocache/store/go_cache/go_cache_test.go delete mode 100644 toolkit/gocache/store/hazelcast/hazelcast.go delete mode 100644 toolkit/gocache/store/hazelcast/hazelcast_benchmark_test.go delete mode 100644 toolkit/gocache/store/hazelcast/hazelcast_mock.go delete mode 100644 toolkit/gocache/store/hazelcast/hazelcast_test.go delete mode 100644 toolkit/gocache/store/memcache/memcache.go delete mode 100644 toolkit/gocache/store/memcache/memcache_bench_test.go delete mode 100644 toolkit/gocache/store/memcache/memcache_mock.go delete mode 100644 toolkit/gocache/store/memcache/memcache_test.go delete mode 100644 toolkit/gocache/store/pegasus/pegasus.go delete mode 100644 toolkit/gocache/store/pegasus/pegasus_bench_test.go delete mode 100644 toolkit/gocache/store/pegasus/pegasus_test.go delete mode 100644 toolkit/gocache/store/redis/redis.go delete mode 100644 toolkit/gocache/store/redis/redis_bench_test.go delete mode 100644 toolkit/gocache/store/redis/redis_mock.go delete mode 100644 toolkit/gocache/store/redis/redis_test.go delete mode 100644 toolkit/gocache/store/rediscluster/rediscluster.go delete mode 100644 toolkit/gocache/store/rediscluster/rediscluster_bench_test.go delete mode 100644 toolkit/gocache/store/rediscluster/rediscluster_mock.go delete mode 100644 toolkit/gocache/store/rediscluster/rediscluster_test.go delete mode 100644 toolkit/gocache/store/ristretto/ristretto.go delete mode 100644 toolkit/gocache/store/ristretto/ristretto_bench_test.go delete mode 100644 toolkit/gocache/store/ristretto/ristretto_mock.go delete mode 100644 toolkit/gocache/store/ristretto/ristretto_test.go delete mode 100644 toolkit/gocache/store/rueidis/rueidis.go delete mode 100644 toolkit/gocache/store/rueidis/rueidis_bench_test.go delete mode 100644 toolkit/gocache/store/rueidis/rueidis_test.go delete mode 100644 toolkit/gormgen/License delete mode 100644 toolkit/gormgen/README.md delete mode 100644 toolkit/gormgen/condition.go delete mode 100644 toolkit/gormgen/config.go delete mode 100644 toolkit/gormgen/do.go delete mode 100644 toolkit/gormgen/do_options.go delete mode 100644 toolkit/gormgen/do_test.go delete mode 100644 toolkit/gormgen/errors.go delete mode 100644 toolkit/gormgen/field/association.go delete mode 100644 toolkit/gormgen/field/asterisk.go delete mode 100644 toolkit/gormgen/field/bool.go delete mode 100644 toolkit/gormgen/field/doc.go delete mode 100644 toolkit/gormgen/field/example_test.go delete mode 100644 toolkit/gormgen/field/export.go delete mode 100644 toolkit/gormgen/field/export_test.go delete mode 100644 toolkit/gormgen/field/expr.go delete mode 100644 toolkit/gormgen/field/field.go delete mode 100644 toolkit/gormgen/field/field_test.go delete mode 100644 toolkit/gormgen/field/float.go delete mode 100644 toolkit/gormgen/field/function.go delete mode 100644 toolkit/gormgen/field/int.go delete mode 100644 toolkit/gormgen/field/serializer.go delete mode 100644 toolkit/gormgen/field/string.go delete mode 100644 toolkit/gormgen/field/tag.go delete mode 100644 toolkit/gormgen/field/time.go delete mode 100644 toolkit/gormgen/field_options.go delete mode 100644 toolkit/gormgen/generator.go delete mode 100644 toolkit/gormgen/generator_test.go delete mode 100644 toolkit/gormgen/helper/clause.go delete mode 100644 toolkit/gormgen/helper/object.go delete mode 100644 toolkit/gormgen/import.go delete mode 100644 toolkit/gormgen/interface.go delete mode 100644 toolkit/gormgen/internal/generate/clause.go delete mode 100644 toolkit/gormgen/internal/generate/clause_test.go delete mode 100644 toolkit/gormgen/internal/generate/export.go delete mode 100644 toolkit/gormgen/internal/generate/generate.go delete mode 100644 toolkit/gormgen/internal/generate/interface.go delete mode 100644 toolkit/gormgen/internal/generate/query.go delete mode 100644 toolkit/gormgen/internal/generate/section.go delete mode 100644 toolkit/gormgen/internal/generate/table.go delete mode 100644 toolkit/gormgen/internal/generate/test.go delete mode 100644 toolkit/gormgen/internal/generate/utils.go delete mode 100644 toolkit/gormgen/internal/model/base.go delete mode 100644 toolkit/gormgen/internal/model/config.go delete mode 100644 toolkit/gormgen/internal/model/options.go delete mode 100644 toolkit/gormgen/internal/model/tbl_column.go delete mode 100644 toolkit/gormgen/internal/model/tbl_index.go delete mode 100644 toolkit/gormgen/internal/parser/export.go delete mode 100644 toolkit/gormgen/internal/parser/method.go delete mode 100644 toolkit/gormgen/internal/parser/parser.go delete mode 100644 toolkit/gormgen/internal/parser/utils.go delete mode 100644 toolkit/gormgen/internal/template/appendsvc.go delete mode 100644 toolkit/gormgen/internal/template/appendsvcimpl.go delete mode 100644 toolkit/gormgen/internal/template/appendsvcimplgrpc.go delete mode 100644 toolkit/gormgen/internal/template/base.go delete mode 100644 toolkit/gormgen/internal/template/dto.go delete mode 100644 toolkit/gormgen/internal/template/method.go delete mode 100644 toolkit/gormgen/internal/template/model.go delete mode 100644 toolkit/gormgen/internal/template/query.go delete mode 100644 toolkit/gormgen/internal/template/struct.go delete mode 100644 toolkit/gormgen/internal/template/svcimpl.go delete mode 100644 toolkit/gormgen/internal/template/svcimplimport.go delete mode 100644 toolkit/gormgen/internal/template/svcimplimportgrpc.go delete mode 100644 toolkit/gormgen/internal/utils/common.go delete mode 100644 toolkit/gormgen/internal/utils/pools/export.go delete mode 100644 toolkit/gormgen/internal/utils/pools/pool.go delete mode 100644 toolkit/gormgen/sec_check.go delete mode 100644 toolkit/gormgen/tests/go.sum delete mode 100644 toolkit/gormgen/tools/gentool/README.ZH_CN.md delete mode 100644 toolkit/gormgen/tools/gentool/README.md delete mode 100644 toolkit/gormgen/tools/gentool/gen.yml delete mode 100644 toolkit/gormgen/tools/gentool/gentool.go delete mode 100644 toolkit/hashutils/hashutils.go delete mode 100644 toolkit/hashutils/hashutils_test.go delete mode 100644 toolkit/imgutils/helper.go delete mode 100644 toolkit/imgutils/imgutils.go delete mode 100644 toolkit/imgutils/imgutils_test.go delete mode 100644 toolkit/imgutils/testdata/rgb.gif delete mode 100644 toolkit/imgutils/testdata/rgb_result.gif delete mode 100644 toolkit/imgutils/testdata/test.gif delete mode 100644 toolkit/imgutils/testdata/test.jpg delete mode 100644 toolkit/imgutils/testdata/test.png delete mode 100644 toolkit/imgutils/testdata/test_result.gif delete mode 100644 toolkit/imgutils/testdata/test_result.jpeg delete mode 100644 toolkit/imgutils/testdata/test_result.jpg delete mode 100644 toolkit/imgutils/testdata/test_result.png delete mode 100644 toolkit/ip/ip.go delete mode 100644 toolkit/ip/ip_test.go delete mode 100644 toolkit/loadbalance/subset.go delete mode 100644 toolkit/loadbalance/subset_test.go delete mode 100644 toolkit/maputils/maputils.go delete mode 100644 toolkit/maputils/maputils_test.go delete mode 100644 toolkit/memberlist/.gitignore delete mode 100644 toolkit/memberlist/LICENSE delete mode 100644 toolkit/memberlist/Makefile delete mode 100644 toolkit/memberlist/README.md delete mode 100644 toolkit/memberlist/alive_delegate.go delete mode 100644 toolkit/memberlist/awareness.go delete mode 100644 toolkit/memberlist/awareness_test.go delete mode 100644 toolkit/memberlist/broadcast.go delete mode 100644 toolkit/memberlist/broadcast_test.go delete mode 100644 toolkit/memberlist/config.go delete mode 100644 toolkit/memberlist/config_test.go delete mode 100644 toolkit/memberlist/conflict_delegate.go delete mode 100644 toolkit/memberlist/delegate.go delete mode 100644 toolkit/memberlist/dns_client_interface.go delete mode 100644 toolkit/memberlist/event_delegate.go delete mode 100644 toolkit/memberlist/event_delegate_test.go delete mode 100644 toolkit/memberlist/integ_test.go delete mode 100644 toolkit/memberlist/keyring.go delete mode 100644 toolkit/memberlist/keyring_test.go delete mode 100644 toolkit/memberlist/logging.go delete mode 100644 toolkit/memberlist/logging_test.go delete mode 100644 toolkit/memberlist/memberlist.go delete mode 100644 toolkit/memberlist/memberlist_interface.go delete mode 100644 toolkit/memberlist/memberlist_test.go delete mode 100644 toolkit/memberlist/merge_delegate.go delete mode 100644 toolkit/memberlist/mock/mock_dns_client_interface.go delete mode 100644 toolkit/memberlist/mock/mock_memberlist_interface.go delete mode 100644 toolkit/memberlist/mock/mock_net_conn_interface.go delete mode 100644 toolkit/memberlist/mock/mock_queue.go delete mode 100644 toolkit/memberlist/mock/mock_transport.go delete mode 100644 toolkit/memberlist/net.go delete mode 100644 toolkit/memberlist/net_conn_interface.go delete mode 100644 toolkit/memberlist/net_test.go delete mode 100644 toolkit/memberlist/net_transport.go delete mode 100644 toolkit/memberlist/ping_delegate.go delete mode 100644 toolkit/memberlist/queue.go delete mode 100644 toolkit/memberlist/queue_test.go delete mode 100644 toolkit/memberlist/security.go delete mode 100644 toolkit/memberlist/security_test.go delete mode 100644 toolkit/memberlist/state.go delete mode 100644 toolkit/memberlist/state_test.go delete mode 100644 toolkit/memberlist/suspicion.go delete mode 100644 toolkit/memberlist/suspicion_test.go delete mode 100644 toolkit/memberlist/todo.md delete mode 100644 toolkit/memberlist/transport.go delete mode 100644 toolkit/memberlist/transport_test.go delete mode 100644 toolkit/memberlist/util.go delete mode 100644 toolkit/memberlist/util_test.go delete mode 100644 toolkit/memberlist/weightbroadcast.go delete mode 100644 toolkit/memberlist/weightbroadcast_test.go delete mode 100644 toolkit/numberutils/numberutils.go delete mode 100644 toolkit/numberutils/numberutils_test.go delete mode 100644 toolkit/openapi/v3/helper.go delete mode 100644 toolkit/openapi/v3/helper_test.go delete mode 100644 toolkit/openapi/v3/model.go delete mode 100644 toolkit/openapi/v3/testdata/enum.go delete mode 100644 toolkit/pagination/gorm/LICENSE delete mode 100644 toolkit/pagination/gorm/README.md delete mode 100644 toolkit/pagination/gorm/paginate.go delete mode 100644 toolkit/pagination/gorm/paginate_test.go delete mode 100644 toolkit/pathutils/pathutils.go delete mode 100644 toolkit/pathutils/pathutils_test.go delete mode 100644 toolkit/pipeconn/pipe_listener.go delete mode 100644 toolkit/pipeconn/pipe_listener_test.go delete mode 100644 toolkit/protobuf/v3/message.go delete mode 100644 toolkit/protobuf/v3/service.go delete mode 100644 toolkit/random/rand.go delete mode 100644 toolkit/reflectutils/reflectutils.go delete mode 100644 toolkit/sliceutils/sliceutils.go delete mode 100644 toolkit/sliceutils/sliceutils_test.go delete mode 100644 toolkit/sqlext/.env delete mode 100644 toolkit/sqlext/arithsymbol/arithsymbol.go delete mode 100644 toolkit/sqlext/logger/logger.go delete mode 100644 toolkit/sqlext/logger/logger_test.go delete mode 100644 toolkit/sqlext/logicsymbol/logicsymbol.go delete mode 100644 toolkit/sqlext/query/query.go delete mode 100644 toolkit/sqlext/query/query_test.go delete mode 100644 toolkit/sqlext/sortenum/sortenum.go delete mode 100644 toolkit/sqlext/testdata/domain/base.go delete mode 100644 toolkit/sqlext/testdata/domain/order.go delete mode 100644 toolkit/sqlext/testdata/domain/user.go delete mode 100644 toolkit/sqlext/testdata/domain2/base.go delete mode 100644 toolkit/sqlext/testdata/domain2/book.go delete mode 100644 toolkit/sqlext/testdata/domain2/publisher.go delete mode 100644 toolkit/sqlext/testdata/domain2/user.go delete mode 100644 toolkit/sqlext/testdata/domain3/base.go delete mode 100644 toolkit/sqlext/testdata/domain3/book.go delete mode 100644 toolkit/sqlext/testdata/domain3/publisher.go delete mode 100644 toolkit/sqlext/testdata/domain3/user.go delete mode 100644 toolkit/sqlext/testdata/domain4/base.go delete mode 100644 toolkit/sqlext/testdata/domain4/book.go delete mode 100644 toolkit/sqlext/testdata/domain4/publisher.go delete mode 100644 toolkit/sqlext/testdata/domain4/user.go delete mode 100644 toolkit/sqlext/testdata/go.mod delete mode 100644 toolkit/sqlext/wrapper/wrapper.go delete mode 100644 toolkit/stringutils/LICENSE delete mode 100644 toolkit/stringutils/README.md delete mode 100644 toolkit/stringutils/UNLICENSE delete mode 100644 toolkit/stringutils/common.go delete mode 100644 toolkit/stringutils/common_test.go delete mode 100644 toolkit/stringutils/constants_test.go delete mode 100644 toolkit/stringutils/highlight.go delete mode 100644 toolkit/stringutils/highlight_test.go delete mode 100644 toolkit/stringutils/index.go delete mode 100644 toolkit/stringutils/index_benchmark_test.go delete mode 100644 toolkit/stringutils/index_bug_test.go delete mode 100644 toolkit/stringutils/index_fuzz_test.go delete mode 100644 toolkit/stringutils/index_ignorecase_benchmark_test.go delete mode 100644 toolkit/stringutils/index_test.go delete mode 100644 toolkit/stringutils/stringutils.go delete mode 100644 toolkit/stringutils/stringutils_test.go delete mode 100644 toolkit/templateutils/funcs.go delete mode 100644 toolkit/templateutils/templateutils.go delete mode 100644 toolkit/timeutils/timeutils.go delete mode 100644 toolkit/timeutils/timeutils_test.go delete mode 100644 toolkit/yaml/testdata/.env delete mode 100644 toolkit/yaml/testdata/app-dev-local.yaml delete mode 100644 toolkit/yaml/testdata/app-dev.yml delete mode 100644 toolkit/yaml/testdata/app-local.yaml delete mode 100644 toolkit/yaml/testdata/app-prod.yml delete mode 100644 toolkit/yaml/testdata/app-test.yml delete mode 100644 toolkit/yaml/testdata/app.yml delete mode 100644 toolkit/yaml/yaml.go delete mode 100644 toolkit/yaml/yaml_test.go delete mode 100644 toolkit/zlogger/entry.go diff --git a/cmd/crud.go b/cmd/crud.go index 84307d4c..9db0e640 100644 --- a/cmd/crud.go +++ b/cmd/crud.go @@ -5,9 +5,9 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/pathutils" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/stringutils" ) var dbDriver string diff --git a/cmd/ddl.go b/cmd/ddl.go index 8d96a714..944dc98c 100644 --- a/cmd/ddl.go +++ b/cmd/ddl.go @@ -5,10 +5,10 @@ import ( "github.com/spf13/cobra" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/dotenv" - "github.com/unionj-cloud/go-doudou/v2/toolkit/envconfig" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/yaml" + "github.com/unionj-cloud/toolkit/dotenv" + "github.com/unionj-cloud/toolkit/envconfig" + "github.com/unionj-cloud/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/yaml" ) var dir string diff --git a/cmd/ddl_test.go b/cmd/ddl_test.go index ef0346f4..4b4b37a3 100644 --- a/cmd/ddl_test.go +++ b/cmd/ddl_test.go @@ -7,7 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/pathutils" ) var testDir string diff --git a/cmd/grpc.go b/cmd/grpc.go index 8efad690..3495556d 100644 --- a/cmd/grpc.go +++ b/cmd/grpc.go @@ -3,7 +3,7 @@ package cmd import ( "github.com/iancoleman/strcase" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" "github.com/spf13/cobra" ) diff --git a/cmd/init.go b/cmd/init.go index de6891a4..ea093a22 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -5,8 +5,8 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/pathutils" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" ) var modName string diff --git a/cmd/internal/ddl/codegen/dao.go b/cmd/internal/ddl/codegen/dao.go index 72cf23e2..56acc85f 100644 --- a/cmd/internal/ddl/codegen/dao.go +++ b/cmd/internal/ddl/codegen/dao.go @@ -10,7 +10,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/table" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -22,12 +22,12 @@ import ( "fmt" "github.com/pkg/errors" "{{.EntityPackage}}" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/query" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/wrapper" - "github.com/unionj-cloud/go-doudou/v2/toolkit/reflectutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/templateutils" + "github.com/unionj-cloud/toolkit/caller" + "github.com/unionj-cloud/toolkit/sqlext/query" + "github.com/unionj-cloud/toolkit/sqlext/wrapper" + "github.com/unionj-cloud/toolkit/reflectutils" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/templateutils" "strings" "math" "time" diff --git a/cmd/internal/ddl/codegen/daosql.go b/cmd/internal/ddl/codegen/daosql.go index eec34afb..9e8b4b9b 100644 --- a/cmd/internal/ddl/codegen/daosql.go +++ b/cmd/internal/ddl/codegen/daosql.go @@ -10,7 +10,7 @@ import ( "github.com/iancoleman/strcase" log "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/table" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/ddl/codegen/dto.go b/cmd/internal/ddl/codegen/dto.go index fe5c07f2..370712c9 100644 --- a/cmd/internal/ddl/codegen/dto.go +++ b/cmd/internal/ddl/codegen/dto.go @@ -9,7 +9,7 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/ddl/codegen/entity.go b/cmd/internal/ddl/codegen/entity.go index d9f3e43e..7761eaee 100644 --- a/cmd/internal/ddl/codegen/entity.go +++ b/cmd/internal/ddl/codegen/entity.go @@ -7,8 +7,8 @@ import ( log "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/templateutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/templateutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/ddl/codegen/idao.go b/cmd/internal/ddl/codegen/idao.go index 1fc539bb..a1a0cf9f 100644 --- a/cmd/internal/ddl/codegen/idao.go +++ b/cmd/internal/ddl/codegen/idao.go @@ -9,7 +9,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/table" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -17,7 +17,7 @@ var idaoTmpl = templates.EditableHeaderTmpl + `package dao import ( "context" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/query" + "github.com/unionj-cloud/toolkit/sqlext/query" "{{.EntityPackage}}" ) diff --git a/cmd/internal/ddl/ddlast/ast.go b/cmd/internal/ddl/ddlast/ast.go index 9da5f88d..a6da612a 100644 --- a/cmd/internal/ddl/ddlast/ast.go +++ b/cmd/internal/ddl/ddlast/ast.go @@ -4,8 +4,8 @@ import ( "sort" "strings" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/sliceutils" ) type sortableFieldMeta []astutils.FieldMeta diff --git a/cmd/internal/ddl/exec.go b/cmd/internal/ddl/exec.go index ffabf2a7..da1cd30a 100644 --- a/cmd/internal/ddl/exec.go +++ b/cmd/internal/ddl/exec.go @@ -10,8 +10,8 @@ import ( "github.com/pkg/errors" "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/caller" // here must import mysql _ "github.com/go-sql-driver/mysql" diff --git a/cmd/internal/ddl/table/ddl.go b/cmd/internal/ddl/table/ddl.go index c20533ec..f751f28e 100644 --- a/cmd/internal/ddl/table/ddl.go +++ b/cmd/internal/ddl/table/ddl.go @@ -24,14 +24,14 @@ import ( "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/ddlast" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/extraenum" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/sortenum" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" - "github.com/unionj-cloud/go-doudou/v2/toolkit/envconfig" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/wrapper" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/caller" + "github.com/unionj-cloud/toolkit/envconfig" + "github.com/unionj-cloud/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/sliceutils" + "github.com/unionj-cloud/toolkit/sqlext/wrapper" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/zlogger" ) // CreateTable create table from Table diff --git a/cmd/internal/ddl/table/ddl_test.go b/cmd/internal/ddl/table/ddl_test.go index cb257ba9..04a5e218 100644 --- a/cmd/internal/ddl/table/ddl_test.go +++ b/cmd/internal/ddl/table/ddl_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/columnenum" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/sortenum" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/wrapper" + "github.com/unionj-cloud/toolkit/sqlext/wrapper" ) func ExampleCreateTable() { diff --git a/cmd/internal/ddl/table/table.go b/cmd/internal/ddl/table/table.go index fe321935..64c75ffb 100644 --- a/cmd/internal/ddl/table/table.go +++ b/cmd/internal/ddl/table/table.go @@ -14,9 +14,9 @@ import ( "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/keyenum" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/nullenum" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/sortenum" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/templateutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/templateutils" ) const ( diff --git a/cmd/internal/ddl/table/table_test.go b/cmd/internal/ddl/table/table_test.go index 036781ce..ee144eb6 100644 --- a/cmd/internal/ddl/table/table_test.go +++ b/cmd/internal/ddl/table/table_test.go @@ -15,8 +15,8 @@ import ( "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/keyenum" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/nullenum" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/ddl/sortenum" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/pathutils" ) func ExampleNewTableFromStruct() { diff --git a/cmd/internal/enum/generator.go b/cmd/internal/enum/generator.go index a38e122a..5187d07d 100644 --- a/cmd/internal/enum/generator.go +++ b/cmd/internal/enum/generator.go @@ -10,8 +10,8 @@ import ( "github.com/pkg/errors" "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/modular/work.go b/cmd/internal/modular/work.go index 30ec33bc..93dfab87 100644 --- a/cmd/internal/modular/work.go +++ b/cmd/internal/modular/work.go @@ -7,9 +7,9 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/common" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/common" + "github.com/unionj-cloud/toolkit/executils" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/name/exec.go b/cmd/internal/name/exec.go index a67e26a7..fe88110b 100644 --- a/cmd/internal/name/exec.go +++ b/cmd/internal/name/exec.go @@ -3,8 +3,8 @@ package name import ( "github.com/iancoleman/strcase" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/stringutils" ) // Name wraps config properties for name command diff --git a/cmd/internal/name/exec_test.go b/cmd/internal/name/exec_test.go index 82efc583..3fc66a7a 100644 --- a/cmd/internal/name/exec_test.go +++ b/cmd/internal/name/exec_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/pathutils" ) const initCode = `package testdata diff --git a/cmd/internal/openapi/v3/codegen/client/go.go b/cmd/internal/openapi/v3/codegen/client/go.go index 3030a405..7d5ce16d 100644 --- a/cmd/internal/openapi/v3/codegen/client/go.go +++ b/cmd/internal/openapi/v3/codegen/client/go.go @@ -8,7 +8,7 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/openapi/v3/codegen" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) var dtoTmpl = templates.EditableHeaderTmpl + `package {{.Pkg}} diff --git a/cmd/internal/openapi/v3/codegen/common.go b/cmd/internal/openapi/v3/codegen/common.go index b4ee1ef8..1562779f 100644 --- a/cmd/internal/openapi/v3/codegen/common.go +++ b/cmd/internal/openapi/v3/codegen/common.go @@ -14,11 +14,11 @@ import ( "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/sliceutils" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -666,10 +666,10 @@ import ( "github.com/opentracing/opentracing-go" "github.com/unionj-cloud/go-doudou/v2/framework/registry" _querystring "github.com/google/go-querystring/query" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/fileutils" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/unionj-cloud/go-doudou/v2/framework/restclient" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" "io" "mime/multipart" "net/url" diff --git a/cmd/internal/openapi/v3/codegen/common_test.go b/cmd/internal/openapi/v3/codegen/common_test.go index bdb90740..310fbb8e 100644 --- a/cmd/internal/openapi/v3/codegen/common_test.go +++ b/cmd/internal/openapi/v3/codegen/common_test.go @@ -7,8 +7,8 @@ import ( "testing" "github.com/stretchr/testify/assert" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/pathutils" ) func TestPattern2Method(t *testing.T) { diff --git a/cmd/internal/openapi/v3/codegen/server.go b/cmd/internal/openapi/v3/codegen/server.go index c92cd8af..0d23d2b5 100644 --- a/cmd/internal/openapi/v3/codegen/server.go +++ b/cmd/internal/openapi/v3/codegen/server.go @@ -12,10 +12,10 @@ import ( "github.com/iancoleman/strcase" "github.com/pkg/errors" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/astutils" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/sliceutils" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/unionj-cloud/go-doudou/v2/version" "golang.org/x/text/cases" "golang.org/x/text/language" @@ -183,7 +183,7 @@ var svcTmpl = templates.EditableHeaderTmpl + `package service import ( "context" "{{.DtoPackage}}" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) //go:generate go-doudou svc http diff --git a/cmd/internal/openapi/v3/codegen/server/svc.go b/cmd/internal/openapi/v3/codegen/server/svc.go index 0c64f872..220f8b60 100644 --- a/cmd/internal/openapi/v3/codegen/server/svc.go +++ b/cmd/internal/openapi/v3/codegen/server/svc.go @@ -9,8 +9,8 @@ import ( "github.com/iancoleman/strcase" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/openapi/v3/codegen" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/assert" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/assert" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) var dtoTmpl = templates.EditableHeaderTmpl + `package {{.Pkg}} diff --git a/cmd/internal/openapi/v3/codegen/testdata/test/downloadclient.go b/cmd/internal/openapi/v3/codegen/testdata/test/downloadclient.go index 43fe4b54..6e1d575e 100644 --- a/cmd/internal/openapi/v3/codegen/testdata/test/downloadclient.go +++ b/cmd/internal/openapi/v3/codegen/testdata/test/downloadclient.go @@ -20,8 +20,8 @@ import ( "github.com/pkg/errors" "github.com/unionj-cloud/go-doudou/v2/framework/registry" "github.com/unionj-cloud/go-doudou/v2/framework/restclient" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/fileutils" + "github.com/unionj-cloud/toolkit/stringutils" ) type DownloadClient struct { diff --git a/cmd/internal/openapi/v3/codegen/testdata/test/petclient.go b/cmd/internal/openapi/v3/codegen/testdata/test/petclient.go index 8e95c8db..4c600426 100644 --- a/cmd/internal/openapi/v3/codegen/testdata/test/petclient.go +++ b/cmd/internal/openapi/v3/codegen/testdata/test/petclient.go @@ -17,7 +17,7 @@ import ( "github.com/pkg/errors" "github.com/unionj-cloud/go-doudou/v2/framework/registry" "github.com/unionj-cloud/go-doudou/v2/framework/restclient" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) type PetClient struct { diff --git a/cmd/internal/openapi/v3/codegen/testdata/test/textclient.go b/cmd/internal/openapi/v3/codegen/testdata/test/textclient.go index 73631596..3634760e 100644 --- a/cmd/internal/openapi/v3/codegen/testdata/test/textclient.go +++ b/cmd/internal/openapi/v3/codegen/testdata/test/textclient.go @@ -17,7 +17,7 @@ import ( "github.com/pkg/errors" "github.com/unionj-cloud/go-doudou/v2/framework/registry" "github.com/unionj-cloud/go-doudou/v2/framework/restclient" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) type TextClient struct { diff --git a/cmd/internal/openapi/v3/codegen/testdata/test/uploadclient.go b/cmd/internal/openapi/v3/codegen/testdata/test/uploadclient.go index 1f9e6ddf..44d12af4 100644 --- a/cmd/internal/openapi/v3/codegen/testdata/test/uploadclient.go +++ b/cmd/internal/openapi/v3/codegen/testdata/test/uploadclient.go @@ -17,7 +17,7 @@ import ( "github.com/pkg/errors" "github.com/unionj-cloud/go-doudou/v2/framework/registry" "github.com/unionj-cloud/go-doudou/v2/framework/restclient" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) type UploadClient struct { diff --git a/cmd/internal/svc/codegen/config.go b/cmd/internal/svc/codegen/config.go index aa01e095..7cb49abe 100644 --- a/cmd/internal/svc/codegen/config.go +++ b/cmd/internal/svc/codegen/config.go @@ -8,16 +8,16 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) var configTmpl = templates.EditableHeaderTmpl + `package config import ( - "github.com/unionj-cloud/go-doudou/v2/toolkit/envconfig" + "github.com/unionj-cloud/toolkit/envconfig" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" ) var G_Config *Config diff --git a/cmd/internal/svc/codegen/config_test.go b/cmd/internal/svc/codegen/config_test.go index fdd6d688..579cc8f4 100644 --- a/cmd/internal/svc/codegen/config_test.go +++ b/cmd/internal/svc/codegen/config_test.go @@ -5,7 +5,7 @@ import ( "path/filepath" "testing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) const testDir = "testdata" diff --git a/cmd/internal/svc/codegen/database/common.go b/cmd/internal/svc/codegen/database/common.go index 671a60fa..b06f9d61 100644 --- a/cmd/internal/svc/codegen/database/common.go +++ b/cmd/internal/svc/codegen/database/common.go @@ -4,10 +4,10 @@ import ( "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/codegen" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/parser" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/validate" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/executils" + "github.com/wubin1989/gen" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" "os" "path/filepath" ) diff --git a/cmd/internal/svc/codegen/database/gorm.go b/cmd/internal/svc/codegen/database/gorm.go index 07cd8e15..df9df30d 100644 --- a/cmd/internal/svc/codegen/database/gorm.go +++ b/cmd/internal/svc/codegen/database/gorm.go @@ -1,17 +1,17 @@ package database import ( - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "path/filepath" "strings" "github.com/gobwas/glob" - "github.com/unionj-cloud/go-doudou/v2/toolkit/errorx" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/errorx" + "github.com/unionj-cloud/toolkit/executils" + "github.com/wubin1989/gen" + "github.com/wubin1989/gen/field" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/wubin1989/gorm" "github.com/wubin1989/mysql" "github.com/wubin1989/postgres" @@ -71,7 +71,7 @@ func (gg *GormGenerator) fix() { // panic(err) // } // fileContent := string(source) - // fileContent = strings.ReplaceAll(fileContent, "github.com/wubin1989/gen", "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen") + // fileContent = strings.ReplaceAll(fileContent, "github.com/wubin1989/gen", "github.com/wubin1989/gen") // ioutil.WriteFile(file, []byte(fileContent), os.ModePerm) //} } diff --git a/cmd/internal/svc/codegen/db.go b/cmd/internal/svc/codegen/db.go index a3f58bfc..9ca81ff8 100644 --- a/cmd/internal/svc/codegen/db.go +++ b/cmd/internal/svc/codegen/db.go @@ -7,7 +7,7 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/svc/codegen/grpcannotation.go b/cmd/internal/svc/codegen/grpcannotation.go index f3a4e161..538bb50f 100644 --- a/cmd/internal/svc/codegen/grpcannotation.go +++ b/cmd/internal/svc/codegen/grpcannotation.go @@ -10,7 +10,7 @@ import ( "github.com/unionj-cloud/go-doudou/v2/version" "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) var annotationTmpl = `/** diff --git a/cmd/internal/svc/codegen/grpchttpmain.go b/cmd/internal/svc/codegen/grpchttpmain.go index bdc827a1..66d52c89 100644 --- a/cmd/internal/svc/codegen/grpchttpmain.go +++ b/cmd/internal/svc/codegen/grpchttpmain.go @@ -8,8 +8,8 @@ import ( "text/template" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/astutils" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -24,7 +24,7 @@ import ( "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" "github.com/unionj-cloud/go-doudou/v2/framework/grpcx" {{.ServiceAlias}} "{{.ServicePackage}}" diff --git a/cmd/internal/svc/codegen/grpcmain.go b/cmd/internal/svc/codegen/grpcmain.go index 04c22c3f..5bc53c08 100644 --- a/cmd/internal/svc/codegen/grpcmain.go +++ b/cmd/internal/svc/codegen/grpcmain.go @@ -11,10 +11,10 @@ import ( "text/template" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/fileutils" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -84,7 +84,7 @@ var gRPCImportBlock = ` "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" "github.com/unionj-cloud/go-doudou/v2/framework/grpcx" {{.ServiceAlias}} "{{.ServicePackage}}" diff --git a/cmd/internal/svc/codegen/grpcmod.go b/cmd/internal/svc/codegen/grpcmod.go index 8875cd7c..99963c5e 100644 --- a/cmd/internal/svc/codegen/grpcmod.go +++ b/cmd/internal/svc/codegen/grpcmod.go @@ -6,8 +6,8 @@ import ( "path/filepath" "regexp" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/fileutils" ) var goModFixGrpc = ` diff --git a/cmd/internal/svc/codegen/grpcproto.go b/cmd/internal/svc/codegen/grpcproto.go index b712128a..00bfd013 100644 --- a/cmd/internal/svc/codegen/grpcproto.go +++ b/cmd/internal/svc/codegen/grpcproto.go @@ -2,6 +2,7 @@ package codegen import ( "fmt" + "github.com/unionj-cloud/go-doudou/v2/version" "os" "path/filepath" "sort" @@ -9,9 +10,9 @@ import ( "text/template" "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - protov3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/templateutils" + "github.com/unionj-cloud/toolkit/astutils" + protov3 "github.com/unionj-cloud/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/templateutils" ) var protoTmpl = `/** @@ -103,7 +104,7 @@ func GenGrpcProto(dir string, ic astutils.InterfaceCollector, p protov3.ProtoGen } defer f.Close() servicePkg := astutils.GetPkgPath(dir) - service = p.NewService(svcname, servicePkg+"/transport/grpc") + service = p.NewService(svcname, servicePkg+"/transport/grpc", version.Release) service.Comments = ic.Interfaces[0].Comments for _, method := range ic.Interfaces[0].Methods { rpc := p.NewRpc(method) diff --git a/cmd/internal/svc/codegen/http.go b/cmd/internal/svc/codegen/http.go index 9e11819f..d03884a1 100644 --- a/cmd/internal/svc/codegen/http.go +++ b/cmd/internal/svc/codegen/http.go @@ -2,7 +2,7 @@ package codegen import ( "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/parser" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) func genHttp(dir string, ic astutils.InterfaceCollector, caseConvertor func(string) string) { diff --git a/cmd/internal/svc/codegen/http2grpc.go b/cmd/internal/svc/codegen/http2grpc.go index 1190a88d..a9aa3a27 100644 --- a/cmd/internal/svc/codegen/http2grpc.go +++ b/cmd/internal/svc/codegen/http2grpc.go @@ -11,8 +11,8 @@ import ( "github.com/iancoleman/strcase" "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/svc/codegen/httpclient.go b/cmd/internal/svc/codegen/httpclient.go index 627c5406..3fbce0b1 100644 --- a/cmd/internal/svc/codegen/httpclient.go +++ b/cmd/internal/svc/codegen/httpclient.go @@ -10,9 +10,9 @@ import ( "github.com/iancoleman/strcase" "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/parser" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - v3helper "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" + v3helper "github.com/unionj-cloud/toolkit/openapi/v3" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -28,11 +28,11 @@ import ( "github.com/go-resty/resty/v2" "github.com/pkg/errors" "github.com/klauspost/compress/gzip" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/fileutils" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/unionj-cloud/go-doudou/v2/framework/registry" "github.com/unionj-cloud/go-doudou/v2/framework/restclient" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" "github.com/opentracing-contrib/go-stdlib/nethttp" "github.com/opentracing/opentracing-go" "io" diff --git a/cmd/internal/svc/codegen/httpclient_test.go b/cmd/internal/svc/codegen/httpclient_test.go index b653d73a..284b50d1 100644 --- a/cmd/internal/svc/codegen/httpclient_test.go +++ b/cmd/internal/svc/codegen/httpclient_test.go @@ -8,7 +8,7 @@ import ( "github.com/iancoleman/strcase" "github.com/pkg/errors" . "github.com/smartystreets/goconvey/convey" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) func TestGenGoClient(t *testing.T) { diff --git a/cmd/internal/svc/codegen/httpclientproxy.go b/cmd/internal/svc/codegen/httpclientproxy.go index 6aa832eb..febae7cf 100644 --- a/cmd/internal/svc/codegen/httpclientproxy.go +++ b/cmd/internal/svc/codegen/httpclientproxy.go @@ -11,10 +11,10 @@ import ( "text/template" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - v3helper "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" + v3helper "github.com/unionj-cloud/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/zlogger" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -23,7 +23,7 @@ var cpimportTmpl = ` "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/rs/zerolog" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "github.com/slok/goresilience" "github.com/go-resty/resty/v2" "github.com/slok/goresilience/circuitbreaker" @@ -31,7 +31,7 @@ var cpimportTmpl = ` "github.com/slok/goresilience/metrics" "github.com/slok/goresilience/retry" "github.com/slok/goresilience/timeout" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" "os" "time" ` diff --git a/cmd/internal/svc/codegen/httpclientproxy_test.go b/cmd/internal/svc/codegen/httpclientproxy_test.go index 7410749f..50dfe3b7 100644 --- a/cmd/internal/svc/codegen/httpclientproxy_test.go +++ b/cmd/internal/svc/codegen/httpclientproxy_test.go @@ -5,7 +5,7 @@ import ( "path/filepath" "testing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) func TestGenGoClientProxy1(t *testing.T) { diff --git a/cmd/internal/svc/codegen/httphandler.go b/cmd/internal/svc/codegen/httphandler.go index 21c7ecd5..321725cc 100644 --- a/cmd/internal/svc/codegen/httphandler.go +++ b/cmd/internal/svc/codegen/httphandler.go @@ -11,7 +11,7 @@ import ( "github.com/unionj-cloud/go-doudou/v2/version" "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) var httpHandlerTmpl = `/** diff --git a/cmd/internal/svc/codegen/httphandlerimpl.go b/cmd/internal/svc/codegen/httphandlerimpl.go index 042b1e1e..fe3ec2e0 100644 --- a/cmd/internal/svc/codegen/httphandlerimpl.go +++ b/cmd/internal/svc/codegen/httphandlerimpl.go @@ -11,9 +11,9 @@ import ( "github.com/iancoleman/strcase" "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - v3helper "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" + v3helper "github.com/unionj-cloud/toolkit/openapi/v3" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -397,10 +397,10 @@ var importTmpl = ` "github.com/bytedance/sonic" "fmt" "github.com/sirupsen/logrus" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" "github.com/unionj-cloud/go-doudou/v2/framework/rest" "github.com/unionj-cloud/go-doudou/v2/framework/rest/httprouter" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" + "github.com/unionj-cloud/toolkit/cast" {{.ServiceAlias}} "{{.ServicePackage}}" "net/http" "github.com/pkg/errors" diff --git a/cmd/internal/svc/codegen/httphandlerimpl_test.go b/cmd/internal/svc/codegen/httphandlerimpl_test.go index 018b976a..0ff95389 100644 --- a/cmd/internal/svc/codegen/httphandlerimpl_test.go +++ b/cmd/internal/svc/codegen/httphandlerimpl_test.go @@ -5,8 +5,8 @@ import ( "path/filepath" "testing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" ) func Test_unimplementedMethods(t *testing.T) { diff --git a/cmd/internal/svc/codegen/httpiclient.go b/cmd/internal/svc/codegen/httpiclient.go index db3f2120..031c88d2 100644 --- a/cmd/internal/svc/codegen/httpiclient.go +++ b/cmd/internal/svc/codegen/httpiclient.go @@ -8,8 +8,8 @@ import ( "text/template" "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -22,7 +22,7 @@ package client import ( "context" "github.com/go-resty/resty/v2" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" "os" ) diff --git a/cmd/internal/svc/codegen/httpiclient_test.go b/cmd/internal/svc/codegen/httpiclient_test.go index 5c8807ac..947976de 100644 --- a/cmd/internal/svc/codegen/httpiclient_test.go +++ b/cmd/internal/svc/codegen/httpiclient_test.go @@ -4,7 +4,7 @@ import ( "path/filepath" "testing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) func TestGenGoIClient(t *testing.T) { diff --git a/cmd/internal/svc/codegen/httpintegrationtesting.go b/cmd/internal/svc/codegen/httpintegrationtesting.go index f29e53fc..ff8e17a5 100644 --- a/cmd/internal/svc/codegen/httpintegrationtesting.go +++ b/cmd/internal/svc/codegen/httpintegrationtesting.go @@ -14,8 +14,8 @@ import ( "github.com/rbretecher/go-postman-collection" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/zlogger" "github.com/unionj-cloud/go-doudou/v2/version" ) @@ -73,7 +73,7 @@ var integrationTestingImportTmpl = ` "github.com/gorilla/mux" "github.com/joho/godotenv" "github.com/rs/zerolog" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "github.com/steinfletcher/apitest" jsonpath "github.com/steinfletcher/apitest-jsonpath" "net/http" diff --git a/cmd/internal/svc/codegen/httpintegrationtesting_test.go b/cmd/internal/svc/codegen/httpintegrationtesting_test.go index 646783b5..62d91709 100644 --- a/cmd/internal/svc/codegen/httpintegrationtesting_test.go +++ b/cmd/internal/svc/codegen/httpintegrationtesting_test.go @@ -5,7 +5,7 @@ import ( "path/filepath" "testing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" + "github.com/unionj-cloud/toolkit/fileutils" ) func Test_notGenerated(t *testing.T) { diff --git a/cmd/internal/svc/codegen/init.go b/cmd/internal/svc/codegen/init.go index 41c95800..c918e2db 100644 --- a/cmd/internal/svc/codegen/init.go +++ b/cmd/internal/svc/codegen/init.go @@ -13,11 +13,11 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/parser" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/common" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/common" + "github.com/unionj-cloud/toolkit/executils" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/svc/codegen/init_test.go b/cmd/internal/svc/codegen/init_test.go index fc9d8dea..397fabe4 100644 --- a/cmd/internal/svc/codegen/init_test.go +++ b/cmd/internal/svc/codegen/init_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" + "github.com/unionj-cloud/toolkit/executils" ) func TestInitProj(t *testing.T) { diff --git a/cmd/internal/svc/codegen/k8sdeployment_test.go b/cmd/internal/svc/codegen/k8sdeployment_test.go index efc12dc8..713f0c72 100644 --- a/cmd/internal/svc/codegen/k8sdeployment_test.go +++ b/cmd/internal/svc/codegen/k8sdeployment_test.go @@ -6,7 +6,7 @@ import ( "path/filepath" "testing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/pathutils" ) func TestModifyVersion(t *testing.T) { diff --git a/cmd/internal/svc/codegen/k8sstatefulset_test.go b/cmd/internal/svc/codegen/k8sstatefulset_test.go index e5c48fc2..b64f5b9f 100644 --- a/cmd/internal/svc/codegen/k8sstatefulset_test.go +++ b/cmd/internal/svc/codegen/k8sstatefulset_test.go @@ -5,7 +5,7 @@ import ( "path/filepath" "testing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/pathutils" ) func TestGenK8sStatefulset(t *testing.T) { diff --git a/cmd/internal/svc/codegen/main.go b/cmd/internal/svc/codegen/main.go index dca306f7..3b501dd9 100644 --- a/cmd/internal/svc/codegen/main.go +++ b/cmd/internal/svc/codegen/main.go @@ -7,7 +7,7 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/svc/codegen/main_test.go b/cmd/internal/svc/codegen/main_test.go index d9b79be5..0a3ba302 100644 --- a/cmd/internal/svc/codegen/main_test.go +++ b/cmd/internal/svc/codegen/main_test.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" . "github.com/smartystreets/goconvey/convey" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) func TestGenMainPanic_Stat(t *testing.T) { diff --git a/cmd/internal/svc/codegen/mainmodule.go b/cmd/internal/svc/codegen/mainmodule.go index ad1d544d..9e190323 100644 --- a/cmd/internal/svc/codegen/mainmodule.go +++ b/cmd/internal/svc/codegen/mainmodule.go @@ -8,7 +8,7 @@ import ( "text/template" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/svc/codegen/plugin.go b/cmd/internal/svc/codegen/plugin.go index 75fd774d..67369fb6 100644 --- a/cmd/internal/svc/codegen/plugin.go +++ b/cmd/internal/svc/codegen/plugin.go @@ -8,7 +8,7 @@ import ( "text/template" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/svc/codegen/svcimpl.go b/cmd/internal/svc/codegen/svcimpl.go index 628428e6..175ac87f 100644 --- a/cmd/internal/svc/codegen/svcimpl.go +++ b/cmd/internal/svc/codegen/svcimpl.go @@ -10,9 +10,9 @@ import ( "github.com/iancoleman/strcase" "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/templates" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/copier" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" "github.com/unionj-cloud/go-doudou/v2/version" ) diff --git a/cmd/internal/svc/codegen/testdata/client/clientproxy.go b/cmd/internal/svc/codegen/testdata/client/clientproxy.go index 58049d4b..6281f93a 100644 --- a/cmd/internal/svc/codegen/testdata/client/clientproxy.go +++ b/cmd/internal/svc/codegen/testdata/client/clientproxy.go @@ -17,7 +17,7 @@ import ( "github.com/slok/goresilience/metrics" "github.com/slok/goresilience/retry" "github.com/slok/goresilience/timeout" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) type UsersvcClientProxy struct { diff --git a/cmd/internal/svc/codegen/testdata/client/iclient.go b/cmd/internal/svc/codegen/testdata/client/iclient.go index e07e5447..d1af808c 100644 --- a/cmd/internal/svc/codegen/testdata/client/iclient.go +++ b/cmd/internal/svc/codegen/testdata/client/iclient.go @@ -9,7 +9,7 @@ import ( "github.com/go-resty/resty/v2" "testdata/vo" "testdata/dto" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" "os" ) diff --git a/cmd/internal/svc/codegen/testdata/config/config.go b/cmd/internal/svc/codegen/testdata/config/config.go index 1c75585e..cefc3354 100644 --- a/cmd/internal/svc/codegen/testdata/config/config.go +++ b/cmd/internal/svc/codegen/testdata/config/config.go @@ -2,7 +2,7 @@ package config import ( "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/envconfig" + "github.com/unionj-cloud/toolkit/envconfig" ) type Config struct { diff --git a/cmd/internal/svc/codegen/testdata/svc.go b/cmd/internal/svc/codegen/testdata/svc.go index 32238697..8fa9e421 100644 --- a/cmd/internal/svc/codegen/testdata/svc.go +++ b/cmd/internal/svc/codegen/testdata/svc.go @@ -7,7 +7,7 @@ import ( "testdata/vo" "github.com/shopspring/decimal" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/cmd/internal/svc/codegen/testdata/svcimpl.go b/cmd/internal/svc/codegen/testdata/svcimpl.go index 8cff2178..c80cee3f 100644 --- a/cmd/internal/svc/codegen/testdata/svcimpl.go +++ b/cmd/internal/svc/codegen/testdata/svcimpl.go @@ -9,7 +9,7 @@ import ( "github.com/brianvoe/gofakeit/v6" "github.com/jmoiron/sqlx" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) type UsersvcImpl struct { diff --git a/cmd/internal/svc/codegen/testdata/svcp.go b/cmd/internal/svc/codegen/testdata/svcp.go index 11332882..a8c244c3 100644 --- a/cmd/internal/svc/codegen/testdata/svcp.go +++ b/cmd/internal/svc/codegen/testdata/svcp.go @@ -5,7 +5,7 @@ import ( "os" "testdata/vo" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/cmd/internal/svc/codegen/testdata/transport/httpsrv/handlerimpl.go b/cmd/internal/svc/codegen/testdata/transport/httpsrv/handlerimpl.go index 78fcd45d..f2cc39ab 100644 --- a/cmd/internal/svc/codegen/testdata/transport/httpsrv/handlerimpl.go +++ b/cmd/internal/svc/codegen/testdata/transport/httpsrv/handlerimpl.go @@ -17,8 +17,8 @@ import ( "github.com/pkg/errors" "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/cast" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) type UsersvcHandlerImpl struct { diff --git a/cmd/internal/svc/parser/parser.go b/cmd/internal/svc/parser/parser.go index 5fc56446..210c4cf2 100644 --- a/cmd/internal/svc/parser/parser.go +++ b/cmd/internal/svc/parser/parser.go @@ -19,11 +19,11 @@ import ( "github.com/iancoleman/strcase" "github.com/samber/lo" "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - protov3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/constants" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" + protov3 "github.com/unionj-cloud/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/stringutils" ) var DEFAULT_DTO_PKGS = []string{"vo", "dto", "model"} diff --git a/cmd/internal/svc/svc.go b/cmd/internal/svc/svc.go index 4ba3dc41..e924d50a 100644 --- a/cmd/internal/svc/svc.go +++ b/cmd/internal/svc/svc.go @@ -18,11 +18,11 @@ import ( "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/codegen/database" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/parser" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/validate" - "github.com/unionj-cloud/go-doudou/v2/toolkit/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/assert" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/executils" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" + "github.com/unionj-cloud/toolkit/stringutils" ) //go:generate mockgen -destination ../../mock/mock_svc.go -package mock -source=./svc.go diff --git a/cmd/internal/svc/svc_test.go b/cmd/internal/svc/svc_test.go index 3f425ac7..79110816 100644 --- a/cmd/internal/svc/svc_test.go +++ b/cmd/internal/svc/svc_test.go @@ -5,7 +5,7 @@ import ( "github.com/iancoleman/strcase" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/codegen" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/parser" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" + v3 "github.com/unionj-cloud/toolkit/protobuf/v3" "os" "os/exec" "path/filepath" @@ -16,9 +16,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/validate" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/astutils" + "github.com/unionj-cloud/toolkit/executils" + "github.com/unionj-cloud/toolkit/pathutils" ) var testDir string diff --git a/cmd/internal/svc/testdata/checkIc2/svc.go b/cmd/internal/svc/testdata/checkIc2/svc.go index 2b22d294..7df77e4a 100644 --- a/cmd/internal/svc/testdata/checkIc2/svc.go +++ b/cmd/internal/svc/testdata/checkIc2/svc.go @@ -4,7 +4,7 @@ import ( "context" "mime/multipart" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/cmd/internal/svc/testdata/novo/svc.go b/cmd/internal/svc/testdata/novo/svc.go index 372516ba..b61d9144 100644 --- a/cmd/internal/svc/testdata/novo/svc.go +++ b/cmd/internal/svc/testdata/novo/svc.go @@ -6,7 +6,7 @@ import ( "os" "github.com/unionj-cloud/go-doudou/v2/framework/testdata/vo" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/cmd/internal/svc/testdata/svc.go b/cmd/internal/svc/testdata/svc.go index 7ea67f8f..fda7138e 100644 --- a/cmd/internal/svc/testdata/svc.go +++ b/cmd/internal/svc/testdata/svc.go @@ -6,7 +6,7 @@ import ( "os" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/testdata/vo" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/cmd/internal/svc/testdata/svcp.go b/cmd/internal/svc/testdata/svcp.go index 12475a5e..8894d8bf 100644 --- a/cmd/internal/svc/testdata/svcp.go +++ b/cmd/internal/svc/testdata/svcp.go @@ -5,7 +5,7 @@ import ( "os" "github.com/unionj-cloud/go-doudou/v2/framework/testdata/vo" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/cmd/internal/svc/validate/validate.go b/cmd/internal/svc/validate/validate.go index 4d7c9126..84398bd3 100644 --- a/cmd/internal/svc/validate/validate.go +++ b/cmd/internal/svc/validate/validate.go @@ -9,9 +9,9 @@ import ( "github.com/pkg/errors" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/svc/parser" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - v3helper "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" + "github.com/unionj-cloud/toolkit/astutils" + v3helper "github.com/unionj-cloud/toolkit/openapi/v3" + "github.com/unionj-cloud/toolkit/sliceutils" ) func DataType(dir string, dtoDirs ...string) { diff --git a/cmd/internal/templates/mainmain.go b/cmd/internal/templates/mainmain.go index c02aa54b..25bf2f44 100644 --- a/cmd/internal/templates/mainmain.go +++ b/cmd/internal/templates/mainmain.go @@ -14,8 +14,8 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/grpcx" "github.com/unionj-cloud/go-doudou/v2/framework/plugin" "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pipeconn" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/pipeconn" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" ) diff --git a/cmd/internal/templates/mainmodule.go b/cmd/internal/templates/mainmodule.go index e9acb65f..4dff2ef1 100644 --- a/cmd/internal/templates/mainmodule.go +++ b/cmd/internal/templates/mainmodule.go @@ -6,7 +6,7 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/grpcx" "github.com/unionj-cloud/go-doudou/v2/framework/plugin" "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" _ "{{.PluginPackage}}" ) diff --git a/cmd/internal/templates/plugin.go b/cmd/internal/templates/plugin.go index 9df044f5..cd19cfe2 100644 --- a/cmd/internal/templates/plugin.go +++ b/cmd/internal/templates/plugin.go @@ -18,9 +18,9 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/grpcx" "github.com/unionj-cloud/go-doudou/v2/framework/plugin" "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pipeconn" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/pipeconn" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" "os" ) diff --git a/cmd/modular/init.go b/cmd/modular/init.go index d0046c09..0dd3035c 100644 --- a/cmd/modular/init.go +++ b/cmd/modular/init.go @@ -4,8 +4,8 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/unionj-cloud/go-doudou/v2/cmd/internal/modular" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" + "github.com/unionj-cloud/toolkit/executils" + "github.com/unionj-cloud/toolkit/pathutils" ) // initCmd initializes the service diff --git a/cmd/name_test.go b/cmd/name_test.go index 5f2bad00..e32958e3 100644 --- a/cmd/name_test.go +++ b/cmd/name_test.go @@ -6,7 +6,7 @@ import ( "testing" "github.com/unionj-cloud/go-doudou/v2/cmd" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" + "github.com/unionj-cloud/toolkit/astutils" ) func TestNameCmd(t *testing.T) { diff --git a/cmd/testdata/testsvc/config/config.go b/cmd/testdata/testsvc/config/config.go index 1c75585e..cefc3354 100644 --- a/cmd/testdata/testsvc/config/config.go +++ b/cmd/testdata/testsvc/config/config.go @@ -2,7 +2,7 @@ package config import ( "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/envconfig" + "github.com/unionj-cloud/toolkit/envconfig" ) type Config struct { diff --git a/framework/cache/2qcache.go b/framework/cache/2qcache.go index 725266a2..c7684236 100644 --- a/framework/cache/2qcache.go +++ b/framework/cache/2qcache.go @@ -5,7 +5,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" + "github.com/unionj-cloud/toolkit/caller" ) type TwoQueueCache struct { diff --git a/framework/cache/arccache.go b/framework/cache/arccache.go index 65dddbeb..c6c52573 100644 --- a/framework/cache/arccache.go +++ b/framework/cache/arccache.go @@ -5,7 +5,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" + "github.com/unionj-cloud/toolkit/caller" ) type ARCCache struct { diff --git a/framework/cache/cachemanager.go b/framework/cache/cachemanager.go index 5902ea4c..d1ca78cf 100644 --- a/framework/cache/cachemanager.go +++ b/framework/cache/cachemanager.go @@ -8,17 +8,17 @@ import ( "github.com/dgraph-io/ristretto" go_cache "github.com/patrickmn/go-cache" "github.com/redis/go-redis/v9" - gocache "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/metrics" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - go_cache_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/store/go_cache" - redis_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/store/redis" - ristretto_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/store/ristretto" + gocache "github.com/unionj-cloud/toolkit/gocache/lib/cache" + "github.com/unionj-cloud/toolkit/gocache/lib/metrics" + "github.com/unionj-cloud/toolkit/gocache/lib/store" + go_cache_store "github.com/unionj-cloud/toolkit/gocache/store/go_cache" + redis_store "github.com/unionj-cloud/toolkit/gocache/store/redis" + ristretto_store "github.com/unionj-cloud/toolkit/gocache/store/ristretto" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/sliceutils" + "github.com/unionj-cloud/toolkit/stringutils" ) var CacheManager gocache.CacheInterface[any] diff --git a/framework/cache/lrucache.go b/framework/cache/lrucache.go index a5eecc2f..419bc064 100644 --- a/framework/cache/lrucache.go +++ b/framework/cache/lrucache.go @@ -5,7 +5,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" + "github.com/unionj-cloud/toolkit/caller" ) type LruCache struct { diff --git a/framework/config/config.go b/framework/config/config.go index 01bb08fe..5b5f628d 100644 --- a/framework/config/config.go +++ b/framework/config/config.go @@ -12,8 +12,8 @@ import ( "sync" "time" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/fileutils" "github.com/apolloconfig/agollo/v4" "github.com/apolloconfig/agollo/v4/env/config" @@ -25,12 +25,12 @@ import ( _ "go.uber.org/automaxprocs" "github.com/unionj-cloud/go-doudou/v2/framework/configmgr" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/dotenv" - "github.com/unionj-cloud/go-doudou/v2/toolkit/envconfig" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/yaml" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/dotenv" + "github.com/unionj-cloud/toolkit/envconfig" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/yaml" + "github.com/unionj-cloud/toolkit/zlogger" ) var GddConfig = &gddConfig{} diff --git a/framework/configmgr/apollo.go b/framework/configmgr/apollo.go index 265b9284..efeaea93 100644 --- a/framework/configmgr/apollo.go +++ b/framework/configmgr/apollo.go @@ -10,7 +10,7 @@ import ( "github.com/apolloconfig/agollo/v4/env/config" "github.com/apolloconfig/agollo/v4/storage" "github.com/pkg/errors" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + logger "github.com/unionj-cloud/toolkit/zlogger" ) var onceApollo sync.Once diff --git a/framework/configmgr/nacos.go b/framework/configmgr/nacos.go index 483373c6..7b873b9f 100644 --- a/framework/configmgr/nacos.go +++ b/framework/configmgr/nacos.go @@ -9,10 +9,10 @@ import ( "github.com/joho/godotenv" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/dotenv" - "github.com/unionj-cloud/go-doudou/v2/toolkit/maputils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/yaml" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/dotenv" + "github.com/unionj-cloud/toolkit/maputils" + "github.com/unionj-cloud/toolkit/yaml" + logger "github.com/unionj-cloud/toolkit/zlogger" "github.com/wubin1989/nacos-sdk-go/v2/clients" "github.com/wubin1989/nacos-sdk-go/v2/clients/cache" "github.com/wubin1989/nacos-sdk-go/v2/clients/config_client" diff --git a/framework/configmgr/nacos_test.go b/framework/configmgr/nacos_test.go index 0fae5d24..5f824d1c 100644 --- a/framework/configmgr/nacos_test.go +++ b/framework/configmgr/nacos_test.go @@ -12,7 +12,7 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/config" "github.com/unionj-cloud/go-doudou/v2/framework/configmgr" "github.com/unionj-cloud/go-doudou/v2/framework/configmgr/mock" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/stringutils" "github.com/wubin1989/nacos-sdk-go/v2/clients/cache" "github.com/wubin1989/nacos-sdk-go/v2/clients/config_client" "github.com/wubin1989/nacos-sdk-go/v2/util" diff --git a/framework/database/cacheradapter.go b/framework/database/cacheradapter.go index a2152c8e..d5a0a0ab 100644 --- a/framework/database/cacheradapter.go +++ b/framework/database/cacheradapter.go @@ -4,10 +4,10 @@ import ( "context" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caches" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/caches" + "github.com/unionj-cloud/toolkit/gocache/lib/cache" + "github.com/unionj-cloud/toolkit/gocache/lib/store" + "github.com/unionj-cloud/toolkit/zlogger" ) var _ caches.Cacher = (*CacherAdapter)(nil) diff --git a/framework/database/database.go b/framework/database/database.go index f45de6d5..d2500e11 100644 --- a/framework/database/database.go +++ b/framework/database/database.go @@ -6,7 +6,7 @@ import ( "strings" "time" - gocache "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/cache" + gocache "github.com/unionj-cloud/toolkit/gocache/lib/cache" "github.com/wubin1989/clickhouse" "github.com/wubin1989/sqlite" "github.com/wubin1989/sqlserver" @@ -20,11 +20,11 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/cache" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caches" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/errorx" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/caches" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/errorx" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/zlogger" ) const ( diff --git a/framework/database/marshaler.go b/framework/database/marshaler.go index 3bb8b323..d85ede36 100644 --- a/framework/database/marshaler.go +++ b/framework/database/marshaler.go @@ -12,10 +12,10 @@ import ( "github.com/lithammer/shortuuid/v4" "github.com/samber/lo" "github.com/spf13/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caches" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "github.com/unionj-cloud/go-doudou/v2/toolkit/reflectutils" + "github.com/unionj-cloud/toolkit/caches" + "github.com/unionj-cloud/toolkit/gocache/lib/cache" + "github.com/unionj-cloud/toolkit/gocache/lib/store" + "github.com/unionj-cloud/toolkit/reflectutils" ) var json = sonic.ConfigDefault diff --git a/framework/grpcx/grpc_resolver_nacos/balancer.go b/framework/grpcx/grpc_resolver_nacos/balancer.go index f9270c85..da908a0c 100644 --- a/framework/grpcx/grpc_resolver_nacos/balancer.go +++ b/framework/grpcx/grpc_resolver_nacos/balancer.go @@ -5,7 +5,7 @@ import ( "sort" "sync" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" diff --git a/framework/grpcx/grpc_resolver_zk/balancer.go b/framework/grpcx/grpc_resolver_zk/balancer.go index 21c6da62..b301633d 100644 --- a/framework/grpcx/grpc_resolver_zk/balancer.go +++ b/framework/grpcx/grpc_resolver_zk/balancer.go @@ -5,7 +5,7 @@ import ( "sort" "sync" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" diff --git a/framework/grpcx/grpc_resolver_zk/zk.go b/framework/grpcx/grpc_resolver_zk/zk.go index cdf3b77d..30f38467 100644 --- a/framework/grpcx/grpc_resolver_zk/zk.go +++ b/framework/grpcx/grpc_resolver_zk/zk.go @@ -5,7 +5,7 @@ import ( "strings" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" + "github.com/unionj-cloud/toolkit/cast" "google.golang.org/grpc/attributes" "google.golang.org/grpc/resolver" ) diff --git a/framework/grpcx/server.go b/framework/grpcx/server.go index 82f69b2d..be82d90c 100644 --- a/framework/grpcx/server.go +++ b/framework/grpcx/server.go @@ -14,8 +14,8 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework" "github.com/unionj-cloud/go-doudou/v2/framework/config" register "github.com/unionj-cloud/go-doudou/v2/framework/registry" - "github.com/unionj-cloud/go-doudou/v2/toolkit/timeutils" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/timeutils" + logger "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) diff --git a/framework/logger/configure.go b/framework/logger/configure.go index 66c2934e..0e45fad4 100644 --- a/framework/logger/configure.go +++ b/framework/logger/configure.go @@ -6,7 +6,7 @@ import ( "github.com/mattn/go-colorable" "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/stringutils" ) type LoggerOption func(*logrus.Logger) diff --git a/framework/logger/entry.go b/framework/logger/entry.go index 6053e01b..db57e451 100644 --- a/framework/logger/entry.go +++ b/framework/logger/entry.go @@ -9,8 +9,8 @@ import ( "github.com/sirupsen/logrus" "github.com/unionj-cloud/go-doudou/v2/framework/buildinfo" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/stringutils" ) var ( diff --git a/framework/plugin/plugin.go b/framework/plugin/plugin.go index b51905d5..1a700e57 100644 --- a/framework/plugin/plugin.go +++ b/framework/plugin/plugin.go @@ -4,7 +4,7 @@ import ( "github.com/elliotchance/orderedmap/v2" "github.com/unionj-cloud/go-doudou/v2/framework/grpcx" "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pipeconn" + "github.com/unionj-cloud/toolkit/pipeconn" ) var servicePlugins = orderedmap.NewOrderedMap[string, ServicePlugin]() diff --git a/framework/ratelimit/memrate/memorystore.go b/framework/ratelimit/memrate/memorystore.go index 754af957..e8231feb 100644 --- a/framework/ratelimit/memrate/memorystore.go +++ b/framework/ratelimit/memrate/memorystore.go @@ -7,7 +7,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/hashicorp/golang-lru/simplelru" "github.com/unionj-cloud/go-doudou/v2/framework/ratelimit" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + logger "github.com/unionj-cloud/toolkit/zlogger" ) const defaultMaxKeys = 256 diff --git a/framework/ratelimit/memrate/rate.go b/framework/ratelimit/memrate/rate.go index c23dd3e4..eb1bb78d 100644 --- a/framework/ratelimit/memrate/rate.go +++ b/framework/ratelimit/memrate/rate.go @@ -13,7 +13,7 @@ import ( "time" "github.com/unionj-cloud/go-doudou/v2/framework/ratelimit" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + logger "github.com/unionj-cloud/toolkit/zlogger" ) // Limit defines the maximum frequency of some events. diff --git a/framework/ratelimit/redisrate/gcralimiter.go b/framework/ratelimit/redisrate/gcralimiter.go index 8fbcd5bd..61a83f5a 100644 --- a/framework/ratelimit/redisrate/gcralimiter.go +++ b/framework/ratelimit/redisrate/gcralimiter.go @@ -6,7 +6,7 @@ import ( "time" "github.com/unionj-cloud/go-doudou/v2/framework/ratelimit" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + logger "github.com/unionj-cloud/toolkit/zlogger" "github.com/go-redis/redis/v8" ) diff --git a/framework/registry/etcd/balancer.go b/framework/registry/etcd/balancer.go index 76532e80..1ad7abd9 100644 --- a/framework/registry/etcd/balancer.go +++ b/framework/registry/etcd/balancer.go @@ -3,7 +3,7 @@ package etcd import ( "sync" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/base" diff --git a/framework/registry/etcd/node.go b/framework/registry/etcd/node.go index 004a9f32..41c09be4 100644 --- a/framework/registry/etcd/node.go +++ b/framework/registry/etcd/node.go @@ -16,10 +16,10 @@ import ( cons "github.com/unionj-cloud/go-doudou/v2/framework/registry/constants" "github.com/unionj-cloud/go-doudou/v2/framework/registry/interfaces" "github.com/unionj-cloud/go-doudou/v2/framework/registry/utils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/zlogger" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/client/v3/naming/endpoints" "go.etcd.io/etcd/client/v3/naming/resolver" diff --git a/framework/registry/memberlist/balancer.go b/framework/registry/memberlist/balancer.go index c800ed39..dca79271 100644 --- a/framework/registry/memberlist/balancer.go +++ b/framework/registry/memberlist/balancer.go @@ -3,7 +3,7 @@ package memberlist import ( "sync" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc/balancer" balancerbase "google.golang.org/grpc/balancer/base" diff --git a/framework/registry/memberlist/config.go b/framework/registry/memberlist/config.go index fb21f8cb..2d7c0ede 100644 --- a/framework/registry/memberlist/config.go +++ b/framework/registry/memberlist/config.go @@ -5,9 +5,9 @@ import ( "time" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/stringutils" ) func setGddMemDeadTimeout(conf *memberlist.Config) { diff --git a/framework/registry/memberlist/config_test.go b/framework/registry/memberlist/config_test.go index 052476d3..b1219424 100644 --- a/framework/registry/memberlist/config_test.go +++ b/framework/registry/memberlist/config_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/memberlist" ) func TestMain(m *testing.M) { diff --git a/framework/registry/memberlist/delegate.go b/framework/registry/memberlist/delegate.go index cedffc5e..883ad229 100644 --- a/framework/registry/memberlist/delegate.go +++ b/framework/registry/memberlist/delegate.go @@ -8,8 +8,8 @@ import ( "github.com/hashicorp/go-msgpack/codec" "github.com/unionj-cloud/go-doudou/v2/framework/registry/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/memberlist" + logger "github.com/unionj-cloud/toolkit/zlogger" ) type Service struct { diff --git a/framework/registry/memberlist/delegate_test.go b/framework/registry/memberlist/delegate_test.go index f10d9d34..de36362e 100644 --- a/framework/registry/memberlist/delegate_test.go +++ b/framework/registry/memberlist/delegate_test.go @@ -6,7 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/memberlist" ) func Test_delegate_NodeMeta(t *testing.T) { diff --git a/framework/registry/memberlist/eventdelegate.go b/framework/registry/memberlist/eventdelegate.go index 4cecbf0e..516c4ef3 100644 --- a/framework/registry/memberlist/eventdelegate.go +++ b/framework/registry/memberlist/eventdelegate.go @@ -1,7 +1,7 @@ package memberlist import ( - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/memberlist" ) type eventDelegate struct { diff --git a/framework/registry/memberlist/eventdelegate_test.go b/framework/registry/memberlist/eventdelegate_test.go index 5c67f5dc..0fde0d24 100644 --- a/framework/registry/memberlist/eventdelegate_test.go +++ b/framework/registry/memberlist/eventdelegate_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/bytedance/sonic" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/memberlist" ) var json = sonic.ConfigDefault diff --git a/framework/registry/memberlist/node.go b/framework/registry/memberlist/node.go index 1cd96b57..ad4e61f2 100644 --- a/framework/registry/memberlist/node.go +++ b/framework/registry/memberlist/node.go @@ -19,11 +19,11 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/config" "github.com/unionj-cloud/go-doudou/v2/framework/configmgr" cons "github.com/unionj-cloud/go-doudou/v2/framework/registry/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/stringutils" + logger "github.com/unionj-cloud/toolkit/zlogger" ) var mlist memberlist.IMemberlist diff --git a/framework/registry/memberlist/resolver.go b/framework/registry/memberlist/resolver.go index c3c562cb..73e9dc7b 100644 --- a/framework/registry/memberlist/resolver.go +++ b/framework/registry/memberlist/resolver.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/memberlist" "google.golang.org/grpc/attributes" gresolver "google.golang.org/grpc/resolver" ) diff --git a/framework/registry/memberlist/serviceprovider.go b/framework/registry/memberlist/serviceprovider.go index c9bb9ef7..05cc575a 100644 --- a/framework/registry/memberlist/serviceprovider.go +++ b/framework/registry/memberlist/serviceprovider.go @@ -7,9 +7,9 @@ import ( "sync/atomic" "time" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/stringutils" + logger "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" ) diff --git a/framework/registry/memberlist/serviceprovider_test.go b/framework/registry/memberlist/serviceprovider_test.go index 226bace4..d05340b9 100644 --- a/framework/registry/memberlist/serviceprovider_test.go +++ b/framework/registry/memberlist/serviceprovider_test.go @@ -3,7 +3,7 @@ package memberlist import ( "sync" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/memberlist" ) type mockServiceProvider struct { diff --git a/framework/registry/nacos/node.go b/framework/registry/nacos/node.go index bc5cab94..93e06750 100644 --- a/framework/registry/nacos/node.go +++ b/framework/registry/nacos/node.go @@ -16,10 +16,10 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/grpcx/grpc_resolver_nacos" cons "github.com/unionj-cloud/go-doudou/v2/framework/registry/constants" "github.com/unionj-cloud/go-doudou/v2/framework/registry/utils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/stringutils" + logger "github.com/unionj-cloud/toolkit/zlogger" "github.com/wubin1989/nacos-sdk-go/v2/clients" "github.com/wubin1989/nacos-sdk-go/v2/clients/naming_client" "github.com/wubin1989/nacos-sdk-go/v2/model" diff --git a/framework/registry/node.go b/framework/registry/node.go index db11873f..6645d518 100644 --- a/framework/registry/node.go +++ b/framework/registry/node.go @@ -7,7 +7,7 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/registry/memberlist" "github.com/unionj-cloud/go-doudou/v2/framework/registry/nacos" "github.com/unionj-cloud/go-doudou/v2/framework/registry/zk" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + logger "github.com/unionj-cloud/toolkit/zlogger" ) type IServiceProvider interface { diff --git a/framework/registry/pipe/node.go b/framework/registry/pipe/node.go index 2a01f181..1e92ec32 100644 --- a/framework/registry/pipe/node.go +++ b/framework/registry/pipe/node.go @@ -5,8 +5,8 @@ import ( "net" "time" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pipeconn" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/pipeconn" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) diff --git a/framework/registry/serversets/endpoint.go b/framework/registry/serversets/endpoint.go index 52abcb44..fdf10026 100644 --- a/framework/registry/serversets/endpoint.go +++ b/framework/registry/serversets/endpoint.go @@ -9,7 +9,7 @@ import ( "github.com/bytedance/sonic" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" + "github.com/unionj-cloud/toolkit/cast" "github.com/go-zookeeper/zk" ) diff --git a/framework/registry/serversets/watch.go b/framework/registry/serversets/watch.go index 4be63036..2ebb9806 100644 --- a/framework/registry/serversets/watch.go +++ b/framework/registry/serversets/watch.go @@ -7,8 +7,8 @@ import ( "time" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/caller" + "github.com/unionj-cloud/toolkit/zlogger" "github.com/go-zookeeper/zk" ) diff --git a/framework/registry/utils/utils.go b/framework/registry/utils/utils.go index a01afb41..40239ce4 100644 --- a/framework/registry/utils/utils.go +++ b/framework/registry/utils/utils.go @@ -3,8 +3,8 @@ package utils import ( "github.com/hashicorp/go-sockaddr" "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/zlogger" ) var GetPrivateIP = sockaddr.GetPrivateIP diff --git a/framework/registry/zk/node.go b/framework/registry/zk/node.go index d82f6a12..b45088cc 100644 --- a/framework/registry/zk/node.go +++ b/framework/registry/zk/node.go @@ -20,11 +20,11 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/registry/interfaces" "github.com/unionj-cloud/go-doudou/v2/framework/registry/serversets" "github.com/unionj-cloud/go-doudou/v2/framework/registry/utils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/errorx" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/cast" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/errorx" + "github.com/unionj-cloud/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/zlogger" "google.golang.org/grpc" ) diff --git a/framework/rest/confighandler.go b/framework/rest/confighandler.go index 981ad01b..e8d85642 100644 --- a/framework/rest/confighandler.go +++ b/framework/rest/confighandler.go @@ -6,7 +6,7 @@ import ( "os" "strings" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/stringutils" ) var ConfigRoutes = configRoutes diff --git a/framework/rest/dochandler.go b/framework/rest/dochandler.go index 2b83937e..fca417ff 100644 --- a/framework/rest/dochandler.go +++ b/framework/rest/dochandler.go @@ -8,7 +8,7 @@ import ( "text/template" "github.com/rs/cors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/stringutils" ) // window.docs = [ diff --git a/framework/rest/form.go b/framework/rest/form.go index 3bb4dc85..959aadef 100644 --- a/framework/rest/form.go +++ b/framework/rest/form.go @@ -2,8 +2,8 @@ package rest import ( "github.com/goccy/go-reflect" - "github.com/unionj-cloud/go-doudou/v2/toolkit/form" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/form" + "github.com/unionj-cloud/toolkit/stringutils" "net/url" ) diff --git a/framework/rest/httprouter/routegroup.go b/framework/rest/httprouter/routegroup.go index 14b4125d..ac5ee802 100644 --- a/framework/rest/httprouter/routegroup.go +++ b/framework/rest/httprouter/routegroup.go @@ -3,7 +3,7 @@ package httprouter import ( "net/http" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/stringutils" ) type RouteGroup struct { diff --git a/framework/rest/memberlistuihandler.go b/framework/rest/memberlistuihandler.go index 4883d46c..01d25dc2 100644 --- a/framework/rest/memberlistuihandler.go +++ b/framework/rest/memberlistuihandler.go @@ -8,7 +8,7 @@ import ( "github.com/hako/durafmt" registry "github.com/unionj-cloud/go-doudou/v2/framework/registry/memberlist" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" + "github.com/unionj-cloud/toolkit/memberlist" ) type Row struct { diff --git a/framework/rest/middleware.go b/framework/rest/middleware.go index 48f70f71..019f5ba4 100644 --- a/framework/rest/middleware.go +++ b/framework/rest/middleware.go @@ -26,8 +26,8 @@ import ( "github.com/uber/jaeger-client-go" "github.com/unionj-cloud/go-doudou/v2/framework/config" "github.com/unionj-cloud/go-doudou/v2/framework/configmgr" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/stringutils" + logger "github.com/unionj-cloud/toolkit/zlogger" ) var json = sonic.ConfigDefault diff --git a/framework/rest/middleware_test.go b/framework/rest/middleware_test.go index 285916a6..ae0983ec 100644 --- a/framework/rest/middleware_test.go +++ b/framework/rest/middleware_test.go @@ -26,7 +26,7 @@ import ( "github.com/unionj-cloud/go-doudou/v2/framework/rest" httpMock "github.com/unionj-cloud/go-doudou/v2/framework/rest/mock" "github.com/unionj-cloud/go-doudou/v2/framework/restclient" - "github.com/unionj-cloud/go-doudou/v2/toolkit/maputils" + "github.com/unionj-cloud/toolkit/maputils" "github.com/wubin1989/nacos-sdk-go/v2/clients/cache" "github.com/wubin1989/nacos-sdk-go/v2/clients/config_client" "github.com/wubin1989/nacos-sdk-go/v2/vo" diff --git a/framework/rest/model.go b/framework/rest/model.go index 651af5a2..84328d66 100644 --- a/framework/rest/model.go +++ b/framework/rest/model.go @@ -10,7 +10,7 @@ import ( "strings" "github.com/pkg/errors" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + logger "github.com/unionj-cloud/toolkit/zlogger" ) // Route wraps config for route diff --git a/framework/rest/prommiddleware.go b/framework/rest/prommiddleware.go index f3ac88ce..ac505a48 100644 --- a/framework/rest/prommiddleware.go +++ b/framework/rest/prommiddleware.go @@ -11,8 +11,8 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/unionj-cloud/go-doudou/v2/framework/buildinfo" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/constants" + "github.com/unionj-cloud/toolkit/stringutils" ) type responseWriter struct { diff --git a/framework/rest/server.go b/framework/rest/server.go index 22f7a8e3..9af09b84 100644 --- a/framework/rest/server.go +++ b/framework/rest/server.go @@ -22,8 +22,8 @@ import ( register "github.com/unionj-cloud/go-doudou/v2/framework/registry" "github.com/unionj-cloud/go-doudou/v2/framework/registry/constants" "github.com/unionj-cloud/go-doudou/v2/framework/rest/httprouter" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/stringutils" + logger "github.com/unionj-cloud/toolkit/zlogger" ) type MiddlewareFunc func(http.Handler) http.Handler diff --git a/framework/rest/validate.go b/framework/rest/validate.go index f9723e0d..332422fd 100644 --- a/framework/rest/validate.go +++ b/framework/rest/validate.go @@ -6,7 +6,7 @@ import ( ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" + "github.com/unionj-cloud/toolkit/stringutils" ) var validate = validator.New() diff --git a/framework/restclient/restclient.go b/framework/restclient/restclient.go index 29603d5c..3f167dfb 100644 --- a/framework/restclient/restclient.go +++ b/framework/restclient/restclient.go @@ -12,7 +12,7 @@ import ( "github.com/opentracing-contrib/go-stdlib/nethttp" "github.com/unionj-cloud/go-doudou/v2/framework/config" "github.com/unionj-cloud/go-doudou/v2/framework/registry" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" + "github.com/unionj-cloud/toolkit/cast" ) // RestClient defines service client interface diff --git a/framework/testdata/checkIc2/svc.go b/framework/testdata/checkIc2/svc.go index 2b22d294..7df77e4a 100644 --- a/framework/testdata/checkIc2/svc.go +++ b/framework/testdata/checkIc2/svc.go @@ -4,7 +4,7 @@ import ( "context" "mime/multipart" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/framework/testdata/novo/svc.go b/framework/testdata/novo/svc.go index 372516ba..b61d9144 100644 --- a/framework/testdata/novo/svc.go +++ b/framework/testdata/novo/svc.go @@ -6,7 +6,7 @@ import ( "os" "github.com/unionj-cloud/go-doudou/v2/framework/testdata/vo" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/framework/testdata/svc.go b/framework/testdata/svc.go index 372516ba..b61d9144 100644 --- a/framework/testdata/svc.go +++ b/framework/testdata/svc.go @@ -6,7 +6,7 @@ import ( "os" "github.com/unionj-cloud/go-doudou/v2/framework/testdata/vo" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/framework/testdata/svcp.go b/framework/testdata/svcp.go index 12475a5e..8894d8bf 100644 --- a/framework/testdata/svcp.go +++ b/framework/testdata/svcp.go @@ -5,7 +5,7 @@ import ( "os" "github.com/unionj-cloud/go-doudou/v2/framework/testdata/vo" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" + v3 "github.com/unionj-cloud/toolkit/openapi/v3" ) // į”Ļæˆ·æœåŠĄæŽĨåĢ diff --git a/framework/tracing/tracer.go b/framework/tracing/tracer.go index 8449f139..467ec650 100644 --- a/framework/tracing/tracer.go +++ b/framework/tracing/tracer.go @@ -11,8 +11,8 @@ import ( "github.com/uber/jaeger-lib/metrics" jprom "github.com/uber/jaeger-lib/metrics/prometheus" ddconfig "github.com/unionj-cloud/go-doudou/v2/framework/config" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - logger "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" + "github.com/unionj-cloud/toolkit/stringutils" + logger "github.com/unionj-cloud/toolkit/zlogger" ) // Init returns an instance of Jaeger Tracer. diff --git a/go.mod b/go.mod index 1fb2e573..33be212e 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/unionj-cloud/go-doudou/v2 -go 1.21 - -toolchain go1.22.2 +go 1.22.2 require ( github.com/Jeffail/gabs/v2 v2.6.1 @@ -10,17 +8,16 @@ require ( github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 github.com/deckarep/golang-set v1.8.0 github.com/felixge/httpsnoop v1.0.4 - github.com/go-git/go-billy/v5 v5.4.1 - github.com/go-git/go-git/v5 v5.6.1 + github.com/go-git/go-billy/v5 v5.4.1 // indirect + github.com/go-git/go-git/v5 v5.6.1 // indirect github.com/go-resty/resty/v2 v2.7.0 github.com/go-sql-driver/mysql v1.8.1 github.com/goccy/go-yaml v1.11.0 - github.com/hyperjumptech/jiffy v1.0.0 - github.com/iancoleman/strcase v0.2.0 - github.com/jeremywohl/flatten v1.0.1 + github.com/hyperjumptech/jiffy v1.0.0 // indirect + github.com/iancoleman/strcase v0.3.0 + github.com/jeremywohl/flatten v1.0.1 // indirect github.com/jmoiron/sqlx v1.3.5 github.com/joho/godotenv v1.5.1 - github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/olekukonko/tablewriter v0.0.5 github.com/opentracing-contrib/go-stdlib v1.0.0 github.com/opentracing/opentracing-go v1.2.0 @@ -33,21 +30,16 @@ require ( github.com/testcontainers/testcontainers-go v0.33.0 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/uber/jaeger-lib v2.4.1+incompatible - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d + github.com/unionj-cloud/toolkit v0.0.1 + github.com/wubin1989/gen v0.0.1 + golang.org/x/tools v0.26.0 // indirect ) require ( - github.com/DATA-DOG/go-sqlmock v1.5.2 - github.com/XiaoMi/pegasus-go-client v0.0.0-20220519103347-ba0e68465cd5 - github.com/allegro/bigcache/v3 v3.1.0 - github.com/auxten/postgresql-parser v1.0.1 - github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 github.com/bytedance/sonic v1.12.1 - github.com/coocood/freecache v1.2.4 github.com/deckarep/golang-set/v2 v2.6.0 github.com/dgraph-io/ristretto v0.1.1 github.com/elliotchance/orderedmap/v2 v2.2.0 - github.com/go-playground/assert/v2 v2.2.0 github.com/go-redis/redis/v8 v8.11.5 github.com/go-zookeeper/zk v1.0.3 github.com/gobwas/glob v0.2.3 @@ -56,29 +48,17 @@ require ( github.com/gorilla/handlers v1.5.1 github.com/hashicorp/go-sockaddr v1.0.2 github.com/hashicorp/golang-lru v0.5.4 - github.com/hazelcast/hazelcast-go-client v1.4.1 github.com/manifoldco/promptui v0.9.0 - github.com/mholt/archiver/v3 v3.5.1 - github.com/morkid/gocache v1.0.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/redis/rueidis v1.0.38 - github.com/redis/rueidis/mock v1.0.38 - github.com/redis/rueidis/rueidiscompat v1.0.38 github.com/rs/cors v1.9.0 github.com/samber/lo v1.39.0 github.com/slok/goresilience v0.2.0 github.com/wubin1989/clickhouse v0.0.3 - github.com/wubin1989/datatypes v0.0.2 - github.com/wubin1989/dbresolver v0.0.2 github.com/wubin1989/gorm v0.0.5 - github.com/wubin1989/hints v0.0.2 github.com/wubin1989/mysql v0.0.2 github.com/wubin1989/prometheus v0.0.2-0.20240611143457-960b4a499cef github.com/wubin1989/sqlite v0.0.3 github.com/wubin1989/sqlserver v0.0.2 - github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 - go.uber.org/mock v0.4.0 - gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -86,6 +66,7 @@ require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/ClickHouse/ch-go v0.61.5 // indirect github.com/ClickHouse/clickhouse-go/v2 v2.29.0 // indirect + github.com/auxten/postgresql-parser v1.0.1 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 // indirect @@ -107,37 +88,38 @@ require ( github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/glog v1.2.0 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mholt/archiver/v3 v3.5.1 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.1.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect - github.com/nxadm/tail v1.4.8 // indirect github.com/paulmach/orb v0.11.1 // indirect - github.com/pegasus-kv/thrift v0.13.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/wubin1989/datatypes v0.0.2 // indirect + github.com/wubin1989/dbresolver v0.0.2 // indirect + github.com/wubin1989/hints v0.0.2 // indirect + github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.26.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/mock v0.4.0 // indirect golang.org/x/arch v0.1.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 // indirect - k8s.io/apimachinery v0.26.2 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( @@ -155,7 +137,7 @@ require ( github.com/cloudflare/circl v1.1.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/davecgh/go-spew v1.1.1 + github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect @@ -170,7 +152,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect - github.com/golang/protobuf v1.5.4 + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect @@ -200,8 +182,6 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/nwaples/rardecode v1.1.3 // indirect - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.31.1 github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect @@ -215,7 +195,7 @@ require ( github.com/redis/go-redis/v9 v9.1.0 github.com/rivo/uniseg v0.1.0 // indirect github.com/skeema/knownhosts v1.1.0 // indirect - github.com/smartystreets/assertions v1.2.0 + github.com/smartystreets/assertions v1.2.0 // indirect github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.3.0 github.com/spf13/jwalterweatherman v1.0.0 // indirect @@ -225,8 +205,8 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/ulikunitz/xz v0.5.11 // indirect - github.com/vmihailenco/go-tinylfu v0.2.2 - github.com/vmihailenco/msgpack/v5 v5.3.5 + github.com/vmihailenco/go-tinylfu v0.2.2 // indirect + github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect @@ -238,10 +218,10 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/sync v0.8.0 - golang.org/x/sys v0.23.0 // indirect + golang.org/x/mod v0.21.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.26.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/protobuf v1.33.0 // indirect @@ -252,26 +232,24 @@ require ( ) require ( - github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/apolloconfig/agollo/v4 v4.1.1-0.20220323095621-60ed86180f24 github.com/arl/statsviz v0.6.0 - github.com/armon/go-metrics v0.4.1 + github.com/armon/go-metrics v0.4.1 // indirect github.com/docker/docker v27.3.0+incompatible // indirect github.com/fatih/color v1.12.0 // indirect - github.com/getkin/kin-openapi v0.115.0 - github.com/ghodss/yaml v1.0.0 - github.com/go-playground/form/v4 v4.2.0 + github.com/getkin/kin-openapi v0.115.0 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/go-playground/universal-translator v0.18.1 github.com/go-playground/validator/v10 v10.11.2 github.com/golang/mock v1.6.0 - github.com/google/btree v1.1.2 - github.com/google/uuid v1.6.0 + github.com/google/btree v1.1.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v1.1.5 - github.com/hashicorp/go-multierror v1.1.1 + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.6.0 github.com/hashicorp/logutils v1.0.0 github.com/jackc/pgx/v5 v5.5.5 // indirect @@ -281,24 +259,24 @@ require ( github.com/mattn/go-runewidth v0.0.10 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/microsoft/go-mssqldb v1.7.2 // indirect - github.com/miekg/dns v1.1.54 + github.com/miekg/dns v1.1.54 // indirect github.com/moby/term v0.5.0 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/rbretecher/go-postman-collection v0.9.0 github.com/rs/zerolog v1.28.0 - github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 + github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/sergi/go-diff v1.2.0 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible - github.com/shopspring/decimal v1.4.0 + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/smartystreets/goconvey v1.7.2 github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb github.com/wubin1989/nacos-sdk-go/v2 v2.1.2-0.20221024120645-0288f53fdaa8 github.com/wubin1989/postgres v0.0.2 go.etcd.io/etcd/client/v3 v3.5.14 go.uber.org/automaxprocs v1.5.2 - golang.org/x/crypto v0.26.0 // indirect + golang.org/x/crypto v0.28.0 // indirect golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea - golang.org/x/text v0.17.0 + golang.org/x/text v0.19.0 google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13 // indirect google.golang.org/grpc v1.64.1 ) diff --git a/go.sum b/go.sum index 24d94b43..a3d6743e 100644 --- a/go.sum +++ b/go.sum @@ -633,8 +633,6 @@ github.com/ClickHouse/clickhouse-go/v2 v2.29.0 h1:Dj1w59RssRyLgGHXtYaWU0eIM1pJsu github.com/ClickHouse/clickhouse-go/v2 v2.29.0/go.mod h1:bLookq6qZJ4Ush/6tOAnJGh1Sf3Sa/nQoMn71p7ZCUE= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= -github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= @@ -646,19 +644,12 @@ github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4K github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/XiaoMi/pegasus-go-client v0.0.0-20220519103347-ba0e68465cd5 h1:mePTwVjIZ65Ko7gK9MWh/xV/ubEe9yns69Slzr4B1aI= -github.com/XiaoMi/pegasus-go-client v0.0.0-20220519103347-ba0e68465cd5/go.mod h1:VrfgKISflRhFm32m3e0SXLccvNJTyG8PRywWbUuGEfY= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw= -github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= @@ -675,8 +666,6 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704 h1:PpfENOj/vPfhhy9N2OFRjpue0hjM5XqAp2thFmkXXIk= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU= -github.com/allegro/bigcache/v3 v3.1.0 h1:H2Vp8VOvxcrB91o86fUSVJFqeuz8kpyyB02eH3bSzwk= -github.com/allegro/bigcache/v3 v3.1.0/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= @@ -688,7 +677,6 @@ github.com/antlr/antlr4 v0.0.0-20200124162019-2d7f727a00b7 h1:4IkFZAFQ87SeXXF6n+ github.com/antlr/antlr4 v0.0.0-20200124162019-2d7f727a00b7/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apolloconfig/agollo/v4 v4.1.1-0.20220323095621-60ed86180f24 h1:ZMK8YXD82znWnBrn9XF7wlPFDXPdBrPphL6ZS2pIKqQ= github.com/apolloconfig/agollo/v4 v4.1.1-0.20220323095621-60ed86180f24/go.mod h1:SuvTjtg0p4UlSzSbik+ibLRr6oR1xRsfy65QzP3GEAs= @@ -716,8 +704,6 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 h1:N7oVaKyGp8bttX0bfZGmcGkjz7DLQXhAn3DNd3T0ous= -github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c= github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0= github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= @@ -730,7 +716,6 @@ github.com/bytedance/sonic v1.12.1/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKz github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -790,8 +775,6 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= -github.com/coocood/freecache v1.2.4 h1:UdR6Yz/X1HW4fZOuH0Z94KwG851GWOSknua5VUbb/5M= -github.com/coocood/freecache v1.2.4/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -811,7 +794,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -838,7 +820,6 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= @@ -847,10 +828,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elliotchance/orderedmap/v2 v2.2.0 h1:7/2iwO98kYT4XkOjA9mBEIwvi4KpGB4cyHeOFOnj4Vk= github.com/elliotchance/orderedmap/v2 v2.2.0/go.mod h1:85lZyVbpGaGvHvnKa7Qhx7zncAdBIBq6u56Hb1PRU5Q= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -869,7 +848,6 @@ github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= @@ -881,8 +859,6 @@ github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -892,7 +868,6 @@ github.com/getkin/kin-openapi v0.115.0 h1:c8WHRLVY3G8m9jQTy0/DnIuljgRwTCB5twZytQ github.com/getkin/kin-openapi v0.115.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -934,7 +909,6 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -943,22 +917,15 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/form/v4 v4.2.0 h1:N1wh+Goz61e6w66vo8vJkQt+uwZSoLz50kZPJWR8eic= -github.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -973,9 +940,6 @@ github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= @@ -995,7 +959,6 @@ github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q8 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -1014,7 +977,6 @@ github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0L github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1030,7 +992,6 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -1084,7 +1045,6 @@ github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vK github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -1106,13 +1066,10 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1137,7 +1094,6 @@ github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38 github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -1206,14 +1162,13 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hazelcast/hazelcast-go-client v1.4.1 h1:BSpJqqjbACI4MugfWXGxk+JdZR3JRELx0n769pa85kA= -github.com/hazelcast/hazelcast-go-client v1.4.1/go.mod h1:PJ38lqXJ18S0YpkrRznPDlUH8GnnMAQCx3jpQtBPZ6Q= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hyperjumptech/jiffy v1.0.0 h1:hLfjgh4YQPYFanSmh06nfN2Es7BZ1WF2sQwmZIQ5tHQ= github.com/hyperjumptech/jiffy v1.0.0/go.mod h1:iFHHUap4onOTcvqBBU0iF33snPmqz4DSA/KgnBHG7dU= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= @@ -1264,10 +1219,8 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1296,7 +1249,6 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -1349,7 +1301,6 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -1423,7 +1374,6 @@ github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= @@ -1435,18 +1385,12 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJ github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/morkid/gocache v1.0.0 h1:hTnU78Dqp2vs9al5vJC2TmmMF+Hm3nDH1AgRBjSXE+0= -github.com/morkid/gocache v1.0.0/go.mod h1:xK+hmoEMjYffIBvjn7DE8WfSd/rF5Kz/G9f20OliMJY= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= @@ -1457,17 +1401,11 @@ github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= @@ -1489,8 +1427,6 @@ github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTK github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pegasus-kv/thrift v0.13.0 h1:4ESwaNoHImfbHa9RUGJiJZ4hrxorihZHk5aarYwY8d4= -github.com/pegasus-kv/thrift v0.13.0/go.mod h1:Gl9NT/WHG6ABm6NsrbfE8LiJN0sAyneCrvB4qN4NPqQ= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -1519,7 +1455,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -1585,12 +1520,6 @@ github.com/rbretecher/go-postman-collection v0.9.0 h1:vXw6KBhASpz0L0igH3OsJCx5pj github.com/rbretecher/go-postman-collection v0.9.0/go.mod h1:pptkyjdB/sqPycH+CCa1zrA6Wpj2Kc8Nz846qRstVVs= github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY= github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= -github.com/redis/rueidis v1.0.38 h1:ZlEBumHM+ECCMgf/zQZImLfmxb/sxGKnBP0R0AxoH/Y= -github.com/redis/rueidis v1.0.38/go.mod h1:bnbkk4+CkXZgDPEbUtSos/o55i4RhFYYesJ4DS2zmq0= -github.com/redis/rueidis/mock v1.0.38 h1:E49z0pptMAs3xbWSW9ZgSp+cAmAiE4SvF7Q5mhDU9hw= -github.com/redis/rueidis/mock v1.0.38/go.mod h1:oOKSGb4CKjvUzGCQ7PupeCEp6W+TdEfzR8YYLejU5Sk= -github.com/redis/rueidis/rueidiscompat v1.0.38 h1:JREqnP+y4Gte4p66ZwBB2jT1m9W0RHFr+lRavpaGno4= -github.com/redis/rueidis/rueidiscompat v1.0.38/go.mod h1:pQaGNQkzKsyxSY0BP/r5lrzP4kUdfWXb/gsquXhbDtA= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1664,7 +1593,6 @@ github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -1677,7 +1605,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1722,6 +1649,8 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/unionj-cloud/toolkit v0.0.1 h1:Q//MiUFDPZGBBnYucbHtJ5oEJ1df59wG6iTrhxQgHDs= +github.com/unionj-cloud/toolkit v0.0.1/go.mod h1:/7fOlIX1aUs3MWYhyKDBNwUo2KI7eDw8M7x7CdZiViA= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= @@ -1739,6 +1668,8 @@ github.com/wubin1989/datatypes v0.0.2 h1:a2ZiuWjqiYHRS+lkvan8QymxYtB1yvwJHf0kE7m github.com/wubin1989/datatypes v0.0.2/go.mod h1:ifZrSL9ZeEfOqWxCvAx6ugbiMYcMPRyY2mSgN8qRdKE= github.com/wubin1989/dbresolver v0.0.2 h1:nxZJa7TSPRWvrHyshbBhoiHFt3/cagHi1qOySrCyqjE= github.com/wubin1989/dbresolver v0.0.2/go.mod h1:QCzD3CTzNXQ8Vk/V0WRdCQw2Mu8d/UGa3AyRIbbe9hc= +github.com/wubin1989/gen v0.0.1 h1:KB5vgZwkGm2dDYjfUpBo2Q3VHaqQCTnw9VEzP8jhP9U= +github.com/wubin1989/gen v0.0.1/go.mod h1:8nHzm1o5Rc3dGRTTCBoqIJisfevFiSzeGQX5IH7eP+I= github.com/wubin1989/gorm v0.0.3/go.mod h1:sv3afa8/Q6XTgEbTTWTjJd0NIlBMH4bMq5VpEnXr/Cc= github.com/wubin1989/gorm v0.0.5 h1:eI+zjoQ2GEURnPBEh+H4axSD4sM0wWpJCAQZw+FfZX8= github.com/wubin1989/gorm v0.0.5/go.mod h1:q/wDV7AJMsbDdtv+K3eNX+VMpC0k1uxCqPBPXzHO90k= @@ -1874,8 +1805,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1936,9 +1867,8 @@ golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1959,8 +1889,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191105084925-a882066a44e0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2019,8 +1947,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2073,7 +2001,6 @@ golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2095,12 +2022,10 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2130,7 +2055,6 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2196,8 +2120,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2215,9 +2139,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2238,8 +2161,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2251,7 +2174,6 @@ golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2306,7 +2228,6 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2322,8 +2243,8 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2639,7 +2560,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2649,8 +2569,6 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV4fzYhNBql77zY0ykqs= -gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -2679,13 +2597,6 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/apimachinery v0.0.0-20191123233150-4c4803ed55e3/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= -k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= @@ -2725,5 +2636,3 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/toolkit/assert/assert.go b/toolkit/assert/assert.go deleted file mode 100644 index f4ee0960..00000000 --- a/toolkit/assert/assert.go +++ /dev/null @@ -1,36 +0,0 @@ -package assert - -import ( - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" -) - -func NotNil(input interface{}, format string, v ...interface{}) { - if input == nil { - zlogger.Panic().Msgf(format, v...) - } -} - -func NotTrue(input bool, format string, v ...interface{}) { - if input { - zlogger.Panic().Msgf(format, v...) - } -} - -func True(input bool, format string, v ...interface{}) { - if !input { - zlogger.Panic().Msgf(format, v...) - } -} - -func NotEmpty(input string, format string, v ...interface{}) { - if stringutils.IsEmpty(input) { - zlogger.Panic().Msgf(format, v...) - } -} - -func Empty(input string, format string, v ...interface{}) { - if stringutils.IsNotEmpty(input) { - zlogger.Panic().Msgf(format, v...) - } -} diff --git a/toolkit/astutils/enumcollector.go b/toolkit/astutils/enumcollector.go deleted file mode 100644 index bb1df43b..00000000 --- a/toolkit/astutils/enumcollector.go +++ /dev/null @@ -1,107 +0,0 @@ -package astutils - -import ( - "go/ast" - "go/parser" - "go/token" - "strings" -) - -type EnumCollector struct { - Methods map[string][]MethodMeta - Package PackageMeta - exprString func(ast.Expr) string - Consts map[string][]string -} - -// Visit traverse each node from source code -func (sc *EnumCollector) Visit(n ast.Node) ast.Visitor { - return sc.Collect(n) -} - -// Collect collects all structs from source code -func (sc *EnumCollector) Collect(n ast.Node) ast.Visitor { - switch spec := n.(type) { - case *ast.Package: - return sc - case *ast.File: // actually it is package name - sc.Package = PackageMeta{ - Name: spec.Name.Name, - } - return sc - case *ast.FuncDecl: - if spec.Recv != nil { - typeName := strings.TrimPrefix(sc.exprString(spec.Recv.List[0].Type), "*") - methods, _ := sc.Methods[typeName] - methods = append(methods, GetMethodMeta(spec)) - if sc.Methods == nil { - sc.Methods = make(map[string][]MethodMeta) - } - sc.Methods[typeName] = methods - } - case *ast.GenDecl: - if spec.Tok == token.CONST { - var comments []string - if spec.Doc != nil { - for _, comment := range spec.Doc.List { - comments = append(comments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - } - } - var typeName string - for _, item := range spec.Specs { - valueSpec := item.(*ast.ValueSpec) - if len(valueSpec.Names) == 0 { - continue - } - switch specType := valueSpec.Type.(type) { - case *ast.Ident: - typeName = specType.Name - case nil: - // useless - //if len(valueSpec.Values) > 0 { - // switch valueExpr := valueSpec.Values[0].(type) { - // case *ast.BasicLit: - // switch valueExpr.Kind { - // case token.INT: - // typeName = "int" - // case token.FLOAT: - // typeName = "float64" - // case token.IMAG: - // typeName = "complex128" - // case token.CHAR: - // typeName = "rune" - // case token.STRING: - // typeName = "string" - // default: - // continue - // } - // } - //} - } - sc.Consts[typeName] = append(sc.Consts[typeName], valueSpec.Names[0].Name) - } - } - } - return nil -} - -// NewEnumCollector initializes an EnumCollector -func NewEnumCollector(exprString func(ast.Expr) string) *EnumCollector { - return &EnumCollector{ - Methods: make(map[string][]MethodMeta), - Package: PackageMeta{}, - exprString: exprString, - Consts: make(map[string][]string), - } -} - -func EnumsOf(file string, exprString func(ast.Expr) string) *EnumCollector { - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewEnumCollector(exprString) - ast.Walk(sc, root) - return sc -} diff --git a/toolkit/astutils/enumcollector_test.go b/toolkit/astutils/enumcollector_test.go deleted file mode 100644 index 86409747..00000000 --- a/toolkit/astutils/enumcollector_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package astutils - -import ( - "go/ast" - "go/parser" - "go/token" - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" -) - -func TestEnum(t *testing.T) { - file := pathutils.Abs("testdata/enum.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewEnumCollector(ExprString) - ast.Walk(sc, root) -} diff --git a/toolkit/astutils/funcs.go b/toolkit/astutils/funcs.go deleted file mode 100644 index 9cdb34f3..00000000 --- a/toolkit/astutils/funcs.go +++ /dev/null @@ -1,493 +0,0 @@ -package astutils - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "github.com/goccy/go-reflect" - "go/ast" - "go/format" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "text/template" - "unicode" - - "github.com/pkg/errors" - "github.com/samber/lo" - "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "golang.org/x/tools/imports" -) - -func GetImportStatements(input []byte) []byte { - reg := regexp.MustCompile("(?s)import \\((.*?)\\)") - if !reg.Match(input) { - return nil - } - matches := reg.FindSubmatch(input) - return matches[1] -} - -func AppendImportStatements(src []byte, appendImports []byte) []byte { - reg := regexp.MustCompile("(?s)import \\((.*?)\\)") - if !reg.Match(src) { - return src - } - matches := reg.FindSubmatch(src) - old := matches[1] - re := regexp.MustCompile(`[\r\n]+`) - splits := re.Split(string(old), -1) - oldmap := make(map[string]struct{}) - for _, item := range splits { - oldmap[strings.TrimSpace(item)] = struct{}{} - } - splits = re.Split(string(appendImports), -1) - var newimps []string - for _, item := range splits { - key := strings.TrimSpace(item) - if _, ok := oldmap[key]; !ok { - newimps = append(newimps, "\t"+key) - } - } - if len(newimps) == 0 { - return src - } - appendImports = []byte(constants.LineBreak + strings.Join(newimps, constants.LineBreak) + constants.LineBreak) - return reg.ReplaceAllFunc(src, func(i []byte) []byte { - old = append([]byte("import ("), old...) - old = append(old, appendImports...) - old = append(old, []byte(")")...) - return old - }) -} - -func GrpcRelatedModify(src []byte, metaName string, grpcSvcName string) []byte { - expr := fmt.Sprintf(`type %sImpl struct {`, metaName) - reg := regexp.MustCompile(expr) - unimpl := fmt.Sprintf("pb.Unimplemented%sServer", grpcSvcName) - if !strings.Contains(string(src), unimpl) { - appendUnimpl := []byte(constants.LineBreak + unimpl + constants.LineBreak) - src = reg.ReplaceAllFunc(src, func(i []byte) []byte { - return append([]byte(expr), appendUnimpl...) - }) - } - var_pb := fmt.Sprintf("var _ pb.%sServer = (*%sImpl)(nil)", grpcSvcName, metaName) - if !strings.Contains(string(src), var_pb) { - appendVarPb := []byte(constants.LineBreak + var_pb + constants.LineBreak) - src = reg.ReplaceAllFunc(src, func(i []byte) []byte { - return append(appendVarPb, []byte(expr)...) - }) - } - return src -} - -func RestRelatedModify(src []byte, metaName string) []byte { - expr := fmt.Sprintf(`type %sImpl struct {`, metaName) - reg := regexp.MustCompile(expr) - var_ := fmt.Sprintf("var _ %s = (*%sImpl)(nil)", metaName, metaName) - if !strings.Contains(string(src), var_) { - appendVarPb := []byte(constants.LineBreak + var_ + constants.LineBreak) - src = reg.ReplaceAllFunc(src, func(i []byte) []byte { - return append(appendVarPb, []byte(expr)...) - }) - } - return src -} - -// FixImport format source code and add missing import syntax automatically -func FixImport(src []byte, file string) { - var ( - res []byte - err error - ) - if res, err = imports.Process(file, src, &imports.Options{ - TabWidth: 8, - TabIndent: true, - Comments: true, - Fragment: true, - }); err != nil { - lines := strings.Split(string(src), "\n") - errLine, _ := strconv.Atoi(strings.Split(err.Error(), ":")[1]) - startLine, endLine := errLine-5, errLine+5 - fmt.Println("Format fail:", errLine, err) - if startLine < 0 { - startLine = 0 - } - if endLine > len(lines)-1 { - endLine = len(lines) - 1 - } - for i := startLine; i <= endLine; i++ { - fmt.Println(i, lines[i]) - } - errors.WithStack(fmt.Errorf("cannot format file: %w", err)) - } else { - _ = ioutil.WriteFile(file, res, os.ModePerm) - return - } - _ = ioutil.WriteFile(file, src, os.ModePerm) -} - -// GetMethodMeta get method name then new MethodMeta struct from *ast.FuncDecl -func GetMethodMeta(spec *ast.FuncDecl) MethodMeta { - methodName := ExprString(spec.Name) - mm := NewMethodMeta(spec.Type, ExprString) - mm.Name = methodName - return mm -} - -// NewMethodMeta new MethodMeta struct from *ast.FuncDecl -func NewMethodMeta(ft *ast.FuncType, exprString func(ast.Expr) string) MethodMeta { - var params, results []FieldMeta - for _, param := range ft.Params.List { - pt := exprString(param.Type) - if len(param.Names) > 0 { - for _, name := range param.Names { - params = append(params, FieldMeta{ - Name: name.Name, - Type: pt, - Tag: "", - }) - } - continue - } - params = append(params, FieldMeta{ - Name: "", - Type: pt, - Tag: "", - }) - } - if ft.Results != nil { - for _, result := range ft.Results.List { - rt := exprString(result.Type) - if len(result.Names) > 0 { - for _, name := range result.Names { - results = append(results, FieldMeta{ - Name: name.Name, - Type: rt, - Tag: "", - }) - } - continue - } - results = append(results, FieldMeta{ - Name: "", - Type: rt, - Tag: "", - }) - } - } - return MethodMeta{ - Params: params, - Results: results, - } -} - -// NewStructMeta new StructMeta from *ast.StructType -func NewStructMeta(structType *ast.StructType, exprString func(ast.Expr) string) StructMeta { - var fields []FieldMeta - re := regexp.MustCompile(`json:"(.*?)"`) - for _, field := range structType.Fields.List { - var fieldComments []string - if field.Doc != nil { - for _, comment := range field.Doc.List { - fieldComments = append(fieldComments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - } - } - - fieldType := exprString(field.Type) - - var tag string - var docName string - if field.Tag != nil { - tag = strings.Trim(field.Tag.Value, "`") - if re.MatchString(tag) { - jsonTag := re.FindStringSubmatch(tag)[1] - docName = strings.Split(jsonTag, ",")[0] - } - } - - if len(field.Names) > 0 { - for _, name := range field.Names { - _docName := docName - if stringutils.IsEmpty(_docName) { - _docName = name.Name - } - fields = append(fields, FieldMeta{ - Name: name.Name, - Type: fieldType, - Tag: tag, - Comments: fieldComments, - IsExport: unicode.IsUpper(rune(name.Name[0])), - DocName: _docName, - }) - } - } else { - splits := strings.Split(fieldType, ".") - name := splits[len(splits)-1] - fieldType = "embed:" + fieldType - _docName := docName - if stringutils.IsEmpty(_docName) { - _docName = name - } - fields = append(fields, FieldMeta{ - Name: name, - Type: fieldType, - Tag: tag, - Comments: fieldComments, - IsExport: unicode.IsUpper(rune(name[0])), - DocName: _docName, - }) - } - } - return StructMeta{ - Fields: fields, - } -} - -// PackageMeta wraps package info -type PackageMeta struct { - Name string -} - -// FieldMeta wraps field info -type FieldMeta struct { - Name string - Type string - Tag string - Comments []string - IsExport bool - // used in OpenAPI 3.0 spec as property name - DocName string - // Annotations of the field - Annotations []Annotation - // ValidateTag based on https://github.com/go-playground/validator - // please refer to its documentation https://pkg.go.dev/github.com/go-playground/validator/v10 - ValidateTag string - IsPathVariable bool -} - -// StructMeta wraps struct info -type StructMeta struct { - Name string - Fields []FieldMeta - Comments []string - Methods []MethodMeta - IsExport bool - // go-doudou version - Version string -} - -// EnumMeta wraps struct info -type EnumMeta struct { - Name string - Values []string -} - -// ExprString return string representation from ast.Expr -func ExprString(expr ast.Expr) string { - switch _expr := expr.(type) { - case *ast.Ident: - return _expr.Name - case *ast.StarExpr: - return "*" + ExprString(_expr.X) - case *ast.SelectorExpr: - return ExprString(_expr.X) + "." + _expr.Sel.Name - case *ast.InterfaceType: - return "interface{}" - case *ast.ArrayType: - if _expr.Len == nil { - return "[]" + ExprString(_expr.Elt) - } - return "[" + ExprString(_expr.Len) + "]" + ExprString(_expr.Elt) - case *ast.BasicLit: - return _expr.Value - case *ast.MapType: - return "map[" + ExprString(_expr.Key) + "]" + ExprString(_expr.Value) - case *ast.StructType: - structmeta := NewStructMeta(_expr, ExprString) - b, _ := json.Marshal(structmeta) - return "anonystructÂŦ" + string(b) + "Âŧ" - case *ast.FuncType: - return NewMethodMeta(_expr, ExprString).String() - case *ast.ChanType: - var result string - if _expr.Dir == ast.SEND { - result += "chan<- " - } else if _expr.Dir == ast.RECV { - result += "<-chan " - } else { - result += "chan " - } - return result + ExprString(_expr.Value) - case *ast.Ellipsis: - if _expr.Ellipsis.IsValid() { - return "..." + ExprString(_expr.Elt) - } - panic(fmt.Sprintf("invalid ellipsis expression: %+v\n", expr)) - case *ast.IndexExpr: - return ExprString(_expr.X) + "[" + ExprString(_expr.Index) + "]" - case *ast.IndexListExpr: - typeParams := lo.Map[ast.Expr, string](_expr.Indices, func(item ast.Expr, index int) string { - return ExprString(item) - }) - return ExprString(_expr.X) + "[" + strings.Join(typeParams, ", ") + "]" - default: - logrus.Infof("not support expression: %+v\n", expr) - logrus.Infof("not support expression: %+v\n", reflect.TypeOf(expr)) - logrus.Infof("not support expression: %#v\n", reflect.TypeOf(expr)) - logrus.Infof("not support expression: %v\n", reflect.TypeOf(expr).String()) - return "" - //panic(fmt.Sprintf("not support expression: %+v\n", expr)) - } -} - -type Annotation struct { - Name string - Params []string -} - -var reAnno = regexp.MustCompile(`@(\S+?)\((.*?)\)`) - -func GetAnnotations(text string) []Annotation { - if !reAnno.MatchString(text) { - return nil - } - var annotations []Annotation - matches := reAnno.FindAllStringSubmatch(text, -1) - for _, item := range matches { - name := fmt.Sprintf(`@%s`, item[1]) - var params []string - if stringutils.IsNotEmpty(item[2]) { - params = strings.Split(strings.TrimSpace(item[2]), ",") - } - annotations = append(annotations, Annotation{ - Name: name, - Params: params, - }) - } - return annotations -} - -// MethodMeta represents an api -type MethodMeta struct { - // Recv method receiver - Recv string - // Name method name - Name string - // Params when generate client code from openapi3 spec json file, Params holds all method input parameters. - // when generate client code from service interface in svc.go file, if there is struct type param, this struct type param will put into request body, - // then others will be put into url as query string. if there is no struct type param and the api is a get request, all will be put into url as query string. - // if there is no struct type param and the api is Not a get request, all will be put into request body as application/x-www-form-urlencoded data. - // specially, if there is one or more v3.FileModel or []v3.FileModel params, - // all will be put into request body as multipart/form-data data. - Params []FieldMeta - // Results response - Results []FieldMeta - QueryVars []FieldMeta - // PathVars not support when generate client code from service interface in svc.go file - // when generate client code from openapi3 spec json file, PathVars is parameters in url as path variable. - PathVars []FieldMeta - // HeaderVars not support when generate client code from service interface in svc.go file - // when generate client code from openapi3 spec json file, HeaderVars is parameters in header. - HeaderVars []FieldMeta - // BodyParams not support when generate client code from service interface in svc.go file - // when generate client code from openapi3 spec json file, BodyParams is parameters in request body as query string. - BodyParams *FieldMeta - // BodyJSON not support when generate client code from service interface in svc.go file - // when generate client code from openapi3 spec json file, BodyJSON is parameters in request body as json. - BodyJSON *FieldMeta - // Files not support when generate client code from service interface in svc.go file - // when generate client code from openapi3 spec json file, Files is parameters in request body as multipart file. - Files []FieldMeta - // Comments of the method - Comments []string - // Path api path - // not support when generate client code from service interface in svc.go file - Path string - // QueryParams not support when generate client code from service interface in svc.go file - // when generate client code from openapi3 spec json file, QueryParams is parameters in url as query string. - QueryParams *FieldMeta - // Annotations of the method - Annotations []Annotation - HasPathVariable bool - // HttpMethod only accepts GET, PUT, POST, DELETE - HttpMethod string -} - -const methodTmpl = `func {{ if .Recv }}(receiver {{.Recv}}){{ end }} {{.Name}}({{- range $i, $p := .Params}} - {{- if $i}},{{end}} - {{- $p.Name}} {{$p.Type}} - {{- end }}) ({{- range $i, $r := .Results}} - {{- if $i}},{{end}} - {{- $r.Name}} {{$r.Type}} - {{- end }})` - -func (mm MethodMeta) String() string { - if stringutils.IsNotEmpty(mm.Recv) && stringutils.IsEmpty(mm.Name) { - panic("not valid code") - } - var isAnony bool - if stringutils.IsEmpty(mm.Name) { - isAnony = true - mm.Name = "placeholder" - } - t, _ := template.New("method.tmpl").Parse(methodTmpl) - var buf bytes.Buffer - _ = t.Execute(&buf, mm) - var res []byte - res, _ = format.Source(buf.Bytes()) - result := string(res) - if isAnony { - return strings.Replace(result, "func placeholder(", "func(", 1) - } - return result -} - -// InterfaceMeta wraps interface info -type InterfaceMeta struct { - Name string - Methods []MethodMeta - Comments []string -} - -// Visit visit each files -func Visit(files *[]string) filepath.WalkFunc { - return func(path string, info os.FileInfo, err error) error { - if err != nil { - logrus.Panicln(err) - } - if !info.IsDir() { - *files = append(*files, path) - } - return nil - } -} - -// GetMod get module name from go.mod file -func GetMod() string { - var ( - f *os.File - err error - firstLine string - ) - dir, _ := os.Getwd() - mod := filepath.Join(dir, "go.mod") - if f, err = os.Open(mod); err != nil { - panic(err) - } - reader := bufio.NewReader(f) - firstLine, _ = reader.ReadString('\n') - return strings.TrimSpace(strings.TrimPrefix(firstLine, "module")) -} - -// GetImportPath get import path of pkg from dir -func GetImportPath(dir string) string { - wd, _ := os.Getwd() - return GetMod() + strings.ReplaceAll(strings.TrimPrefix(dir, wd), `\`, `/`) -} diff --git a/toolkit/astutils/funcs_test.go b/toolkit/astutils/funcs_test.go deleted file mode 100644 index 8ccc8f41..00000000 --- a/toolkit/astutils/funcs_test.go +++ /dev/null @@ -1,463 +0,0 @@ -package astutils - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/davecgh/go-spew/spew" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -func TestFixImport(t *testing.T) { - code := `package main - -import ( - "encoding/json" - "fmt" -) - -type UserVo struct { - Id int - Name string - Phone string - Dept string -} - -type Page struct { - PageNo int -Size int -Items []UserVo -} - -func main() { - page := Page{ - PageNo: 10, - Size: 30, -} -b, _ := json.Marshal(page) -fmt.Println(string(b)) -} -` - expect := `package main - -import ( - "encoding/json" - "fmt" -) - -type UserVo struct { - Id int - Name string - Phone string - Dept string -} - -type Page struct { - PageNo int - Size int - Items []UserVo -} - -func main() { - page := Page{ - PageNo: 10, - Size: 30, - } - b, _ := json.Marshal(page) - fmt.Println(string(b)) -} -` - file := pathutils.Abs("testdata/output.go") - FixImport([]byte(code), file) - f, err := os.Open(file) - if err != nil { - t.Fatal(err) - } - got, err := ioutil.ReadAll(f) - if err != nil { - t.Fatal(err) - } - assert.Equal(t, expect, string(got)) -} - -func TestMethodMeta_String(t *testing.T) { - type fields struct { - Recv string - Name string - Params []FieldMeta - Results []FieldMeta - Comments []string - } - tests := []struct { - name string - fields fields - want string - panic bool - }{ - { - name: "", - fields: fields{ - Recv: "handler", - Name: "HandleEvent", - Params: []FieldMeta{ - { - Name: "ctx", - Type: "context.Context", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - { - Name: "etype", - Type: "int", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - { - Name: "uid", - Type: "string", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Results: []FieldMeta{ - { - Name: "", - Type: "bool", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - { - Name: "", - Type: "error", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Comments: nil, - }, - want: "func (receiver handler) HandleEvent(ctx context.Context, etype int, uid string) (bool, error)", - }, - { - name: "", - fields: fields{ - Recv: "", - Name: "HandleEvent", - Params: []FieldMeta{ - { - Name: "ctx", - Type: "context.Context", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - { - Name: "etype", - Type: "int", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - { - Name: "uid", - Type: "string", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Results: []FieldMeta{ - { - Name: "", - Type: "error", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Comments: nil, - }, - want: "func HandleEvent(ctx context.Context, etype int, uid string) error", - }, - { - name: "", - fields: fields{ - Recv: "", - Name: "", - Params: []FieldMeta{ - { - Name: "etype", - Type: "int", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - { - Name: "uid", - Type: "string", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Results: []FieldMeta{ - { - Name: "", - Type: "error", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Comments: nil, - }, - want: "func(etype int, uid string) error", - }, - { - name: "", - fields: fields{ - Recv: "PlaceHolder", - Name: "", - Params: []FieldMeta{ - { - Name: "etype", - Type: "int", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - { - Name: "uid", - Type: "string", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Results: []FieldMeta{ - { - Name: "", - Type: "error", - Tag: "", - Comments: nil, - IsExport: false, - DocName: "", - }, - }, - Comments: nil, - }, - want: "", - panic: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mm := MethodMeta{ - Recv: tt.fields.Recv, - Name: tt.fields.Name, - Params: tt.fields.Params, - Results: tt.fields.Results, - Comments: tt.fields.Comments, - } - if tt.panic { - assert.Panics(t, func() { - mm.String() - }) - } else { - if got := mm.String(); stringutils.IsNotEmpty(tt.want) && got != tt.want { - t.Errorf("String() = %v, want %v", got, tt.want) - } - } - }) - } -} - -func TestVisit(t *testing.T) { - testDir := pathutils.Abs("./testdata") - vodir := filepath.Join(testDir, "vo") - var files []string - err := filepath.Walk(vodir, Visit(&files)) - if err != nil { - logrus.Panicln(err) - } - assert.Len(t, files, 1) -} - -func TestNewMethodMeta(t *testing.T) { - file := pathutils.Abs("testdata/cat.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - spew.Dump(root) -} - -func TestGetImportStatements(t *testing.T) { - input := `import ( - "context" - "encoding/json" - "fmt" - "github.com/sirupsen/logrus" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - {{.ServiceAlias}} "{{.ServicePackage}}" - "net/http" - "github.com/pkg/errors" -)` - ret := GetImportStatements([]byte(input)) - fmt.Println(string(ret)) -} - -func TestAppendImportStatements(t *testing.T) { - input := `import ( - "context" - "encoding/json" - "fmt" - - "github.com/sirupsen/logrus" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - - {{.ServiceAlias}} "{{.ServicePackage}}" - "net/http" -) - -type UsersvcHandlerImpl struct { - usersvc service.Usersvc -} -` - ret := AppendImportStatements([]byte(input), []byte(` - "context" - "encoding/json" - "fmt" - "github.com/pkg/errors" -`)) - - ret = AppendImportStatements(ret, []byte(` - "context" - "encoding/json" - "fmt" - "github.com/pkg/errors" -`)) - - ret = AppendImportStatements(ret, []byte(` - "context" - "encoding/json" - "fmt" - "github.com/pkg/errors" -`)) - - expected := `import ( - "context" - "encoding/json" - "fmt" - - "github.com/sirupsen/logrus" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/openapi/v3" - "github.com/unionj-cloud/go-doudou/v2/framework/rest" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - - {{.ServiceAlias}} "{{.ServicePackage}}" - "net/http" - - "github.com/pkg/errors" -) - -type UsersvcHandlerImpl struct { - usersvc service.Usersvc -} -` - - fmt.Println(string(ret)) - require.Equal(t, expected, string(ret)) -} - -func TestAppendImportStatements1(t *testing.T) { - input := `import ()` - ret := AppendImportStatements([]byte(input), []byte(` - "context" - "encoding/json" - "fmt" - "github.com/pkg/errors" -`)) - expected := `import ( - "context" - "encoding/json" - "fmt" - "github.com/pkg/errors" -)` - - fmt.Println(string(ret)) - require.Equal(t, expected, string(ret)) -} - -func TestAppendImportStatements2(t *testing.T) { - input := `import ()` - ret := AppendImportStatements([]byte(input), []byte(` - -`)) - expected := input - - fmt.Println(string(ret)) - require.Equal(t, expected, string(ret)) -} - -func ExampleGetAnnotations() { - ret := GetAnnotations(`// NEW 删é™Ī数æŪæŽĨåĢäļåˆ æ•°æŪ文äŧķ@role(SUPER_ADMIN)@permission(create,update)čŋ™æ˜Ŋ几äļŠæģĻč§Ģ@sss()`) - fmt.Println(ret) - // Output: - // [{@role [SUPER_ADMIN]} {@permission [create update]} {@sss []}] -} - -func TestGrpcRelatedModify(t *testing.T) { - input := ` -var _ Helloworld = (*HelloworldImpl)(nil) - -type HelloworldImpl struct { - conf *config.Config -} - -func (receiver *HelloworldImpl) Greeting(ctx context.Context, greeting string) (data string, err error) { - var _result struct { - Data string - } - _ = gofakeit.Struct(&_result) - return _result.Data, nil -} -` - ret := GrpcRelatedModify([]byte(input), "Helloworld", "HelloworldRpc") - fmt.Println(string(ret)) -} diff --git a/toolkit/astutils/helper.go b/toolkit/astutils/helper.go deleted file mode 100644 index 9573632e..00000000 --- a/toolkit/astutils/helper.go +++ /dev/null @@ -1,70 +0,0 @@ -package astutils - -import ( - "go/ast" - "go/parser" - "go/token" - "path/filepath" - "strings" - - "github.com/pkg/errors" - "golang.org/x/tools/go/packages" -) - -func IsSlice(t string) bool { - return strings.Contains(t, "[") || strings.HasPrefix(t, "...") -} - -func IsVarargs(t string) bool { - return strings.HasPrefix(t, "...") -} - -func ToSlice(t string) string { - return "[]" + strings.TrimPrefix(t, "...") -} - -// ElementType get element type string from slice -func ElementType(t string) string { - if IsVarargs(t) { - return strings.TrimPrefix(t, "...") - } - return t[strings.Index(t, "]")+1:] -} - -func CollectStructsInFolder(dir string, sc *StructCollector) { - dir, _ = filepath.Abs(dir) - var files []string - err := filepath.Walk(dir, Visit(&files)) - if err != nil { - panic(err) - } - for _, file := range files { - if filepath.Ext(file) != ".go" { - continue - } - root, err := parser.ParseFile(token.NewFileSet(), file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - ast.Walk(sc, root) - } -} - -func GetPkgPath(filePath string) string { - pkgs, err := packages.Load(&packages.Config{ - Mode: packages.NeedName, - Dir: filePath, - }) - if err != nil { - panic(err) - } - if len(pkgs) == 0 { - panic(errors.New("no package found")) - } - if len(pkgs[0].Errors) > 0 { - for _, err = range pkgs[0].Errors { - panic(err) - } - } - return pkgs[0].PkgPath -} diff --git a/toolkit/astutils/helper_test.go b/toolkit/astutils/helper_test.go deleted file mode 100644 index 6eaddc7c..00000000 --- a/toolkit/astutils/helper_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package astutils - -import ( - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestGetPkgPath(t *testing.T) { - workDir, _ := filepath.Abs("./testdata") - oldDir, _ := os.Getwd() - os.Chdir(workDir) - defer func() { - os.Chdir(oldDir) - }() - type args struct { - filePath string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - filePath: filepath.Join(workDir, "demo", "config"), - }, - want: "testdata/demo/config", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - assert.Equalf(t, tt.want, GetPkgPath(tt.args.filePath), "GetPkgPath(%v)", tt.args.filePath) - }) - } -} diff --git a/toolkit/astutils/interfacecollector.go b/toolkit/astutils/interfacecollector.go deleted file mode 100644 index 80c18bae..00000000 --- a/toolkit/astutils/interfacecollector.go +++ /dev/null @@ -1,303 +0,0 @@ -package astutils - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "net/http" - "regexp" - "strings" - - "github.com/iancoleman/strcase" - "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -// InterfaceCollector collect interfaces by parsing source code -type InterfaceCollector struct { - Interfaces []InterfaceMeta - Package PackageMeta - exprString func(ast.Expr) string - cmap ast.CommentMap -} - -// Visit traverse each node from source code -func (ic *InterfaceCollector) Visit(n ast.Node) ast.Visitor { - return ic.Collect(n) -} - -// Collect collects all interfaces from source code -func (ic *InterfaceCollector) Collect(n ast.Node) ast.Visitor { - switch spec := n.(type) { - case *ast.Package: - return ic - case *ast.File: // actually it is package name - ic.Package = PackageMeta{ - Name: spec.Name.Name, - } - return ic - case *ast.GenDecl: - if spec.Tok == token.TYPE { - comments := doc2Comments(spec.Doc) - for _, item := range spec.Specs { - typeSpec := item.(*ast.TypeSpec) - typeName := typeSpec.Name.Name - switch specType := typeSpec.Type.(type) { - case *ast.InterfaceType: - ic.Interfaces = append(ic.Interfaces, InterfaceMeta{ - Name: typeName, - Methods: ic.field2Methods(specType.Methods.List), - Comments: comments, - }) - } - } - } - } - return nil -} - -// GetShelves_ShelfBooks_Book -// shelves/:shelf/books/:book -func Pattern(method string) (httpMethod string, endpoint string) { - httpMethods := []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodDelete} - re1, err := regexp.Compile("_?[A-Z]") - if err != nil { - panic(err) - } - method = re1.ReplaceAllStringFunc(method, func(s string) string { - if strings.HasPrefix(s, "_") { - return "/:" + strings.ToLower(strings.TrimPrefix(s, "_")) - } else { - return "/" + strings.ToLower(s) - } - }) - splits := strings.Split(method, "/")[1:] - httpMethod = httpMethods[1] - head := strings.ToUpper(splits[0]) - if sliceutils.StringContains(httpMethods, head) { - httpMethod = head - splits = splits[1:] - } - return httpMethod, strings.Join(splits, "/") -} - -func pathVariables(endpoint string) (ret []string) { - splits := strings.Split(endpoint, "/") - pvs := sliceutils.StringFilter(splits, func(item string) bool { - return stringutils.IsNotEmpty(item) && strings.HasPrefix(item, ":") - }) - for _, v := range pvs { - ret = append(ret, strings.TrimPrefix(v, ":")) - } - return -} - -func (ic *InterfaceCollector) field2Methods(list []*ast.Field) []MethodMeta { - var methods []MethodMeta - for _, method := range list { - if len(method.Names) == 0 { - panic("no method name") - } - mn := method.Names[0].Name - - var mComments []string - var annotations []Annotation - if method.Doc != nil { - for _, comment := range method.Doc.List { - mComments = append(mComments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - annotations = append(annotations, GetAnnotations(comment.Text)...) - } - } - - ft, _ := method.Type.(*ast.FuncType) - var params []FieldMeta - if ft.Params != nil { - params = ic.field2Params(ft.Params.List) - } - - queryVars := make([]FieldMeta, 0) - httpMethod, endpoint := Pattern(mn) - pvs := pathVariables(endpoint) - for i := range params { - if sliceutils.StringContains(pvs, params[i].Name) { - params[i].IsPathVariable = true - } - if httpMethod == http.MethodGet && !params[i].IsPathVariable && params[i].Type != "context.Context" { - queryVars = append(queryVars, params[i]) - } - } - - var results []FieldMeta - if ft.Results != nil { - results = ic.field2Results(ft.Results.List) - } - methods = append(methods, MethodMeta{ - Name: mn, - Params: params, - Results: results, - Comments: mComments, - Annotations: annotations, - HasPathVariable: len(pvs) > 0, - HttpMethod: httpMethod, - QueryVars: queryVars, - }) - } - return methods -} - -func (ic *InterfaceCollector) field2Params(list []*ast.Field) []FieldMeta { - var params []FieldMeta - pkeymap := make(map[string]int) - for _, param := range list { - pt := ic.exprString(param.Type) - if len(param.Names) > 0 { - for i, name := range param.Names { - field := FieldMeta{ - Name: name.Name, - Type: pt, - } - var cnode ast.Node - if i == 0 { - cnode = param - } else { - cnode = name - } - if cmts, exists := ic.cmap[cnode]; exists { - for _, comment := range cmts[0].List { - field.Comments = append(field.Comments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - field.Annotations = append(field.Annotations, GetAnnotations(comment.Text)...) - } - } - var validateTags []string - for _, item := range field.Annotations { - if item.Name == "@validate" { - validateTags = append(validateTags, item.Params...) - } - } - field.ValidateTag = strings.Join(validateTags, ",") - params = append(params, field) - } - continue - } - var pComments []string - var annotations []Annotation - if cmts, exists := ic.cmap[param]; exists { - for _, comment := range cmts[0].List { - pComments = append(pComments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - annotations = append(annotations, GetAnnotations(comment.Text)...) - } - } - var pn string - elemt := strings.TrimPrefix(pt, "*") - if stringutils.IsNotEmpty(elemt) { - if strings.Contains(elemt, "[") { - elemt = elemt[strings.Index(elemt, "]")+1:] - elemt = strings.TrimPrefix(elemt, "*") - } - splits := strings.Split(elemt, ".") - _key := "p" + strcase.ToLowerCamel(splits[len(splits)-1][0:1]) - if _, exists := pkeymap[_key]; exists { - pkeymap[_key]++ - pn = _key + fmt.Sprintf("%d", pkeymap[_key]) - } else { - pkeymap[_key]++ - pn = _key - } - } - var validateTags []string - for _, item := range annotations { - if item.Name == "@validate" { - validateTags = append(validateTags, item.Params...) - } - } - params = append(params, FieldMeta{ - Name: pn, - Type: pt, - Comments: pComments, - Annotations: annotations, - ValidateTag: strings.Join(validateTags, ","), - }) - } - return params -} - -func (ic *InterfaceCollector) field2Results(list []*ast.Field) []FieldMeta { - var results []FieldMeta - rkeymap := make(map[string]int) - for _, result := range list { - var rComments []string - if cmts, exists := ic.cmap[result]; exists { - for _, comment := range cmts[0].List { - rComments = append(rComments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - } - } - rt := ic.exprString(result.Type) - if len(result.Names) > 0 { - for _, name := range result.Names { - results = append(results, FieldMeta{ - Name: name.Name, - Type: rt, - Tag: "", - Comments: rComments, - }) - } - continue - } - var rn string - elemt := strings.TrimPrefix(rt, "*") - if stringutils.IsNotEmpty(elemt) { - if strings.Contains(elemt, "[") { - elemt = elemt[strings.Index(elemt, "]")+1:] - elemt = strings.TrimPrefix(elemt, "*") - } - splits := strings.Split(elemt, ".") - _key := "r" + strcase.ToLowerCamel(splits[len(splits)-1][0:1]) - if _, exists := rkeymap[_key]; exists { - rkeymap[_key]++ - rn = _key + fmt.Sprintf("%d", rkeymap[_key]) - } else { - rkeymap[_key]++ - rn = _key - } - } - results = append(results, FieldMeta{ - Name: rn, - Type: rt, - Tag: "", - Comments: rComments, - }) - } - return results -} - -func doc2Comments(doc *ast.CommentGroup) []string { - var comments []string - if doc != nil { - for _, comment := range doc.List { - comments = append(comments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - } - } - return comments -} - -// NewInterfaceCollector initializes an InterfaceCollector -func NewInterfaceCollector(exprString func(ast.Expr) string) *InterfaceCollector { - return &InterfaceCollector{ - exprString: exprString, - } -} - -// BuildInterfaceCollector initializes an InterfaceCollector and collects interfaces -func BuildInterfaceCollector(file string, exprString func(ast.Expr) string) InterfaceCollector { - ic := NewInterfaceCollector(exprString) - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - logrus.Panicln(err) - } - ic.cmap = ast.NewCommentMap(fset, root, root.Comments) - ast.Walk(ic, root) - return *ic -} diff --git a/toolkit/astutils/interfacecollector_test.go b/toolkit/astutils/interfacecollector_test.go deleted file mode 100644 index fc1fb68e..00000000 --- a/toolkit/astutils/interfacecollector_test.go +++ /dev/null @@ -1,106 +0,0 @@ -package astutils - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" -) - -func TestInterfaceCollector(t *testing.T) { - file := pathutils.Abs("testdata/svc.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - //spew.Dump(root) - sc := NewInterfaceCollector(ExprString) - sc.cmap = ast.NewCommentMap(fset, root, root.Comments) - ast.Walk(sc, root) - fmt.Println(sc) -} - -func TestBuildInterfaceCollector(t *testing.T) { - file := pathutils.Abs("testdata/svc.go") - ic := BuildInterfaceCollector(file, ExprString) - assert.NotNil(t, ic) -} - -func Test_pattern(t *testing.T) { - type args struct { - method string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "1", - args: args{ - method: "GetBooks", - }, - want: "books", - }, - { - name: "2", - args: args{ - method: "PageUsers", - }, - want: "page/users", - }, - { - name: "", - args: args{ - method: "Get", - }, - want: "", - }, - { - name: "", - args: args{ - method: "GetShelves_ShelfBooks_Book", - }, - want: "shelves/:shelf/books/:book", - }, - { - name: "", - args: args{ - method: "Goodfood_BigappleBooks_Mybird", - }, - want: "goodfood/:bigapple/books/:mybird", - }, - { - name: "", - args: args{ - method: "ApiV1Query_range", - }, - want: "api/v1/query_range", - }, - { - name: "", - args: args{ - method: "GetQuery_range", - }, - want: "query_range", - }, - { - name: "", - args: args{ - method: "GetQuery", - }, - want: "query", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _, endpoint := Pattern(tt.args.method) - assert.Equalf(t, tt.want, endpoint, "pattern(%v)", tt.args.method) - }) - } -} diff --git a/toolkit/astutils/rewritejsontag.go b/toolkit/astutils/rewritejsontag.go deleted file mode 100644 index 407e7b50..00000000 --- a/toolkit/astutils/rewritejsontag.go +++ /dev/null @@ -1,133 +0,0 @@ -package astutils - -import ( - "bytes" - "fmt" - "go/ast" - "go/format" - "go/parser" - "go/token" - "regexp" - "strings" - "unicode" - - "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" - "golang.org/x/tools/go/ast/astutil" -) - -func isExport(field string) bool { - return unicode.IsUpper([]rune(field)[0]) -} - -func extractJsonPropName(tag string) string { - re := regexp.MustCompile(`json:"(.*?)"`) - if re.MatchString(tag) { - subs := re.FindAllStringSubmatch(tag, -1) - return strings.TrimSpace(strings.Split(subs[0][1], ",")[0]) - } - return "" -} - -func extractFormPropName(tag string) string { - re := regexp.MustCompile(`form:"(.*?)"`) - if re.MatchString(tag) { - subs := re.FindAllStringSubmatch(tag, -1) - return strings.TrimSpace(strings.Split(subs[0][1], ",")[0]) - } - return "" -} - -type RewriteTagConfig struct { - File string - Omitempty bool - ConvertFunc func(old string) string - Form bool -} - -// RewriteTag overwrites json tag by convert function and return formatted source code -func RewriteTag(config RewriteTagConfig) (string, error) { - file, convert, omitempty, form := config.File, config.ConvertFunc, config.Omitempty, config.Form - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - re := regexp.MustCompile(`json:"(.*?)"`) - reForm := regexp.MustCompile(`form:"(.*?)"`) - astutil.Apply(root, func(cursor *astutil.Cursor) bool { - return true - }, func(cursor *astutil.Cursor) bool { - structSpec, ok := cursor.Node().(*ast.StructType) - if !ok { - return true - } - for _, field := range structSpec.Fields.List { - if field.Names == nil { - continue - } - fname := field.Names[0].Name - if !isExport(fname) { - continue - } - tagValue := convert(field.Names[0].Name) - jsonTagValue := tagValue - if omitempty { - jsonTagValue += ",omitempty" - } - jsonTag := fmt.Sprintf(`json:"%s"`, jsonTagValue) - - formTagValue := tagValue - if omitempty { - formTagValue += ",omitempty" - } - formTag := fmt.Sprintf(`form:"%s"`, formTagValue) - - if field.Tag != nil { - if re.MatchString(field.Tag.Value) { - if extractJsonPropName(field.Tag.Value) != "-" { - field.Tag.Value = re.ReplaceAllLiteralString(field.Tag.Value, jsonTag) - } - } else { - lastindex := strings.LastIndex(field.Tag.Value, "`") - if lastindex < 0 { - panic(errors.New("call LastIndex() error")) - } - field.Tag.Value = field.Tag.Value[:lastindex] + fmt.Sprintf(" %s`", jsonTag) - } - if form { - if reForm.MatchString(field.Tag.Value) { - if extractFormPropName(field.Tag.Value) != "-" { - field.Tag.Value = reForm.ReplaceAllLiteralString(field.Tag.Value, formTag) - } - } else { - lastindex := strings.LastIndex(field.Tag.Value, "`") - if lastindex < 0 { - panic(errors.New("call LastIndex() error")) - } - field.Tag.Value = field.Tag.Value[:lastindex] + fmt.Sprintf(" %s`", formTag) - } - } - } else { - if form { - field.Tag = &ast.BasicLit{ - Kind: token.STRING, - Value: fmt.Sprintf("`%s %s`", jsonTag, formTag), - } - } else { - field.Tag = &ast.BasicLit{ - Kind: token.STRING, - Value: fmt.Sprintf("`%s`", jsonTag), - } - } - } - } - return true - }) - buf := &bytes.Buffer{} - err = format.Node(buf, fset, root) - if err != nil { - return "", fmt.Errorf("error formatting new code: %w", err) - } - return buf.String(), nil -} diff --git a/toolkit/astutils/rewritejsontag_test.go b/toolkit/astutils/rewritejsontag_test.go deleted file mode 100644 index 071c3cb6..00000000 --- a/toolkit/astutils/rewritejsontag_test.go +++ /dev/null @@ -1,149 +0,0 @@ -package astutils - -import ( - "fmt" - "testing" - - "github.com/iancoleman/strcase" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" -) - -func ExampleRewriteTag() { - file := pathutils.Abs("testdata/rewritejsontag.go") - config := RewriteTagConfig{ - File: file, - Omitempty: true, - ConvertFunc: strcase.ToLowerCamel, - Form: false, - } - result, err := RewriteTag(config) - if err != nil { - panic(err) - } - fmt.Println(result) - // Output: - //package main - // - //type base struct { - // Index string `json:"index,omitempty"` - // Type string `json:"type,omitempty"` - //} - // - //type struct1 struct { - // base - // Name string `json:"name,omitempty"` - // StructType int `json:"structType,omitempty" dd:"awesomtag"` - // Format string `dd:"anothertag" json:"format,omitempty"` - // Pos int `json:"pos,omitempty"` - //} -} - -func Test_isExport(t *testing.T) { - type args struct { - field string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "", - args: args{ - field: "unExportField", - }, - want: false, - }, - { - name: "", - args: args{ - field: "ExportField", - }, - want: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := isExport(tt.args.field); got != tt.want { - t.Errorf("isExport() = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_extractJsonPropName(t *testing.T) { - type args struct { - tag string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - tag: `json:"name, omitempty"`, - }, - want: "name", - }, - { - name: "", - args: args{ - tag: `json:"name"`, - }, - want: "name", - }, - { - name: "", - args: args{ - tag: `json:"-, omitempty"`, - }, - want: "-", - }, - { - name: "", - args: args{ - tag: `json:"-"`, - }, - want: "-", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := extractJsonPropName(tt.args.tag); got != tt.want { - t.Errorf("extractJsonPropName() = %v, want %v", got, tt.want) - } - }) - } -} - -func ExampleRewriteTagForm() { - file := pathutils.Abs("testdata/rewritejsontag.go") - config := RewriteTagConfig{ - File: file, - Omitempty: true, - ConvertFunc: strcase.ToLowerCamel, - Form: true, - } - result, err := RewriteTag(config) - if err != nil { - panic(err) - } - fmt.Println(result) - // Output: - //package main - // - //type base struct { - // Index string `json:"index,omitempty" form:"index,omitempty"` - // Type string `json:"type,omitempty" form:"type,omitempty"` - //} - // - //type struct1 struct { - // base - // Name string `json:"name,omitempty" form:"name,omitempty"` - // StructType int `json:"structType,omitempty" dd:"awesomtag" form:"structType,omitempty"` - // Format string `dd:"anothertag" json:"format,omitempty" form:"format,omitempty"` - // Pos int `json:"pos,omitempty" form:"pos,omitempty"` - //} -} diff --git a/toolkit/astutils/staticmethodcollector.go b/toolkit/astutils/staticmethodcollector.go deleted file mode 100644 index 34686c7e..00000000 --- a/toolkit/astutils/staticmethodcollector.go +++ /dev/null @@ -1,67 +0,0 @@ -package astutils - -import ( - "go/ast" - "go/parser" - "go/token" - - "github.com/sirupsen/logrus" -) - -// StaticMethodCollector collect methods by parsing source code -type StaticMethodCollector struct { - Methods []MethodMeta - Package PackageMeta - exprString func(ast.Expr) string -} - -// Visit traverse each node from source code -func (sc *StaticMethodCollector) Visit(n ast.Node) ast.Visitor { - return sc.Collect(n) -} - -// Collect collects all static methods from source code -func (sc *StaticMethodCollector) Collect(n ast.Node) ast.Visitor { - switch spec := n.(type) { - case *ast.Package: - return sc - case *ast.File: // actually it is package name - sc.Package = PackageMeta{ - Name: spec.Name.Name, - } - return sc - case *ast.FuncDecl: - if spec.Recv == nil { - sc.Methods = append(sc.Methods, GetMethodMeta(spec)) - } - case *ast.GenDecl: - } - return nil -} - -type StaticMethodCollectorOption func(collector *StaticMethodCollector) - -// NewStaticMethodCollector initializes an StaticMethodCollector -func NewStaticMethodCollector(exprString func(ast.Expr) string, opts ...StaticMethodCollectorOption) *StaticMethodCollector { - sc := &StaticMethodCollector{ - Methods: make([]MethodMeta, 0), - Package: PackageMeta{}, - exprString: exprString, - } - for _, opt := range opts { - opt(sc) - } - return sc -} - -// BuildStaticMethodCollector initializes an StaticMethodCollector and collects static methods -func BuildStaticMethodCollector(file string, exprString func(ast.Expr) string) StaticMethodCollector { - sc := NewStaticMethodCollector(exprString) - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - logrus.Panicln(err) - } - ast.Walk(sc, root) - return *sc -} diff --git a/toolkit/astutils/structcollector.go b/toolkit/astutils/structcollector.go deleted file mode 100644 index 436d9b93..00000000 --- a/toolkit/astutils/structcollector.go +++ /dev/null @@ -1,175 +0,0 @@ -package astutils - -import ( - "go/ast" - "go/parser" - "go/token" - "regexp" - "strings" - "unicode" - - "github.com/sirupsen/logrus" -) - -// StructCollector collect structs by parsing source code -type StructCollector struct { - Structs []StructMeta - Methods map[string][]MethodMeta - Package PackageMeta - NonStructTypeMap map[string]ast.Expr - exprString func(ast.Expr) string - enums map[string]EnumMeta - GlobalStructs []StructMeta -} - -// Visit traverse each node from source code -func (sc *StructCollector) Visit(n ast.Node) ast.Visitor { - return sc.Collect(n) -} - -// Collect collects all structs from source code -func (sc *StructCollector) Collect(n ast.Node) ast.Visitor { - switch spec := n.(type) { - case *ast.Package: - return sc - case *ast.File: // actually it is package name - sc.Package = PackageMeta{ - Name: spec.Name.Name, - } - return sc - case *ast.FuncDecl: - if spec.Recv != nil { - typeName := strings.TrimPrefix(sc.exprString(spec.Recv.List[0].Type), "*") - methods, _ := sc.Methods[typeName] - methods = append(methods, GetMethodMeta(spec)) - if sc.Methods == nil { - sc.Methods = make(map[string][]MethodMeta) - } - sc.Methods[typeName] = methods - } - case *ast.GenDecl: - if spec.Tok == token.TYPE { - var comments []string - if spec.Doc != nil { - for _, comment := range spec.Doc.List { - comments = append(comments, strings.TrimSpace(strings.TrimPrefix(comment.Text, "//"))) - } - } - for _, item := range spec.Specs { - typeSpec := item.(*ast.TypeSpec) - typeName := typeSpec.Name.Name - switch specType := typeSpec.Type.(type) { - case *ast.StructType: - structmeta := NewStructMeta(specType, sc.exprString) - structmeta.Name = typeName - structmeta.Comments = comments - structmeta.IsExport = unicode.IsUpper(rune(typeName[0])) - sc.Structs = append(sc.Structs, structmeta) - default: - sc.NonStructTypeMap[typeName] = typeSpec.Type - } - } - } - } - return nil -} - -// DocFlatEmbed flatten embed struct fields -func (sc *StructCollector) DocFlatEmbed() []StructMeta { - structs := sc.GlobalStructs - if len(structs) == 0 { - structs = sc.Structs - } - structMap := make(map[string]StructMeta) - for _, structMeta := range structs { - if _, exists := structMap[structMeta.Name]; !exists { - structMap[structMeta.Name] = structMeta - } - } - - var exStructs []StructMeta - for _, structMeta := range structs { - if !structMeta.IsExport { - continue - } - exStructs = append(exStructs, structMeta) - } - - re := regexp.MustCompile(`json:"(.*?)"`) - var result []StructMeta - for _, structMeta := range exStructs { - _structMeta := StructMeta{ - Name: structMeta.Name, - Fields: make([]FieldMeta, 0), - Comments: make([]string, len(structMeta.Comments)), - IsExport: true, - } - copy(_structMeta.Comments, structMeta.Comments) - fieldMap := make(map[string]FieldMeta) - embedFieldMap := make(map[string]FieldMeta) - for _, fieldMeta := range structMeta.Fields { - if strings.HasPrefix(fieldMeta.Type, "embed") { - if re.MatchString(fieldMeta.Tag) { - fieldMeta.Type = strings.TrimPrefix(fieldMeta.Type, "embed:") - _structMeta.Fields = append(_structMeta.Fields, fieldMeta) - fieldMap[fieldMeta.Name] = fieldMeta - } else { - if embedded, exists := structMap[fieldMeta.Name]; exists { - for _, field := range embedded.Fields { - if !field.IsExport { - continue - } - embedFieldMap[field.Name] = field - } - } - } - } else if fieldMeta.IsExport { - _structMeta.Fields = append(_structMeta.Fields, fieldMeta) - fieldMap[fieldMeta.Name] = fieldMeta - } - } - - for key, field := range embedFieldMap { - if _, exists := fieldMap[key]; !exists { - _structMeta.Fields = append(_structMeta.Fields, field) - } - } - result = append(result, _structMeta) - } - return result -} - -type StructCollectorOption func(collector *StructCollector) - -func WithEnums(enums map[string]EnumMeta) StructCollectorOption { - return func(collector *StructCollector) { - collector.enums = enums - } -} - -// NewStructCollector initializes an StructCollector -func NewStructCollector(exprString func(ast.Expr) string, opts ...StructCollectorOption) *StructCollector { - sc := &StructCollector{ - Structs: nil, - Methods: make(map[string][]MethodMeta), - Package: PackageMeta{}, - NonStructTypeMap: make(map[string]ast.Expr), - exprString: exprString, - } - for _, opt := range opts { - opt(sc) - } - return sc -} - -// BuildStructCollector initializes an StructCollector and collects structs -func BuildStructCollector(file string, exprString func(ast.Expr) string) StructCollector { - sc := NewStructCollector(exprString) - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - logrus.Panicln(err) - } - ast.Walk(sc, root) - return *sc -} diff --git a/toolkit/astutils/structcollector_test.go b/toolkit/astutils/structcollector_test.go deleted file mode 100644 index 6719ca35..00000000 --- a/toolkit/astutils/structcollector_test.go +++ /dev/null @@ -1,252 +0,0 @@ -package astutils - -import ( - "encoding/json" - "fmt" - "go/ast" - "go/parser" - "go/token" - "regexp" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" -) - -func TestStruct(t *testing.T) { - file := pathutils.Abs("testdata/vo.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - fmt.Println(sc.Structs) -} - -func TestInter(t *testing.T) { - file := pathutils.Abs("testdata/svc.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewInterfaceCollector(ExprString) - ast.Walk(sc, root) - fmt.Println(sc.Interfaces) -} - -func TestStructFuncDecl(t *testing.T) { - file := pathutils.Abs("testdata/cat.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - methods, exists := sc.Methods["Cat"] - if !exists { - t.Error("Cat should has methods") - } - if len(methods) != 1 { - t.Error("Cat should has only one method") - } -} - -func TestRegex(t *testing.T) { - re := regexp.MustCompile(`anonystructÂŦ(.*)Âŧ`) - a := `[]anonystructÂŦ{"Name":"","Fields":[{"Name":"Name","Type":"string","Tag":"","Comments":null,"IsExport":true,"DocName":"Name"},{"Name":"Addr","Type":"anonystructÂŦ{\"Name\":\"\",\"Fields\":[{\"Name\":\"Zip\",\"Type\":\"string\",\"Tag\":\"\",\"Comments\":null,\"IsExport\":true,\"DocName\":\"Zip\"},{\"Name\":\"Block\",\"Type\":\"string\",\"Tag\":\"\",\"Comments\":null,\"IsExport\":true,\"DocName\":\"Block\"},{\"Name\":\"Full\",\"Type\":\"string\",\"Tag\":\"\",\"Comments\":null,\"IsExport\":true,\"DocName\":\"Full\"}],\"Comments\":null,\"Methods\":null,\"IsExport\":false}Âŧ","Tag":"","Comments":null,"IsExport":true,"DocName":"Addr"}],"Comments":null,"Methods":null,"IsExport":false}Âŧ` - result := re.FindStringSubmatch(a) - fmt.Println(result[1]) - - j := result[1] - var structmeta StructMeta - json.Unmarshal([]byte(j), &structmeta) -} - -func TestStructCollector_DocFlatEmbed(t *testing.T) { - file := pathutils.Abs("testdata/embed.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - structs := sc.DocFlatEmbed() - for _, item := range structs { - if item.Name == "TestEmbed" { - var fields []string - var docFields []string - for _, fieldMeta := range item.Fields { - fields = append(fields, fieldMeta.Name) - docFields = append(docFields, fieldMeta.DocName) - } - assert.ElementsMatch(t, fields, []string{"Fields", "Type", "Index"}) - assert.ElementsMatch(t, docFields, []string{"fields", "type", "index"}) - } - } -} - -func TestStructCollector_DocFlatEmbed1(t *testing.T) { - file := pathutils.Abs("testdata/embed1.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - structs := sc.DocFlatEmbed() - for _, item := range structs { - if item.Name == "TestEmbed1" { - var fields []string - var docFields []string - for _, fieldMeta := range item.Fields { - fields = append(fields, fieldMeta.Name) - docFields = append(docFields, fieldMeta.DocName) - } - assert.ElementsMatch(t, fields, []string{"Fields", "TestBase1"}) - assert.ElementsMatch(t, docFields, []string{"fields", "test_base_1"}) - } - } -} - -func TestStructCollector_DocFlatEmbed_ExcludeUnexportedFields(t *testing.T) { - file := pathutils.Abs("testdata/embed2.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - structs := sc.DocFlatEmbed() - for _, item := range structs { - if item.Name == "TestEmbed2" { - var fields []string - var docFields []string - for _, fieldMeta := range item.Fields { - fields = append(fields, fieldMeta.Name) - docFields = append(docFields, fieldMeta.DocName) - } - assert.ElementsMatch(t, fields, []string{"Fields", "Index", "Type"}) - assert.ElementsMatch(t, docFields, []string{"fields", "index", "type"}) - } - } -} - -func TestStructCollector_DocFlatEmbed_ExcludeUnexportedFields2(t *testing.T) { - file := pathutils.Abs("testdata/embed3.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - structs := sc.DocFlatEmbed() - for _, item := range structs { - if item.Name == "TestEmbed3" { - var fields []string - var docFields []string - for _, fieldMeta := range item.Fields { - fields = append(fields, fieldMeta.Name) - docFields = append(docFields, fieldMeta.DocName) - } - assert.ElementsMatch(t, fields, []string{"Fields", "Type"}) - assert.ElementsMatch(t, docFields, []string{"fields", "type"}) - } - } -} - -func TestStructCollector_DocFlatEmbed_ExcludeUnexportedFields3(t *testing.T) { - file := pathutils.Abs("testdata/embed4.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - structs := sc.DocFlatEmbed() - for _, item := range structs { - if item.Name == "TestEmbed4" { - var fields []string - var docFields []string - for _, fieldMeta := range item.Fields { - fields = append(fields, fieldMeta.Name) - docFields = append(docFields, fieldMeta.DocName) - } - assert.ElementsMatch(t, fields, []string{"Fields", "TestBase1"}) - assert.ElementsMatch(t, docFields, []string{"fields", "test_base_1"}) - } - if item.Name == "TestBase4" { - var fields []string - var docFields []string - for _, fieldMeta := range item.Fields { - fields = append(fields, fieldMeta.Name) - docFields = append(docFields, fieldMeta.DocName) - } - assert.ElementsMatch(t, fields, []string{"Type"}) - assert.ElementsMatch(t, docFields, []string{"Type"}) - } - } -} - -func TestStructCollector_DocFlatEmbed_ExcludeUnexportedFields4(t *testing.T) { - file := pathutils.Abs("testdata/embed5.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - structs := sc.DocFlatEmbed() - for _, item := range structs { - if item.Name == "TestEmbed5" { - var fields []string - var docFields []string - for _, fieldMeta := range item.Fields { - fields = append(fields, fieldMeta.Name) - docFields = append(docFields, fieldMeta.DocName) - } - assert.ElementsMatch(t, fields, []string{"Fields", "testBase5"}) - assert.ElementsMatch(t, docFields, []string{"fields", "testBase"}) - } - } -} - -func TestStructCollector_Alias(t *testing.T) { - file := pathutils.Abs("testdata/alias.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - //spew.Dump(root) - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - structs := sc.DocFlatEmbed() - for _, item := range structs { - if item.Name == "TestAlias" { - fmt.Println(item) - } - } -} - -func TestStructCollector_Entity(t *testing.T) { - file := pathutils.Abs("testdata/entity/purchase.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - //spew.Dump(root) - sc := NewStructCollector(ExprString) - ast.Walk(sc, root) - fmt.Println(sc) -} diff --git a/toolkit/astutils/testdata/alias.go b/toolkit/astutils/testdata/alias.go deleted file mode 100644 index 5d97af58..00000000 --- a/toolkit/astutils/testdata/alias.go +++ /dev/null @@ -1,44 +0,0 @@ -package main - -import ( - "time" - - "github.com/unionj-cloud/go-doudou/v2/esutils" -) - -// comment for alia age -type age int - -type Event struct { - Name string - EventType int -} - -type TestAlias struct { - esutils.Base - Age age - School []struct { - Name string - Addr struct { - Zip string - Block string - Full string - } - } - EventChan chan Event - SigChan chan int - Callback func(string) bool - CallbackN func(param string) bool -} - -type ta TestAlias - -type TT time.Time - -type mm map[string]interface{} - -type MyInter interface { - Speak() error -} - -type starM *time.Time diff --git a/toolkit/astutils/testdata/cat.go b/toolkit/astutils/testdata/cat.go deleted file mode 100644 index 9e5bba03..00000000 --- a/toolkit/astutils/testdata/cat.go +++ /dev/null @@ -1,47 +0,0 @@ -package main - -import ( - "context" - "fmt" -) - -type User struct { - Name string `json:"name"` -} - -type Cat struct { - Hobbies map[string]interface{} - Sleep func() bool - Run chan string -} - -// eat execute eat behavior for Cat -func (c *Cat) eat(food string) ( - // not hungry - full bool, - // how feel - mood string) { - fmt.Println("eat " + food) - return true, "happy" -} - -func (c *Cat) PostSelectVersionPage(ctx context.Context, body PageDTO[VersionDTO, Cat, User]) (code int, message string, data PageDTO[VersionDTO, Cat, User], err error) { - return 0, "", PageDTO[VersionDTO, Cat, User]{}, err -} - -type VersionDTO struct { - VersionName string `json:"versionName"` - VersionId interface{} `json:"versionId"` -} - -type PageDTO[T any, R any, K any] struct { - TotalRow int `json:"totalRow"` - PageNumber int `json:"pageNumber"` - TotalPage int `json:"totalPage"` - PageSize int `json:"pageSize"` - ReturnMsg string `json:"return_msg"` - List []T `json:"list"` - Item []R `json:"item"` - Many []K `json:"many"` - ReturnCode string `json:"return_code"` -} diff --git a/toolkit/astutils/testdata/demo/config/config.go b/toolkit/astutils/testdata/demo/config/config.go deleted file mode 100644 index d912156b..00000000 --- a/toolkit/astutils/testdata/demo/config/config.go +++ /dev/null @@ -1 +0,0 @@ -package config diff --git a/toolkit/astutils/testdata/demo/go.mod b/toolkit/astutils/testdata/demo/go.mod deleted file mode 100644 index 5f3ef328..00000000 --- a/toolkit/astutils/testdata/demo/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module testdata/demo - -go 1.20 diff --git a/toolkit/astutils/testdata/embed.go b/toolkit/astutils/testdata/embed.go deleted file mode 100644 index 1f59449d..00000000 --- a/toolkit/astutils/testdata/embed.go +++ /dev/null @@ -1,13 +0,0 @@ -package main - -//go:generate go-doudou name --file $GOFILE - -type TestBase struct { - Index string `json:"index"` - Type string `json:"type"` -} - -type TestEmbed struct { - TestBase - Fields []Field `json:"fields"` -} diff --git a/toolkit/astutils/testdata/embed1.go b/toolkit/astutils/testdata/embed1.go deleted file mode 100644 index 83408279..00000000 --- a/toolkit/astutils/testdata/embed1.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -type TestBase1 struct { - Index string - Type string -} - -type TestEmbed1 struct { - TestBase1 `json:"test_base_1,omitempty"` - Fields []Field `json:"fields"` -} diff --git a/toolkit/astutils/testdata/embed2.go b/toolkit/astutils/testdata/embed2.go deleted file mode 100644 index f6d2fbcb..00000000 --- a/toolkit/astutils/testdata/embed2.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -type testBase struct { - Index string `json:"index"` - Type string `json:"type"` -} - -type TestEmbed2 struct { - testBase - Fields []Field `json:"fields"` -} diff --git a/toolkit/astutils/testdata/embed3.go b/toolkit/astutils/testdata/embed3.go deleted file mode 100644 index 691cff4c..00000000 --- a/toolkit/astutils/testdata/embed3.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -type TestBase3 struct { - index string `json:"index"` - Type string `json:"type"` -} - -type TestEmbed3 struct { - TestBase3 - Fields []Field `json:"fields"` -} diff --git a/toolkit/astutils/testdata/embed4.go b/toolkit/astutils/testdata/embed4.go deleted file mode 100644 index 3fd0a3c8..00000000 --- a/toolkit/astutils/testdata/embed4.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -type TestBase4 struct { - index string - Type string -} - -type TestEmbed4 struct { - TestBase1 `json:"test_base_1,omitempty"` - Fields []Field `json:"fields"` -} diff --git a/toolkit/astutils/testdata/embed5.go b/toolkit/astutils/testdata/embed5.go deleted file mode 100644 index 076dee92..00000000 --- a/toolkit/astutils/testdata/embed5.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -type testBase5 struct { - Index string `json:"index"` - Type string `json:"type"` -} - -type TestEmbed5 struct { - testBase5 `json:"testBase"` - Fields []Field `json:"fields"` -} diff --git a/toolkit/astutils/testdata/entity/base.go b/toolkit/astutils/testdata/entity/base.go deleted file mode 100644 index 45d091ef..00000000 --- a/toolkit/astutils/testdata/entity/base.go +++ /dev/null @@ -1,9 +0,0 @@ -package entity - -import "time" - -type Base struct { - CreateAt *time.Time `dd:"default:CURRENT_TIMESTAMP"` - UpdateAt *time.Time `dd:"default:CURRENT_TIMESTAMP;extra:ON UPDATE CURRENT_TIMESTAMP"` - DeleteAt *time.Time -} diff --git a/toolkit/astutils/testdata/entity/material.go b/toolkit/astutils/testdata/entity/material.go deleted file mode 100644 index 8159c31b..00000000 --- a/toolkit/astutils/testdata/entity/material.go +++ /dev/null @@ -1,14 +0,0 @@ -package entity - -import "time" - -//dd:table -type Material struct { - Id int `dd:"pk;auto;type:int(11)"` - Name string `dd:"type:varchar(45);extra:comment '原料名į§°'"` - Amount int `dd:"type:int(11);extra:comment '原料单äŧķ克数'"` - CreateAt *time.Time `dd:"type:datetime;default:CURRENT_TIMESTAMP"` - UpdateAt *time.Time `dd:"type:datetime;default:CURRENT_TIMESTAMP;extra:on update CURRENT_TIMESTAMP"` - DeleteAt *time.Time `dd:"type:datetime"` - Price float32 `dd:"type:decimal(10,2);extra:comment '原料单äŧķčŋ›äŧ·'"` -} diff --git a/toolkit/astutils/testdata/entity/purchase.go b/toolkit/astutils/testdata/entity/purchase.go deleted file mode 100644 index 523f132b..00000000 --- a/toolkit/astutils/testdata/entity/purchase.go +++ /dev/null @@ -1,17 +0,0 @@ -package entity - -import "time" - -//dd:table -type Purchase struct { - Id int `dd:"pk;auto;type:int(11)"` - PurchaseAt *time.Time `dd:"type:datetime;extra:comment '采čī­æ—ķé—ī'"` - CreateAt *time.Time `dd:"type:datetime;default:CURRENT_TIMESTAMP"` - UpdateAt *time.Time `dd:"type:datetime;default:CURRENT_TIMESTAMP;extra:on update CURRENT_TIMESTAMP"` - DeleteAt *time.Time `dd:"type:datetime"` - ArriveAt *time.Time `dd:"type:datetime;extra:comment '到čī§æ—ķé—ī'"` - Status int8 `dd:"type:tinyint(4);extra:comment '0: čŋ›čĄŒäļ­ -1: åŪŒįŧ“ -2: 取æķˆ'"` - Note string `dd:"type:text;extra:comment 'åĪ‡æģĻ'"` -} diff --git a/toolkit/astutils/testdata/entity/user.go b/toolkit/astutils/testdata/entity/user.go deleted file mode 100644 index 2c4fbac1..00000000 --- a/toolkit/astutils/testdata/entity/user.go +++ /dev/null @@ -1,14 +0,0 @@ -package entity - -//dd:table -type User struct { - ID int `dd:"pk;auto"` - Name string `dd:"index:name_phone_idx,2;default:'jack'"` - Phone string `dd:"index:name_phone_idx,1;default:'13552053960';extra:comment '手朚号'"` - Age int `dd:"index"` - No int `dd:"unique"` - School string `dd:"null;default:'harvard';extra:comment 'å­Ķæ Ą'"` - IsStudent bool - - Base -} diff --git a/toolkit/astutils/testdata/enum.go b/toolkit/astutils/testdata/enum.go deleted file mode 100644 index c3d61206..00000000 --- a/toolkit/astutils/testdata/enum.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import "encoding/json" - -//go:generate go-doudou name --file $GOFILE -o - -type KeyboardLayout int - -const ( - UNKNOWN KeyboardLayout = iota - QWERTZ = 300 - - AZERTY int64 = 400 - QWERTY - ddd = "abc" -) - -func (k *KeyboardLayout) StringSetter(value string) { - switch value { - case "UNKNOWN": - *k = UNKNOWN - case "QWERTY": - *k = QWERTY - case "QWERTZ": - *k = QWERTZ - case "AZERTY": - *k = AZERTY - default: - *k = UNKNOWN - } -} - -func (k *KeyboardLayout) StringGetter() string { - switch *k { - case UNKNOWN: - return "UNKNOWN" - case QWERTY: - return "QWERTY" - case QWERTZ: - return "QWERTZ" - case AZERTY: - return "AZERTY" - default: - return "UNKNOWN" - } -} - -func (k *KeyboardLayout) UnmarshalJSON(bytes []byte) error { - var _k string - err := json.Unmarshal(bytes, &_k) - if err != nil { - return err - } - k.StringSetter(_k) - return nil -} - -func (k KeyboardLayout) MarshalJSON() ([]byte, error) { - return json.Marshal(k.StringGetter()) -} - -type Keyboard struct { - Layout *KeyboardLayout `json:"layout,omitempty"` - Backlit bool `json:"backlit,omitempty"` -} diff --git a/toolkit/astutils/testdata/output.go b/toolkit/astutils/testdata/output.go deleted file mode 100644 index a3ea3174..00000000 --- a/toolkit/astutils/testdata/output.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" -) - -type UserVo struct { - Id int - Name string - Phone string - Dept string -} - -type Page struct { - PageNo int - Size int - Items []UserVo -} - -func main() { - page := Page{ - PageNo: 10, - Size: 30, - } - b, _ := json.Marshal(page) - fmt.Println(string(b)) -} diff --git a/toolkit/astutils/testdata/rewritejsontag.go b/toolkit/astutils/testdata/rewritejsontag.go deleted file mode 100644 index 93d16dad..00000000 --- a/toolkit/astutils/testdata/rewritejsontag.go +++ /dev/null @@ -1,14 +0,0 @@ -package main - -type base struct { - Index string - Type string -} - -type struct1 struct { - base - Name string `json:"good"` - StructType int `json:"struct_type" dd:"awesomtag"` - Format string `dd:"anothertag"` - Pos int -} diff --git a/toolkit/astutils/testdata/svc.go b/toolkit/astutils/testdata/svc.go deleted file mode 100644 index 4a307f38..00000000 --- a/toolkit/astutils/testdata/svc.go +++ /dev/null @@ -1,45 +0,0 @@ -package main - -import ( - "context" - "mime/multipart" -) - -// į”Ļæˆ·æœåŠĄæŽĨåĢ -// v1į‰ˆæœŽ -type Usersvc interface { - // You can define your service methods as your need. Below is an example. - PageUsers(ctx context.Context, query PageQuery) (code int, data PageRet, msg error) - - // comment1 - // comment2 - GetUser(ctx context.Context, - // į”Ļ户ID - // @validate(gt=0,lte=10) - userId, - // æĩ‹čŊ• - school, - // å›ūį‰‡åœ°å€ - photo string, - ) ( - // äļšåŠĄįŠķ态į  - code int, - // įŧ“æžœ - data string, - // 错čŊŊ - msg error) - - // comment3 - SignUp(ctx context.Context, - // @validate(gt=0,lte=10) - username string, password int, actived bool, score float64) (code int, data string, msg error) - - // comment4 - UploadAvatar(context.Context, []*multipart.FileHeader, string) (int, string, error) - - // comment5 - DownloadAvatar(ctx context.Context, userId string, userAttrs ...int) (a, b string) - - // @role(SUPER_ADMIN) - BulkSaveOrUpdate(context.Context, int) error -} diff --git a/toolkit/astutils/testdata/vo.go b/toolkit/astutils/testdata/vo.go deleted file mode 100644 index 0cf9068e..00000000 --- a/toolkit/astutils/testdata/vo.go +++ /dev/null @@ -1,145 +0,0 @@ -package main - -//go:generate go-doudou name --file $GOFILE -o - -// į­›é€‰æĄäŧķ -type PageFilter struct { - // įœŸåŪžå§“名前įž€åŒđ配 - Name string `json:"name,omitempty"` - // æ‰€åąžéƒĻé—ĻID - Dept int `json:"dept,omitempty"` -} - -// æŽ’åšæĄäŧķ -type Order struct { - Col string `json:"col,omitempty"` - Sort, Name, Banana string -} - -// 分éĄĩį­›é€‰æĄäŧķ -type PageQuery struct { - Filter PageFilter `json:"filter,omitempty"` - Page Page `json:"page,omitempty"` -} - -type PageRet struct { - Items interface{} `json:"items,omitempty"` - PageNo int `json:"pageNo,omitempty"` - PageSize int `json:"pageSize,omitempty"` - Total int `json:"total,omitempty"` - HasNext bool `json:"hasNext,omitempty"` -} - -type queryType int -type queryLogic int - -const ( - SHOULD queryLogic = iota + 1 - MUST - MUSTNOT -) - -const ( - TERMS queryType = iota + 1 - MATCHPHRASE - RANGE - PREFIX - WILDCARD - EXISTS -) - -type esFieldType string - -const ( - TEXT esFieldType = "text" - KEYWORD esFieldType = "keyword" - DATE esFieldType = "date" - LONG esFieldType = "long" - INTEGER esFieldType = "integer" - SHORT esFieldType = "short" - DOUBLE esFieldType = "double" - FLOAT esFieldType = "float" - BOOL esFieldType = "boolean" -) - -type Base struct { - Index string `json:"index,omitempty"` - Type string `json:"type,omitempty"` -} - -type QueryCond struct { - Pair map[string][]interface{} `json:"pair,omitempty"` - QueryLogic queryLogic `json:"queryLogic,omitempty"` - QueryType queryType `json:"queryType,omitempty"` - Children []QueryCond `json:"children,omitempty"` -} - -type Sort struct { - Field string `json:"field,omitempty"` - Ascending bool `json:"ascending,omitempty"` -} - -type Paging struct { - StartDate string `json:"startDate,omitempty"` - EndDate string `json:"endDate,omitempty"` - DateField string `json:"dateField,omitempty"` - QueryConds []QueryCond `json:"queryConds,omitempty"` - Skip int `json:"skip,omitempty"` - Limit int `json:"limit,omitempty"` - Sortby []Sort `json:"sortby,omitempty"` -} - -type BulkSavePayload struct { - Base - Docs []map[string]interface{} `json:"docs,omitempty"` -} - -type SavePayload struct { - Base - Doc map[string]interface{} `json:"doc,omitempty"` -} - -type BulkDeletePayload struct { - Base - DocIds []string `json:"docIds,omitempty"` -} - -type PagePayload struct { - Base - Paging -} - -type PageResult struct { - Page int `json:"page,omitempty"` - PageSize int `json:"pageSize,omitempty"` - Total int `json:"total,omitempty"` - Docs []map[string]interface{} `json:"docs,omitempty"` - HasNextPage bool `json:"hasNextPage,omitempty"` -} - -type StatPayload struct { - Base - Paging - Aggr interface{} `json:"aggr,omitempty"` -} - -type RandomPayload struct { - Base - Paging -} - -type CountPayload struct { - Base - Paging -} - -type Field struct { - Name string `json:"name,omitempty"` - Type esFieldType `json:"type,omitempty"` - Format string `json:"format,omitempty"` -} - -type MappingPayload struct { - Base - Fields []Field `json:"fields,omitempty"` -} diff --git a/toolkit/astutils/testdata/vo/cat.go b/toolkit/astutils/testdata/vo/cat.go deleted file mode 100644 index 0a5845c2..00000000 --- a/toolkit/astutils/testdata/vo/cat.go +++ /dev/null @@ -1,14 +0,0 @@ -package vo - -import "fmt" - -type Cat struct { - Hobbies map[string]interface{} - Sleep func() bool - Run chan string -} - -func (c *Cat) eat(food string) bool { - fmt.Println("eat " + food) - return true -} diff --git a/toolkit/cache/.prettierrc.yml b/toolkit/cache/.prettierrc.yml deleted file mode 100644 index 8b7f044a..00000000 --- a/toolkit/cache/.prettierrc.yml +++ /dev/null @@ -1,4 +0,0 @@ -semi: false -singleQuote: true -proseWrap: always -printWidth: 100 diff --git a/toolkit/cache/CHANGELOG.md b/toolkit/cache/CHANGELOG.md deleted file mode 100644 index e9d6eece..00000000 --- a/toolkit/cache/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -> :heart: [**Uptrace.dev** - distributed traces, logs, and errors in one place](https://uptrace.dev) - -## v8 - -- Added s2 (snappy) compression. That means that v8 can't read the data set by v7. -- Replaced LRU with TinyLFU for local cache. -- Requires go-redis v8. diff --git a/toolkit/cache/LICENSE b/toolkit/cache/LICENSE deleted file mode 100644 index 9a21b9aa..00000000 --- a/toolkit/cache/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2016 The github.com/go-redis/cache Contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/toolkit/cache/Makefile b/toolkit/cache/Makefile deleted file mode 100644 index 57914e33..00000000 --- a/toolkit/cache/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -all: - go test ./... - go test ./... -short -race - go test ./... -run=NONE -bench=. -benchmem - env GOOS=linux GOARCH=386 go test ./... - golangci-lint run diff --git a/toolkit/cache/README.md b/toolkit/cache/README.md deleted file mode 100644 index 5d31c87a..00000000 --- a/toolkit/cache/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# Redis cache library for Golang - -[![Build Status](https://travis-ci.org/go-redis/cache.svg)](https://travis-ci.org/go-redis/cache) -[![GoDoc](https://godoc.org/github.com/go-redis/cache?status.svg)](https://pkg.go.dev/github.com/go-redis/cache/v9?tab=doc) - -> go-redis/cache is brought to you by :star: -> [**uptrace/uptrace**](https://github.com/uptrace/uptrace). Uptrace is an open source and blazingly -> fast [distributed tracing tool](https://get.uptrace.dev/) powered by OpenTelemetry and ClickHouse. -> Give it a star as well! - -go-redis/cache library implements a cache using Redis as a key/value storage. It uses -[MessagePack](https://github.com/vmihailenco/msgpack) to marshal values. - -Optionally, you can use [TinyLFU](https://github.com/dgryski/go-tinylfu) or any other -[cache algorithm](https://github.com/vmihailenco/go-cache-benchmark) as a local in-process cache. - -If you are interested in monitoring cache hit rate, see the guide for -[Monitoring using OpenTelemetry Metrics](https://blog.uptrace.dev/posts/opentelemetry-metrics-cache-stats/). - -## Installation - -go-redis/cache supports 2 last Go versions and requires a Go version with -[modules](https://github.com/golang/go/wiki/Modules) support. So make sure to initialize a Go -module: - -```shell -go mod init github.com/my/repo -``` - -And then install go-redis/cache/v9 (note _v9_ in the import; omitting it is a popular mistake): - -```shell -go get github.com/go-redis/cache/v9 -``` - -## Quickstart - -```go -package cache_test - -import ( - "context" - "fmt" - "time" - - "github.com/redis/go-redis/v9" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cache" -) - -type Object struct { - Str string - Num int -} - -func Example_basicUsage() { - ring := redis.NewRing(&redis.RingOptions{ - Addrs: map[string]string{ - "server1": ":6379", - "server2": ":6380", - }, - }) - - mycache := cache.New(&cache.Options{ - Redis: ring, - LocalCache: cache.NewTinyLFU(1000, time.Minute), - }) - - ctx := context.TODO() - key := "mykey" - obj := &Object{ - Str: "mystring", - Num: 42, - } - - if err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - Value: obj, - TTL: time.Hour, - }); err != nil { - panic(err) - } - - var wanted Object - if err := mycache.Get(ctx, key, &wanted); err == nil { - fmt.Println(wanted) - } - - // Output: {mystring 42} -} - -func Example_advancedUsage() { - ring := redis.NewRing(&redis.RingOptions{ - Addrs: map[string]string{ - "server1": ":6379", - "server2": ":6380", - }, - }) - - mycache := cache.New(&cache.Options{ - Redis: ring, - LocalCache: cache.NewTinyLFU(1000, time.Minute), - }) - - obj := new(Object) - err := mycache.Once(&cache.Item{ - Key: "mykey", - Value: obj, // destination - Do: func(*cache.Item) (interface{}, error) { - return &Object{ - Str: "mystring", - Num: 42, - }, nil - }, - }) - if err != nil { - panic(err) - } - fmt.Println(obj) - // Output: &{mystring 42} -} -``` diff --git a/toolkit/cache/bench_test.go b/toolkit/cache/bench_test.go deleted file mode 100644 index 75f2d681..00000000 --- a/toolkit/cache/bench_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package cache_test - -import ( - "strings" - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/cache" -) - -func BenchmarkOnce(b *testing.B) { - mycache := newCacheWithLocal(newRing()) - obj := &Object{ - Str: strings.Repeat("my very large string", 10), - Num: 42, - } - - b.ResetTimer() - - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var dst Object - err := mycache.Once(&cache.Item{ - Key: "bench-once", - Value: &dst, - Do: func(*cache.Item) (interface{}, error) { - return obj, nil - }, - }) - if err != nil { - b.Fatal(err) - } - if dst.Num != 42 { - b.Fatalf("%d != 42", dst.Num) - } - } - }) -} - -func BenchmarkSet(b *testing.B) { - mycache := newCacheWithLocal(newRing()) - obj := &Object{ - Str: strings.Repeat("my very large string", 10), - Num: 42, - } - - b.ResetTimer() - - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if err := mycache.Set(&cache.Item{ - Key: "bench-set", - Value: obj, - }); err != nil { - b.Fatal(err) - } - } - }) -} diff --git a/toolkit/cache/cache.go b/toolkit/cache/cache.go deleted file mode 100644 index dde3d442..00000000 --- a/toolkit/cache/cache.go +++ /dev/null @@ -1,404 +0,0 @@ -package cache - -import ( - "context" - "errors" - "fmt" - "sync/atomic" - "time" - - "github.com/klauspost/compress/s2" - "github.com/redis/go-redis/v9" - "github.com/vmihailenco/msgpack/v5" - "golang.org/x/sync/singleflight" -) - -const ( - compressionThreshold = 64 - timeLen = 4 -) - -const ( - noCompression = 0x0 - s2Compression = 0x1 -) - -var ( - ErrCacheMiss = errors.New("cache: key is missing") - errRedisLocalCacheNil = errors.New("cache: both Redis and LocalCache are nil") -) - -type rediser interface { - Set(ctx context.Context, key string, value interface{}, ttl time.Duration) *redis.StatusCmd - SetXX(ctx context.Context, key string, value interface{}, ttl time.Duration) *redis.BoolCmd - SetNX(ctx context.Context, key string, value interface{}, ttl time.Duration) *redis.BoolCmd - - Get(ctx context.Context, key string) *redis.StringCmd - Del(ctx context.Context, keys ...string) *redis.IntCmd -} - -type Item struct { - Ctx context.Context - - Key string - Value interface{} - - // TTL is the cache expiration time. - // Default TTL is 1 hour. - TTL time.Duration - - // Do returns value to be cached. - Do func(*Item) (interface{}, error) - - // SetXX only sets the key if it already exists. - SetXX bool - - // SetNX only sets the key if it does not already exist. - SetNX bool - - // SkipLocalCache skips local cache as if it is not set. - SkipLocalCache bool -} - -func (item *Item) Context() context.Context { - if item.Ctx == nil { - return context.Background() - } - return item.Ctx -} - -func (item *Item) value() (interface{}, error) { - if item.Do != nil { - return item.Do(item) - } - if item.Value != nil { - return item.Value, nil - } - return nil, nil -} - -func (item *Item) ttl() time.Duration { - return item.TTL -} - -// ------------------------------------------------------------------------------ -type ( - MarshalFunc func(interface{}) ([]byte, error) - UnmarshalFunc func([]byte, interface{}) error -) - -type Options struct { - Redis rediser - LocalCache LocalCache - StatsEnabled bool - Marshal MarshalFunc - Unmarshal UnmarshalFunc -} - -type Cache struct { - opt *Options - - group singleflight.Group - - marshal MarshalFunc - unmarshal UnmarshalFunc - - hits uint64 - misses uint64 -} - -func New(opt *Options) *Cache { - cacher := &Cache{ - opt: opt, - } - - if opt.Marshal == nil { - cacher.marshal = cacher._marshal - } else { - cacher.marshal = opt.Marshal - } - - if opt.Unmarshal == nil { - cacher.unmarshal = cacher._unmarshal - } else { - cacher.unmarshal = opt.Unmarshal - } - return cacher -} - -// Set caches the item. -func (cd *Cache) Set(item *Item) error { - _, _, err := cd.set(item) - return err -} - -func (cd *Cache) set(item *Item) ([]byte, bool, error) { - value, err := item.value() - if err != nil { - return nil, false, err - } - - b, err := cd.Marshal(value) - if err != nil { - return nil, false, err - } - - if cd.opt.LocalCache != nil && !item.SkipLocalCache { - cd.opt.LocalCache.Set(item.Key, b) - } - - if cd.opt.Redis == nil { - if cd.opt.LocalCache == nil { - return b, true, errRedisLocalCacheNil - } - return b, true, nil - } - - ttl := item.ttl() - - if item.SetXX { - return b, true, cd.opt.Redis.SetXX(item.Context(), item.Key, b, ttl).Err() - } - if item.SetNX { - return b, true, cd.opt.Redis.SetNX(item.Context(), item.Key, b, ttl).Err() - } - return b, true, cd.opt.Redis.Set(item.Context(), item.Key, b, ttl).Err() -} - -// Exists reports whether value for the given key exists. -func (cd *Cache) Exists(ctx context.Context, key string) bool { - _, err := cd.getBytes(ctx, key, false) - return err == nil -} - -// Get gets the value for the given key. -func (cd *Cache) Get(ctx context.Context, key string, value interface{}) error { - return cd.get(ctx, key, value, false) -} - -// Get gets the value for the given key skipping local cache. -func (cd *Cache) GetSkippingLocalCache( - ctx context.Context, key string, value interface{}, -) error { - return cd.get(ctx, key, value, true) -} - -func (cd *Cache) get( - ctx context.Context, - key string, - value interface{}, - skipLocalCache bool, -) error { - b, err := cd.getBytes(ctx, key, skipLocalCache) - if err != nil { - return err - } - return cd.unmarshal(b, value) -} - -func (cd *Cache) getBytes(ctx context.Context, key string, skipLocalCache bool) ([]byte, error) { - if !skipLocalCache && cd.opt.LocalCache != nil { - b, ok := cd.opt.LocalCache.Get(key) - if ok { - return b, nil - } - } - - if cd.opt.Redis == nil { - if cd.opt.LocalCache == nil { - return nil, errRedisLocalCacheNil - } - return nil, ErrCacheMiss - } - - b, err := cd.opt.Redis.Get(ctx, key).Bytes() - if err != nil { - if cd.opt.StatsEnabled { - atomic.AddUint64(&cd.misses, 1) - } - if err == redis.Nil { - return nil, ErrCacheMiss - } - return nil, err - } - - if cd.opt.StatsEnabled { - atomic.AddUint64(&cd.hits, 1) - } - - if !skipLocalCache && cd.opt.LocalCache != nil { - cd.opt.LocalCache.Set(key, b) - } - return b, nil -} - -// Once gets the item.Value for the given item.Key from the cache or -// executes, caches, and returns the results of the given item.Func, -// making sure that only one execution is in-flight for a given item.Key -// at a time. If a duplicate comes in, the duplicate caller waits for the -// original to complete and receives the same results. -func (cd *Cache) Once(item *Item) error { - b, cached, err := cd.getSetItemBytesOnce(item) - if err != nil { - return err - } - - if item.Value == nil || len(b) == 0 { - return nil - } - - if err := cd.unmarshal(b, item.Value); err != nil { - if cached { - _ = cd.Delete(item.Context(), item.Key) - return cd.Once(item) - } - return err - } - - return nil -} - -func (cd *Cache) getSetItemBytesOnce(item *Item) (b []byte, cached bool, err error) { - if cd.opt.LocalCache != nil { - b, ok := cd.opt.LocalCache.Get(item.Key) - if ok { - return b, true, nil - } - } - - v, err, _ := cd.group.Do(item.Key, func() (interface{}, error) { - b, err := cd.getBytes(item.Context(), item.Key, item.SkipLocalCache) - if err == nil { - cached = true - return b, nil - } - - b, ok, err := cd.set(item) - if ok { - return b, nil - } - return nil, err - }) - if err != nil { - return nil, false, err - } - return v.([]byte), cached, nil -} - -func (cd *Cache) Delete(ctx context.Context, key string) error { - if cd.opt.LocalCache != nil { - cd.opt.LocalCache.Del(key) - } - - if cd.opt.Redis == nil { - if cd.opt.LocalCache == nil { - return errRedisLocalCacheNil - } - return nil - } - - _, err := cd.opt.Redis.Del(ctx, key).Result() - return err -} - -func (cd *Cache) DeleteFromLocalCache(key string) { - if cd.opt.LocalCache != nil { - cd.opt.LocalCache.Del(key) - } -} - -func (cd *Cache) Marshal(value interface{}) ([]byte, error) { - return cd.marshal(value) -} - -func (cd *Cache) _marshal(value interface{}) ([]byte, error) { - switch value := value.(type) { - case nil: - return nil, nil - case []byte: - return value, nil - case string: - return []byte(value), nil - } - - b, err := msgpack.Marshal(value) - if err != nil { - return nil, err - } - - return compress(b), nil -} - -func compress(data []byte) []byte { - if len(data) < compressionThreshold { - n := len(data) + 1 - b := make([]byte, n, n+timeLen) - copy(b, data) - b[len(b)-1] = noCompression - return b - } - - n := s2.MaxEncodedLen(len(data)) + 1 - b := make([]byte, n, n+timeLen) - b = s2.Encode(b, data) - b = append(b, s2Compression) - return b -} - -func (cd *Cache) Unmarshal(b []byte, value interface{}) error { - return cd.unmarshal(b, value) -} - -func (cd *Cache) _unmarshal(b []byte, value interface{}) error { - if len(b) == 0 { - return nil - } - - switch value := value.(type) { - case nil: - return nil - case *[]byte: - clone := make([]byte, len(b)) - copy(clone, b) - *value = clone - return nil - case *string: - *value = string(b) - return nil - } - - switch c := b[len(b)-1]; c { - case noCompression: - b = b[:len(b)-1] - case s2Compression: - b = b[:len(b)-1] - - var err error - b, err = s2.Decode(nil, b) - if err != nil { - return err - } - default: - return fmt.Errorf("unknown compression method: %x", c) - } - - return msgpack.Unmarshal(b, value) -} - -//------------------------------------------------------------------------------ - -type Stats struct { - Hits uint64 - Misses uint64 -} - -// Stats returns cache statistics. -func (cd *Cache) Stats() *Stats { - if !cd.opt.StatsEnabled { - return nil - } - return &Stats{ - Hits: atomic.LoadUint64(&cd.hits), - Misses: atomic.LoadUint64(&cd.misses), - } -} diff --git a/toolkit/cache/cache_test.go b/toolkit/cache/cache_test.go deleted file mode 100644 index a7a2ab1e..00000000 --- a/toolkit/cache/cache_test.go +++ /dev/null @@ -1,426 +0,0 @@ -package cache_test - -import ( - "context" - "errors" - "io" - "sync" - "sync/atomic" - "testing" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/redis/go-redis/v9" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/cache" -) - -func TestGinkgo(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cache") -} - -func perform(n int, cbs ...func(int)) { - var wg sync.WaitGroup - for _, cb := range cbs { - for i := 0; i < n; i++ { - wg.Add(1) - go func(cb func(int), i int) { - defer wg.Done() - defer GinkgoRecover() - - cb(i) - }(cb, i) - } - } - wg.Wait() -} - -var _ = Describe("Cache", func() { - ctx := context.TODO() - - const key = "mykey" - var obj *Object - - var rdb *redis.Ring - var mycache *cache.Cache - - testCache := func() { - It("Gets and Sets nil", func() { - err := mycache.Set(&cache.Item{ - Key: key, - TTL: time.Hour, - }) - Expect(err).NotTo(HaveOccurred()) - - err = mycache.Get(ctx, key, nil) - Expect(err).NotTo(HaveOccurred()) - - Expect(mycache.Exists(ctx, key)).To(BeTrue()) - }) - - It("Deletes key", func() { - err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - TTL: time.Hour, - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(mycache.Exists(ctx, key)).To(BeTrue()) - - err = mycache.Delete(ctx, key) - Expect(err).NotTo(HaveOccurred()) - - err = mycache.Get(ctx, key, nil) - Expect(err).To(Equal(cache.ErrCacheMiss)) - - Expect(mycache.Exists(ctx, key)).To(BeFalse()) - }) - - It("Gets and Sets data", func() { - err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - Value: obj, - TTL: time.Hour, - }) - Expect(err).NotTo(HaveOccurred()) - - wanted := new(Object) - err = mycache.Get(ctx, key, wanted) - Expect(err).NotTo(HaveOccurred()) - Expect(wanted).To(Equal(obj)) - - Expect(mycache.Exists(ctx, key)).To(BeTrue()) - }) - - It("Sets string as is", func() { - value := "str_value" - - err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - Value: value, - }) - Expect(err).NotTo(HaveOccurred()) - - var dst string - err = mycache.Get(ctx, key, &dst) - Expect(err).NotTo(HaveOccurred()) - Expect(dst).To(Equal(value)) - }) - - It("Sets bytes as is", func() { - value := []byte("str_value") - - err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - Value: value, - }) - Expect(err).NotTo(HaveOccurred()) - - var dst []byte - err = mycache.Get(ctx, key, &dst) - Expect(err).NotTo(HaveOccurred()) - Expect(dst).To(Equal(value)) - }) - - It("can be used with Incr", func() { - if rdb == nil { - return - } - - value := "123" - - err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - Value: value, - }) - Expect(err).NotTo(HaveOccurred()) - - n, err := rdb.Incr(ctx, key).Result() - Expect(err).NotTo(HaveOccurred()) - Expect(n).To(Equal(int64(124))) - }) - - Describe("Once func", func() { - It("calls Func when cache fails", func() { - err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - Value: int64(0), - }) - Expect(err).NotTo(HaveOccurred()) - - var got bool - err = mycache.Get(ctx, key, &got) - Expect(err).To(MatchError("msgpack: invalid code=d3 decoding bool")) - - err = mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: &got, - Do: func(*cache.Item) (interface{}, error) { - return true, nil - }, - }) - Expect(err).NotTo(HaveOccurred()) - Expect(got).To(BeTrue()) - - got = false - err = mycache.Get(ctx, key, &got) - Expect(err).NotTo(HaveOccurred()) - Expect(got).To(BeTrue()) - }) - - It("does not cache when Func fails", func() { - perform(100, func(int) { - var got bool - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: &got, - Do: func(*cache.Item) (interface{}, error) { - return nil, io.EOF - }, - }) - Expect(err).To(Equal(io.EOF)) - Expect(got).To(BeFalse()) - }) - - var got bool - err := mycache.Get(ctx, key, &got) - Expect(err).To(Equal(cache.ErrCacheMiss)) - - err = mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: &got, - Do: func(*cache.Item) (interface{}, error) { - return true, nil - }, - }) - Expect(err).NotTo(HaveOccurred()) - Expect(got).To(BeTrue()) - }) - - It("works with Value", func() { - var callCount int64 - perform(100, func(int) { - got := new(Object) - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: got, - Do: func(*cache.Item) (interface{}, error) { - atomic.AddInt64(&callCount, 1) - return obj, nil - }, - }) - Expect(err).NotTo(HaveOccurred()) - Expect(got).To(Equal(obj)) - }) - Expect(callCount).To(Equal(int64(1))) - }) - - It("works with ptr and non-ptr", func() { - var callCount int64 - perform(100, func(int) { - got := new(Object) - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: got, - Do: func(*cache.Item) (interface{}, error) { - atomic.AddInt64(&callCount, 1) - return *obj, nil - }, - }) - Expect(err).NotTo(HaveOccurred()) - Expect(got).To(Equal(obj)) - }) - Expect(callCount).To(Equal(int64(1))) - }) - - It("works with bool", func() { - var callCount int64 - perform(100, func(int) { - var got bool - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: &got, - Do: func(*cache.Item) (interface{}, error) { - atomic.AddInt64(&callCount, 1) - return true, nil - }, - }) - Expect(err).NotTo(HaveOccurred()) - Expect(got).To(BeTrue()) - }) - Expect(callCount).To(Equal(int64(1))) - }) - - It("works without Value and nil result", func() { - var callCount int64 - perform(100, func(int) { - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Do: func(*cache.Item) (interface{}, error) { - atomic.AddInt64(&callCount, 1) - return nil, nil - }, - }) - Expect(err).NotTo(HaveOccurred()) - }) - Expect(callCount).To(Equal(int64(1))) - }) - - It("works without Value and error result", func() { - var callCount int64 - perform(100, func(int) { - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Do: func(*cache.Item) (interface{}, error) { - time.Sleep(100 * time.Millisecond) - atomic.AddInt64(&callCount, 1) - return nil, errors.New("error stub") - }, - }) - Expect(err).To(MatchError("error stub")) - }) - Expect(callCount).To(Equal(int64(1))) - }) - - It("does not cache error result", func() { - var callCount int64 - do := func(sleep time.Duration) (int, error) { - var n int - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: &n, - Do: func(*cache.Item) (interface{}, error) { - time.Sleep(sleep) - - n := atomic.AddInt64(&callCount, 1) - if n == 1 { - return nil, errors.New("error stub") - } - return 42, nil - }, - }) - if err != nil { - return 0, err - } - return n, nil - } - - perform(100, func(int) { - n, err := do(100 * time.Millisecond) - Expect(err).To(MatchError("error stub")) - Expect(n).To(Equal(0)) - }) - - perform(100, func(int) { - n, err := do(0) - Expect(err).NotTo(HaveOccurred()) - Expect(n).To(Equal(42)) - }) - - Expect(callCount).To(Equal(int64(2))) - }) - - It("skips Set when TTL = -1", func() { - key := "skip-set" - - var value string - err := mycache.Once(&cache.Item{ - Ctx: ctx, - Key: key, - Value: &value, - Do: func(item *cache.Item) (interface{}, error) { - item.TTL = -1 - return "hello", nil - }, - }) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("hello")) - - if rdb != nil { - exists, err := rdb.Exists(ctx, key).Result() - Expect(err).NotTo(HaveOccurred()) - Expect(exists).To(Equal(int64(0))) - } - }) - }) - } - - BeforeEach(func() { - obj = &Object{ - Str: "mystring", - Num: 42, - } - }) - - Context("without LocalCache", func() { - BeforeEach(func() { - rdb = newRing() - mycache = newCache(rdb) - }) - - testCache() - }) - - Context("with LocalCache", func() { - BeforeEach(func() { - rdb = newRing() - mycache = newCacheWithLocal(rdb) - }) - - testCache() - }) - - Context("with LocalCache and without Redis", func() { - BeforeEach(func() { - rdb = nil - mycache = cache.New(&cache.Options{ - LocalCache: cache.NewTinyLFU(1000, time.Minute), - }) - }) - - testCache() - }) -}) - -func newRing() *redis.Ring { - ctx := context.TODO() - ring := redis.NewRing(&redis.RingOptions{ - Addrs: map[string]string{ - "server1": ":6379", - }, - }) - _ = ring.ForEachShard(ctx, func(ctx context.Context, client *redis.Client) error { - return client.FlushDB(ctx).Err() - }) - return ring -} - -func newCache(rdb *redis.Ring) *cache.Cache { - return cache.New(&cache.Options{ - Redis: rdb, - }) -} - -func newCacheWithLocal(rdb *redis.Ring) *cache.Cache { - return cache.New(&cache.Options{ - Redis: rdb, - LocalCache: cache.NewTinyLFU(1000, time.Minute), - }) -} diff --git a/toolkit/cache/example_cache_test.go b/toolkit/cache/example_cache_test.go deleted file mode 100644 index b42abc0e..00000000 --- a/toolkit/cache/example_cache_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package cache_test - -import ( - "context" - "fmt" - "time" - - "github.com/redis/go-redis/v9" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/cache" -) - -type Object struct { - Str string - Num int -} - -func Example_basicUsage() { - ring := redis.NewRing(&redis.RingOptions{ - Addrs: map[string]string{ - "server1": ":6379", - "server2": ":6380", - }, - }) - - mycache := cache.New(&cache.Options{ - Redis: ring, - LocalCache: cache.NewTinyLFU(1000, time.Minute), - }) - - ctx := context.TODO() - key := "mykey" - obj := &Object{ - Str: "mystring", - Num: 42, - } - - if err := mycache.Set(&cache.Item{ - Ctx: ctx, - Key: key, - Value: obj, - TTL: time.Hour, - }); err != nil { - panic(err) - } - - var wanted Object - if err := mycache.Get(ctx, key, &wanted); err == nil { - fmt.Println(wanted) - } - - // Output: {mystring 42} -} - -func Example_advancedUsage() { - ring := redis.NewRing(&redis.RingOptions{ - Addrs: map[string]string{ - "server1": ":6379", - "server2": ":6380", - }, - }) - - mycache := cache.New(&cache.Options{ - Redis: ring, - LocalCache: cache.NewTinyLFU(1000, time.Minute), - }) - - obj := new(Object) - err := mycache.Once(&cache.Item{ - Key: "mykey", - Value: obj, // destination - Do: func(*cache.Item) (interface{}, error) { - return &Object{ - Str: "mystring", - Num: 42, - }, nil - }, - }) - if err != nil { - panic(err) - } - fmt.Println(obj) - // Output: &{mystring 42} -} diff --git a/toolkit/cache/local.go b/toolkit/cache/local.go deleted file mode 100644 index 81f50978..00000000 --- a/toolkit/cache/local.go +++ /dev/null @@ -1,81 +0,0 @@ -package cache - -import ( - "math/rand" - "sync" - "time" - - "github.com/vmihailenco/go-tinylfu" -) - -type LocalCache interface { - Set(key string, data []byte) - Get(key string) ([]byte, bool) - Del(key string) -} - -type TinyLFU struct { - mu sync.Mutex - rand *rand.Rand - lfu *tinylfu.T - ttl time.Duration - offset time.Duration -} - -var _ LocalCache = (*TinyLFU)(nil) - -func NewTinyLFU(size int, ttl time.Duration) *TinyLFU { - const maxOffset = 10 * time.Second - - offset := ttl / 10 - if offset > maxOffset { - offset = maxOffset - } - - return &TinyLFU{ - rand: rand.New(rand.NewSource(time.Now().UnixNano())), - lfu: tinylfu.New(size, 100000), - ttl: ttl, - offset: offset, - } -} - -func (c *TinyLFU) UseRandomizedTTL(offset time.Duration) { - c.offset = offset -} - -func (c *TinyLFU) Set(key string, b []byte) { - c.mu.Lock() - defer c.mu.Unlock() - - ttl := c.ttl - if c.offset > 0 { - ttl += time.Duration(c.rand.Int63n(int64(c.offset))) - } - - c.lfu.Set(&tinylfu.Item{ - Key: key, - Value: b, - ExpireAt: time.Now().Add(ttl), - }) -} - -func (c *TinyLFU) Get(key string) ([]byte, bool) { - c.mu.Lock() - defer c.mu.Unlock() - - val, ok := c.lfu.Get(key) - if !ok { - return nil, false - } - - b := val.([]byte) - return b, true -} - -func (c *TinyLFU) Del(key string) { - c.mu.Lock() - defer c.mu.Unlock() - - c.lfu.Del(key) -} diff --git a/toolkit/cache/local_test.go b/toolkit/cache/local_test.go deleted file mode 100644 index f8dad079..00000000 --- a/toolkit/cache/local_test.go +++ /dev/null @@ -1,56 +0,0 @@ -package cache_test - -import ( - "context" - "fmt" - "math/rand" - "testing" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/cache" -) - -func TestTinyLFU_Get_CorruptionOnExpiry(t *testing.T) { - strFor := func(i int) string { - return fmt.Sprintf("a string %d", i) - } - keyName := func(i int) string { - return fmt.Sprintf("key-%00000d", i) - } - - mycache := cache.NewTinyLFU(1000, 1*time.Second) - size := 50000 - // Put a bunch of stuff in the cache with a TTL of 1 second - for i := 0; i < size; i++ { - key := keyName(i) - mycache.Set(key, []byte(strFor(i))) - } - - // Read stuff for a bit longer than the TTL - that's when the corruption occurs - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - - done := ctx.Done() -loop: - for { - select { - case <-done: - // this is expected - break loop - default: - i := rand.Intn(size) - key := keyName(i) - - b, ok := mycache.Get(key) - if !ok { - continue loop - } - - got := string(b) - expected := strFor(i) - if got != expected { - t.Fatalf("expected=%q got=%q key=%q", expected, got, key) - } - } - } -} diff --git a/toolkit/caches/LICENSE b/toolkit/caches/LICENSE deleted file mode 100644 index ed43104c..00000000 --- a/toolkit/caches/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023-NOW Kristian Tsivkov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/toolkit/caches/README.md b/toolkit/caches/README.md deleted file mode 100644 index be0639a7..00000000 --- a/toolkit/caches/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# Gorm Caches - -Gorm Caches plugin using database request reductions (easer), and response caching mechanism provide you an easy way to optimize database performance. - -## Features - -- Database request reduction. If three identical requests are running at the same time, only the first one is going to be executed, and its response will be returned for all. -- Database response caching. By implementing the Cacher interface, you can easily setup a caching mechanism for your database queries. -- Supports all databases that are supported by gorm itself. - -## Install - -```bash -go get -u github.com/go-gorm/caches/v2 -``` - -## Usage - -Configure the `easer`, and the `cacher`, and then load the plugin to gorm. - -```go -package main - -import ( - "fmt" - "sync" - - "github.com/go-gorm/caches" - "github.com/wubin1989/mysql" - "github.com/wubin1989/gorm" -) - -func main() { - db, _ := gorm.Open( - mysql.Open("DATABASE_DSN"), - &gorm.Config{}, - ) - cachesPlugin := &caches.Caches{Conf: &caches.Config{ - Easer: true, - Cacher: &yourCacherImplementation{}, - }} - _ = db.Use(cachesPlugin) -} -``` - -## Easer Example - -```go -package main - -import ( - "fmt" - "sync" - "time" - - "github.com/go-gorm/caches" - "github.com/wubin1989/mysql" - "github.com/wubin1989/gorm" -) - -type UserRoleModel struct { - gorm.Model - Name string `gorm:"unique"` -} - -type UserModel struct { - gorm.Model - Name string - RoleId uint - Role *UserRoleModel `gorm:"foreignKey:role_id;references:id"` -} - -func main() { - db, _ := gorm.Open( - mysql.Open("DATABASE_DSN"), - &gorm.Config{}, - ) - - cachesPlugin := &caches.Caches{Conf: &caches.Config{ - Easer: true, - }} - - _ = db.Use(cachesPlugin) - - _ = db.AutoMigrate(&UserRoleModel{}) - - _ = db.AutoMigrate(&UserModel{}) - - adminRole := &UserRoleModel{ - Name: "Admin", - } - db.FirstOrCreate(adminRole, "Name = ?", "Admin") - - guestRole := &UserRoleModel{ - Name: "Guest", - } - db.FirstOrCreate(guestRole, "Name = ?", "Guest") - - db.Save(&UserModel{ - Name: "ktsivkov", - Role: adminRole, - }) - db.Save(&UserModel{ - Name: "anonymous", - Role: guestRole, - }) - - var ( - q1Users []UserModel - q2Users []UserModel - ) - wg := &sync.WaitGroup{} - wg.Add(2) - go func() { - db.Model(&UserModel{}).Joins("Role").Find(&q1Users, "Role.Name = ? AND Sleep(1) = false", "Admin") - wg.Done() - }() - go func() { - time.Sleep(500 * time.Millisecond) - db.Model(&UserModel{}).Joins("Role").Find(&q2Users, "Role.Name = ? AND Sleep(1) = false", "Admin") - wg.Done() - }() - wg.Wait() - - fmt.Println(fmt.Sprintf("%+v", q1Users)) - fmt.Println(fmt.Sprintf("%+v", q2Users)) -} -``` - -## Cacher Example - -```go -package main - -import ( - "fmt" - "sync" - - "github.com/go-gorm/caches" - "github.com/wubin1989/mysql" - "github.com/wubin1989/gorm" -) - -type UserRoleModel struct { - gorm.Model - Name string `gorm:"unique"` -} - -type UserModel struct { - gorm.Model - Name string - RoleId uint - Role *UserRoleModel `gorm:"foreignKey:role_id;references:id"` -} - -type dummyCacher struct { - store *sync.Map -} - -func (c *dummyCacher) init() { - if c.store == nil { - c.store = &sync.Map{} - } -} - -func (c *dummyCacher) Get(key string) *caches.Query { - c.init() - val, ok := c.store.Load(key) - if !ok { - return nil - } - - return val.(*caches.Query) -} - -func (c *dummyCacher) Store(key string, val *caches.Query) error { - c.init() - c.store.Store(key, val) - return nil -} - -func main() { - db, _ := gorm.Open( - mysql.Open("DATABASE_DSN"), - &gorm.Config{}, - ) - - cachesPlugin := &caches.Caches{Conf: &caches.Config{ - Cacher: &dummyCacher{}, - }} - - _ = db.Use(cachesPlugin) - - _ = db.AutoMigrate(&UserRoleModel{}) - - _ = db.AutoMigrate(&UserModel{}) - - adminRole := &UserRoleModel{ - Name: "Admin", - } - db.FirstOrCreate(adminRole, "Name = ?", "Admin") - - guestRole := &UserRoleModel{ - Name: "Guest", - } - db.FirstOrCreate(guestRole, "Name = ?", "Guest") - - db.Save(&UserModel{ - Name: "ktsivkov", - Role: adminRole, - }) - db.Save(&UserModel{ - Name: "anonymous", - Role: guestRole, - }) - - var ( - q1Users []UserModel - q2Users []UserModel - ) - - db.Model(&UserModel{}).Joins("Role").Find(&q1Users, "Role.Name = ? AND Sleep(1) = false", "Admin") - fmt.Println(fmt.Sprintf("%+v", q1Users)) - - db.Model(&UserModel{}).Joins("Role").Find(&q2Users, "Role.Name = ? AND Sleep(1) = false", "Admin") - fmt.Println(fmt.Sprintf("%+v", q2Users)) -} -``` - -## License - -MIT license. - -## Easer -The easer is an adjusted version of the [ServantGo](https://github.com/ktsivkov/servantgo) library to fit the needs of this plugin. diff --git a/toolkit/caches/cacher.go b/toolkit/caches/cacher.go deleted file mode 100644 index 44536aba..00000000 --- a/toolkit/caches/cacher.go +++ /dev/null @@ -1,7 +0,0 @@ -package caches - -type Cacher interface { - Get(key string) *Query - Store(key string, val *Query) error - Delete(tag string, tags ...string) error -} diff --git a/toolkit/caches/cacher_test.go b/toolkit/caches/cacher_test.go deleted file mode 100644 index b0d836d0..00000000 --- a/toolkit/caches/cacher_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package caches - -import ( - "errors" - "sync" -) - -type cacherMock struct { - store *sync.Map -} - -func (c *cacherMock) Delete(tag string, tags ...string) error { - //TODO implement me - panic("implement me") -} - -func (c *cacherMock) init() { - if c.store == nil { - c.store = &sync.Map{} - } -} - -func (c *cacherMock) Get(key string) *Query { - c.init() - val, ok := c.store.Load(key) - if !ok { - return nil - } - - return val.(*Query) -} - -func (c *cacherMock) Store(key string, val *Query) error { - c.init() - c.store.Store(key, val) - return nil -} - -type cacherStoreErrorMock struct { - store *sync.Map -} - -func (c *cacherStoreErrorMock) Delete(tag string, tags ...string) error { - //TODO implement me - panic("implement me") -} - -func (c *cacherStoreErrorMock) init() { - if c.store == nil { - c.store = &sync.Map{} - } -} - -func (c *cacherStoreErrorMock) Get(key string) *Query { - c.init() - val, ok := c.store.Load(key) - if !ok { - return nil - } - - return val.(*Query) -} - -func (c *cacherStoreErrorMock) Store(string, *Query) error { - return errors.New("store-error") -} diff --git a/toolkit/caches/caches.go b/toolkit/caches/caches.go deleted file mode 100644 index 0ca787f5..00000000 --- a/toolkit/caches/caches.go +++ /dev/null @@ -1,365 +0,0 @@ -package caches - -import ( - "context" - "fmt" - "strings" - "sync" - - "github.com/auxten/postgresql-parser/pkg/sql/parser" - "github.com/auxten/postgresql-parser/pkg/sql/sem/tree" - "github.com/auxten/postgresql-parser/pkg/walk" - mapset "github.com/deckarep/golang-set/v2" - "github.com/samber/lo" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/wubin1989/gorm" - "github.com/wubin1989/mysql" - "github.com/wubin1989/postgres" - "github.com/xwb1989/sqlparser" -) - -type ctxKey int - -const tablesKey = ctxKey(0) - -func NewTablesContext(ctx context.Context, tables mapset.Set[string]) context.Context { - return context.WithValue(ctx, tablesKey, tables) -} - -func TablesFromContext(ctx context.Context) (mapset.Set[string], bool) { - tables, ok := ctx.Value(tablesKey).(mapset.Set[string]) - return tables, ok -} - -type Caches struct { - Conf *Config - queue *sync.Map -} - -type Config struct { - Easer bool - Cacher Cacher -} - -func (c *Caches) Name() string { - return "gorm:caches" -} - -func (c *Caches) Initialize(db *gorm.DB) error { - if c.Conf == nil { - c.Conf = &Config{ - Easer: false, - Cacher: nil, - } - } - - if c.Conf.Easer { - c.queue = &sync.Map{} - } - - callback := db.Callback().Query().Get("gorm:query") - - err := db.Callback().Query().Replace("gorm:query", c.Query(callback)) - if err != nil { - return err - } - - err = db.Callback().Create().After("gorm:after_create").Register("cache:after_create", c.AfterWrite) - if err != nil { - return err - } - - err = db.Callback().Delete().After("gorm:after_delete").Register("cache:after_delete", c.AfterWrite) - if err != nil { - return err - } - - err = db.Callback().Update().After("gorm:after_update").Register("cache:after_update", c.AfterWrite) - if err != nil { - return err - } - - err = db.Callback().Raw().After("gorm:raw").Register("cache:after_raw", c.AfterWrite) - if err != nil { - return err - } - - // Run sql SHOW default_transaction_isolation; to make sure the transaction isolation level is >= read committed - err = db.Callback().Begin().Register("cache:after_begin", c.AfterBegin) - if err != nil { - return err - } - - err = db.Callback().Commit().Register("cache:after_commit", c.AfterCommit) - if err != nil { - return err - } - - return nil -} - -func (c *Caches) Query(callback func(*gorm.DB)) func(*gorm.DB) { - return func(db *gorm.DB) { - if db.Error != nil { - return - } - - if c.Conf.Easer == false && c.Conf.Cacher == nil { - callback(db) - return - } - - identifier := buildIdentifier(db) - if stringutils.ContainsI(identifier, "INSERT INTO") { - callback(db) - c.AfterWrite(db) - return - } - - if _, ok := db.Statement.ConnPool.(gorm.TxCommitter); ok { - // query from database directly when in transaction - callback(db) - return - } - - if db.DryRun { - return - } - - if res, ok := c.checkCache(identifier); ok { - res.replaceOn(db) - return - } - - c.ease(db, identifier, callback) - if db.Error != nil { - return - } - - c.storeInCache(db, identifier) - if db.Error != nil { - return - } - } -} - -func (c *Caches) AfterWrite(db *gorm.DB) { - if db.Error != nil { - return - } - - if c.Conf.Easer == false && c.Conf.Cacher == nil { - return - } - - tables := getTables(db) - - if len(tables) == 0 { - return - } - - if _, ok := db.Statement.ConnPool.(gorm.TxCommitter); ok { - // query from database directly when in transaction - if value, ok := TablesFromContext(db.Statement.Context); ok { - value.Append(tables...) - } - return - } - - if len(tables) == 1 { - c.deleteCache(db, tables[0]) - } else { - c.deleteCache(db, tables[0], tables[1:]...) - } - - if db.Error != nil { - return - } -} - -func (c *Caches) AfterBegin(db *gorm.DB) { - if db.Error != nil { - return - } - - if c.Conf.Easer == false && c.Conf.Cacher == nil { - return - } - - db.Statement.Context = NewTablesContext(db.Statement.Context, mapset.NewSet[string]()) -} - -func (c *Caches) AfterCommit(db *gorm.DB) { - if db.Error != nil { - return - } - - if c.Conf.Easer == false && c.Conf.Cacher == nil { - return - } - - value, ok := TablesFromContext(db.Statement.Context) - if !ok { - return - } - - tables := value.ToSlice() - - if len(tables) == 0 { - return - } - - if len(tables) == 1 { - c.deleteCache(db, tables[0]) - } else { - c.deleteCache(db, tables[0], tables[1:]...) - } - - if db.Error != nil { - return - } -} - -func (c *Caches) ease(db *gorm.DB, identifier string, callback func(*gorm.DB)) { - if c.Conf.Easer == false { - //if true { - callback(db) - return - } - - res := ease(&queryTask{ - id: identifier, - db: db, - queryCb: callback, - }, c.queue).(*queryTask) - - if db.Error != nil { - return - } - - if res.db.Statement.Dest == db.Statement.Dest { - return - } - - q := Query{ - Dest: res.db.Statement.Dest, - RowsAffected: res.db.Statement.RowsAffected, - } - q.replaceOn(db) -} - -func (c *Caches) checkCache(identifier string) (res *Query, ok bool) { - if c.Conf.Cacher != nil { - if res = c.Conf.Cacher.Get(identifier); res != nil { - return res, true - } - } - return nil, false -} - -func getTables(db *gorm.DB) []string { - switch db.Dialector.(type) { - case *mysql.Dialector: - return getTablesMysql(db) - case *postgres.Dialector: - return getTablesPostgres(db) - } - return nil -} - -func getTablesMysql(db *gorm.DB) []string { - stmt, err := sqlparser.Parse(db.Statement.SQL.String()) - if err != nil { - fmt.Println("Error: " + err.Error()) - } - tableNames := make([]string, 0) - _ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { - switch node := node.(type) { - case sqlparser.TableName: - tableNames = append(tableNames, node.Name.CompliantName()) - } - return true, nil - }, stmt) - tableNames = lo.Filter(tableNames, func(x string, index int) bool { - return stringutils.IsNotEmpty(x) - }) - tableNames = lo.Uniq(tableNames) - return tableNames -} - -func getTablesPostgres(db *gorm.DB) []string { - tableNames := make([]string, 0) - sql := db.Statement.SQL.String() - w := &walk.AstWalker{ - Fn: func(ctx interface{}, node interface{}) (stop bool) { - //log.Printf("%T", node) - switch expr := node.(type) { - case *tree.TableName: - var sb strings.Builder - fmtCtx := tree.NewFmtCtx(tree.FmtSimple) - expr.TableNamePrefix.Format(fmtCtx) - sb.WriteString(fmtCtx.String()) - - if sb.Len() > 0 { - sb.WriteString(".") - } - - fmtCtx = tree.NewFmtCtx(tree.FmtSimple) - expr.TableName.Format(fmtCtx) - sb.WriteString(fmtCtx.String()) - - tableNames = append(tableNames, sb.String()) - case *tree.Insert: - fmtCtx := tree.NewFmtCtx(tree.FmtSimple) - expr.Table.Format(fmtCtx) - tableName := fmtCtx.String() - tableNames = append(tableNames, tableName) - case *tree.Update: - fmtCtx := tree.NewFmtCtx(tree.FmtSimple) - expr.Table.Format(fmtCtx) - tableName := fmtCtx.String() - tableNames = append(tableNames, tableName) - case *tree.Delete: - fmtCtx := tree.NewFmtCtx(tree.FmtSimple) - expr.Table.Format(fmtCtx) - tableName := fmtCtx.String() - tableNames = append(tableNames, tableName) - } - return false - }, - } - stmts, err := parser.Parse(sql) - if err != nil { - return nil - } - _, err = w.Walk(stmts, nil) - if err != nil { - return nil - } - return tableNames -} - -func (c *Caches) storeInCache(db *gorm.DB, identifier string) { - if c.Conf.Cacher != nil { - if _, ok := db.Statement.Dest.(map[string]interface{}); ok { - fmt.Println(db.Statement.Dest) - } - err := c.Conf.Cacher.Store(identifier, &Query{ - Tags: getTables(db), - Dest: db.Statement.Dest, - RowsAffected: db.Statement.RowsAffected, - }) - if err != nil { - _ = db.AddError(err) - } - } -} - -func (c *Caches) deleteCache(db *gorm.DB, tag string, tags ...string) { - if c.Conf.Cacher != nil { - err := c.Conf.Cacher.Delete(tag, tags...) - if err != nil { - _ = db.AddError(err) - } - } -} diff --git a/toolkit/caches/caches_test.go b/toolkit/caches/caches_test.go deleted file mode 100644 index ee14c6fc..00000000 --- a/toolkit/caches/caches_test.go +++ /dev/null @@ -1,423 +0,0 @@ -package caches - -import ( - "fmt" - "github.com/goccy/go-reflect" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/utils/tests" -) - -type mockDest struct { - Result string -} - -func TestCaches_Name(t *testing.T) { - caches := &Caches{ - Conf: &Config{ - Easer: true, - Cacher: nil, - }, - } - expectedName := "gorm:caches" - if act := caches.Name(); act != expectedName { - t.Errorf("Name on caches did not return the expected value, expected: %s, actual: %s", - expectedName, act) - } -} - -func TestCaches_Initialize(t *testing.T) { - t.Run("empty config", func(t *testing.T) { - caches := &Caches{} - db, err := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - if err != nil { - t.Fatalf("gorm initialization resulted into an unexpected error, %s", err.Error()) - } - - originalQueryCb := db.Callback().Query().Get("gorm:query") - - err = db.Use(caches) - if err != nil { - t.Fatalf("gorm:caches loading resulted into an unexpected error, %s", err.Error()) - } - - newQueryCallback := db.Callback().Query().Get("gorm:query") - - if reflect.ValueOf(originalQueryCb).Pointer() == reflect.ValueOf(newQueryCallback).Pointer() { - t.Errorf("loading of gorm:caches, expected to replace the `gorm:query` callback") - } - - if reflect.ValueOf(newQueryCallback).Pointer() != reflect.ValueOf(caches.Query).Pointer() { - t.Errorf("loading of gorm:caches, expected to replace the `gorm:query` callback, with caches.Query") - } - - if reflect.ValueOf(originalQueryCb).Pointer() != reflect.ValueOf(caches.queryCb).Pointer() { - t.Errorf("loading of gorm:caches, expected to load original `gorm:query` callback, to caches.queryCb") - } - }) - t.Run("config - easer", func(t *testing.T) { - caches := &Caches{ - Conf: &Config{ - Easer: true, - Cacher: nil, - }, - } - db, err := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - if err != nil { - t.Fatalf("gorm initialization resulted into an unexpected error, %s", err.Error()) - } - - originalQueryCb := db.Callback().Query().Get("gorm:query") - - err = db.Use(caches) - if err != nil { - t.Fatalf("gorm:caches loading resulted into an unexpected error, %s", err.Error()) - } - - newQueryCallback := db.Callback().Query().Get("gorm:query") - - if reflect.ValueOf(originalQueryCb).Pointer() == reflect.ValueOf(newQueryCallback).Pointer() { - t.Errorf("loading of gorm:caches, expected to replace the `gorm:query` callback") - } - - if reflect.ValueOf(newQueryCallback).Pointer() != reflect.ValueOf(caches.Query).Pointer() { - t.Errorf("loading of gorm:caches, expected to replace the `gorm:query` callback, with caches.Query") - } - - if reflect.ValueOf(originalQueryCb).Pointer() != reflect.ValueOf(caches.queryCb).Pointer() { - t.Errorf("loading of gorm:caches, expected to load original `gorm:query` callback, to caches.queryCb") - } - }) -} - -func TestCaches_Query(t *testing.T) { - t.Run("nothing enabled", func(t *testing.T) { - conf := &Config{ - Easer: false, - Cacher: nil, - } - db, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db.Statement.Dest = &mockDest{} - caches := &Caches{ - Conf: conf, - queryCb: func(db *gorm.DB) { - db.Statement.Dest.(*mockDest).Result = db.Statement.SQL.String() - }, - } - - // Set the query SQL into something specific - exampleQuery := "demo-query" - db.Statement.SQL.WriteString(exampleQuery) - - caches.Query(db) // Execute the query - - if db.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db.Error) - } - - if db.Statement.Dest == nil { - t.Fatal("no query result was set after caches Query was executed") - } - - if res := db.Statement.Dest.(*mockDest); res.Result != exampleQuery { - t.Errorf("the execution of the Query expected a result of `%s`, got `%s`", exampleQuery, res) - } - }) - - t.Run("easer only", func(t *testing.T) { - conf := &Config{ - Easer: true, - Cacher: nil, - } - - t.Run("one query", func(t *testing.T) { - db, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db.Statement.Dest = &mockDest{} - caches := &Caches{ - Conf: conf, - - queue: &sync.Map{}, - queryCb: func(db *gorm.DB) { - db.Statement.Dest.(*mockDest).Result = db.Statement.SQL.String() - }, - } - - // Set the query SQL into something specific - exampleQuery := "demo-query" - db.Statement.SQL.WriteString(exampleQuery) - - caches.Query(db) // Execute the query - - if db.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db.Error) - } - - if db.Statement.Dest == nil { - t.Fatal("no query result was set after caches Query was executed") - } - - if res := db.Statement.Dest.(*mockDest); res.Result != exampleQuery { - t.Errorf("the execution of the Query expected a result of `%s`, got `%s`", exampleQuery, res) - } - }) - - t.Run("two identical queries", func(t *testing.T) { - t.Run("without error", func(t *testing.T) { - var incr int32 - db1, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db1.Statement.Dest = &mockDest{} - db2, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db2.Statement.Dest = &mockDest{} - - caches := &Caches{ - Conf: conf, - - queue: &sync.Map{}, - queryCb: func(db *gorm.DB) { - time.Sleep(1 * time.Second) - atomic.AddInt32(&incr, 1) - - db.Statement.Dest.(*mockDest).Result = fmt.Sprintf("%d", atomic.LoadInt32(&incr)) - }, - } - - // Set the queries' SQL into something specific - exampleQuery := "demo-query" - db1.Statement.SQL.WriteString(exampleQuery) - db2.Statement.SQL.WriteString(exampleQuery) - - wg := &sync.WaitGroup{} - wg.Add(2) - go func() { - caches.Query(db1) // Execute the query - wg.Done() - }() - go func() { - time.Sleep(500 * time.Millisecond) // Execute the second query half a second later - caches.Query(db2) // Execute the query - wg.Done() - }() - wg.Wait() - - if db1.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db1.Error) - } - - if db2.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db2.Error) - } - - if act := atomic.LoadInt32(&incr); act != 1 { - t.Errorf("when executing two identical queries, expected to run %d time, but %d", 1, act) - } - }) - }) - - t.Run("two different queries", func(t *testing.T) { - var incr int32 - db1, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db1.Statement.Dest = &mockDest{} - db2, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db2.Statement.Dest = &mockDest{} - - caches := &Caches{ - Conf: conf, - - queue: &sync.Map{}, - queryCb: func(db *gorm.DB) { - time.Sleep(1 * time.Second) - atomic.AddInt32(&incr, 1) - - db.Statement.Dest.(*mockDest).Result = fmt.Sprintf("%d", atomic.LoadInt32(&incr)) - }, - } - - // Set the queries' SQL into something specific - exampleQuery1 := "demo-query-1" - db1.Statement.SQL.WriteString(exampleQuery1) - exampleQuery2 := "demo-query-2" - db2.Statement.SQL.WriteString(exampleQuery2) - - wg := &sync.WaitGroup{} - wg.Add(2) - go func() { - caches.Query(db1) // Execute the query - wg.Done() - }() - go func() { - time.Sleep(500 * time.Millisecond) // Execute the second query half a second later - caches.Query(db2) // Execute the query - wg.Done() - }() - wg.Wait() - - if db1.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db1.Error) - } - - if db2.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db2.Error) - } - - if act := atomic.LoadInt32(&incr); act != 2 { - t.Errorf("when executing two identical queries, expected to run %d times, but %d", 2, act) - } - }) - }) - - t.Run("cacher only", func(t *testing.T) { - t.Run("one query", func(t *testing.T) { - t.Run("with error", func(t *testing.T) { - db, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db.Statement.Dest = &mockDest{} - - caches := &Caches{ - Conf: &Config{ - Easer: false, - Cacher: &cacherStoreErrorMock{}, - }, - - queue: &sync.Map{}, - queryCb: func(db *gorm.DB) { - db.Statement.Dest.(*mockDest).Result = db.Statement.SQL.String() - }, - } - - // Set the query SQL into something specific - exampleQuery := "demo-query" - db.Statement.SQL.WriteString(exampleQuery) - - caches.Query(db) // Execute the query - - if db.Error == nil { - t.Error("an error was expected, got none") - } - }) - - t.Run("without error", func(t *testing.T) { - db, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db.Statement.Dest = &mockDest{} - - caches := &Caches{ - Conf: &Config{ - Easer: false, - Cacher: &cacherMock{}, - }, - - queue: &sync.Map{}, - queryCb: func(db *gorm.DB) { - db.Statement.Dest.(*mockDest).Result = db.Statement.SQL.String() - }, - } - - // Set the query SQL into something specific - exampleQuery := "demo-query" - db.Statement.SQL.WriteString(exampleQuery) - - caches.Query(db) // Execute the query - - if db.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db.Error) - } - - if db.Statement.Dest == nil { - t.Fatal("no query result was set after caches Query was executed") - } - - if res := db.Statement.Dest.(*mockDest); res.Result != exampleQuery { - t.Errorf("the execution of the Query expected a result of `%s`, got `%s`", exampleQuery, res) - } - }) - }) - - t.Run("two identical queries", func(t *testing.T) { - var incr int32 - db1, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db1.Statement.Dest = &mockDest{} - db2, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db2.Statement.Dest = &mockDest{} - - caches := &Caches{ - Conf: &Config{ - Easer: false, - Cacher: &cacherMock{}, - }, - - queue: &sync.Map{}, - queryCb: func(db *gorm.DB) { - time.Sleep(1 * time.Second) - atomic.AddInt32(&incr, 1) - - db.Statement.Dest.(*mockDest).Result = fmt.Sprintf("%d", atomic.LoadInt32(&incr)) - }, - } - - // Set the queries' SQL into something specific - exampleQuery := "demo-query" - db1.Statement.SQL.WriteString(exampleQuery) - db2.Statement.SQL.WriteString(exampleQuery) - - caches.Query(db1) - caches.Query(db2) - - if db1.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db1.Error) - } - - if db2.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db2.Error) - } - - if act := atomic.LoadInt32(&incr); act != 1 { - t.Errorf("when executing two identical queries, expected to run %d time, but %d", 1, act) - } - }) - - t.Run("two different queries", func(t *testing.T) { - var incr int32 - db1, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db1.Statement.Dest = &mockDest{} - db2, _ := gorm.Open(tests.DummyDialector{}, &gorm.Config{}) - db2.Statement.Dest = &mockDest{} - - caches := &Caches{ - Conf: &Config{ - Easer: false, - Cacher: &cacherMock{}, - }, - - queue: &sync.Map{}, - queryCb: func(db *gorm.DB) { - time.Sleep(1 * time.Second) - atomic.AddInt32(&incr, 1) - - db.Statement.Dest.(*mockDest).Result = fmt.Sprintf("%d", atomic.LoadInt32(&incr)) - }, - } - - // Set the queries' SQL into something specific - exampleQuery1 := "demo-query-1" - db1.Statement.SQL.WriteString(exampleQuery1) - exampleQuery2 := "demo-query-2" - db2.Statement.SQL.WriteString(exampleQuery2) - - caches.Query(db1) - if db1.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db1.Error) - } - - caches.Query(db2) - if db2.Error != nil { - t.Fatalf("an unexpected error has occurred, %v", db2.Error) - } - - if act := atomic.LoadInt32(&incr); act != 2 { - t.Errorf("when executing two identical queries, expected to run %d times, but %d", 2, act) - } - }) - }) -} diff --git a/toolkit/caches/easer.go b/toolkit/caches/easer.go deleted file mode 100644 index b3135442..00000000 --- a/toolkit/caches/easer.go +++ /dev/null @@ -1,30 +0,0 @@ -package caches - -import "sync" - -func ease(t task, queue *sync.Map) task { - eq := &eased{ - task: t, - wg: &sync.WaitGroup{}, - } - eq.wg.Add(1) - - runner, ok := queue.LoadOrStore(t.GetId(), eq) - et := runner.(*eased) - - // If this request is the first of its kind, we execute the Run - if !ok { - et.task.Run() - - queue.Delete(et.task.GetId()) - et.wg.Done() - } - - et.wg.Wait() - return et.task -} - -type eased struct { - task task - wg *sync.WaitGroup -} diff --git a/toolkit/caches/easer_test.go b/toolkit/caches/easer_test.go deleted file mode 100644 index c2b49e53..00000000 --- a/toolkit/caches/easer_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package caches - -import ( - "sync" - "testing" - "time" -) - -func TestEase(t *testing.T) { - t.Run("same queries", func(t *testing.T) { - queue := &sync.Map{} - - myTask := &mockTask{ - delay: 1 * time.Second, - expRes: "expect-this", - id: "unique-id", - } - myDupTask := &mockTask{ - delay: 1 * time.Second, - expRes: "not-this", - id: "unique-id", - } - - wg := &sync.WaitGroup{} - wg.Add(2) - - var ( - myTaskRes *mockTask - myDupTaskRes *mockTask - ) - - // Both queries will run at the same time, the second one will run half a second later - go func() { - myTaskRes = ease(myTask, queue).(*mockTask) - wg.Done() - }() - go func() { - time.Sleep(500 * time.Millisecond) - myDupTaskRes = ease(myDupTask, queue).(*mockTask) - wg.Done() - }() - wg.Wait() - - if myTaskRes.actRes != myTaskRes.expRes { - t.Error("expected first query to be executed") - } - - if myTaskRes.actRes != myDupTaskRes.actRes { - t.Errorf("expected same result from both tasks, expected: %s, actual: %s", - myTaskRes.actRes, myDupTaskRes.actRes) - } - }) - - t.Run("different queries", func(t *testing.T) { - queue := &sync.Map{} - - myTask := &mockTask{ - delay: 1 * time.Second, - expRes: "expect-this", - id: "unique-id", - } - myDupTask := &mockTask{ - delay: 1 * time.Second, - expRes: "not-this", - id: "other-unique-id", - } - - wg := &sync.WaitGroup{} - wg.Add(2) - - var ( - myTaskRes *mockTask - myDupTaskRes *mockTask - ) - - // Both queries will run at the same time, the second one will run half a second later - go func() { - myTaskRes = ease(myTask, queue).(*mockTask) - wg.Done() - }() - go func() { - time.Sleep(500 * time.Millisecond) - myDupTaskRes = ease(myDupTask, queue).(*mockTask) - wg.Done() - }() - wg.Wait() - - if myTaskRes.actRes != myTaskRes.expRes { - t.Errorf("expected first query to be executed, expected: %s, actual: %s", - myTaskRes.actRes, myTaskRes.expRes) - } - - if myTaskRes.actRes == myDupTaskRes.actRes { - t.Errorf("expected different result from both tasks, expected: %s, actual: %s", - myTaskRes.actRes, myDupTaskRes.actRes) - } - - if myDupTaskRes.actRes != myDupTaskRes.expRes { - t.Error("expected second query to be executed") - } - }) -} diff --git a/toolkit/caches/identifier.go b/toolkit/caches/identifier.go deleted file mode 100644 index e85e0253..00000000 --- a/toolkit/caches/identifier.go +++ /dev/null @@ -1,35 +0,0 @@ -package caches - -import ( - "fmt" - "github.com/goccy/go-reflect" - - "github.com/samber/lo" - "github.com/wubin1989/gorm/callbacks" - - "github.com/wubin1989/gorm" -) - -func buildIdentifier(db *gorm.DB) string { - // Build query identifier, - // for that reason we need to compile all arguments into a string - // and concat them with the SQL query itself - - callbacks.BuildQuerySQL(db) - var ( - identifier string - query string - queryArgs string - ) - query = db.Statement.SQL.String() - vars := lo.Map[interface{}, interface{}](db.Statement.Vars, func(item interface{}, index int) interface{} { - if reflect.ValueOf(item).Kind() == reflect.Ptr { - return reflect.ValueOf(item).Elem().Interface() - } - return item - }) - queryArgs = fmt.Sprintf("%v", vars) - identifier = fmt.Sprintf("%s-%s", query, queryArgs) - - return identifier -} diff --git a/toolkit/caches/identifier_test.go b/toolkit/caches/identifier_test.go deleted file mode 100644 index 7d403306..00000000 --- a/toolkit/caches/identifier_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package caches - -import ( - "testing" - - "github.com/wubin1989/gorm" -) - -func Test_buildIdentifier(t *testing.T) { - db := &gorm.DB{} - db.Statement = &gorm.Statement{} - db.Statement.SQL.WriteString("TEST-SQL") - db.Statement.Vars = append(db.Statement.Vars, "test", 123, 12.3, true, false, []string{"test", "me"}) - - actual := buildIdentifier(db) - expected := "TEST-SQL-[test 123 12.3 true false [test me]]" - if actual != expected { - t.Errorf("buildIdentifier expected to return `%s` but got `%s`", expected, actual) - } -} diff --git a/toolkit/caches/query.go b/toolkit/caches/query.go deleted file mode 100644 index ecb9d9fe..00000000 --- a/toolkit/caches/query.go +++ /dev/null @@ -1,14 +0,0 @@ -package caches - -import "github.com/wubin1989/gorm" - -type Query struct { - Tags []string - Dest interface{} - RowsAffected int64 -} - -func (q *Query) replaceOn(db *gorm.DB) { - SetPointedValue(db.Statement.Dest, q.Dest) - SetPointedValue(&db.Statement.RowsAffected, &q.RowsAffected) -} diff --git a/toolkit/caches/query_task.go b/toolkit/caches/query_task.go deleted file mode 100644 index 5a58c7d1..00000000 --- a/toolkit/caches/query_task.go +++ /dev/null @@ -1,17 +0,0 @@ -package caches - -import "github.com/wubin1989/gorm" - -type queryTask struct { - id string - db *gorm.DB - queryCb func(db *gorm.DB) -} - -func (q *queryTask) GetId() string { - return q.id -} - -func (q *queryTask) Run() { - q.queryCb(q.db) -} diff --git a/toolkit/caches/query_task_test.go b/toolkit/caches/query_task_test.go deleted file mode 100644 index b7fabf5a..00000000 --- a/toolkit/caches/query_task_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package caches - -import ( - "sync/atomic" - "testing" - - "github.com/wubin1989/gorm" -) - -func TestQueryTask_GetId(t *testing.T) { - task := &queryTask{ - id: "myId", - db: nil, - queryCb: func(db *gorm.DB) { - }, - } - - if task.GetId() != "myId" { - t.Error("GetId on queryTask returned an unexpected value") - } -} - -func TestQueryTask_Run(t *testing.T) { - var inc int32 - task := &queryTask{ - id: "myId", - db: nil, - queryCb: func(db *gorm.DB) { - atomic.AddInt32(&inc, 1) - }, - } - - task.Run() - - if atomic.LoadInt32(&inc) != 1 { - t.Error("Run on queryTask was expected to execute the callback specified once") - } -} diff --git a/toolkit/caches/reflection.go b/toolkit/caches/reflection.go deleted file mode 100644 index cececda3..00000000 --- a/toolkit/caches/reflection.go +++ /dev/null @@ -1,81 +0,0 @@ -package caches - -import ( - "errors" - "fmt" - "github.com/goccy/go-reflect" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - - "github.com/wubin1989/gorm/schema" -) - -func SetPointedValue(dest interface{}, src interface{}) { - copier.DeepCopy(src, dest) -} - -func deepCopy(src, dst interface{}) error { - srcVal := reflect.ValueOf(src) - dstVal := reflect.ValueOf(dst) - - if srcVal.Kind() == reflect.Ptr { - srcVal = srcVal.Elem() - } - - if srcVal.Type() != dstVal.Elem().Type() { - return errors.New("src and dst must be of the same type") - } - - return copyValue(srcVal, dstVal.Elem()) -} - -func copyValue(src, dst reflect.Value) error { - switch src.Kind() { - case reflect.Ptr: - src = src.Elem() - dst.Set(reflect.New(src.Type())) - err := copyValue(src, dst.Elem()) - if err != nil { - return err - } - - case reflect.Struct: - for i := 0; i < src.NumField(); i++ { - if src.Type().Field(i).PkgPath != "" { - return fmt.Errorf("%w: %+v", schema.ErrUnsupportedDataType, src.Type().Field(i).Name) - } - err := copyValue(src.Field(i), dst.Field(i)) - if err != nil { - return err - } - } - - case reflect.Slice: - newSlice := reflect.MakeSlice(src.Type(), src.Len(), src.Cap()) - for i := 0; i < src.Len(); i++ { - err := copyValue(src.Index(i), newSlice.Index(i)) - if err != nil { - return err - } - } - dst.Set(newSlice) - - case reflect.Map: - newMap := reflect.MakeMapWithSize(src.Type(), src.Len()) - for _, key := range src.MapKeys() { - value := src.MapIndex(key) - newValue := reflect.New(value.Type()).Elem() - err := copyValue(value, newValue) - if err != nil { - return err - } - newMap.SetMapIndex(key, newValue) - } - dst.Set(newMap) - - default: - dst.Set(src) - } - - return nil -} diff --git a/toolkit/caches/reflection_test.go b/toolkit/caches/reflection_test.go deleted file mode 100644 index 9fb726cc..00000000 --- a/toolkit/caches/reflection_test.go +++ /dev/null @@ -1,215 +0,0 @@ -package caches - -import ( - "github.com/goccy/go-reflect" - "testing" -) - -type unsupportedMockStruct struct { - ExportedField string - unexportedField string - ExportedSliceField []string - unexportedSliceField []string - ExportedMapField map[string]string - unexportedMapField map[string]string -} - -type supportedMockStruct struct { - ExportedField string - ExportedSliceField []string - ExportedMapField map[string]string -} - -func Test_SetPointedValue(t *testing.T) { - src := &struct { - Name string - }{ - Name: "Test", - } - - dest := &struct { - Name string - }{} - - SetPointedValue(dest, src) - - if !reflect.DeepEqual(src, dest) { - t.Error("SetPointedValue was expected to point the dest to the source") - } - - if dest.Name != src.Name { - t.Errorf("src and dest were expected to have the same name, src.Name `%s`, dest.Name `%s`", src.Name, dest.Name) - } -} - -func Test_deepCopy(t *testing.T) { - t.Run("struct", func(t *testing.T) { - t.Run("supported", func(t *testing.T) { - srcStruct := supportedMockStruct{ - ExportedField: "exported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - } - dstStruct := supportedMockStruct{} - - if err := deepCopy(srcStruct, &dstStruct); err != nil { - t.Errorf("deepCopy returned an unexpected error %+v", err) - } - - if !reflect.DeepEqual(srcStruct, dstStruct) { - t.Errorf("deepCopy failed to copy structure: got %+v, want %+v", dstStruct, srcStruct) - } - }) - t.Run("unsupported", func(t *testing.T) { - srcStruct := unsupportedMockStruct{ - ExportedField: "exported field", - unexportedField: "unexported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - unexportedSliceField: []string{"1st elem of an unexported slice field", "2nd elem of an unexported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - unexportedMapField: map[string]string{ - "key1": "unexported map elem", - "key2": "unexported map elem", - }, - } - dstStruct := unsupportedMockStruct{} - - if err := deepCopy(srcStruct, &dstStruct); err == nil { - t.Error("deepCopy was expected to fail copying an structure with unexported fields") - } - }) - }) - - t.Run("map", func(t *testing.T) { - t.Run("map[string]string", func(t *testing.T) { - srcMap := map[string]string{ - "key1": "value1", - "key2": "value2", - } - dstMap := make(map[string]string) - - if err := deepCopy(srcMap, &dstMap); err != nil { - t.Errorf("deepCopy returned an unexpected error %+v", err) - } - - if !reflect.DeepEqual(srcMap, dstMap) { - t.Errorf("deepCopy failed to copy map: got %+v, want %+v", dstMap, srcMap) - } - }) - - t.Run("map[string]struct", func(t *testing.T) { - srcMap := map[string]supportedMockStruct{ - "key1": { - ExportedField: "exported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - }, - "key2": { - ExportedField: "exported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - }, - } - dstMap := make(map[string]supportedMockStruct) - - if err := deepCopy(srcMap, &dstMap); err != nil { - t.Errorf("deepCopy returned an unexpected error %+v", err) - } - - if !reflect.DeepEqual(srcMap, dstMap) { - t.Errorf("deepCopy failed to copy map: got %+v, want %+v", dstMap, srcMap) - } - }) - }) - - t.Run("slice", func(t *testing.T) { - t.Run("[]string", func(t *testing.T) { - srcSlice := []string{"A", "B", "C"} - dstSlice := make([]string, len(srcSlice)) - - if err := deepCopy(srcSlice, &dstSlice); err != nil { - t.Errorf("deepCopy returned an unexpected error %+v", err) - } - - if !reflect.DeepEqual(srcSlice, dstSlice) { - t.Errorf("deepCopy failed to copy slice: got %+v, want %+v", dstSlice, srcSlice) - } - }) - t.Run("[]struct", func(t *testing.T) { - srcSlice := []supportedMockStruct{ - { - ExportedField: "exported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - }, { - ExportedField: "exported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - }, { - ExportedField: "exported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - }, - } - dstSlice := make([]supportedMockStruct, len(srcSlice)) - - if err := deepCopy(srcSlice, &dstSlice); err != nil { - t.Errorf("deepCopy returned an unexpected error %+v", err) - } - - if !reflect.DeepEqual(srcSlice, dstSlice) { - t.Errorf("deepCopy failed to copy slice: got %+v, want %+v", dstSlice, srcSlice) - } - }) - }) - - t.Run("pointer", func(t *testing.T) { - srcStruct := &supportedMockStruct{ - ExportedField: "exported field", - ExportedSliceField: []string{"1st elem of an exported slice field", "2nd elem of an exported slice field"}, - ExportedMapField: map[string]string{ - "key1": "exported map elem", - "key2": "exported map elem", - }, - } - dstStruct := &supportedMockStruct{} - - if err := deepCopy(srcStruct, dstStruct); err != nil { - t.Errorf("deepCopy returned an unexpected error %+v", err) - } - - if !reflect.DeepEqual(srcStruct, dstStruct) { - t.Errorf("deepCopy failed to copy structure: got %+v, want %+v", dstStruct, srcStruct) - } - }) - - t.Run("mismatched", func(t *testing.T) { - src := "a string" - dst := 123 - - if err := deepCopy(src, &dst); err == nil { - t.Error("deepCopy did not return an error when provided mismatched types") - } - }) -} diff --git a/toolkit/caches/task.go b/toolkit/caches/task.go deleted file mode 100644 index 2b470ff3..00000000 --- a/toolkit/caches/task.go +++ /dev/null @@ -1,6 +0,0 @@ -package caches - -type task interface { - GetId() string - Run() -} diff --git a/toolkit/caches/task_test.go b/toolkit/caches/task_test.go deleted file mode 100644 index 431a1968..00000000 --- a/toolkit/caches/task_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package caches - -import ( - "time" -) - -type mockTask struct { - delay time.Duration - actRes string - expRes string - id string -} - -func (q *mockTask) GetId() string { - return q.id -} - -func (q *mockTask) Run() { - time.Sleep(q.delay) - q.actRes = q.expRes -} diff --git a/toolkit/caller/caller.go b/toolkit/caller/caller.go deleted file mode 100644 index b3474494..00000000 --- a/toolkit/caller/caller.go +++ /dev/null @@ -1,28 +0,0 @@ -package caller - -import ( - "fmt" - "runtime" -) - -type Caller struct { - Name string - File string - Line int -} - -func (c Caller) String() string { - return fmt.Sprintf("called from %s on %s#%d", c.Name, c.File, c.Line) -} - -func NewCaller() Caller { - var caller Caller - pc, file, line, ok := runtime.Caller(1) - details := runtime.FuncForPC(pc) - if ok && details != nil { - caller.File = file - caller.Line = line - caller.Name = details.Name() - } - return caller -} diff --git a/toolkit/caller/caller_test.go b/toolkit/caller/caller_test.go deleted file mode 100644 index ac535d0d..00000000 --- a/toolkit/caller/caller_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package caller_test - -import ( - "fmt" - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" -) - -func TestCaller_String(t *testing.T) { - c := caller.NewCaller() - fmt.Println(c.String()) -} diff --git a/toolkit/cast/string.go b/toolkit/cast/string.go deleted file mode 100644 index 1fd8a60a..00000000 --- a/toolkit/cast/string.go +++ /dev/null @@ -1,174 +0,0 @@ -package cast - -import ( - "fmt" - "strconv" - - "github.com/pkg/errors" - "github.com/shopspring/decimal" -) - -func ToInt(s string) int { - v, err := strconv.ParseInt(s, 0, 0) - if err == nil { - return int(v) - } - return 0 -} - -func ToIntE(s string) (int, error) { - v, err := strconv.ParseInt(s, 0, 0) - if err == nil { - return int(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to int", s) -} - -func ToInt8E(s string) (int8, error) { - v, err := strconv.ParseInt(s, 0, 8) - if err == nil { - return int8(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to int8", s) -} - -func ToInt16E(s string) (int16, error) { - v, err := strconv.ParseInt(s, 0, 16) - if err == nil { - return int16(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to int16", s) -} - -func ToInt32E(s string) (int32, error) { - v, err := strconv.ParseInt(s, 0, 32) - if err == nil { - return int32(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to int32", s) -} - -func ToInt64E(s string) (int64, error) { - v, err := strconv.ParseInt(s, 0, 64) - if err == nil { - return v, nil - } - return 0, fmt.Errorf("unable to cast string %#v to int64", s) -} - -func ToUintE(s string) (uint, error) { - v, err := strconv.ParseUint(s, 0, 0) - if err == nil { - return uint(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to uint", s) -} - -func ToUint8E(s string) (uint8, error) { - v, err := strconv.ParseUint(s, 0, 8) - if err == nil { - return uint8(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to uint8", s) -} - -func ToUint16E(s string) (uint16, error) { - v, err := strconv.ParseUint(s, 0, 16) - if err == nil { - return uint16(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to uint16", s) -} - -func ToUint32E(s string) (uint32, error) { - v, err := strconv.ParseUint(s, 0, 32) - if err == nil { - return uint32(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to uint32", s) -} - -func ToUint64E(s string) (uint64, error) { - v, err := strconv.ParseUint(s, 0, 64) - if err == nil { - return v, nil - } - return 0, fmt.Errorf("unable to cast string %#v to uint64", s) -} - -func ToFloat32E(s string) (float32, error) { - v, err := strconv.ParseFloat(s, 32) - if err == nil { - return float32(v), nil - } - return 0, fmt.Errorf("unable to cast string %#v to float32", s) -} - -func ToFloat64E(s string) (float64, error) { - v, err := strconv.ParseFloat(s, 64) - if err == nil { - return v, nil - } - return 0, fmt.Errorf("unable to cast string %#v to float64", s) -} - -func ToErrorE(s string) (error, error) { - return errors.New(s), nil -} - -func ToBoolE(s string) (bool, error) { - b, err := strconv.ParseBool(s) - if err == nil { - return b, nil - } - return false, fmt.Errorf("unable to cast string %#v to bool", s) -} - -func ToBoolOrDefault(s string, d bool) bool { - result := d - if eg, err := ToBoolE(s); err == nil { - result = eg - } - return result -} - -func ToIntOrDefault(s string, d int) int { - result := d - if eg, err := ToIntE(s); err == nil { - result = eg - } - return result -} - -func ToInt64OrDefault(s string, d int64) int64 { - result := d - if eg, err := ToInt64E(s); err == nil { - result = eg - } - return result -} - -func ToUInt32OrDefault(s string, d uint32) uint32 { - result := d - if eg, err := ToUint32E(s); err == nil { - result = eg - } - return result -} - -func ToRuneSliceE(s string) ([]rune, error) { - return []rune(s), nil -} - -func ToByteSliceE(s string) ([]byte, error) { - return []byte(s), nil -} - -func ToDecimal(s string) decimal.Decimal { - ret, _ := decimal.NewFromString(s) - return ret -} - -func ToDecimalE(s string) (decimal.Decimal, error) { - return decimal.NewFromString(s) -} diff --git a/toolkit/cast/string_test.go b/toolkit/cast/string_test.go deleted file mode 100644 index 11fe2b8b..00000000 --- a/toolkit/cast/string_test.go +++ /dev/null @@ -1,884 +0,0 @@ -package cast - -import ( - "github.com/goccy/go-reflect" - "testing" - - "github.com/shopspring/decimal" -) - -func TestToInt(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want int - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - }, - { - name: "", - args: args{ - s: "not_int", - }, - want: 0, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ToInt(tt.args.s); got != tt.want { - t.Errorf("ToInt() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToIntE(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want int - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - { - name: "", - args: args{ - s: "", - }, - want: 0, - wantErr: true, - }, - { - name: "", - args: args{ - s: "003", - }, - want: 3, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToIntE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToIntE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToIntE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt8E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want int8 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt8E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt8E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToInt8E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt16E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want int16 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt16E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt16E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToInt16E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt32E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want int32 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt32E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt32E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToInt32E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt64E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want int64 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt64E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt64E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToInt64E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUintE(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want uint - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUintE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUintE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToUintE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint8E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want uint8 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint8E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint8E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToUint8E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint16E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want uint16 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint16E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint16E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToUint16E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint32E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want uint32 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint32E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint32E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToUint32E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint64E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want uint64 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint64E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint64E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToUint64E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToFloat32E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want float32 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21.7812", - }, - want: 21.7812, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToFloat32E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToFloat32E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToFloat32E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToFloat64E(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want float64 - wantErr bool - }{ - { - name: "", - args: args{ - s: "21", - }, - want: 21, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: 0, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToFloat64E(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToFloat64E() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToFloat64E() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToErrorE(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want string - want1 error - }{ - { - name: "", - args: args{ - s: "error", - }, - want: "error", - want1: nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, got1 := ToErrorE(tt.args.s) - if got.Error() != tt.want { - t.Errorf("ToErrorE() got = %v, want %v", got.Error(), tt.want) - } - if !reflect.DeepEqual(got1, tt.want1) { - t.Errorf("ToErrorE() got1 = %v, want %v", got1, tt.want1) - } - }) - } -} - -func TestToBoolE(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want bool - wantErr bool - }{ - { - name: "", - args: args{ - s: "true", - }, - want: true, - wantErr: false, - }, - { - name: "", - args: args{ - s: "21a", - }, - want: false, - wantErr: true, - }, - { - name: "", - args: args{ - s: "", - }, - want: false, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToBoolE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToBoolE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ToBoolE() got = %v, want %v", got, tt.want) - } - }) - } -} - -//func TestToComplex64E(t *testing.T) { -// type args struct { -// s string -// } -// tests := []struct { -// name string -// args args -// want complex64 -// wantErr bool -// }{ -// { -// name: "", -// args: args{ -// s: "21", -// }, -// want: 21, -// wantErr: false, -// }, -// { -// name: "", -// args: args{ -// s: "21a", -// }, -// want: 0, -// wantErr: true, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// got, err := ToComplex64E(tt.args.s) -// if (err != nil) != tt.wantErr { -// t.Errorf("ToComplex64E() error = %v, wantErr %v", err, tt.wantErr) -// return -// } -// if got != tt.want { -// t.Errorf("ToComplex64E() got = %v, want %v", got, tt.want) -// } -// }) -// } -//} - -//func TestToComplex128E(t *testing.T) { -// type args struct { -// s string -// } -// tests := []struct { -// name string -// args args -// want complex128 -// wantErr bool -// }{ -// { -// name: "", -// args: args{ -// s: "21", -// }, -// want: 21, -// wantErr: false, -// }, -// { -// name: "", -// args: args{ -// s: "21a", -// }, -// want: 0, -// wantErr: true, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// got, err := ToComplex128E(tt.args.s) -// if (err != nil) != tt.wantErr { -// t.Errorf("ToComplex128E() error = %v, wantErr %v", err, tt.wantErr) -// return -// } -// if got != tt.want { -// t.Errorf("ToComplex128E() got = %v, want %v", got, tt.want) -// } -// }) -// } -//} - -func TestToRuneSliceE(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want []rune - wantErr bool - }{ - { - name: "", - args: args{ - s: "text", - }, - want: []rune("text"), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToRuneSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToRuneSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToRuneSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToByteSliceE(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want []byte - wantErr bool - }{ - { - name: "", - args: args{ - s: "text", - }, - want: []byte("text"), - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToByteSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToByteSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToByteSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToBoolOrDefault(t *testing.T) { - type args struct { - s string - d bool - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "", - args: args{ - s: "true", - d: false, - }, - want: true, - }, - { - name: "", - args: args{ - s: "21a", - d: true, - }, - want: true, - }, - { - name: "", - args: args{ - s: "", - d: true, - }, - want: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ToBoolOrDefault(tt.args.s, tt.args.d); got != tt.want { - t.Errorf("ToBoolOrDefault() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToIntOrDefault(t *testing.T) { - type args struct { - s string - d int - } - tests := []struct { - name string - args args - want int - }{ - { - name: "", - args: args{ - s: "not_int", - d: 10, - }, - want: 10, - }, - { - name: "", - args: args{ - s: "5", - d: 10, - }, - want: 5, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ToIntOrDefault(tt.args.s, tt.args.d); got != tt.want { - t.Errorf("ToIntOrDefault() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToDecimal(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want decimal.Decimal - }{ - { - name: "", - args: args{ - s: "2.43", - }, - want: decimal.NewFromFloat(2.43), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ToDecimal(tt.args.s); !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToDecimal() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/toolkit/cast/stringslice.go b/toolkit/cast/stringslice.go deleted file mode 100644 index 25ce26ab..00000000 --- a/toolkit/cast/stringslice.go +++ /dev/null @@ -1,300 +0,0 @@ -package cast - -import ( - "fmt" - - "github.com/shopspring/decimal" -) - -func ToIntSliceE(s []string) ([]int, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int", s) - } - var ret []int - for _, item := range s { - i, err := ToIntE(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToInt8SliceE(s []string) ([]int8, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int8", s) - } - var ret []int8 - for _, item := range s { - i, err := ToInt8E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int8 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToInt16SliceE(s []string) ([]int16, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int16", s) - } - var ret []int16 - for _, item := range s { - i, err := ToInt16E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int16 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToInt32SliceE(s []string) ([]int32, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int32", s) - } - var ret []int32 - for _, item := range s { - i, err := ToInt32E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int32 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToInt64SliceE(s []string) ([]int64, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int64", s) - } - var ret []int64 - for _, item := range s { - i, err := ToInt64E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []int64 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToUintSliceE(s []string) ([]uint, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint", s) - } - var ret []uint - for _, item := range s { - i, err := ToUintE(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToUint8SliceE(s []string) ([]uint8, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint8", s) - } - var ret []uint8 - for _, item := range s { - i, err := ToUint8E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint8 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToUint16SliceE(s []string) ([]uint16, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint16", s) - } - var ret []uint16 - for _, item := range s { - i, err := ToUint16E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint16 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToUint32SliceE(s []string) ([]uint32, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint32", s) - } - var ret []uint32 - for _, item := range s { - i, err := ToUint32E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint32 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToUint64SliceE(s []string) ([]uint64, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint64", s) - } - var ret []uint64 - for _, item := range s { - i, err := ToUint64E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []uint64 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToFloat32SliceE(s []string) ([]float32, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []float32", s) - } - var ret []float32 - for _, item := range s { - i, err := ToFloat32E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []float32 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToFloat64SliceE(s []string) ([]float64, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []float64", s) - } - var ret []float64 - for _, item := range s { - i, err := ToFloat64E(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []float64 because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -func ToErrorSliceE(s []string) ([]error, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []error", s) - } - var ret []error - for _, item := range s { - i, _ := ToErrorE(item) - ret = append(ret, i) - } - return ret, nil -} - -func ToBoolSliceE(s []string) ([]bool, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []bool", s) - } - var ret []bool - for _, item := range s { - i, err := ToBoolE(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []bool because of error %s", s, err) - } - ret = append(ret, i) - } - return ret, nil -} - -//func ToComplex64SliceE(s []string) ([]complex64, error) { -// if s == nil { -// return nil, fmt.Errorf("unable to cast string slice %#v to []complex64", s) -// } -// var ret []complex64 -// for _, item := range s { -// i, err := ToComplex64E(item) -// if err != nil { -// return nil, fmt.Errorf("unable to cast string slice %#v to []complex64 because of error %s", s, err) -// } -// ret = append(ret, i) -// } -// return ret, nil -//} -// -//func ToComplex128SliceE(s []string) ([]complex128, error) { -// if s == nil { -// return nil, fmt.Errorf("unable to cast string slice %#v to []complex128", s) -// } -// var ret []complex128 -// for _, item := range s { -// i, err := ToComplex128E(item) -// if err != nil { -// return nil, fmt.Errorf("unable to cast string slice %#v to []complex128 because of error %s", s, err) -// } -// ret = append(ret, i) -// } -// return ret, nil -//} - -func ToRuneSliceSliceE(s []string) ([][]rune, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to [][]rune", s) - } - var ret [][]rune - for _, item := range s { - i, _ := ToRuneSliceE(item) - ret = append(ret, i) - } - return ret, nil -} - -func ToByteSliceSliceE(s []string) ([][]byte, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to [][]byte", s) - } - var ret [][]byte - for _, item := range s { - i, _ := ToByteSliceE(item) - ret = append(ret, i) - } - return ret, nil -} - -func ToInterfaceSliceE(s []string) ([]interface{}, error) { - if s == nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []interface{}", s) - } - var ret []interface{} - for _, item := range s { - ret = append(ret, item) - } - return ret, nil -} - -func ToDecimalSlice(s []string) []decimal.Decimal { - var ret []decimal.Decimal - for _, item := range s { - d, _ := decimal.NewFromString(item) - ret = append(ret, d) - } - return ret -} - -func ToDecimalSliceE(s []string) ([]decimal.Decimal, error) { - var ret []decimal.Decimal - for _, item := range s { - d, err := ToDecimalE(item) - if err != nil { - return nil, fmt.Errorf("unable to cast string slice %#v to []decimal.Decimal because of error %s", s, err) - } - ret = append(ret, d) - } - return ret, nil -} diff --git a/toolkit/cast/stringslice_test.go b/toolkit/cast/stringslice_test.go deleted file mode 100644 index a752c8b2..00000000 --- a/toolkit/cast/stringslice_test.go +++ /dev/null @@ -1,976 +0,0 @@ -package cast - -import ( - "fmt" - "github.com/goccy/go-reflect" - "testing" - - "github.com/shopspring/decimal" -) - -func TestToIntSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []int - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []int{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToIntSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToIntSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToIntSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt8SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []int8 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []int8{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt8SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt8SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToInt8SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt16SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []int16 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []int16{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt16SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt16SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToInt16SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt32SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []int32 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []int32{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt32SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt32SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToInt32SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInt64SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []int64 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []int64{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInt64SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInt64SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToInt64SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUintSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []uint - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []uint{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUintSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUintSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToUintSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint8SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []uint8 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []uint8{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint8SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint8SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToUint8SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint16SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []uint16 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []uint16{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint16SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint16SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToUint16SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint32SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []uint32 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []uint32{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint32SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint32SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToUint32SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToUint64SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []uint64 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3", "4"}, - }, - want: []uint64{2, 3, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToUint64SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToUint64SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToUint64SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToFloat32SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []float32 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3.1314926", "4"}, - }, - want: []float32{2, 3.1314926, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToFloat32SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToFloat32SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToFloat32SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToFloat64SliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []float64 - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"2", "3.1314926", "4"}, - }, - want: []float64{2, 3.1314926, 4}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"2", "3q", "4"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToFloat64SliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToFloat64SliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToFloat64SliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func ExampleToErrorSliceE() { - got, _ := ToErrorSliceE([]string{"test1", "test2"}) - fmt.Println(got) - - //Output: - //[test1 test2] -} - -func TestToBoolSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []bool - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"true", "false"}, - }, - want: []bool{true, false}, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{"T", "fff"}, - }, - want: nil, - wantErr: true, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToBoolSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToBoolSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToBoolSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -//func TestToComplex64SliceE(t *testing.T) { -// type args struct { -// s []string -// } -// tests := []struct { -// name string -// args args -// want []complex64 -// wantErr bool -// }{ -// { -// name: "", -// args: args{ -// s: []string{"2", "3.1314926", "4"}, -// }, -// want: []complex64{2, 3.1314926, 4}, -// wantErr: false, -// }, -// { -// name: "", -// args: args{ -// s: []string{"2", "3q", "4"}, -// }, -// want: nil, -// wantErr: true, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// got, err := ToComplex64SliceE(tt.args.s) -// if (err != nil) != tt.wantErr { -// t.Errorf("ToComplex64SliceE() error = %v, wantErr %v", err, tt.wantErr) -// return -// } -// if !reflect.DeepEqual(got, tt.want) { -// t.Errorf("ToComplex64SliceE() got = %v, want %v", got, tt.want) -// } -// }) -// } -//} - -//func TestToComplex128SliceE(t *testing.T) { -// type args struct { -// s []string -// } -// tests := []struct { -// name string -// args args -// want []complex128 -// wantErr bool -// }{ -// { -// name: "", -// args: args{ -// s: []string{"2", "3.1314926", "4"}, -// }, -// want: []complex128{2, 3.1314926, 4}, -// wantErr: false, -// }, -// { -// name: "", -// args: args{ -// s: []string{"2", "3q", "4"}, -// }, -// want: nil, -// wantErr: true, -// }, -// } -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// got, err := ToComplex128SliceE(tt.args.s) -// if (err != nil) != tt.wantErr { -// t.Errorf("ToComplex128SliceE() error = %v, wantErr %v", err, tt.wantErr) -// return -// } -// if !reflect.DeepEqual(got, tt.want) { -// t.Errorf("ToComplex128SliceE() got = %v, want %v", got, tt.want) -// } -// }) -// } -//} - -func TestToRuneSliceSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want [][]rune - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"test1"}, - }, - want: [][]rune{[]rune("test1")}, - wantErr: false, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToRuneSliceSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToRuneSliceSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToRuneSliceSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToByteSliceSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want [][]byte - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"test1"}, - }, - want: [][]byte{[]byte("test1")}, - wantErr: false, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToByteSliceSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToByteSliceSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToByteSliceSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToInterfaceSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []interface{} - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{"test1"}, - }, - want: []interface{}{"test1"}, - wantErr: false, - }, - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToInterfaceSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToInterfaceSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToInterfaceSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToErrorSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []error - wantErr bool - }{ - { - name: "", - args: args{ - s: nil, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToErrorSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToErrorSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToErrorSliceE() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToDecimalSlice(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []decimal.Decimal - }{ - { - name: "", - args: args{ - s: []string{ - "2.43", - "17.89", - }, - }, - want: []decimal.Decimal{ - decimal.NewFromFloat(2.43), - decimal.NewFromFloat(17.89), - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ToDecimalSlice(tt.args.s); !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToDecimalSlice() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToDecimalSliceE(t *testing.T) { - type args struct { - s []string - } - tests := []struct { - name string - args args - want []decimal.Decimal - wantErr bool - }{ - { - name: "", - args: args{ - s: []string{ - "2.43", - "17.89", - }, - }, - want: []decimal.Decimal{ - decimal.NewFromFloat(2.43), - decimal.NewFromFloat(17.89), - }, - wantErr: false, - }, - { - name: "", - args: args{ - s: []string{ - "2.43", - "17d.89", - }, - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ToDecimalSliceE(tt.args.s) - if (err != nil) != tt.wantErr { - t.Errorf("ToDecimalSliceE() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != nil { - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToDecimalSliceE() got = %v, want %v", got, tt.want) - } - } - }) - } -} diff --git a/toolkit/common/utils.go b/toolkit/common/utils.go deleted file mode 100644 index becbebb6..00000000 --- a/toolkit/common/utils.go +++ /dev/null @@ -1,76 +0,0 @@ -package common - -import ( - "os" - "path/filepath" - "strings" - "text/template" - - "github.com/go-git/go-billy/v5/osfs" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing/cache" - "github.com/go-git/go-git/v5/storage/filesystem" - "github.com/pkg/errors" - "github.com/sirupsen/logrus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" -) - -// InitGitRepo inits git repository. -// Reinitialized existing Git repository is safe -// https://stackoverflow.com/questions/5149694/does-running-git-init-twice-initialize-a-repository-or-reinitialize-an-existing -func InitGitRepo(dir string) { - fs := osfs.New(dir) - dot, _ := fs.Chroot(".git") - storage := filesystem.NewStorage(dot, cache.NewObjectLRUDefault()) - - _, _ = git.Init(storage, fs) -} - -const gitignoreTmpl = `# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Dependency directories (remove the comment below to include it) -# vendor/ -**/*.local -.DS_Store -.idea` - -// GitIgnore adds .gitignore file -func GitIgnore(dir string) { - var ( - gitignorefile string - err error - f *os.File - tpl *template.Template - ) - gitignorefile = filepath.Join(dir, ".gitignore") - if _, err = os.Stat(gitignorefile); os.IsNotExist(err) { - if f, err = os.Create(gitignorefile); err != nil { - panic(err) - } - defer f.Close() - - tpl, _ = template.New(".gitignore.tmpl").Parse(gitignoreTmpl) - _ = tpl.Execute(f, nil) - } else { - logrus.Warnf("file %s already exists", ".gitignore") - } -} - -func GetGoVersionNum(runner executils.Runner) (string, error) { - out, err := runner.Output("go", "version") - if err != nil { - return "", errors.WithStack(err) - } - // go version go1.18.8 darwin/amd64 - result := strings.TrimPrefix(strings.Split(string(out), " ")[2], "go") - // invalid go version '1.18.8': must match format 1.23 - return result[:strings.LastIndex(result, ".")], nil -} diff --git a/toolkit/concurrency/do.go b/toolkit/concurrency/do.go deleted file mode 100644 index 20cc38f8..00000000 --- a/toolkit/concurrency/do.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2020 StackRox Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package concurrency - -import ( - "time" -) - -// DoWithTimeout performs the action as soon as the waitable is done. -// It gives up and returns after timeout, and returns a bool indicating whether -// the action was performed or not. -func DoWithTimeout(w Waitable, action func(), timeout time.Duration) bool { - if WaitWithTimeout(w, timeout) { - action() - return true - } - return false -} diff --git a/toolkit/concurrency/signal.go b/toolkit/concurrency/signal.go deleted file mode 100644 index ec12f4b2..00000000 --- a/toolkit/concurrency/signal.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2020 StackRox Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package concurrency - -import ( - "sync/atomic" - "unsafe" -) - -var ( - closedCh = func() chan struct{} { - ch := make(chan struct{}) - close(ch) - return ch - }() -) - -// Signal implements a signalling facility. Unlike sync.Cond, it is based on channels and can hence be used -// in `select` statements. -// There are two ways to instantiate a Signal. The preferred way is by calling `NewSignal()`, which will return a signal -// that is not triggered. Alternatively, the zero-value can be used to instantiate a signal in triggered condition, -// which is not what you usually want. To reset it to the non-triggered state, call `Reset()`. -// Similarly to `sync.(RW)Mutex` and `sync.Cond`, a signal should not be copied once used. -type Signal struct { - ch unsafe.Pointer // ch is a pointer to the signal channel, or `nil` if the signal is in the triggered state. -} - -// NewSignal creates a new signal that is in the reset state. -func NewSignal() Signal { - var s Signal - s.Reset() - return s -} - -// WaitC returns a WaitableChan for this signal. -func (s *Signal) WaitC() WaitableChan { - chPtr := atomic.LoadPointer(&s.ch) - if chPtr == nil { - return closedCh - } - - ch := (*chan struct{})(chPtr) - return *ch -} - -// Done returns a channel that is closed when this signal was triggered. -func (s *Signal) Done() <-chan struct{} { - return s.WaitC() -} - -// IsDone checks if the signal was triggered. It is a slightly more efficient alternative to calling `IsDone(s)`. -func (s *Signal) IsDone() bool { - chPtr := atomic.LoadPointer(&s.ch) - if chPtr == nil { - return true - } - ch := (*chan struct{})(chPtr) - return IsDone(WaitableChan(*ch)) -} - -// Wait waits for the signal to be triggered. It is a slightly more efficient and convenient alternative to calling -// `Wait(s)`. -func (s *Signal) Wait() { - chPtr := atomic.LoadPointer(&s.ch) - if chPtr == nil { - return - } - ch := (*chan struct{})(chPtr) - Wait(WaitableChan(*ch)) -} - -// Reset resets the signal to the non-triggered state, if necessary. The return value indicates whether a reset was -// actually performed (i.e., the signal was triggered). It returns false if the signal was not in the triggered state. -func (s *Signal) Reset() bool { - ch := make(chan struct{}) - return atomic.CompareAndSwapPointer(&s.ch, nil, unsafe.Pointer(&ch)) -} - -// Signal triggers the signal. The return value indicates whether the signal was actually triggered. It returns false -// if the signal was already in the triggered state. -func (s *Signal) Signal() bool { - chPtr := atomic.SwapPointer(&s.ch, nil) - if chPtr == nil { - return false - } - - ch := (*chan struct{})(chPtr) - close(*ch) - return true -} - -// Snapshot returns a WaitableChan that observers will only see triggering once, i.e., if this signal is triggered (or -// has been triggered) and then `Reset()` is called, subsequent calls to `Done()` on the returned object will still see -// a triggered channel. -func (s *Signal) Snapshot() WaitableChan { - return s.Done() -} - -// SignalWhen triggers this signal when the given trigger condition is satisfied. It returns as soon as either this -// signal is triggered (either by this function or another goroutine), or cancelCond is triggered (in which case the -// signal will not be triggered). -// CAREFUL: This function blocks; if you do not want this, invoke it in a goroutine. -func (s *Signal) SignalWhen(triggerCond Waitable, cancelCond Waitable) bool { - select { - case <-triggerCond.Done(): - return s.Signal() - case <-cancelCond.Done(): - return false - case <-s.Done(): - return false - } -} diff --git a/toolkit/concurrency/signal_test.go b/toolkit/concurrency/signal_test.go deleted file mode 100644 index eba56836..00000000 --- a/toolkit/concurrency/signal_test.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) 2020 StackRox Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package concurrency - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestNewSignalIsNotDone(t *testing.T) { - t.Parallel() - a := assert.New(t) - - s := NewSignal() - a.False(s.IsDone(), "signal should not be triggered") -} - -func TestNewSignalResetHasNoEffect(t *testing.T) { - t.Parallel() - a := assert.New(t) - - s := NewSignal() - wc := s.WaitC() - a.False(s.Reset(), "Reset on a new signal should return false") - a.False(s.IsDone(), "signal should not be triggered") - a.Equal(wc, s.WaitC(), "the channel should not change when reset has no effect") -} - -func TestSignalTrigger(t *testing.T) { - t.Parallel() - a := assert.New(t) - - s := NewSignal() - a.False(s.IsDone(), "signal should not be triggered") - wc := s.WaitC() - - a.True(s.Signal(), "calling signal should return true") - a.True(s.IsDone(), "signal should be triggered") - a.True(IsDone(wc), "the old wait channel should be closed") - - // Test that Signal() can be called repeatedly - a.False(s.Signal(), "calling signal the second time should return false") - a.True(s.IsDone(), "signal should be triggered") -} - -func TestSignalTriggerAndReset(t *testing.T) { - t.Parallel() - a := assert.New(t) - - s := NewSignal() - wc := s.WaitC() - a.True(s.Signal(), "calling signal should return true") - a.True(s.IsDone(), "signal should be triggered") - a.True(IsDone(wc), "old wait channel should be closed") - - a.True(s.Reset(), "calling Reset on a triggered signal should return true") - a.False(s.IsDone(), "signal should not be triggered after reset") - a.True(IsDone(wc), "old wait channel should still be closed") - - a.False(s.Reset(), "calling reset a second time should return false") -} - -func TestSignalDoWithTimeout(t *testing.T) { - t.Parallel() - a := assert.New(t) - - var done bool - action := func() { - done = true - } - - s := NewSignal() - a.False(DoWithTimeout(&s, action, 100*time.Millisecond)) - a.False(done) - go func() { - time.Sleep(10 * time.Millisecond) - s.Signal() - }() - a.True(DoWithTimeout(&s, action, 500*time.Millisecond)) - a.True(done) -} diff --git a/toolkit/concurrency/types.go b/toolkit/concurrency/types.go deleted file mode 100644 index 773772d9..00000000 --- a/toolkit/concurrency/types.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2020 StackRox Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package concurrency - -// Waitable is a generic interface for things that can be waited upon. The method `Done` returns a channel that, when -// closed, signals that whatever condition is represented by this waitable is satisfied. -// Note: The name `Done` was chosen such that `context.Context` conforms to this interface. -type Waitable interface { - Done() <-chan struct{} -} - -// WaitableChan is an alias around a `<-chan struct{}` that returns itself in its `Done` method. -type WaitableChan <-chan struct{} - -// Done returns the channel itself. -func (c WaitableChan) Done() <-chan struct{} { - return c -} diff --git a/toolkit/concurrency/wait.go b/toolkit/concurrency/wait.go deleted file mode 100644 index ac5024b6..00000000 --- a/toolkit/concurrency/wait.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2020 StackRox Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package concurrency - -import "time" - -// Wait waits indefinitely until the condition represented by the given Waitable is fulfilled. -func Wait(w Waitable) { - <-w.Done() -} - -// IsDone checks if the given waitable's condition is fulfilled. -func IsDone(w Waitable) bool { - select { - case <-w.Done(): - return true - default: - return false - } -} - -// WaitWithTimeout waits for the given Waitable with a specified timeout. It returns false if the timeout expired -// before the condition was fulfilled, true otherwise. -func WaitWithTimeout(w Waitable, timeout time.Duration) bool { - if timeout <= 0 { - return IsDone(w) - } - - t := time.NewTimer(timeout) - select { - case <-w.Done(): - if !t.Stop() { - <-t.C - } - return true - case <-t.C: - return false - } -} diff --git a/toolkit/constants/constants.go b/toolkit/constants/constants.go deleted file mode 100644 index 74871d9f..00000000 --- a/toolkit/constants/constants.go +++ /dev/null @@ -1,53 +0,0 @@ -package constants - -// FORMAT is a pattern for formatting time -const FORMAT = "2006-01-02 15:04:05" - -// FORMAT2 is a pattern for formatting time -const FORMAT2 = "2006-01-02" - -// FORMAT3 is a pattern for formatting time -const FORMAT3 = "2006/01/02" - -// FORMATDOT is a pattern for formatting time -const FORMATDOT = "2006.01.02" - -// FORMATENANO is a pattern for formatting time -const FORMATENANO = "2006-01-02T15:04:05.999Z" - -// FORMATES is a pattern for formatting time -const FORMATES = "2006-01-02T15:04:05Z" - -// FORMAT4 is a pattern for formatting time -const FORMAT4 = "2006-01-02 15:04" - -// FORMAT5 is a pattern for formatting time -const FORMAT5 = "2006åđī1月2æ—Ĩ" - -// FORMAT7 is a pattern for formatting time -const FORMAT7 = "2006åđī01月02æ—Ĩ" - -// FORMAT6 is a pattern for formatting time -const FORMAT6 = "2006åđī1月" - -// FORMAT8 is a pattern for formatting time -const FORMAT8 = "2006-01-02T15:04:05-0700" // 2020-07-12T15:31:50+0800 -// FORMAT9 is a pattern for formatting time -const FORMAT9 = "2006åđī01月02æ—Ĩ15æ—ķ04分" // "2019åđī1月04æ—Ĩ09æ—ķ04分" -// FORMAT10 is a pattern for formatting time -const FORMAT10 = "20060102" - -// FORMAT11 is a pattern for formatting time -const FORMAT11 = "20060102150405" - -// FORMAT12 is a pattern for formatting time -const FORMAT12 = "2006/1/2" - -// FORMAT13 is a pattern for formatting time -const FORMAT13 = "06-01-02" - -// FORMAT14 is a pattern for formatting time -const FORMAT14 = "01-02-06" - -// FORMAT15 is a pattern for formatting time -const FORMAT15 = "Mon Jan 2 15:04:05 MST 2006" diff --git a/toolkit/constants/constants_darwin.go b/toolkit/constants/constants_darwin.go deleted file mode 100644 index feef4eac..00000000 --- a/toolkit/constants/constants_darwin.go +++ /dev/null @@ -1,3 +0,0 @@ -package constants - -const LineBreak = "\n" diff --git a/toolkit/constants/constants_linux.go b/toolkit/constants/constants_linux.go deleted file mode 100644 index feef4eac..00000000 --- a/toolkit/constants/constants_linux.go +++ /dev/null @@ -1,3 +0,0 @@ -package constants - -const LineBreak = "\n" diff --git a/toolkit/constants/constants_windows.go b/toolkit/constants/constants_windows.go deleted file mode 100644 index f9a75574..00000000 --- a/toolkit/constants/constants_windows.go +++ /dev/null @@ -1,3 +0,0 @@ -package constants - -const LineBreak = "\r\n" diff --git a/toolkit/copier/copier.go b/toolkit/copier/copier.go deleted file mode 100644 index 664f1dbb..00000000 --- a/toolkit/copier/copier.go +++ /dev/null @@ -1,30 +0,0 @@ -package copier - -import ( - "github.com/bytedance/sonic" - "github.com/bytedance/sonic/decoder" - "github.com/pkg/errors" - "reflect" -) - -var json = sonic.ConfigDefault - -// DeepCopy src to target with json marshal and unmarshal -func DeepCopy(src, target interface{}) error { - if src == nil || target == nil { - return nil - } - if reflect.ValueOf(target).Kind() != reflect.Ptr { - return errors.New("Target should be a pointer") - } - b, err := json.MarshalToString(src) - if err != nil { - return errors.WithStack(err) - } - dec := decoder.NewDecoder(b) - dec.UseInt64() - if err = dec.Decode(target); err != nil { - return errors.WithStack(err) - } - return nil -} diff --git a/toolkit/copier/copier_test.go b/toolkit/copier/copier_test.go deleted file mode 100644 index d1029504..00000000 --- a/toolkit/copier/copier_test.go +++ /dev/null @@ -1,143 +0,0 @@ -package copier - -import ( - "fmt" - "testing" -) - -type Family struct { - Father string - Mather string - Pets map[string]string - Toys []string -} - -type TestStruct struct { - Name string - Age int - Family Family -} - -type FamilyShadow struct { - Father string - Mather string - Pets map[string]string -} - -type TestStructShadow struct { - Name string - Family FamilyShadow -} - -func TestDeepCopy(t *testing.T) { - pets := make(map[string]string) - pets["a"] = "dog" - pets["b"] = "cat" - - family := Family{ - Father: "Jack", - Mather: "Lily", - Pets: pets, - Toys: []string{ - "car", - "lego", - }, - } - src := TestStruct{ - Name: "Rose", - Age: 18, - Family: family, - } - - var target TestStructShadow - - type args struct { - src interface{} - target interface{} - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - args: args{ - src: src, - target: &target, - }, - wantErr: false, - }, - { - args: args{ - src: nil, - target: nil, - }, - wantErr: false, - }, - { - name: "", - args: args{ - src: make(chan string), - target: &target, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := DeepCopy(tt.args.src, tt.args.target); (err != nil) != tt.wantErr { - t.Errorf("DeepCopy() error = %v, wantErr %v", err, tt.wantErr) - } - fmt.Printf("%#v\n", tt.args.target) - }) - } -} - -func TestDeepCopy_ShouldHasError(t *testing.T) { - pets := make(map[string]string) - pets["a"] = "dog" - pets["b"] = "cat" - - family := Family{ - Father: "Jack", - Mather: "Lily", - Pets: pets, - Toys: []string{ - "car", - "lego", - }, - } - src := TestStruct{ - Name: "Rose", - Age: 18, - Family: family, - } - - var target TestStructShadow - - type args struct { - src interface{} - target interface{} - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "TestDeepCopy", - args: args{ - src: src, - target: target, - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := DeepCopy(tt.args.src, tt.args.target); (err != nil) != tt.wantErr { - t.Errorf("DeepCopy() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} diff --git a/toolkit/customtypes/time.go b/toolkit/customtypes/time.go deleted file mode 100644 index c3789a15..00000000 --- a/toolkit/customtypes/time.go +++ /dev/null @@ -1,46 +0,0 @@ -package customtypes - -import ( - "github.com/goccy/go-reflect" - "time" -) - -type Time time.Time - -var TimeLayout = "2006-01-02 15:04:05" - -func (t *Time) UnmarshalJSON(data []byte) (err error) { - if data == nil || len(data) == 0 { - *t = Time(time.Time{}) - return nil - } - if data[0] == '"' && data[len(data)-1] == '"' { - data = data[1 : len(data)-1] - } - if data == nil || len(data) == 0 { - *t = Time(time.Time{}) - return nil - } - if string(data) == "null" { - *t = Time(time.Time{}) - return nil - } - now, err := time.ParseInLocation(TimeLayout, string(data), time.Local) - *t = Time(now) - return -} - -func (t Time) MarshalJSON() ([]byte, error) { - if reflect.ValueOf(t).IsZero() { - return []byte("null"), nil - } - b := make([]byte, 0, len(TimeLayout)+2) - b = append(b, '"') - b = time.Time(t).AppendFormat(b, TimeLayout) - b = append(b, '"') - return b, nil -} - -func (t Time) String() string { - return time.Time(t).Format(TimeLayout) -} diff --git a/toolkit/customtypes/time_test.go b/toolkit/customtypes/time_test.go deleted file mode 100644 index dba417c2..00000000 --- a/toolkit/customtypes/time_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package customtypes - -import ( - "fmt" - "testing" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" -) - -type User struct { - CreatedAt Time `json:"created_at"` -} - -type Author struct { - CreatedAt Time `json:"created_at"` -} - -func TestTime_UnmarshalJSON(t *testing.T) { - u := User{} - fmt.Println(u.CreatedAt) - a := Author{} - copier.DeepCopy(&u, &a) - fmt.Println(a.CreatedAt) -} - -func TestTime_UnmarshalJSON1(t *testing.T) { - u := User{ - CreatedAt: Time(time.Now()), - } - fmt.Println(u.CreatedAt) - a := Author{} - copier.DeepCopy(&u, &a) - fmt.Println(a.CreatedAt) -} diff --git a/toolkit/dotenv/dotenv.go b/toolkit/dotenv/dotenv.go deleted file mode 100644 index dd829ec0..00000000 --- a/toolkit/dotenv/dotenv.go +++ /dev/null @@ -1,32 +0,0 @@ -package dotenv - -import ( - "io" - "os" - "path/filepath" - "strings" - - "github.com/joho/godotenv" -) - -func Load(env string) { - wd, _ := os.Getwd() - _ = godotenv.Load(filepath.Join(wd, ".env."+env+".local")) - if "test" != env { - _ = godotenv.Load(filepath.Join(wd, ".env.local")) - } - _ = godotenv.Load(filepath.Join(wd, ".env."+env)) - _ = godotenv.Load() // The Original .env -} - -func LoadAsMap(reader io.Reader) (map[string]interface{}, error) { - envMap, err := godotenv.Parse(reader) - if err != nil { - return nil, err - } - result := make(map[string]interface{}) - for key, value := range envMap { - result[strings.ToLower(strings.ReplaceAll(key, "_", "."))] = value - } - return result, nil -} diff --git a/toolkit/dotenv/dotenv_test.go b/toolkit/dotenv/dotenv_test.go deleted file mode 100644 index 7dbd8b2d..00000000 --- a/toolkit/dotenv/dotenv_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package dotenv_test - -import ( - "io" - "os" - "testing" - - "github.com/pkg/errors" - "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/dotenv" -) - -func TestLoadAsMap(t *testing.T) { - _ = os.Chdir("testdata") - f, _ := os.Open(".env") - result, err := dotenv.LoadAsMap(f) - require.NoError(t, err) - require.Equal(t, "6060", result["gdd.port"]) - require.Equal(t, "/api", result["gdd.route.root.path"]) -} - -func ErrReader(err error) io.Reader { - return &errReader{err: err} -} - -type errReader struct { - err error -} - -func (r *errReader) Read(p []byte) (int, error) { - return 0, r.err -} - -func TestLoadAsMapError(t *testing.T) { - _, err := dotenv.LoadAsMap(ErrReader(errors.New("test error"))) - require.Error(t, err) -} - -func TestLoad(t *testing.T) { - _ = os.Chdir("testdata") - dotenv.Load("") - require.Equal(t, "6060", os.Getenv("GDD_PORT")) - require.Equal(t, "/api", os.Getenv("GDD_ROUTE_ROOT_PATH")) -} diff --git a/toolkit/dotenv/testdata/.env b/toolkit/dotenv/testdata/.env deleted file mode 100644 index 891c52be..00000000 --- a/toolkit/dotenv/testdata/.env +++ /dev/null @@ -1,2 +0,0 @@ -GDD_PORT=6060 -GDD_ROUTE_ROOT_PATH=/api \ No newline at end of file diff --git a/toolkit/envconfig/LICENSE b/toolkit/envconfig/LICENSE deleted file mode 100644 index 4bfa7a84..00000000 --- a/toolkit/envconfig/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2013 Kelsey Hightower - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/toolkit/envconfig/README.md b/toolkit/envconfig/README.md deleted file mode 100644 index 3446d2fe..00000000 --- a/toolkit/envconfig/README.md +++ /dev/null @@ -1,231 +0,0 @@ -# envconfig - -[![Build Status](https://travis-ci.org/kelseyhightower/envconfig.svg)](https://travis-ci.org/kelseyhightower/envconfig) - -```Go -import "github.com/kelseyhightower/envconfig" -``` - -## Documentation - -See [godoc](http://godoc.org/github.com/kelseyhightower/envconfig) - -## Usage - -Set some environment variables: - -```Bash -export MYAPP_DEBUG=false -export MYAPP_PORT=8080 -export MYAPP_USER=Kelsey -export MYAPP_RATE="0.5" -export MYAPP_TIMEOUT="3m" -export MYAPP_USERS="rob,ken,robert" -export MYAPP_COLORCODES="red:1,green:2,blue:3" -``` - -Write some code: - -```Go -package main - -import ( - "fmt" - "log" - "time" - - "github.com/kelseyhightower/envconfig" -) - -type Specification struct { - Debug bool - Port int - User string - Users []string - Rate float32 - Timeout time.Duration - ColorCodes map[string]int -} - -func main() { - var s Specification - err := envconfig.Process("myapp", &s) - if err != nil { - log.Fatal(err.Error()) - } - format := "Debug: %v\nPort: %d\nUser: %s\nRate: %f\nTimeout: %s\n" - _, err = fmt.Printf(format, s.Debug, s.Port, s.User, s.Rate, s.Timeout) - if err != nil { - log.Fatal(err.Error()) - } - - fmt.Println("Users:") - for _, u := range s.Users { - fmt.Printf(" %s\n", u) - } - - fmt.Println("Color codes:") - for k, v := range s.ColorCodes { - fmt.Printf(" %s: %d\n", k, v) - } -} -``` - -Results: - -```Bash -Debug: false -Port: 8080 -User: Kelsey -Rate: 0.500000 -Timeout: 3m0s -Users: - rob - ken - robert -Color codes: - red: 1 - green: 2 - blue: 3 -``` - -## Struct Tag Support - -Envconfig supports the use of struct tags to specify alternate, default, and required -environment variables. - -For example, consider the following struct: - -```Go -type Specification struct { - ManualOverride1 string `envconfig:"manual_override_1"` - DefaultVar string `default:"foobar"` - RequiredVar string `required:"true"` - IgnoredVar string `ignored:"true"` - AutoSplitVar string `split_words:"true"` - RequiredAndAutoSplitVar string `required:"true" split_words:"true"` -} -``` - -Envconfig has automatic support for CamelCased struct elements when the -`split_words:"true"` tag is supplied. Without this tag, `AutoSplitVar` above -would look for an environment variable called `MYAPP_AUTOSPLITVAR`. With the -setting applied it will look for `MYAPP_AUTO_SPLIT_VAR`. Note that numbers -will get globbed into the previous word. If the setting does not do the -right thing, you may use a manual override. - -Envconfig will process value for `ManualOverride1` by populating it with the -value for `MYAPP_MANUAL_OVERRIDE_1`. Without this struct tag, it would have -instead looked up `MYAPP_MANUALOVERRIDE1`. With the `split_words:"true"` tag -it would have looked up `MYAPP_MANUAL_OVERRIDE1`. - -```Bash -export MYAPP_MANUAL_OVERRIDE_1="this will be the value" - -# export MYAPP_MANUALOVERRIDE1="and this will not" -``` - -If envconfig can't find an environment variable value for `MYAPP_DEFAULTVAR`, -it will populate it with "foobar" as a default value. - -If envconfig can't find an environment variable value for `MYAPP_REQUIREDVAR`, -it will return an error when asked to process the struct. If -`MYAPP_REQUIREDVAR` is present but empty, envconfig will not return an error. - -If envconfig can't find an environment variable in the form `PREFIX_MYVAR`, and there -is a struct tag defined, it will try to populate your variable with an environment -variable that directly matches the envconfig tag in your struct definition: - -```shell -export SERVICE_HOST=127.0.0.1 -export MYAPP_DEBUG=true -``` -```Go -type Specification struct { - ServiceHost string `envconfig:"SERVICE_HOST"` - Debug bool -} -``` - -Envconfig won't process a field with the "ignored" tag set to "true", even if a corresponding -environment variable is set. - -## Supported Struct Field Types - -envconfig supports these struct field types: - - * string - * int8, int16, int32, int64 - * bool - * float32, float64 - * slices of any supported type - * maps (keys and values of any supported type) - * [encoding.TextUnmarshaler](https://golang.org/pkg/encoding/#TextUnmarshaler) - * [encoding.BinaryUnmarshaler](https://golang.org/pkg/encoding/#BinaryUnmarshaler) - * [time.Duration](https://golang.org/pkg/time/#Duration) - -Embedded structs using these fields are also supported. - -## Custom Decoders - -Any field whose type (or pointer-to-type) implements `envconfig.Decoder` can -control its own deserialization: - -```Bash -export DNS_SERVER=8.8.8.8 -``` - -```Go -type IPDecoder net.IP - -func (ipd *IPDecoder) Decode(value string) error { - *ipd = IPDecoder(net.ParseIP(value)) - return nil -} - -type DNSConfig struct { - Address IPDecoder `envconfig:"DNS_SERVER"` -} -``` - -Example for decoding the environment variables into map[string][]structName type - -```Bash -export SMS_PROVIDER_WITH_WEIGHT= `IND=[{"name":"SMSProvider1","weight":70},{"name":"SMSProvider2","weight":30}];US=[{"name":"SMSProvider1","weight":100}]` -``` - -```GO -type providerDetails struct { - Name string - Weight int -} - -type SMSProviderDecoder map[string][]providerDetails - -func (sd *SMSProviderDecoder) Decode(value string) error { - smsProvider := map[string][]providerDetails{} - pairs := strings.Split(value, ";") - for _, pair := range pairs { - providerdata := []providerDetails{} - kvpair := strings.Split(pair, "=") - if len(kvpair) != 2 { - return fmt.Errorf("invalid map item: %q", pair) - } - err := json.Unmarshal([]byte(kvpair[1]), &providerdata) - if err != nil { - return fmt.Errorf("invalid map json: %w", err) - } - smsProvider[kvpair[0]] = providerdata - - } - *sd = SMSProviderDecoder(smsProvider) - return nil -} - -type SMSProviderConfig struct { - ProviderWithWeight SMSProviderDecoder `envconfig:"SMS_PROVIDER_WITH_WEIGHT"` -} -``` - -Also, envconfig will use a `Set(string) error` method like from the -[flag.Value](https://godoc.org/flag#Value) interface if implemented. diff --git a/toolkit/envconfig/doc.go b/toolkit/envconfig/doc.go deleted file mode 100644 index f28561cd..00000000 --- a/toolkit/envconfig/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2013 Kelsey Hightower. All rights reserved. -// Use of this source code is governed by the MIT License that can be found in -// the LICENSE file. - -// Package envconfig implements decoding of environment variables based on a user -// defined specification. A typical use is using environment variables for -// configuration settings. -package envconfig diff --git a/toolkit/envconfig/env_os.go b/toolkit/envconfig/env_os.go deleted file mode 100644 index 6b85e3f5..00000000 --- a/toolkit/envconfig/env_os.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build appengine || go1.5 -// +build appengine go1.5 - -package envconfig - -import "os" - -var lookupEnv = os.LookupEnv diff --git a/toolkit/envconfig/env_syscall.go b/toolkit/envconfig/env_syscall.go deleted file mode 100644 index 221ff7fa..00000000 --- a/toolkit/envconfig/env_syscall.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build !appengine && !go1.5 -// +build !appengine,!go1.5 - -package envconfig - -import "syscall" - -var lookupEnv = syscall.Getenv diff --git a/toolkit/envconfig/envconfig.go b/toolkit/envconfig/envconfig.go deleted file mode 100644 index a1580f55..00000000 --- a/toolkit/envconfig/envconfig.go +++ /dev/null @@ -1,592 +0,0 @@ -// Copyright (c) 2013 Kelsey Hightower. All rights reserved. -// Use of this source code is governed by the MIT License that can be found in -// the LICENSE file. - -package envconfig - -import ( - "encoding" - "fmt" - "math" - "os" - "reflect" - "regexp" - "strconv" - "strings" - "time" - - "github.com/pkg/errors" -) - -// ErrInvalidSpecification indicates that a specification is of the wrong type. -var ErrInvalidSpecification = errors.New("specification must be a struct pointer") - -var gatherRegexp = regexp.MustCompile("([^A-Z]+|[A-Z]+[^A-Z]+|[A-Z]+)") -var acronymRegexp = regexp.MustCompile("([A-Z]+)([A-Z][^A-Z]+)") - -// A ParseError occurs when an environment variable cannot be converted to -// the type required by a struct field during assignment. -type ParseError struct { - KeyName string - FieldName string - TypeName string - Value string - Err error -} - -// Decoder has the same semantics as Setter, but takes higher precedence. -// It is provided for historical compatibility. -type Decoder interface { - Decode(value string) error -} - -// Setter is implemented by types can self-deserialize values. -// Any type that implements flag.Value also implements Setter. -type Setter interface { - Set(value string) error -} - -func (e *ParseError) Error() string { - return fmt.Sprintf("envconfig.Process: assigning %[1]s to %[2]s: converting '%[3]s' to type %[4]s. details: %+v", e.KeyName, e.FieldName, e.Value, e.TypeName, e.Err) -} - -type SeparatorType string - -const ( - INDEX SeparatorType = "index" - COMMA SeparatorType = "comma" -) - -// varInfo maintains information about the configuration variable -type varInfo struct { - Name string - Alt string - Key string - Field reflect.Value - Tags reflect.StructTag - ValuesBy SeparatorType -} - -// GatherInfo gathers information about the specified struct -func gatherInfo(prefix string, spec interface{}) ([]varInfo, error) { - s := reflect.ValueOf(spec) - - if s.Kind() != reflect.Ptr { - return nil, ErrInvalidSpecification - } - s = s.Elem() - if s.Kind() != reflect.Struct { - return nil, ErrInvalidSpecification - } - typeOfSpec := s.Type() - - // over allocate an info array, we will extend if needed later - infos := make([]varInfo, 0, s.NumField()) - for i := 0; i < s.NumField(); i++ { - f := s.Field(i) - ftype := typeOfSpec.Field(i) - if !f.CanSet() || isTrue(ftype.Tag.Get("ignored")) { - continue - } - - for f.Kind() == reflect.Ptr { - if f.IsNil() { - if f.Type().Elem().Kind() != reflect.Struct { - // nil pointer to a non-struct: leave it alone - break - } - // nil pointer to struct: create a zero instance - f.Set(reflect.New(f.Type().Elem())) - } - f = f.Elem() - } - - // Capture information about the config variable - info := varInfo{ - Name: ftype.Name, - Field: f, - Tags: ftype.Tag, - Alt: strings.ToUpper(ftype.Tag.Get("envconfig")), - } - - // Default to the field name as the env var name (will be upcased) - info.Key = info.Name - - // Best effort to un-pick camel casing as separate words - if isTrue(ftype.Tag.Get("split_words")) { - words := gatherRegexp.FindAllStringSubmatch(ftype.Name, -1) - if len(words) > 0 { - var name []string - for _, words := range words { - if m := acronymRegexp.FindStringSubmatch(words[0]); len(m) == 3 { - name = append(name, m[1], m[2]) - } else { - name = append(name, words[0]) - } - } - - info.Key = strings.Join(name, "_") - } - } - if info.Alt != "" { - info.Key = info.Alt - } - if prefix != "" { - info.Key = fmt.Sprintf("%s_%s", prefix, info.Key) - } - info.Key = strings.ToUpper(info.Key) - info.ValuesBy = SeparatorType(ftype.Tag.Get("values_by")) - - infos = append(infos, info) - - if f.Kind() == reflect.Struct { - // honor Decode if present - if decoderFrom(f) == nil && setterFrom(f) == nil && textUnmarshaler(f) == nil && binaryUnmarshaler(f) == nil { - innerPrefix := prefix - if !ftype.Anonymous { - innerPrefix = info.Key - } - - embeddedPtr := f.Addr().Interface() - embeddedInfos, err := gatherInfo(innerPrefix, embeddedPtr) - if err != nil { - return nil, err - } - infos = append(infos[:len(infos)-1], embeddedInfos...) - - continue - } - } - } - return infos, nil -} - -// CheckDisallowed checks that no environment variables with the prefix are set -// that we don't know how or want to parse. This is likely only meaningful with -// a non-empty prefix. -func CheckDisallowed(prefix string, spec interface{}) error { - infos, err := gatherInfo(prefix, spec) - if err != nil { - return err - } - - vars := make(map[string]struct{}) - for _, info := range infos { - vars[info.Key] = struct{}{} - } - - if prefix != "" { - prefix = strings.ToUpper(prefix) + "_" - } - - for _, env := range os.Environ() { - if !strings.HasPrefix(env, prefix) { - continue - } - v := strings.SplitN(env, "=", 2)[0] - if _, found := vars[v]; !found { - return fmt.Errorf("unknown environment variable %s", v) - } - } - - return nil -} - -// Process populates the specified struct based on environment variables -func Process(prefix string, spec interface{}) error { - infos, err := gatherInfo(prefix, spec) - - for _, info := range infos { - - if info.ValuesBy == INDEX { - index := 0 - end := false - for !end { - key := info.Key + "_" + strconv.Itoa(index) - if end, err = doProcess(key, info); err != nil { - return errors.WithStack(err) - } - index++ - } - if info.Field.IsNil() || info.Field.IsZero() { - if err = checkRequired(info); err != nil { - return errors.WithStack(err) - } - def := info.Tags.Get("default") - if def != "" { - err = processFieldWithConfig(def, info.Field, ProcessConfig{ - ValuesBy: info.ValuesBy, - }) - } - } - continue - } - - if _, err = doProcess(info.Key, info); err != nil { - return errors.WithStack(err) - } - } - - return err -} - -func checkRequired(info varInfo) error { - def := info.Tags.Get("default") - req := info.Tags.Get("required") - if def == "" { - if isTrue(req) { - key := info.Key - if info.Alt != "" { - key = info.Alt - } - return fmt.Errorf("required key %s missing value", key) - } - } - return nil -} - -func doProcess(key string, info varInfo) (end bool, err error) { - // `os.Getenv` cannot differentiate between an explicitly set empty value - // and an unset value. `os.LookupEnv` is preferred to `syscall.Getenv`, - // but it is only available in go1.5 or newer. We're using Go build tags - // here to use os.LookupEnv for >=go1.5 - value, ok := lookupEnv(key) - - if info.ValuesBy == INDEX && !ok { - return true, nil - } - - if !ok && info.Alt != "" { - value, ok = lookupEnv(info.Alt) - } - - if info.ValuesBy != INDEX { - if !ok { - if err = checkRequired(info); err != nil { - return false, errors.WithStack(err) - } - def := info.Tags.Get("default") - if def == "" { - return false, nil - } - value = def - } - } - - err = processFieldWithConfig(value, info.Field, ProcessConfig{ - ValuesBy: info.ValuesBy, - }) - if err != nil { - return false, &ParseError{ - KeyName: info.Key, - FieldName: info.Name, - TypeName: info.Field.Type().String(), - Value: value, - Err: errors.WithStack(err), - } - } - - return false, nil -} - -// MustProcess is the same as Process but panics if an error occurs -func MustProcess(prefix string, spec interface{}) { - if err := Process(prefix, spec); err != nil { - panic(err) - } -} - -func processField(value string, field reflect.Value) error { - typ := field.Type() - - decoder := decoderFrom(field) - if decoder != nil { - return decoder.Decode(value) - } - // look for Set method if Decode not defined - setter := setterFrom(field) - if setter != nil { - return setter.Set(value) - } - - if t := textUnmarshaler(field); t != nil { - return t.UnmarshalText([]byte(value)) - } - - if b := binaryUnmarshaler(field); b != nil { - return b.UnmarshalBinary([]byte(value)) - } - - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - if field.IsNil() { - field.Set(reflect.New(typ)) - } - field = field.Elem() - } - - switch typ.Kind() { - case reflect.String: - field.SetString(value) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - var ( - val int64 - err error - ) - if field.Kind() == reflect.Int64 && typ.PkgPath() == "time" && typ.Name() == "Duration" { - var d time.Duration - d, err = time.ParseDuration(value) - val = int64(d) - } else { - val, err = strconv.ParseInt(value, 0, typ.Bits()) - } - if err != nil { - return err - } - - field.SetInt(val) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - val, err := strconv.ParseUint(value, 0, typ.Bits()) - if err != nil { - return err - } - field.SetUint(val) - case reflect.Bool: - val, err := strconv.ParseBool(value) - if err != nil { - return err - } - field.SetBool(val) - case reflect.Float32, reflect.Float64: - val, err := strconv.ParseFloat(value, typ.Bits()) - if err != nil { - return err - } - field.SetFloat(val) - case reflect.Slice: - sl := reflect.MakeSlice(typ, 0, 0) - if typ.Elem().Kind() == reflect.Uint8 { - sl = reflect.ValueOf([]byte(value)) - } else if strings.TrimSpace(value) != "" { - vals := strings.Split(value, ",") - sl = reflect.MakeSlice(typ, len(vals), len(vals)) - for i, val := range vals { - err := processField(val, sl.Index(i)) - if err != nil { - return err - } - } - } - field.Set(sl) - case reflect.Map: - mp := reflect.MakeMap(typ) - if strings.TrimSpace(value) != "" { - pairs := strings.Split(value, ",") - for _, pair := range pairs { - kvpair := strings.Split(pair, ":") - if len(kvpair) != 2 { - return fmt.Errorf("invalid map item: %q", pair) - } - k := reflect.New(typ.Key()).Elem() - err := processField(kvpair[0], k) - if err != nil { - return err - } - v := reflect.New(typ.Elem()).Elem() - err = processField(kvpair[1], v) - if err != nil { - return err - } - mp.SetMapIndex(k, v) - } - } - field.Set(mp) - } - - return nil -} - -type ProcessConfig struct { - ValuesBy SeparatorType -} - -const ( - CAP_GROW_STEP = 8 -) - -func processFieldWithConfig(value string, field reflect.Value, config ProcessConfig) error { - typ := field.Type() - - decoder := decoderFrom(field) - if decoder != nil { - return decoder.Decode(value) - } - // look for Set method if Decode not defined - setter := setterFrom(field) - if setter != nil { - return setter.Set(value) - } - - if t := textUnmarshaler(field); t != nil { - return t.UnmarshalText([]byte(value)) - } - - if b := binaryUnmarshaler(field); b != nil { - return b.UnmarshalBinary([]byte(value)) - } - - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - if field.IsNil() { - field.Set(reflect.New(typ)) - } - field = field.Elem() - } - - switch typ.Kind() { - case reflect.String: - field.SetString(value) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - var ( - val int64 - err error - ) - if field.Kind() == reflect.Int64 && typ.PkgPath() == "time" && typ.Name() == "Duration" { - var d time.Duration - d, err = time.ParseDuration(value) - val = int64(d) - } else { - val, err = strconv.ParseInt(value, 0, typ.Bits()) - } - if err != nil { - return errors.WithStack(err) - } - - field.SetInt(val) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - val, err := strconv.ParseUint(value, 0, typ.Bits()) - if err != nil { - return errors.WithStack(err) - } - field.SetUint(val) - case reflect.Bool: - val, err := strconv.ParseBool(value) - if err != nil { - return errors.WithStack(err) - } - field.SetBool(val) - case reflect.Float32, reflect.Float64: - val, err := strconv.ParseFloat(value, typ.Bits()) - if err != nil { - return errors.WithStack(err) - } - field.SetFloat(val) - case reflect.Slice: - if config.ValuesBy == INDEX { - if field.IsNil() || field.IsZero() { - sl := reflect.MakeSlice(typ, 0, 0) - if typ.Elem().Kind() == reflect.Uint8 { - return errors.WithStack(errors.New("Not support uint8 slice field to be processed with index values_by tag")) - } else if strings.TrimSpace(value) != "" { - sl = reflect.MakeSlice(typ, 1, CAP_GROW_STEP) - err := processFieldWithConfig(value, sl.Index(0), config) - if err != nil { - return errors.WithStack(err) - } - } - field.Set(sl) - } else { - size := field.Len() - if size >= int(math.Floor(float64(field.Cap())*0.75)) { - field.Grow(CAP_GROW_STEP) - } - field.SetLen(size + 1) - if typ.Elem().Kind() == reflect.Uint8 { - return errors.WithStack(errors.New("Not support uint8 slice field to be processed with index values_by tag")) - } else if strings.TrimSpace(value) != "" { - err := processFieldWithConfig(value, field.Index(size), config) - if err != nil { - return errors.WithStack(err) - } - } - } - } else { - sl := reflect.MakeSlice(typ, 0, 0) - if typ.Elem().Kind() == reflect.Uint8 { - sl = reflect.ValueOf([]byte(value)) - } else if strings.TrimSpace(value) != "" { - vals := strings.Split(value, ",") - sl = reflect.MakeSlice(typ, len(vals), len(vals)) - for i, val := range vals { - err := processFieldWithConfig(val, sl.Index(i), config) - if err != nil { - return errors.WithStack(err) - } - } - } - field.Set(sl) - } - case reflect.Map: - mp := reflect.MakeMap(typ) - if strings.TrimSpace(value) != "" { - pairs := strings.Split(value, ",") - for _, pair := range pairs { - kvpair := strings.Split(pair, ":") - if len(kvpair) != 2 { - return fmt.Errorf("invalid map item: %q", pair) - } - k := reflect.New(typ.Key()).Elem() - err := processFieldWithConfig(kvpair[0], k, config) - if err != nil { - return errors.WithStack(err) - } - v := reflect.New(typ.Elem()).Elem() - err = processFieldWithConfig(kvpair[1], v, config) - if err != nil { - return errors.WithStack(err) - } - mp.SetMapIndex(k, v) - } - } - field.Set(mp) - } - - return nil -} - -func interfaceFrom(field reflect.Value, fn func(interface{}, *bool)) { - // it may be impossible for a struct field to fail this check - if !field.CanInterface() { - return - } - var ok bool - fn(field.Interface(), &ok) - if !ok && field.CanAddr() { - fn(field.Addr().Interface(), &ok) - } -} - -func decoderFrom(field reflect.Value) (d Decoder) { - interfaceFrom(field, func(v interface{}, ok *bool) { d, *ok = v.(Decoder) }) - return d -} - -func setterFrom(field reflect.Value) (s Setter) { - interfaceFrom(field, func(v interface{}, ok *bool) { s, *ok = v.(Setter) }) - return s -} - -func textUnmarshaler(field reflect.Value) (t encoding.TextUnmarshaler) { - interfaceFrom(field, func(v interface{}, ok *bool) { t, *ok = v.(encoding.TextUnmarshaler) }) - return t -} - -func binaryUnmarshaler(field reflect.Value) (b encoding.BinaryUnmarshaler) { - interfaceFrom(field, func(v interface{}, ok *bool) { b, *ok = v.(encoding.BinaryUnmarshaler) }) - return b -} - -func isTrue(s string) bool { - b, _ := strconv.ParseBool(s) - return b -} diff --git a/toolkit/envconfig/envconfig_1.8_test.go b/toolkit/envconfig/envconfig_1.8_test.go deleted file mode 100644 index 0ef0790f..00000000 --- a/toolkit/envconfig/envconfig_1.8_test.go +++ /dev/null @@ -1,69 +0,0 @@ -//go:build go1.8 -// +build go1.8 - -package envconfig - -import ( - "errors" - "net/url" - "os" - "testing" -) - -type SpecWithURL struct { - UrlValue url.URL - UrlPointer *url.URL -} - -func TestParseURL(t *testing.T) { - var s SpecWithURL - - os.Clearenv() - os.Setenv("ENV_CONFIG_URLVALUE", "https://github.com/kelseyhightower/envconfig") - os.Setenv("ENV_CONFIG_URLPOINTER", "https://github.com/kelseyhightower/envconfig") - - err := Process("env_config", &s) - if err != nil { - t.Fatal("unexpected error:", err) - } - - u, err := url.Parse("https://github.com/kelseyhightower/envconfig") - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if s.UrlValue != *u { - t.Errorf("expected %q, got %q", u, s.UrlValue.String()) - } - - if *s.UrlPointer != *u { - t.Errorf("expected %q, got %q", u, s.UrlPointer) - } -} - -func TestParseURLError(t *testing.T) { - var s SpecWithURL - - os.Clearenv() - os.Setenv("ENV_CONFIG_URLPOINTER", "http_://foo") - - err := Process("env_config", &s) - - v, ok := err.(*ParseError) - if !ok { - t.Fatalf("expected ParseError, got %T %v", err, err) - } - if v.FieldName != "UrlPointer" { - t.Errorf("expected %s, got %v", "UrlPointer", v.FieldName) - } - - expectedUnerlyingError := url.Error{ - Op: "parse", - URL: "http_://foo", - Err: errors.New("first path segment in URL cannot contain colon"), - } - - if v.Err.Error() != expectedUnerlyingError.Error() { - t.Errorf("expected %q, got %q", expectedUnerlyingError, v.Err) - } -} diff --git a/toolkit/envconfig/envconfig_test.go b/toolkit/envconfig/envconfig_test.go deleted file mode 100644 index b0eea96d..00000000 --- a/toolkit/envconfig/envconfig_test.go +++ /dev/null @@ -1,936 +0,0 @@ -// Copyright (c) 2013 Kelsey Hightower. All rights reserved. -// Use of this source code is governed by the MIT License that can be found in -// the LICENSE file. - -package envconfig - -import ( - "flag" - "fmt" - "net/url" - "os" - "strings" - "testing" - "time" - - "github.com/pkg/errors" -) - -type HonorDecodeInStruct struct { - Value string -} - -func (h *HonorDecodeInStruct) Decode(env string) error { - h.Value = "decoded" - return nil -} - -type CustomURL struct { - Value *url.URL -} - -func (cu *CustomURL) UnmarshalBinary(data []byte) error { - u, err := url.Parse(string(data)) - cu.Value = u - return err -} - -type Specification struct { - Embedded `desc:"can we document a struct"` - EmbeddedButIgnored `ignored:"true"` - Debug bool - Port int - Rate float32 - User string - TTL uint32 - Timeout time.Duration - AdminUsers []string - Users []string `values_by:"index" required:"true"` - Fruits []string `values_by:"index" default:"apple"` - MagicNumbers []int - EmptyNumbers []int - ByteSlice []byte - ColorCodes map[string]int - MultiWordVar string - MultiWordVarWithAutoSplit uint32 `split_words:"true"` - MultiWordACRWithAutoSplit uint32 `split_words:"true"` - SomePointer *string - SomePointerWithDefault *string `default:"foo2baz" desc:"foorbar is the word"` - MultiWordVarWithAlt string `envconfig:"MULTI_WORD_VAR_WITH_ALT" desc:"what alt"` - MultiWordVarWithLowerCaseAlt string `envconfig:"multi_word_var_with_lower_case_alt"` - NoPrefixWithAlt string `envconfig:"SERVICE_HOST"` - DefaultVar string `default:"foobar"` - RequiredVar string `required:"True"` - NoPrefixDefault string `envconfig:"BROKER" default:"127.0.0.1"` - RequiredDefault string `required:"true" default:"foo2bar"` - Ignored string `ignored:"true"` - NestedSpecification struct { - Property string `envconfig:"inner"` - PropertyWithDefault string `default:"fuzzybydefault"` - } `envconfig:"outer"` - AfterNested string - DecodeStruct HonorDecodeInStruct `envconfig:"honor"` - Datetime time.Time - MapField map[string]string `default:"one:two,three:four"` - UrlValue CustomURL - UrlPointer *CustomURL -} - -type Embedded struct { - Enabled bool `desc:"some embedded value"` - EmbeddedPort int - MultiWordVar string - MultiWordVarWithAlt string `envconfig:"MULTI_WITH_DIFFERENT_ALT"` - EmbeddedAlt string `envconfig:"EMBEDDED_WITH_ALT"` - EmbeddedIgnored string `ignored:"true"` -} - -type EmbeddedButIgnored struct { - FirstEmbeddedButIgnored string - SecondEmbeddedButIgnored string -} - -func TestProcess(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_USERS_0", "John1") - os.Setenv("ENV_CONFIG_DEBUG", "true") - os.Setenv("ENV_CONFIG_PORT", "8080") - os.Setenv("ENV_CONFIG_RATE", "0.5") - os.Setenv("ENV_CONFIG_USER", "Kelsey") - os.Setenv("ENV_CONFIG_TIMEOUT", "2m") - os.Setenv("ENV_CONFIG_ADMINUSERS", "John,Adam,Will") - os.Setenv("ENV_CONFIG_MAGICNUMBERS", "5,10,20") - os.Setenv("ENV_CONFIG_EMPTYNUMBERS", "") - os.Setenv("ENV_CONFIG_BYTESLICE", "this is a test value") - os.Setenv("ENV_CONFIG_COLORCODES", "red:1,green:2,blue:3") - os.Setenv("SERVICE_HOST", "127.0.0.1") - os.Setenv("ENV_CONFIG_TTL", "30") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_IGNORED", "was-not-ignored") - os.Setenv("ENV_CONFIG_OUTER_INNER", "iamnested") - os.Setenv("ENV_CONFIG_AFTERNESTED", "after") - os.Setenv("ENV_CONFIG_HONOR", "honor") - os.Setenv("ENV_CONFIG_DATETIME", "2016-08-16T18:57:05Z") - os.Setenv("ENV_CONFIG_MULTI_WORD_VAR_WITH_AUTO_SPLIT", "24") - os.Setenv("ENV_CONFIG_MULTI_WORD_ACR_WITH_AUTO_SPLIT", "25") - os.Setenv("ENV_CONFIG_URLVALUE", "https://github.com/kelseyhightower/envconfig") - os.Setenv("ENV_CONFIG_URLPOINTER", "https://github.com/kelseyhightower/envconfig") - err := Process("env_config", &s) - if err != nil { - t.Error(err.Error()) - } - if s.NoPrefixWithAlt != "127.0.0.1" { - t.Errorf("expected %v, got %v", "127.0.0.1", s.NoPrefixWithAlt) - } - if !s.Debug { - t.Errorf("expected %v, got %v", true, s.Debug) - } - if s.Port != 8080 { - t.Errorf("expected %d, got %v", 8080, s.Port) - } - if s.Rate != 0.5 { - t.Errorf("expected %f, got %v", 0.5, s.Rate) - } - if s.TTL != 30 { - t.Errorf("expected %d, got %v", 30, s.TTL) - } - if s.User != "Kelsey" { - t.Errorf("expected %s, got %s", "Kelsey", s.User) - } - if s.Timeout != 2*time.Minute { - t.Errorf("expected %s, got %s", 2*time.Minute, s.Timeout) - } - if s.RequiredVar != "foo" { - t.Errorf("expected %s, got %s", "foo", s.RequiredVar) - } - if len(s.AdminUsers) != 3 || - s.AdminUsers[0] != "John" || - s.AdminUsers[1] != "Adam" || - s.AdminUsers[2] != "Will" { - t.Errorf("expected %#v, got %#v", []string{"John", "Adam", "Will"}, s.AdminUsers) - } - if len(s.MagicNumbers) != 3 || - s.MagicNumbers[0] != 5 || - s.MagicNumbers[1] != 10 || - s.MagicNumbers[2] != 20 { - t.Errorf("expected %#v, got %#v", []int{5, 10, 20}, s.MagicNumbers) - } - if len(s.EmptyNumbers) != 0 { - t.Errorf("expected %#v, got %#v", []int{}, s.EmptyNumbers) - } - expected := "this is a test value" - if string(s.ByteSlice) != expected { - t.Errorf("expected %v, got %v", expected, string(s.ByteSlice)) - } - if s.Ignored != "" { - t.Errorf("expected empty string, got %#v", s.Ignored) - } - - if len(s.ColorCodes) != 3 || - s.ColorCodes["red"] != 1 || - s.ColorCodes["green"] != 2 || - s.ColorCodes["blue"] != 3 { - t.Errorf( - "expected %#v, got %#v", - map[string]int{ - "red": 1, - "green": 2, - "blue": 3, - }, - s.ColorCodes, - ) - } - - if s.NestedSpecification.Property != "iamnested" { - t.Errorf("expected '%s' string, got %#v", "iamnested", s.NestedSpecification.Property) - } - - if s.NestedSpecification.PropertyWithDefault != "fuzzybydefault" { - t.Errorf("expected default '%s' string, got %#v", "fuzzybydefault", s.NestedSpecification.PropertyWithDefault) - } - - if s.AfterNested != "after" { - t.Errorf("expected default '%s' string, got %#v", "after", s.AfterNested) - } - - if s.DecodeStruct.Value != "decoded" { - t.Errorf("expected default '%s' string, got %#v", "decoded", s.DecodeStruct.Value) - } - - if expected := time.Date(2016, 8, 16, 18, 57, 05, 0, time.UTC); !s.Datetime.Equal(expected) { - t.Errorf("expected %s, got %s", expected.Format(time.RFC3339), s.Datetime.Format(time.RFC3339)) - } - - if s.MultiWordVarWithAutoSplit != 24 { - t.Errorf("expected %q, got %q", 24, s.MultiWordVarWithAutoSplit) - } - - if s.MultiWordACRWithAutoSplit != 25 { - t.Errorf("expected %d, got %d", 25, s.MultiWordACRWithAutoSplit) - } - - u, err := url.Parse("https://github.com/kelseyhightower/envconfig") - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if *s.UrlValue.Value != *u { - t.Errorf("expected %q, got %q", u, s.UrlValue.Value.String()) - } - - if *s.UrlPointer.Value != *u { - t.Errorf("expected %q, got %q", u, s.UrlPointer.Value.String()) - } -} - -func TestProcessValuesBy(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_USERS_0", "John1") - os.Setenv("ENV_CONFIG_USERS_1", "Adam2") - os.Setenv("ENV_CONFIG_USERS_2", "Will3") - os.Setenv("ENV_CONFIG_USERS_3", "Will4") - os.Setenv("ENV_CONFIG_USERS_4", "Will5") - os.Setenv("ENV_CONFIG_USERS_5", "Will6") - os.Setenv("ENV_CONFIG_USERS_6", "Will7") - os.Setenv("ENV_CONFIG_USERS_7", "Will8") - os.Setenv("ENV_CONFIG_USERS_8", "Will9") - os.Setenv("ENV_CONFIG_USERS_9", "Will10") - os.Setenv("ENV_CONFIG_USERS_10", "Will11") - _ = Process("env_config", &s) - if len(s.Users) != 11 { - t.Errorf("expected %#v, got %#v", []string{"John1", "Adam2", "Will3", "Will4", "Will5", "Will6", "Will7", "Will8", "Will9", "Will10", "Will11"}, s.Users) - } -} - -func TestProcessValuesByRequired(t *testing.T) { - var s Specification - os.Clearenv() - err := Process("env_config", &s) - if err == nil { - t.Errorf("should have error") - } - if err.Error() != "required key ENV_CONFIG_USERS missing value" { - t.Errorf("error not right") - } -} - -func TestProcessValuesByDefault(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_USERS_0", "John1") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - err := Process("env_config", &s) - if err != nil { - t.Errorf("should not have error: %s", err) - } - if s.Fruits[0] != "apple" { - t.Errorf("fruits should have one and only one element apple") - } -} - -func TestParseErrorBool(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_DEBUG", "string") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - err := Process("env_config", &s) - v := &ParseError{} - ok := errors.As(err, &v) - if !ok { - t.Errorf("expected ParseError, got %v", v) - } - if v.FieldName != "Debug" { - t.Errorf("expected %s, got %v", "Debug", v.FieldName) - } - if s.Debug != false { - t.Errorf("expected %v, got %v", false, s.Debug) - } -} - -func TestParseErrorFloat32(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_RATE", "string") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - err := Process("env_config", &s) - v := &ParseError{} - ok := errors.As(err, &v) - if !ok { - t.Errorf("expected ParseError, got %v", v) - } - if v.FieldName != "Rate" { - t.Errorf("expected %s, got %v", "Rate", v.FieldName) - } - if s.Rate != 0 { - t.Errorf("expected %v, got %v", 0, s.Rate) - } -} - -func TestParseErrorInt(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_PORT", "string") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - err := Process("env_config", &s) - v := &ParseError{} - ok := errors.As(err, &v) - if !ok { - t.Errorf("expected ParseError, got %v", v) - } - if v.FieldName != "Port" { - t.Errorf("expected %s, got %v", "Port", v.FieldName) - } - if s.Port != 0 { - t.Errorf("expected %v, got %v", 0, s.Port) - } -} - -func TestParseErrorUint(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_TTL", "-30") - err := Process("env_config", &s) - v := &ParseError{} - ok := errors.As(err, &v) - if !ok { - t.Errorf("expected ParseError, got %v", v) - } - if v.FieldName != "TTL" { - t.Errorf("expected %s, got %v", "TTL", v.FieldName) - } - if s.TTL != 0 { - t.Errorf("expected %v, got %v", 0, s.TTL) - } -} - -func TestParseErrorSplitWords(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_MULTI_WORD_VAR_WITH_AUTO_SPLIT", "shakespeare") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - err := Process("env_config", &s) - v := &ParseError{} - ok := errors.As(err, &v) - if !ok { - t.Errorf("expected ParseError, got %v", v) - } - if v.FieldName != "MultiWordVarWithAutoSplit" { - t.Errorf("expected %s, got %v", "", v.FieldName) - } - if s.MultiWordVarWithAutoSplit != 0 { - t.Errorf("expected %v, got %v", 0, s.MultiWordVarWithAutoSplit) - } -} - -func TestErrInvalidSpecification(t *testing.T) { - m := make(map[string]string) - err := Process("env_config", &m) - if err != ErrInvalidSpecification { - t.Errorf("expected %v, got %v", ErrInvalidSpecification, err) - } -} - -func TestUnsetVars(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("USER", "foo") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - // If the var is not defined the non-prefixed version should not be used - // unless the struct tag says so - if s.User != "" { - t.Errorf("expected %q, got %q", "", s.User) - } -} - -func TestAlternateVarNames(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_MULTI_WORD_VAR", "foo") - os.Setenv("ENV_CONFIG_MULTI_WORD_VAR_WITH_ALT", "bar") - os.Setenv("ENV_CONFIG_MULTI_WORD_VAR_WITH_LOWER_CASE_ALT", "baz") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - // Setting the alt version of the var in the environment has no effect if - // the struct tag is not supplied - if s.MultiWordVar != "" { - t.Errorf("expected %q, got %q", "", s.MultiWordVar) - } - - // Setting the alt version of the var in the environment correctly sets - // the value if the struct tag IS supplied - if s.MultiWordVarWithAlt != "bar" { - t.Errorf("expected %q, got %q", "bar", s.MultiWordVarWithAlt) - } - - // Alt value is not case sensitive and is treated as all uppercase - if s.MultiWordVarWithLowerCaseAlt != "baz" { - t.Errorf("expected %q, got %q", "baz", s.MultiWordVarWithLowerCaseAlt) - } -} - -func TestRequiredVar(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foobar") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.RequiredVar != "foobar" { - t.Errorf("expected %s, got %s", "foobar", s.RequiredVar) - } -} - -func TestRequiredMissing(t *testing.T) { - var s Specification - os.Clearenv() - - err := Process("env_config", &s) - if err == nil { - t.Error("no failure when missing required variable") - } -} - -func TestBlankDefaultVar(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "requiredvalue") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.DefaultVar != "foobar" { - t.Errorf("expected %s, got %s", "foobar", s.DefaultVar) - } - - if *s.SomePointerWithDefault != "foo2baz" { - t.Errorf("expected %s, got %s", "foo2baz", *s.SomePointerWithDefault) - } -} - -func TestNonBlankDefaultVar(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_DEFAULTVAR", "nondefaultval") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "requiredvalue") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.DefaultVar != "nondefaultval" { - t.Errorf("expected %s, got %s", "nondefaultval", s.DefaultVar) - } -} - -func TestExplicitBlankDefaultVar(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_DEFAULTVAR", "") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.DefaultVar != "" { - t.Errorf("expected %s, got %s", "\"\"", s.DefaultVar) - } -} - -func TestAlternateNameDefaultVar(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("BROKER", "betterbroker") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.NoPrefixDefault != "betterbroker" { - t.Errorf("expected %q, got %q", "betterbroker", s.NoPrefixDefault) - } - - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.NoPrefixDefault != "127.0.0.1" { - t.Errorf("expected %q, got %q", "127.0.0.1", s.NoPrefixDefault) - } -} - -func TestRequiredDefault(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.RequiredDefault != "foo2bar" { - t.Errorf("expected %q, got %q", "foo2bar", s.RequiredDefault) - } -} - -func TestPointerFieldBlank(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.SomePointer != nil { - t.Errorf("expected , got %q", *s.SomePointer) - } -} - -func TestEmptyMapFieldOverride(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_MAPFIELD", "") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if s.MapField == nil { - t.Error("expected empty map, got ") - } - - if len(s.MapField) != 0 { - t.Errorf("expected empty map, got map of size %d", len(s.MapField)) - } -} - -func TestMustProcess(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_DEBUG", "true") - os.Setenv("ENV_CONFIG_PORT", "8080") - os.Setenv("ENV_CONFIG_RATE", "0.5") - os.Setenv("ENV_CONFIG_USER", "Kelsey") - os.Setenv("SERVICE_HOST", "127.0.0.1") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - MustProcess("env_config", &s) - - defer func() { - if err := recover(); err != nil { - return - } - - t.Error("expected panic") - }() - m := make(map[string]string) - MustProcess("env_config", &m) -} - -func TestEmbeddedStruct(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "required") - os.Setenv("ENV_CONFIG_ENABLED", "true") - os.Setenv("ENV_CONFIG_EMBEDDEDPORT", "1234") - os.Setenv("ENV_CONFIG_MULTIWORDVAR", "foo") - os.Setenv("ENV_CONFIG_MULTI_WORD_VAR_WITH_ALT", "bar") - os.Setenv("ENV_CONFIG_MULTI_WITH_DIFFERENT_ALT", "baz") - os.Setenv("ENV_CONFIG_EMBEDDED_WITH_ALT", "foobar") - os.Setenv("ENV_CONFIG_SOMEPOINTER", "foobaz") - os.Setenv("ENV_CONFIG_EMBEDDED_IGNORED", "was-not-ignored") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - if !s.Enabled { - t.Errorf("expected %v, got %v", true, s.Enabled) - } - if s.EmbeddedPort != 1234 { - t.Errorf("expected %d, got %v", 1234, s.EmbeddedPort) - } - if s.MultiWordVar != "foo" { - t.Errorf("expected %s, got %s", "foo", s.MultiWordVar) - } - if s.Embedded.MultiWordVar != "foo" { - t.Errorf("expected %s, got %s", "foo", s.Embedded.MultiWordVar) - } - if s.MultiWordVarWithAlt != "bar" { - t.Errorf("expected %s, got %s", "bar", s.MultiWordVarWithAlt) - } - if s.Embedded.MultiWordVarWithAlt != "baz" { - t.Errorf("expected %s, got %s", "baz", s.Embedded.MultiWordVarWithAlt) - } - if s.EmbeddedAlt != "foobar" { - t.Errorf("expected %s, got %s", "foobar", s.EmbeddedAlt) - } - if *s.SomePointer != "foobaz" { - t.Errorf("expected %s, got %s", "foobaz", *s.SomePointer) - } - if s.EmbeddedIgnored != "" { - t.Errorf("expected empty string, got %#v", s.Ignored) - } -} - -func TestEmbeddedButIgnoredStruct(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "required") - os.Setenv("ENV_CONFIG_FIRSTEMBEDDEDBUTIGNORED", "was-not-ignored") - os.Setenv("ENV_CONFIG_SECONDEMBEDDEDBUTIGNORED", "was-not-ignored") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - if s.FirstEmbeddedButIgnored != "" { - t.Errorf("expected empty string, got %#v", s.Ignored) - } - if s.SecondEmbeddedButIgnored != "" { - t.Errorf("expected empty string, got %#v", s.Ignored) - } -} - -func TestNonPointerFailsProperly(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "snap") - - err := Process("env_config", s) - if err != ErrInvalidSpecification { - t.Errorf("non-pointer should fail with ErrInvalidSpecification, was instead %s", err) - } -} - -func TestCustomValueFields(t *testing.T) { - var s struct { - Foo string - Bar bracketed - Baz quoted - Struct setterStruct - } - - // Set would panic when the receiver is nil, - // so make sure it has an initial value to replace. - s.Baz = quoted{new(bracketed)} - - os.Clearenv() - os.Setenv("ENV_CONFIG_FOO", "foo") - os.Setenv("ENV_CONFIG_BAR", "bar") - os.Setenv("ENV_CONFIG_BAZ", "baz") - os.Setenv("ENV_CONFIG_STRUCT", "inner") - - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if want := "foo"; s.Foo != want { - t.Errorf("foo: got %#q, want %#q", s.Foo, want) - } - - if want := "[bar]"; s.Bar.String() != want { - t.Errorf("bar: got %#q, want %#q", s.Bar, want) - } - - if want := `["baz"]`; s.Baz.String() != want { - t.Errorf(`baz: got %#q, want %#q`, s.Baz, want) - } - - if want := `setterstruct{"inner"}`; s.Struct.Inner != want { - t.Errorf(`Struct.Inner: got %#q, want %#q`, s.Struct.Inner, want) - } -} - -func TestCustomPointerFields(t *testing.T) { - var s struct { - Foo string - Bar *bracketed - Baz *quoted - Struct *setterStruct - } - - // Set would panic when the receiver is nil, - // so make sure they have initial values to replace. - s.Bar = new(bracketed) - s.Baz = "ed{new(bracketed)} - - os.Clearenv() - os.Setenv("ENV_CONFIG_FOO", "foo") - os.Setenv("ENV_CONFIG_BAR", "bar") - os.Setenv("ENV_CONFIG_BAZ", "baz") - os.Setenv("ENV_CONFIG_STRUCT", "inner") - - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - - if want := "foo"; s.Foo != want { - t.Errorf("foo: got %#q, want %#q", s.Foo, want) - } - - if want := "[bar]"; s.Bar.String() != want { - t.Errorf("bar: got %#q, want %#q", s.Bar, want) - } - - if want := `["baz"]`; s.Baz.String() != want { - t.Errorf(`baz: got %#q, want %#q`, s.Baz, want) - } - - if want := `setterstruct{"inner"}`; s.Struct.Inner != want { - t.Errorf(`Struct.Inner: got %#q, want %#q`, s.Struct.Inner, want) - } -} - -func TestEmptyPrefixUsesFieldNames(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("REQUIREDVAR", "foo") - os.Setenv("USERS_0", "John1") - err := Process("", &s) - if err != nil { - t.Errorf("Process failed: %s", err) - } - - if s.RequiredVar != "foo" { - t.Errorf( - `RequiredVar not populated correctly: expected "foo", got %q`, - s.RequiredVar, - ) - } -} - -func TestNestedStructVarName(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "required") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - val := "found with only short name" - os.Setenv("INNER", val) - if err := Process("env_config", &s); err != nil { - t.Error(err.Error()) - } - if s.NestedSpecification.Property != val { - t.Errorf("expected %s, got %s", val, s.NestedSpecification.Property) - } -} - -func TestTextUnmarshalerError(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_DATETIME", "I'M NOT A DATE") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - err := Process("env_config", &s) - - v := &ParseError{} - ok := errors.As(err, &v) - if !ok { - t.Errorf("expected ParseError, got %v", v) - } - if v.FieldName != "Datetime" { - t.Errorf("expected %s, got %v", "Datetime", v.FieldName) - } - - expectedLowLevelError := time.ParseError{ - Layout: time.RFC3339, - Value: "I'M NOT A DATE", - LayoutElem: "2006", - ValueElem: "I'M NOT A DATE", - } - - if v.Err.Error() != expectedLowLevelError.Error() { - t.Errorf("expected %s, got %s", expectedLowLevelError, v.Err) - } -} - -func TestBinaryUnmarshalerError(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_URLPOINTER", "http://%41:8080/") - os.Setenv("ENV_CONFIG_USERS_0", "John1") - err := Process("env_config", &s) - - v := &ParseError{} - ok := errors.As(err, &v) - if !ok { - t.Fatalf("expected ParseError, got %T %v", err, err) - } - if v.FieldName != "UrlPointer" { - t.Errorf("expected %s, got %v", "UrlPointer", v.FieldName) - } - - // To be compatible with go 1.5 and lower we should do a very basic check, - // because underlying error message varies in go 1.5 and go 1.6+. - ue := &url.Error{} - ok = errors.As(v.Err, &ue) - if !ok { - t.Errorf("expected error type to be \"*url.Error\", got %T", v.Err) - } - - if ue.Op != "parse" { - t.Errorf("expected error op to be \"parse\", got %q", ue.Op) - } -} - -func TestCheckDisallowedOnlyAllowed(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_DEBUG", "true") - os.Setenv("UNRELATED_ENV_VAR", "true") - err := CheckDisallowed("env_config", &s) - if err != nil { - t.Errorf("expected no error, got %s", err) - } -} - -func TestCheckDisallowedMispelled(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_DEBUG", "true") - os.Setenv("ENV_CONFIG_ZEBUG", "false") - err := CheckDisallowed("env_config", &s) - if experr := "unknown environment variable ENV_CONFIG_ZEBUG"; err.Error() != experr { - t.Errorf("expected %s, got %s", experr, err) - } -} - -func TestCheckDisallowedIgnored(t *testing.T) { - var s Specification - os.Clearenv() - os.Setenv("ENV_CONFIG_DEBUG", "true") - os.Setenv("ENV_CONFIG_IGNORED", "false") - err := CheckDisallowed("env_config", &s) - if experr := "unknown environment variable ENV_CONFIG_IGNORED"; err.Error() != experr { - t.Errorf("expected %s, got %s", experr, err) - } -} - -func TestErrorMessageForRequiredAltVar(t *testing.T) { - var s struct { - Foo string `envconfig:"BAR" required:"true"` - } - - os.Clearenv() - err := Process("env_config", &s) - - if err == nil { - t.Error("no failure when missing required variable") - } - - if !strings.Contains(err.Error(), " BAR ") { - t.Errorf("expected error message to contain BAR, got \"%v\"", err) - } -} - -type bracketed string - -func (b *bracketed) Set(value string) error { - *b = bracketed("[" + value + "]") - return nil -} - -func (b bracketed) String() string { - return string(b) -} - -// quoted is used to test the precedence of Decode over Set. -// The sole field is a flag.Value rather than a setter to validate that -// all flag.Value implementations are also Setter implementations. -type quoted struct{ flag.Value } - -func (d quoted) Decode(value string) error { - return d.Set(`"` + value + `"`) -} - -type setterStruct struct { - Inner string -} - -func (ss *setterStruct) Set(value string) error { - ss.Inner = fmt.Sprintf("setterstruct{%q}", value) - return nil -} - -func BenchmarkGatherInfo(b *testing.B) { - os.Clearenv() - os.Setenv("ENV_CONFIG_DEBUG", "true") - os.Setenv("ENV_CONFIG_PORT", "8080") - os.Setenv("ENV_CONFIG_RATE", "0.5") - os.Setenv("ENV_CONFIG_USER", "Kelsey") - os.Setenv("ENV_CONFIG_TIMEOUT", "2m") - os.Setenv("ENV_CONFIG_ADMINUSERS", "John,Adam,Will") - os.Setenv("ENV_CONFIG_MAGICNUMBERS", "5,10,20") - os.Setenv("ENV_CONFIG_COLORCODES", "red:1,green:2,blue:3") - os.Setenv("SERVICE_HOST", "127.0.0.1") - os.Setenv("ENV_CONFIG_TTL", "30") - os.Setenv("ENV_CONFIG_REQUIREDVAR", "foo") - os.Setenv("ENV_CONFIG_IGNORED", "was-not-ignored") - os.Setenv("ENV_CONFIG_OUTER_INNER", "iamnested") - os.Setenv("ENV_CONFIG_AFTERNESTED", "after") - os.Setenv("ENV_CONFIG_HONOR", "honor") - os.Setenv("ENV_CONFIG_DATETIME", "2016-08-16T18:57:05Z") - os.Setenv("ENV_CONFIG_MULTI_WORD_VAR_WITH_AUTO_SPLIT", "24") - for i := 0; i < b.N; i++ { - var s Specification - gatherInfo("env_config", &s) - } -} diff --git a/toolkit/envconfig/testdata/custom.txt b/toolkit/envconfig/testdata/custom.txt deleted file mode 100644 index 04d2f5d0..00000000 --- a/toolkit/envconfig/testdata/custom.txt +++ /dev/null @@ -1,36 +0,0 @@ -ENV_CONFIG_ENABLED=some.embedded.value -ENV_CONFIG_EMBEDDEDPORT= -ENV_CONFIG_MULTIWORDVAR= -ENV_CONFIG_MULTI_WITH_DIFFERENT_ALT= -ENV_CONFIG_EMBEDDED_WITH_ALT= -ENV_CONFIG_DEBUG= -ENV_CONFIG_PORT= -ENV_CONFIG_RATE= -ENV_CONFIG_USER= -ENV_CONFIG_TTL= -ENV_CONFIG_TIMEOUT= -ENV_CONFIG_ADMINUSERS= -ENV_CONFIG_MAGICNUMBERS= -ENV_CONFIG_EMPTYNUMBERS= -ENV_CONFIG_BYTESLICE= -ENV_CONFIG_COLORCODES= -ENV_CONFIG_MULTIWORDVAR= -ENV_CONFIG_MULTI_WORD_VAR_WITH_AUTO_SPLIT= -ENV_CONFIG_MULTI_WORD_ACR_WITH_AUTO_SPLIT= -ENV_CONFIG_SOMEPOINTER= -ENV_CONFIG_SOMEPOINTERWITHDEFAULT=foorbar.is.the.word -ENV_CONFIG_MULTI_WORD_VAR_WITH_ALT=what.alt -ENV_CONFIG_MULTI_WORD_VAR_WITH_LOWER_CASE_ALT= -ENV_CONFIG_SERVICE_HOST= -ENV_CONFIG_DEFAULTVAR= -ENV_CONFIG_REQUIREDVAR= -ENV_CONFIG_BROKER= -ENV_CONFIG_REQUIREDDEFAULT= -ENV_CONFIG_OUTER_INNER= -ENV_CONFIG_OUTER_PROPERTYWITHDEFAULT= -ENV_CONFIG_AFTERNESTED= -ENV_CONFIG_HONOR= -ENV_CONFIG_DATETIME= -ENV_CONFIG_MAPFIELD= -ENV_CONFIG_URLVALUE= -ENV_CONFIG_URLPOINTER= diff --git a/toolkit/envconfig/testdata/default_list.txt b/toolkit/envconfig/testdata/default_list.txt deleted file mode 100644 index fb0eced7..00000000 --- a/toolkit/envconfig/testdata/default_list.txt +++ /dev/null @@ -1,183 +0,0 @@ -This.application.is.configured.via.the.environment..The.following.environment -variables.can.be.used: - -ENV_CONFIG_ENABLED -..[description].some.embedded.value -..[type]........True.or.False -..[default]..... -..[required].... -ENV_CONFIG_EMBEDDEDPORT -..[description]. -..[type]........Integer -..[default]..... -..[required].... -ENV_CONFIG_MULTIWORDVAR -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_MULTI_WITH_DIFFERENT_ALT -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_EMBEDDED_WITH_ALT -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_DEBUG -..[description]. -..[type]........True.or.False -..[default]..... -..[required].... -ENV_CONFIG_PORT -..[description]. -..[type]........Integer -..[default]..... -..[required].... -ENV_CONFIG_RATE -..[description]. -..[type]........Float -..[default]..... -..[required].... -ENV_CONFIG_USER -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_TTL -..[description]. -..[type]........Unsigned.Integer -..[default]..... -..[required].... -ENV_CONFIG_TIMEOUT -..[description]. -..[type]........Duration -..[default]..... -..[required].... -ENV_CONFIG_ADMINUSERS -..[description]. -..[type]........Comma-separated.list.of.String -..[default]..... -..[required].... -ENV_CONFIG_MAGICNUMBERS -..[description]. -..[type]........Comma-separated.list.of.Integer -..[default]..... -..[required].... -ENV_CONFIG_EMPTYNUMBERS -..[description]. -..[type]........Comma-separated.list.of.Integer -..[default]..... -..[required].... -ENV_CONFIG_BYTESLICE -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_COLORCODES -..[description]. -..[type]........Comma-separated.list.of.String:Integer.pairs -..[default]..... -..[required].... -ENV_CONFIG_MULTIWORDVAR -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_MULTI_WORD_VAR_WITH_AUTO_SPLIT -..[description]. -..[type]........Unsigned.Integer -..[default]..... -..[required].... -ENV_CONFIG_MULTI_WORD_ACR_WITH_AUTO_SPLIT -..[description]. -..[type]........Unsigned.Integer -..[default]..... -..[required].... -ENV_CONFIG_SOMEPOINTER -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_SOMEPOINTERWITHDEFAULT -..[description].foorbar.is.the.word -..[type]........String -..[default].....foo2baz -..[required].... -ENV_CONFIG_MULTI_WORD_VAR_WITH_ALT -..[description].what.alt -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_MULTI_WORD_VAR_WITH_LOWER_CASE_ALT -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_SERVICE_HOST -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_DEFAULTVAR -..[description]. -..[type]........String -..[default].....foobar -..[required].... -ENV_CONFIG_REQUIREDVAR -..[description]. -..[type]........String -..[default]..... -..[required]....true -ENV_CONFIG_BROKER -..[description]. -..[type]........String -..[default].....127.0.0.1 -..[required].... -ENV_CONFIG_REQUIREDDEFAULT -..[description]. -..[type]........String -..[default].....foo2bar -..[required]....true -ENV_CONFIG_OUTER_INNER -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_OUTER_PROPERTYWITHDEFAULT -..[description]. -..[type]........String -..[default].....fuzzybydefault -..[required].... -ENV_CONFIG_AFTERNESTED -..[description]. -..[type]........String -..[default]..... -..[required].... -ENV_CONFIG_HONOR -..[description]. -..[type]........HonorDecodeInStruct -..[default]..... -..[required].... -ENV_CONFIG_DATETIME -..[description]. -..[type]........Time -..[default]..... -..[required].... -ENV_CONFIG_MAPFIELD -..[description]. -..[type]........Comma-separated.list.of.String:String.pairs -..[default].....one:two,three:four -..[required].... -ENV_CONFIG_URLVALUE -..[description]. -..[type]........CustomURL -..[default]..... -..[required].... -ENV_CONFIG_URLPOINTER -..[description]. -..[type]........CustomURL -..[default]..... -..[required].... diff --git a/toolkit/envconfig/testdata/default_table.txt b/toolkit/envconfig/testdata/default_table.txt deleted file mode 100644 index 65c9b445..00000000 --- a/toolkit/envconfig/testdata/default_table.txt +++ /dev/null @@ -1,40 +0,0 @@ -This.application.is.configured.via.the.environment..The.following.environment -variables.can.be.used: - -KEY..............................................TYPE............................................DEFAULT...............REQUIRED....DESCRIPTION -ENV_CONFIG_ENABLED...............................True.or.False.....................................................................some.embedded.value -ENV_CONFIG_EMBEDDEDPORT..........................Integer........................................................................... -ENV_CONFIG_MULTIWORDVAR..........................String............................................................................ -ENV_CONFIG_MULTI_WITH_DIFFERENT_ALT..............String............................................................................ -ENV_CONFIG_EMBEDDED_WITH_ALT.....................String............................................................................ -ENV_CONFIG_DEBUG.................................True.or.False..................................................................... -ENV_CONFIG_PORT..................................Integer........................................................................... -ENV_CONFIG_RATE..................................Float............................................................................. -ENV_CONFIG_USER..................................String............................................................................ -ENV_CONFIG_TTL...................................Unsigned.Integer.................................................................. -ENV_CONFIG_TIMEOUT...............................Duration.......................................................................... -ENV_CONFIG_ADMINUSERS............................Comma-separated.list.of.String.................................................... -ENV_CONFIG_MAGICNUMBERS..........................Comma-separated.list.of.Integer................................................... -ENV_CONFIG_EMPTYNUMBERS..........................Comma-separated.list.of.Integer................................................... -ENV_CONFIG_BYTESLICE.............................String............................................................................ -ENV_CONFIG_COLORCODES............................Comma-separated.list.of.String:Integer.pairs...................................... -ENV_CONFIG_MULTIWORDVAR..........................String............................................................................ -ENV_CONFIG_MULTI_WORD_VAR_WITH_AUTO_SPLIT........Unsigned.Integer.................................................................. -ENV_CONFIG_MULTI_WORD_ACR_WITH_AUTO_SPLIT........Unsigned.Integer.................................................................. -ENV_CONFIG_SOMEPOINTER...........................String............................................................................ -ENV_CONFIG_SOMEPOINTERWITHDEFAULT................String..........................................foo2baz...........................foorbar.is.the.word -ENV_CONFIG_MULTI_WORD_VAR_WITH_ALT...............String............................................................................what.alt -ENV_CONFIG_MULTI_WORD_VAR_WITH_LOWER_CASE_ALT....String............................................................................ -ENV_CONFIG_SERVICE_HOST..........................String............................................................................ -ENV_CONFIG_DEFAULTVAR............................String..........................................foobar............................ -ENV_CONFIG_REQUIREDVAR...........................String................................................................true........ -ENV_CONFIG_BROKER................................String..........................................127.0.0.1......................... -ENV_CONFIG_REQUIREDDEFAULT.......................String..........................................foo2bar...............true........ -ENV_CONFIG_OUTER_INNER...........................String............................................................................ -ENV_CONFIG_OUTER_PROPERTYWITHDEFAULT.............String..........................................fuzzybydefault.................... -ENV_CONFIG_AFTERNESTED...........................String............................................................................ -ENV_CONFIG_HONOR.................................HonorDecodeInStruct............................................................... -ENV_CONFIG_DATETIME..............................Time.............................................................................. -ENV_CONFIG_MAPFIELD..............................Comma-separated.list.of.String:String.pairs.....one:two,three:four................ -ENV_CONFIG_URLVALUE..............................CustomURL......................................................................... -ENV_CONFIG_URLPOINTER............................CustomURL......................................................................... diff --git a/toolkit/envconfig/testdata/fault.txt b/toolkit/envconfig/testdata/fault.txt deleted file mode 100644 index b525ff12..00000000 --- a/toolkit/envconfig/testdata/fault.txt +++ /dev/null @@ -1,36 +0,0 @@ -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} -{.Key} diff --git a/toolkit/envconfig/usage.go b/toolkit/envconfig/usage.go deleted file mode 100644 index aebadb03..00000000 --- a/toolkit/envconfig/usage.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright (c) 2016 Kelsey Hightower and others. All rights reserved. -// Use of this source code is governed by the MIT License that can be found in -// the LICENSE file. - -package envconfig - -import ( - "encoding" - "fmt" - "io" - "os" - "reflect" - "strconv" - "strings" - "text/tabwriter" - "text/template" -) - -const ( - // DefaultListFormat constant to use to display usage in a list format - DefaultListFormat = `This application is configured via the environment. The following environment -variables can be used: -{{range .}} -{{usage_key .}} - [description] {{usage_description .}} - [type] {{usage_type .}} - [default] {{usage_default .}} - [required] {{usage_required .}}{{end}} -` - // DefaultTableFormat constant to use to display usage in a tabular format - DefaultTableFormat = `This application is configured via the environment. The following environment -variables can be used: - -KEY TYPE DEFAULT REQUIRED DESCRIPTION -{{range .}}{{usage_key .}} {{usage_type .}} {{usage_default .}} {{usage_required .}} {{usage_description .}} -{{end}}` -) - -var ( - decoderType = reflect.TypeOf((*Decoder)(nil)).Elem() - setterType = reflect.TypeOf((*Setter)(nil)).Elem() - textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() - binaryUnmarshalerType = reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem() -) - -func implementsInterface(t reflect.Type) bool { - return t.Implements(decoderType) || - reflect.PtrTo(t).Implements(decoderType) || - t.Implements(setterType) || - reflect.PtrTo(t).Implements(setterType) || - t.Implements(textUnmarshalerType) || - reflect.PtrTo(t).Implements(textUnmarshalerType) || - t.Implements(binaryUnmarshalerType) || - reflect.PtrTo(t).Implements(binaryUnmarshalerType) -} - -// toTypeDescription converts Go types into a human readable description -func toTypeDescription(t reflect.Type) string { - switch t.Kind() { - case reflect.Array, reflect.Slice: - if t.Elem().Kind() == reflect.Uint8 { - return "String" - } - return fmt.Sprintf("Comma-separated list of %s", toTypeDescription(t.Elem())) - case reflect.Map: - return fmt.Sprintf( - "Comma-separated list of %s:%s pairs", - toTypeDescription(t.Key()), - toTypeDescription(t.Elem()), - ) - case reflect.Ptr: - return toTypeDescription(t.Elem()) - case reflect.Struct: - if implementsInterface(t) && t.Name() != "" { - return t.Name() - } - return "" - case reflect.String: - name := t.Name() - if name != "" && name != "string" { - return name - } - return "String" - case reflect.Bool: - name := t.Name() - if name != "" && name != "bool" { - return name - } - return "True or False" - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - name := t.Name() - if name != "" && !strings.HasPrefix(name, "int") { - return name - } - return "Integer" - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - name := t.Name() - if name != "" && !strings.HasPrefix(name, "uint") { - return name - } - return "Unsigned Integer" - case reflect.Float32, reflect.Float64: - name := t.Name() - if name != "" && !strings.HasPrefix(name, "float") { - return name - } - return "Float" - } - return fmt.Sprintf("%+v", t) -} - -// Usage writes usage information to stdout using the default header and table format -func Usage(prefix string, spec interface{}) error { - // The default is to output the usage information as a table - // Create tabwriter instance to support table output - tabs := tabwriter.NewWriter(os.Stdout, 1, 0, 4, ' ', 0) - - err := Usagef(prefix, spec, tabs, DefaultTableFormat) - tabs.Flush() - return err -} - -// Usagef writes usage information to the specified io.Writer using the specified template specification -func Usagef(prefix string, spec interface{}, out io.Writer, format string) error { - - // Specify the default usage template functions - functions := template.FuncMap{ - "usage_key": func(v varInfo) string { return v.Key }, - "usage_description": func(v varInfo) string { return v.Tags.Get("desc") }, - "usage_type": func(v varInfo) string { return toTypeDescription(v.Field.Type()) }, - "usage_default": func(v varInfo) string { return v.Tags.Get("default") }, - "usage_required": func(v varInfo) (string, error) { - req := v.Tags.Get("required") - if req != "" { - reqB, err := strconv.ParseBool(req) - if err != nil { - return "", err - } - if reqB { - req = "true" - } - } - return req, nil - }, - } - - tmpl, err := template.New("envconfig").Funcs(functions).Parse(format) - if err != nil { - return err - } - - return Usaget(prefix, spec, out, tmpl) -} - -// Usaget writes usage information to the specified io.Writer using the specified template -func Usaget(prefix string, spec interface{}, out io.Writer, tmpl *template.Template) error { - // gather first - infos, err := gatherInfo(prefix, spec) - if err != nil { - return err - } - - return tmpl.Execute(out, infos) -} diff --git a/toolkit/envconfig/usage_test.go b/toolkit/envconfig/usage_test.go deleted file mode 100644 index c34b3dc1..00000000 --- a/toolkit/envconfig/usage_test.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) 2016 Kelsey Hightower and others. All rights reserved. -// Use of this source code is governed by the MIT License that can be found in -// the LICENSE file. - -package envconfig - -import ( - "bytes" - "io" - "io/ioutil" - "log" - "os" - "strings" - "testing" - "text/tabwriter" -) - -var testUsageTableResult, testUsageListResult, testUsageCustomResult, testUsageBadFormatResult string - -func TestMain(m *testing.M) { - - // Load the expected test results from a text file - data, err := ioutil.ReadFile("testdata/default_table.txt") - if err != nil { - log.Fatal(err) - } - testUsageTableResult = string(data) - - data, err = ioutil.ReadFile("testdata/default_list.txt") - if err != nil { - log.Fatal(err) - } - testUsageListResult = string(data) - - data, err = ioutil.ReadFile("testdata/custom.txt") - if err != nil { - log.Fatal(err) - } - testUsageCustomResult = string(data) - - data, err = ioutil.ReadFile("testdata/fault.txt") - if err != nil { - log.Fatal(err) - } - testUsageBadFormatResult = string(data) - - retCode := m.Run() - os.Exit(retCode) -} - -func compareUsage(want, got string, t *testing.T) { - got = strings.ReplaceAll(got, " ", ".") - if want != got { - shortest := len(want) - if len(got) < shortest { - shortest = len(got) - } - if len(want) != len(got) { - t.Errorf("expected result length of %d, found %d", len(want), len(got)) - } - for i := 0; i < shortest; i++ { - if want[i] != got[i] { - t.Errorf("difference at index %d, expected '%c' (%v), found '%c' (%v)\n", - i, want[i], want[i], got[i], got[i]) - break - } - } - t.Errorf("Complete Expected:\n'%s'\nComplete Found:\n'%s'\n", want, got) - } -} - -func TestUsageDefault(t *testing.T) { - var s Specification - os.Clearenv() - save := os.Stdout - r, w, _ := os.Pipe() - os.Stdout = w - err := Usage("env_config", &s) - outC := make(chan string) - // copy the output in a separate goroutine so printing can't block indefinitely - go func() { - var buf bytes.Buffer - io.Copy(&buf, r) - outC <- buf.String() - }() - w.Close() - os.Stdout = save // restoring the real stdout - out := <-outC - - if err != nil { - t.Error(err.Error()) - } - compareUsage(testUsageTableResult, out, t) -} - -func TestUsageTable(t *testing.T) { - var s Specification - os.Clearenv() - buf := new(bytes.Buffer) - tabs := tabwriter.NewWriter(buf, 1, 0, 4, ' ', 0) - err := Usagef("env_config", &s, tabs, DefaultTableFormat) - tabs.Flush() - if err != nil { - t.Error(err.Error()) - } - compareUsage(testUsageTableResult, buf.String(), t) -} - -func TestUsageList(t *testing.T) { - var s Specification - os.Clearenv() - buf := new(bytes.Buffer) - err := Usagef("env_config", &s, buf, DefaultListFormat) - if err != nil { - t.Error(err.Error()) - } - compareUsage(testUsageListResult, buf.String(), t) -} - -func TestUsageCustomFormat(t *testing.T) { - var s Specification - os.Clearenv() - buf := new(bytes.Buffer) - err := Usagef("env_config", &s, buf, "{{range .}}{{usage_key .}}={{usage_description .}}\n{{end}}") - if err != nil { - t.Error(err.Error()) - } - compareUsage(testUsageCustomResult, buf.String(), t) -} - -func TestUsageUnknownKeyFormat(t *testing.T) { - var s Specification - unknownError := "template: envconfig:1:2: executing \"envconfig\" at <.UnknownKey>" - os.Clearenv() - buf := new(bytes.Buffer) - err := Usagef("env_config", &s, buf, "{{.UnknownKey}}") - if err == nil { - t.Errorf("expected 'unknown key' error, but got no error") - } - if !strings.Contains(err.Error(), unknownError) { - t.Errorf("expected '%s', but got '%s'", unknownError, err.Error()) - } -} - -func TestUsageBadFormat(t *testing.T) { - var s Specification - os.Clearenv() - // If you don't use two {{}} then you get a lieteral - buf := new(bytes.Buffer) - err := Usagef("env_config", &s, buf, "{{range .}}{.Key}\n{{end}}") - if err != nil { - t.Error(err.Error()) - } - compareUsage(testUsageBadFormatResult, buf.String(), t) -} diff --git a/toolkit/errorx/errorx.go b/toolkit/errorx/errorx.go deleted file mode 100644 index d1011925..00000000 --- a/toolkit/errorx/errorx.go +++ /dev/null @@ -1,17 +0,0 @@ -package errorx - -import ( - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" -) - -func Panic(msg string) { - zlogger.Panic().Msg(msg) -} - -func Wrap(err error) error { - if err == nil { - return nil - } - zlogger.Error().Err(err).Msg(err.Error()) - return err -} diff --git a/toolkit/executils/executils.go b/toolkit/executils/executils.go deleted file mode 100644 index e0584b02..00000000 --- a/toolkit/executils/executils.go +++ /dev/null @@ -1,38 +0,0 @@ -package executils - -import ( - "os" - "os/exec" -) - -//go:generate mockgen -destination ../../mock/mock_executils_runner.go -package mock -source=./executils.go - -// Runner is mainly for executing shell command -type Runner interface { - Run(string, ...string) error - Start(string, ...string) (*exec.Cmd, error) - Output(string, ...string) ([]byte, error) -} - -// CmdRunner implements Runner interface -type CmdRunner struct{} - -func (r CmdRunner) Output(command string, args ...string) ([]byte, error) { - return exec.Command(command, args...).Output() -} - -// Run executes commands -func (r CmdRunner) Run(command string, args ...string) error { - cmd := exec.Command(command, args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - return cmd.Run() -} - -// Start starts the specified command but does not wait for it to complete. -func (r CmdRunner) Start(command string, args ...string) (*exec.Cmd, error) { - cmd := exec.Command(command, args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - return cmd, cmd.Start() -} diff --git a/toolkit/executils/executils_test.go b/toolkit/executils/executils_test.go deleted file mode 100644 index b112daca..00000000 --- a/toolkit/executils/executils_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package executils - -import ( - "fmt" - "os" - "testing" -) - -func TestCmdRunner_Run(t *testing.T) { - var runner CmdRunner - cs := []string{"-test.run=TestHelperProcess", "--"} - runner.Run(os.Args[0], cs...) -} - -func TestCmdRunner_Start(t *testing.T) { - var runner CmdRunner - cs := []string{"-test.run=TestHelperProcess", "--"} - cmd, _ := runner.Start(os.Args[0], cs...) - if err := cmd.Wait(); err != nil { - panic(err) - } -} - -func TestHelperProcess(*testing.T) { - fmt.Println("testing helper process") -} diff --git a/toolkit/fileutils/fileutils.go b/toolkit/fileutils/fileutils.go deleted file mode 100644 index b156935d..00000000 --- a/toolkit/fileutils/fileutils.go +++ /dev/null @@ -1,53 +0,0 @@ -package fileutils - -import ( - "bufio" - "io" - "os" - - "github.com/mholt/archiver/v3" - "github.com/pkg/errors" -) - -// CreateDirectory dir didn't exist, then create dir, otherwise do nothing. -func CreateDirectory(dir string) (err error) { - var info os.FileInfo - if info, err = os.Stat(dir); err != nil { - if os.IsNotExist(err) { - if err = os.MkdirAll(dir, 0755); err != nil { - return - } - } - } else { - if !info.IsDir() { - return errors.New("not a directory: " + dir) - } - } - return -} - -func File2lines(filePath string) ([]string, error) { - f, err := os.Open(filePath) - if err != nil { - return nil, err - } - defer f.Close() - return LinesFromReader(f) -} - -func LinesFromReader(r io.Reader) ([]string, error) { - var lines []string - scanner := bufio.NewScanner(r) - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - if err := scanner.Err(); err != nil { - return nil, err - } - - return lines, nil -} - -func Archive(output string, sources ...string) error { - return archiver.Archive(sources, output) -} diff --git a/toolkit/fileutils/fileutils_test.go b/toolkit/fileutils/fileutils_test.go deleted file mode 100644 index c1f2cf0e..00000000 --- a/toolkit/fileutils/fileutils_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package fileutils - -import ( - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" -) - -func TestCreateDirectory(t *testing.T) { - type args struct { - dir string - } - tests := []struct { - name string - args args - wantErr bool - }{ - { - name: "", - args: args{ - dir: pathutils.Abs("testfiles"), - }, - // it should have error because testfiles has already existed as a file not a directory - wantErr: true, - }, - { - name: "", - args: args{ - dir: "/TestCreateDirectory", - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := CreateDirectory(tt.args.dir); (err != nil) != tt.wantErr { - t.Errorf("CreateDirectory() error = %v, wantErr %v", err, tt.wantErr) - } - //defer os.RemoveAll(dir) - }) - } -} diff --git a/toolkit/fileutils/testfiles b/toolkit/fileutils/testfiles deleted file mode 100644 index e69de29b..00000000 diff --git a/toolkit/form/.gitignore b/toolkit/form/.gitignore deleted file mode 100644 index aa19ee28..00000000 --- a/toolkit/form/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof -old.txt -new.txt - -/.idea \ No newline at end of file diff --git a/toolkit/form/LICENSE b/toolkit/form/LICENSE deleted file mode 100644 index 8d8aba15..00000000 --- a/toolkit/form/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Go Playground - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/toolkit/form/Makefile b/toolkit/form/Makefile deleted file mode 100644 index 0ff37bce..00000000 --- a/toolkit/form/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: lint test bench - -lint: - golangci-lint run --timeout 5m - -test: - go test -covermode=atomic -race ./... - -bench: - go test -bench=. -benchmem ./... - -.PHONY: test lint bench -.DEFAULT_GOAL := all diff --git a/toolkit/form/README.md b/toolkit/form/README.md deleted file mode 100644 index 2e76aeea..00000000 --- a/toolkit/form/README.md +++ /dev/null @@ -1,323 +0,0 @@ -Package form -============ -![Project status](https://img.shields.io/badge/version-4.2.1-green.svg) -[![Build Status](https://github.com/go-playground/form/actions/workflows/workflow.yml/badge.svg)](https://github.com/go-playground/form/actions/workflows/workflow.yml) -[![Coverage Status](https://coveralls.io/repos/github/go-playground/form/badge.svg?branch=master)](https://coveralls.io/github/go-playground/form?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/form)](https://goreportcard.com/report/github.com/go-playground/form) -[![GoDoc](https://godoc.org/github.com/go-playground/form?status.svg)](https://godoc.org/github.com/go-playground/form) -![License](https://img.shields.io/dub/l/vibe-d.svg) -[![Gitter](https://badges.gitter.im/go-playground/form.svg)](https://gitter.im/go-playground/form?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -Package form Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. - -It has the following features: - -- Supports map of almost all types. -- Supports both Numbered and Normal arrays eg. `"Array[0]"` and just `"Array"` with multiple values passed. -- Slice honours the specified index. eg. if "Slice[2]" is the only Slice value passed down, it will be put at index 2; if slice isn't big enough it will be expanded. -- Array honours the specified index. eg. if "Array[2]" is the only Array value passed down, it will be put at index 2; if array isn't big enough a warning will be printed and value ignored. -- Only creates objects as necessary eg. if no `array` or `map` values are passed down, the `array` and `map` are left as their default values in the struct. -- Allows for Custom Type registration. -- Handles time.Time using RFC3339 time format by default, but can easily be changed by registering a Custom Type, see below. -- Handles Encoding & Decoding of almost all Go types eg. can Decode into struct, array, map, int... and Encode a struct, array, map, int... - -Common Questions - -- Does it support encoding.TextUnmarshaler? No because TextUnmarshaler only accepts []byte but posted values can have multiple values, so is not suitable. -- Mixing `array/slice` with `array[idx]/slice[idx]`, in which order are they parsed? `array/slice` then `array[idx]/slice[idx]` - -Supported Types ( out of the box ) ----------- - -* `string` -* `bool` -* `int`, `int8`, `int16`, `int32`, `int64` -* `uint`, `uint8`, `uint16`, `uint32`, `uint64` -* `float32`, `float64` -* `struct` and `anonymous struct` -* `interface{}` -* `time.Time` - by default using RFC3339 -* a `pointer` to one of the above types -* `slice`, `array` -* `map` -* `custom types` can override any of the above types -* many other types may be supported inherently - -**NOTE**: `map`, `struct` and `slice` nesting are ad infinitum. - -Installation ------------- - -Use go get. - - go get github.com/go-playground/form - -Then import the form package into your own code. - - import "github.com/go-playground/form/v4" - -Usage ------ - -- Use symbol `.` for separating fields/structs. (eg. `structfield.field`) -- Use `[index or key]` for access to index of a slice/array or key for map. (eg. `arrayfield[0]`, `mapfield[keyvalue]`) - -```html -
- - - - - - - - - - - - -
-``` - -Examples -------- - -Decoding -```go -package main - -import ( - "fmt" - "log" - "net/url" - - "github.com/go-playground/form/v4" -) - -// Address contains address information -type Address struct { - Name string - Phone string -} - -// User contains user information -type User struct { - Name string - Age uint8 - Gender string - Address []Address - Active bool `form:"active"` - MapExample map[string]string - NestedMap map[string]map[string]string - NestedArray [][]string -} - -// use a single instance of Decoder, it caches struct info -var decoder *form.Decoder - -func main() { - decoder = form.NewDecoder() - - // this simulates the results of http.Request's ParseForm() function - values := parseForm() - - var user User - - // must pass a pointer - err := decoder.Decode(&user, values) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", user) -} - -// this simulates the results of http.Request's ParseForm() function -func parseForm() url.Values { - return url.Values{ - "Name": []string{"joeybloggs"}, - "Age": []string{"3"}, - "Gender": []string{"Male"}, - "Address[0].Name": []string{"26 Here Blvd."}, - "Address[0].Phone": []string{"9(999)999-9999"}, - "Address[1].Name": []string{"26 There Blvd."}, - "Address[1].Phone": []string{"1(111)111-1111"}, - "active": []string{"true"}, - "MapExample[key]": []string{"value"}, - "NestedMap[key][key]": []string{"value"}, - "NestedArray[0][0]": []string{"value"}, - } -} -``` - -Encoding -```go -package main - -import ( - "fmt" - "log" - - "github.com/go-playground/form/v4" -) - -// Address contains address information -type Address struct { - Name string - Phone string -} - -// User contains user information -type User struct { - Name string - Age uint8 - Gender string - Address []Address - Active bool `form:"active"` - MapExample map[string]string - NestedMap map[string]map[string]string - NestedArray [][]string -} - -// use a single instance of Encoder, it caches struct info -var encoder *form.Encoder - -func main() { - encoder = form.NewEncoder() - - user := User{ - Name: "joeybloggs", - Age: 3, - Gender: "Male", - Address: []Address{ - {Name: "26 Here Blvd.", Phone: "9(999)999-9999"}, - {Name: "26 There Blvd.", Phone: "1(111)111-1111"}, - }, - Active: true, - MapExample: map[string]string{"key": "value"}, - NestedMap: map[string]map[string]string{"key": {"key": "value"}}, - NestedArray: [][]string{{"value"}}, - } - - // must pass a pointer - values, err := encoder.Encode(&user) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", values) -} -``` - -Registering Custom Types --------------- - -Decoder -```go -decoder.RegisterCustomTypeFunc(func(vals []string) (interface{}, error) { - return time.Parse("2006-01-02", vals[0]) -}, time.Time{}) -``` -ADDITIONAL: if a struct type is registered, the function will only be called if a url.Value exists for -the struct and not just the struct fields eg. url.Values{"User":"Name%3Djoeybloggs"} will call the -custom type function with 'User' as the type, however url.Values{"User.Name":"joeybloggs"} will not. - - -Encoder -```go -encoder.RegisterCustomTypeFunc(func(x interface{}) ([]string, error) { - return []string{x.(time.Time).Format("2006-01-02")}, nil -}, time.Time{}) -``` - -Ignoring Fields --------------- -you can tell form to ignore fields using `-` in the tag -```go -type MyStruct struct { - Field string `form:"-"` -} -``` - -Omitempty --------------- -you can tell form to omit empty fields using `,omitempty` or `FieldName,omitempty` in the tag -```go -type MyStruct struct { - Field string `form:",omitempty"` - Field2 string `form:"CustomFieldName,omitempty"` -} -``` - -Notes ------- -To maximize compatibility with other systems the Encoder attempts -to avoid using array indexes in url.Values if at all possible. - -eg. -```go -// A struct field of -Field []string{"1", "2", "3"} - -// will be output a url.Value as -"Field": []string{"1", "2", "3"} - -and not -"Field[0]": []string{"1"} -"Field[1]": []string{"2"} -"Field[2]": []string{"3"} - -// however there are times where it is unavoidable, like with pointers -i := int(1) -Field []*string{nil, nil, &i} - -// to avoid index 1 and 2 must use index -"Field[2]": []string{"1"} -``` - -Benchmarks ------- -###### Run on M1 MacBook Pro using go version go1.20.6 darwin/amd64 - -NOTE: the 1 allocation and B/op in the first 4 decodes is actually the struct allocating when passing it in, so primitives are actually zero allocation. - -```go -go test -run=NONE -bench=. -benchmem=true ./... -goos: darwin -goarch: arm64 -pkg: github.com/go-playground/form/v4/benchmarks -BenchmarkSimpleUserDecodeStruct-8 8704111 121.1 ns/op 64 B/op 1 allocs/op -BenchmarkSimpleUserDecodeStructParallel-8 35916134 32.89 ns/op 64 B/op 1 allocs/op -BenchmarkSimpleUserEncodeStruct-8 3746173 320.7 ns/op 485 B/op 10 allocs/op -BenchmarkSimpleUserEncodeStructParallel-8 7293147 180.0 ns/op 485 B/op 10 allocs/op -BenchmarkPrimitivesDecodeStructAllPrimitivesTypes-8 2993259 400.5 ns/op 96 B/op 1 allocs/op -BenchmarkPrimitivesDecodeStructAllPrimitivesTypesParallel-8 13023300 97.70 ns/op 96 B/op 1 allocs/op -BenchmarkPrimitivesEncodeStructAllPrimitivesTypes-8 643202 1767 ns/op 2977 B/op 35 allocs/op -BenchmarkPrimitivesEncodeStructAllPrimitivesTypesParallel-8 1000000 1202 ns/op 2978 B/op 35 allocs/op -BenchmarkComplexArrayDecodeStructAllTypes-8 172630 6822 ns/op 2008 B/op 121 allocs/op -BenchmarkComplexArrayDecodeStructAllTypesParallel-8 719788 1735 ns/op 2009 B/op 121 allocs/op -BenchmarkComplexArrayEncodeStructAllTypes-8 197052 5839 ns/op 7087 B/op 104 allocs/op -BenchmarkComplexArrayEncodeStructAllTypesParallel-8 348039 3247 ns/op 7089 B/op 104 allocs/op -BenchmarkComplexMapDecodeStructAllTypes-8 139246 8550 ns/op 5313 B/op 130 allocs/op -BenchmarkComplexMapDecodeStructAllTypesParallel-8 409018 3143 ns/op 5317 B/op 130 allocs/op -BenchmarkComplexMapEncodeStructAllTypes-8 208833 5515 ns/op 4257 B/op 103 allocs/op -BenchmarkComplexMapEncodeStructAllTypesParallel-8 523833 2182 ns/op 4258 B/op 103 allocs/op -BenchmarkDecodeNestedStruct-8 807690 1408 ns/op 344 B/op 14 allocs/op -BenchmarkDecodeNestedStructParallel-8 3409441 359.6 ns/op 344 B/op 14 allocs/op -BenchmarkEncodeNestedStruct-8 1488520 803.6 ns/op 653 B/op 16 allocs/op -BenchmarkEncodeNestedStructParallel-8 3570204 346.6 ns/op 653 B/op 16 allocs/op -``` - -Competitor benchmarks can be found [here](https://github.com/go-playground/form/blob/master/benchmarks/benchmarks.md) - -Complimentary Software ----------------------- - -Here is a list of software that compliments using this library post decoding. - -* [Validator](https://github.com/go-playground/validator) - Go Struct and Field validation, including Cross Field, Cross Struct, Map, Slice and Array diving. -* [mold](https://github.com/go-playground/mold) - Is a general library to help modify or set data within data structures and other objects. - -License ------- -Distributed under MIT License, please see license file in code for more details. diff --git a/toolkit/form/_examples/decoder-embedded/main.go b/toolkit/form/_examples/decoder-embedded/main.go deleted file mode 100644 index c75fab2b..00000000 --- a/toolkit/form/_examples/decoder-embedded/main.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "fmt" - "log" - "net/url" - - "github.com/go-playground/form/v4" -) - -// A ... -type A struct { - Field string -} - -// B ... -type B struct { - A - Field string -} - -// use a single instance of Decoder, it caches struct info -var decoder *form.Decoder - -func main() { - decoder = form.NewDecoder() - - // this simulates the results of http.Request's ParseForm() function - values := parseFormB() - - var b B - - // must pass a pointer - err := decoder.Decode(&b, values) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", b) - - values = parseFormAB() - - // must pass a pointer - err = decoder.Decode(&b, values) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", b) -} - -// this simulates the results of http.Request's ParseForm() function -func parseFormB() url.Values { - return url.Values{ - "Field": []string{"B FieldVal"}, - } -} - -// this simulates the results of http.Request's ParseForm() function -func parseFormAB() url.Values { - return url.Values{ - "Field": []string{"B FieldVal"}, - "A.Field": []string{"A FieldVal"}, - } -} diff --git a/toolkit/form/_examples/decoder/full.go b/toolkit/form/_examples/decoder/full.go deleted file mode 100644 index 6028dbf4..00000000 --- a/toolkit/form/_examples/decoder/full.go +++ /dev/null @@ -1,173 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/form" - "log" - "net/url" -) - -//
-// -// -// -// -// -// -// -// -// -// -// -// -//
- -// Address contains address information -type Address struct { - Name string - Phone string -} - -// User contains user information -type User struct { - Name string - Age uint8 - Gender string - Address []Address - Active bool `form:"active"` - MapExample map[string]string - NestedMap map[string]map[string]string - NestedArray [][]string - Extra map[string]interface{} `form:"+"` - Others struct { - Other1 int - Other2 int - Others map[string]interface{} `form:"+"` - } - Leader *User -} - -// use a single instance of Decoder, it caches struct info -var decoder *form.Decoder - -func main() { - decoder = form.NewDecoder() - decoder.SetNamespacePrefix("[") - decoder.SetNamespaceSuffix("]") - - // this simulates the results of http.Request's ParseForm() function - values := parseForm2() - - for i := 0; i < 1; i++ { - var user User - - // must pass a pointer - err := decoder.Decode(&user, values) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", user) - } - - //userMap := make(map[string]interface{}) - //// must pass a pointer - //err := decoder.Decode(&userMap, values) - //if err != nil { - // log.Panic(err) - //} - // - //fmt.Printf("%#v\n", userMap) - -} - -// this simulates the results of http.Request's ParseForm() function -func parseForm() url.Values { - return url.Values{ - "Name": []string{"joeybloggs"}, - "Age": []string{"3"}, - "Gender": []string{"Male"}, - "Address[0].Name": []string{"26 Here Blvd."}, - "Address[0].Phone": []string{"9(999)999-9999"}, - "Address[1].Name": []string{"26 There Blvd."}, - "Address[1].Phone": []string{"1(111)111-1111"}, - "active": []string{"true"}, - "MapExample[key]": []string{"value"}, - "MapExample[key1]": []string{"value1"}, - "NestedMap[key][key]": []string{"value"}, - "NestedMap[key][key1]": []string{"value1"}, - "NestedArray[0][0]": []string{"value"}, - "other1": []string{"1"}, - "other2": []string{"2"}, - "Leader.Name": []string{"jack"}, - "Others.Other1": []string{"1"}, - "Others.Other2": []string{"2"}, - "Others[Other3]": []string{"3"}, - "Others[Other4]": []string{"4"}, - "a": []string{"5"}, - "b": []string{"b"}, - "c[0]": []string{"c"}, - "c[1]": []string{"d"}, - "c[2]": []string{"e"}, - "d[key]": []string{"value"}, - "d[key1]": []string{"value1"}, - "e[key][key]": []string{"value"}, - "e[key][key1]": []string{"value1"}, - "f[0][0]": []string{"value"}, - "f[0][1]": []string{"value1"}, - "f[1][0]": []string{"value10"}, - } -} - -func parseForm2() url.Values { - return url.Values{ - "Name": []string{"joeybloggs"}, - "Age": []string{"3"}, - "Gender": []string{"Male"}, - "Address[0][Name]": []string{"26 Here Blvd."}, - "Address[0][Phone]": []string{"9(999)999-9999"}, - "Address[1][Name]": []string{"26 There Blvd."}, - "Address[1][Phone]": []string{"1(111)111-1111"}, - "active": []string{"true"}, - "MapExample[key]": []string{"value"}, - "NestedMap[key][key]": []string{"value"}, - "NestedArray[0][0]": []string{"value"}, - "other1": []string{"1"}, - "other2": []string{"2"}, - "Leader.Name": []string{"jack"}, - "Leader[Name]": []string{"jack"}, - "Others[Other1]": []string{"1"}, - "Others[Other2]": []string{"2"}, - "Others[Other3]": []string{"3"}, - "Others[Other4]": []string{"4"}, - "a": []string{"5"}, - "b": []string{"b"}, - "c[0]": []string{"c"}, - "c[1]": []string{"d"}, - "c[2]": []string{"e"}, - "d[key]": []string{"value"}, - "d[key1]": []string{"value1"}, - "e[key][key]": []string{"value"}, - "e[key][key1]": []string{"value1"}, - "f[0][0]": []string{"value"}, - "f[0][1]": []string{"value1"}, - "f[1][0]": []string{"value10"}, - } -} - -type A struct { - B string `form:"b,c"` -} - -type ParameterWrapper struct { - Parameter A `json:"parameter" form:"parameter"` -} - -func parseForm3() url.Values { - // parameter[product_code] - return url.Values{ - //"parameter[b]": []string{"b"}, - "parameter[c]": []string{"b"}, - } -} diff --git a/toolkit/form/_examples/encoder-embedded/main.go b/toolkit/form/_examples/encoder-embedded/main.go deleted file mode 100644 index a0a6e8a3..00000000 --- a/toolkit/form/_examples/encoder-embedded/main.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "fmt" - "log" - - "github.com/go-playground/form/v4" -) - -// A ... -type A struct { - Field string -} - -// B ... -type B struct { - A - Field string -} - -// use a single instance of Encoder, it caches struct info -var encoder *form.Encoder - -func main() { - - type A struct { - Field string - } - - type B struct { - A - Field string - } - - b := B{ - A: A{ - Field: "A Val", - }, - Field: "B Val", - } - - encoder = form.NewEncoder() - - v, err := encoder.Encode(b) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", v) - - encoder.SetAnonymousMode(form.AnonymousSeparate) - v, err = encoder.Encode(b) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", v) -} diff --git a/toolkit/form/_examples/encoder-omitempty/main.go b/toolkit/form/_examples/encoder-omitempty/main.go deleted file mode 100644 index 9a529007..00000000 --- a/toolkit/form/_examples/encoder-omitempty/main.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "fmt" - "log" - - "github.com/go-playground/form/v4" -) - -// Test ... -type Test struct { - String string `form:",omitempty"` - Array []string - Map map[string]string -} - -// use a single instance of Encoder, it caches struct info -var encoder *form.Encoder - -func main() { - var t Test - - encoder = form.NewEncoder() - - values, err := encoder.Encode(t) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", values) - - t.String = "String Val" - t.Array = []string{"arr1"} - - values, err = encoder.Encode(t) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", values) -} diff --git a/toolkit/form/_examples/encoder/full.go b/toolkit/form/_examples/encoder/full.go deleted file mode 100644 index e3a1fd17..00000000 --- a/toolkit/form/_examples/encoder/full.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "fmt" - "log" - - "github.com/go-playground/form/v4" -) - -// Address contains address information -type Address struct { - Name string - Phone string -} - -// User contains user information -type User struct { - Name string - Age uint8 - Gender string - Address []Address - Active bool `form:"active"` - MapExample map[string]string - NestedMap map[string]map[string]string - NestedArray [][]string -} - -// use a single instance of Encoder, it caches struct info -var encoder *form.Encoder - -func main() { - encoder = form.NewEncoder() - - user := User{ - Name: "joeybloggs", - Age: 3, - Gender: "Male", - Address: []Address{ - {Name: "26 Here Blvd.", Phone: "9(999)999-9999"}, - {Name: "26 There Blvd.", Phone: "1(111)111-1111"}, - }, - Active: true, - MapExample: map[string]string{"key": "value"}, - NestedMap: map[string]map[string]string{"key": {"key": "value"}}, - NestedArray: [][]string{{"value"}}, - } - - // must pass a pointer - values, err := encoder.Encode(&user) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", values) -} diff --git a/toolkit/form/benchmarks/benchmarks.md b/toolkit/form/benchmarks/benchmarks.md deleted file mode 100644 index 70f78671..00000000 --- a/toolkit/form/benchmarks/benchmarks.md +++ /dev/null @@ -1,31 +0,0 @@ -## Benchmarks - -All Benchmarks Last Run Nov 17, 2019 - -Run on MacBook Pro (15-inch, 2017) using go version go1.13.4 darwin/amd64 -go test -run=NONE -bench=. -benchmem=true - -### go-playground/form -```go -BenchmarkSimpleUserDecodeStruct-8 4447569 255 ns/op 64 B/op 1 allocs/op -BenchmarkSimpleUserDecodeStructParallel-8 14087551 77.2 ns/op 64 B/op 1 allocs/op -BenchmarkSimpleUserEncodeStruct-8 1863354 645 ns/op 485 B/op 10 allocs/op -BenchmarkSimpleUserEncodeStructParallel-8 5554753 208 ns/op 485 B/op 10 allocs/op -BenchmarkPrimitivesDecodeStructAllPrimitivesTypes-8 1345276 881 ns/op 96 B/op 1 allocs/op -BenchmarkPrimitivesDecodeStructAllPrimitivesTypesParallel-8 4729965 259 ns/op 96 B/op 1 allocs/op -BenchmarkPrimitivesEncodeStructAllPrimitivesTypes-8 303967 3331 ns/op 2977 B/op 35 allocs/op -BenchmarkPrimitivesEncodeStructAllPrimitivesTypesParallel-8 1094600 1077 ns/op 2978 B/op 35 allocs/op -BenchmarkComplexArrayDecodeStructAllTypes-8 76928 14567 ns/op 2248 B/op 121 allocs/op -BenchmarkComplexArrayDecodeStructAllTypesParallel-8 292060 4355 ns/op 2249 B/op 121 allocs/op -BenchmarkComplexArrayEncodeStructAllTypes-8 94536 11334 ns/op 7113 B/op 104 allocs/op -BenchmarkComplexArrayEncodeStructAllTypesParallel-8 298318 3633 ns/op 7112 B/op 104 allocs/op -BenchmarkComplexMapDecodeStructAllTypes-8 58084 18635 ns/op 5306 B/op 130 allocs/op -BenchmarkComplexMapDecodeStructAllTypesParallel-8 187159 5454 ns/op 5308 B/op 130 allocs/op -BenchmarkComplexMapEncodeStructAllTypes-8 101962 11763 ns/op 6971 B/op 129 allocs/op -BenchmarkComplexMapEncodeStructAllTypesParallel-8 312925 4185 ns/op 6970 B/op 129 allocs/op -BenchmarkDecodeNestedStruct-8 469940 2547 ns/op 384 B/op 14 allocs/op -BenchmarkDecodeNestedStructParallel-8 1486963 810 ns/op 384 B/op 14 allocs/op -BenchmarkEncodeNestedStruct-8 796798 1501 ns/op 693 B/op 16 allocs/op -BenchmarkEncodeNestedStructParallel-8 2290203 520 ns/op 693 B/op 16 allocs/op - -``` \ No newline at end of file diff --git a/toolkit/form/benchmarks/benchmarks_test.go b/toolkit/form/benchmarks/benchmarks_test.go deleted file mode 100644 index 4d4940d7..00000000 --- a/toolkit/form/benchmarks/benchmarks_test.go +++ /dev/null @@ -1,653 +0,0 @@ -package benchmarks - -import ( - "net/url" - "testing" - - "github.com/go-playground/form/v4" -) - -// Simple Benchmarks - -type User struct { - FirstName string `form:"fname" schema:"fname" formam:"fname"` - LastName string `form:"lname" schema:"lname" formam:"lname"` - Email string `form:"email" schema:"email" formam:"email"` - Age uint8 `form:"age" schema:"age" formam:"age"` -} - -func getUserStructValues() url.Values { - return url.Values{ - "fname": []string{"Joey"}, - "lname": []string{"Bloggs"}, - "email": []string{"joeybloggs@gmail.com"}, - "age": []string{"32"}, - } -} - -func getUserStruct() *User { - return &User{ - FirstName: "Joey", - LastName: "Bloggs", - Email: "joeybloggs@gmail.com", - Age: 32, - } -} - -func BenchmarkSimpleUserDecodeStruct(b *testing.B) { - - values := getUserStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - var test User - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } -} - -func BenchmarkSimpleUserDecodeStructParallel(b *testing.B) { - - values := getUserStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var test User - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } - }) -} -func BenchmarkSimpleUserEncodeStruct(b *testing.B) { - - test := getUserStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } -} - -func BenchmarkSimpleUserEncodeStructParallel(b *testing.B) { - - test := getUserStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } - }) -} - -// Primitives ALL types - -type PrimitivesStruct struct { - String string - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - Uint uint - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Uint64 uint64 - Float32 float32 - Float64 float64 - Bool bool -} - -func getPrimitivesStructValues() url.Values { - return url.Values{ - "String": []string{"joeybloggs"}, - "Int": []string{"1"}, - "Int8": []string{"2"}, - "Int16": []string{"3"}, - "Int32": []string{"4"}, - "Int64": []string{"5"}, - "Uint": []string{"1"}, - "Uint8": []string{"2"}, - "Uint16": []string{"3"}, - "Uint32": []string{"4"}, - "Uint64": []string{"5"}, - "Float32": []string{"1.1"}, - "Float64": []string{"5.0"}, - "Bool": []string{"true"}, - } -} - -func getPrimitivesStruct() *PrimitivesStruct { - return &PrimitivesStruct{ - String: "joeybloggs", - Int: 1, - Int8: 2, - Int16: 3, - Int32: 4, - Int64: 5, - Uint: 1, - Uint8: 2, - Uint16: 3, - Uint32: 4, - Uint64: 5, - Float32: 1.1, - Float64: 5.0, - Bool: true, - } -} - -func BenchmarkPrimitivesDecodeStructAllPrimitivesTypes(b *testing.B) { - values := getPrimitivesStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - var test PrimitivesStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } -} - -func BenchmarkPrimitivesDecodeStructAllPrimitivesTypesParallel(b *testing.B) { - values := getPrimitivesStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var test PrimitivesStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } - }) -} - -func BenchmarkPrimitivesEncodeStructAllPrimitivesTypes(b *testing.B) { - test := getPrimitivesStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } -} - -func BenchmarkPrimitivesEncodeStructAllPrimitivesTypesParallel(b *testing.B) { - test := getPrimitivesStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } - }) -} - -// Complex Array ALL types - -type ComplexArrayStruct struct { - String []string - StringPtr []*string - Int []int - IntPtr []*int - Int8 []int8 - Int8Ptr []*int8 - Int16 []int16 - Int16Ptr []*int16 - Int32 []int32 - Int32Ptr []*int32 - Int64 []int64 - Int64Ptr []*int64 - Uint []uint - UintPtr []*uint - Uint8 []uint8 - Uint8Ptr []*uint8 - Uint16 []uint16 - Uint16Ptr []*uint16 - Uint32 []uint32 - Uint32Ptr []*uint32 - Uint64 []uint64 - Uint64Ptr []*uint64 - NestedInt [][]int - NestedIntPtr [][]*int -} - -func getComplexArrayStructValues() url.Values { - return url.Values{ - "String": []string{"joeybloggs"}, - "StringPtr": []string{"joeybloggs"}, - "Int": []string{"1", "2"}, - "IntPtr": []string{"1", "2"}, - "Int8[0]": []string{"1"}, - "Int8[1]": []string{"2"}, - "Int8Ptr[0]": []string{"1"}, - "Int8Ptr[1]": []string{"2"}, - "Int16": []string{"1", "2"}, - "Int16Ptr": []string{"1", "2"}, - "Int32": []string{"1", "2"}, - "Int32Ptr": []string{"1", "2"}, - "Int64": []string{"1", "2"}, - "Int64Ptr": []string{"1", "2"}, - "Uint": []string{"1", "2"}, - "UintPtr": []string{"1", "2"}, - "Uint8[0]": []string{"1"}, - "Uint8[1]": []string{"2"}, - "Uint8Ptr[0]": []string{"1"}, - "Uint8Ptr[1]": []string{"2"}, - "Uint16": []string{"1", "2"}, - "Uint16Ptr": []string{"1", "2"}, - "Uint32": []string{"1", "2"}, - "Uint32Ptr": []string{"1", "2"}, - "Uint64": []string{"1", "2"}, - "Uint64Ptr": []string{"1", "2"}, - "NestedInt[0][0]": []string{"1"}, - "NestedIntPtr[0][1]": []string{"1"}, - } -} - -func getComplexArrayStruct() *ComplexArrayStruct { - - s := "joeybloggs" - - i1 := int(1) - i2 := int(2) - i81 := int8(1) - i82 := int8(2) - i161 := int16(1) - i162 := int16(2) - i321 := int32(1) - i322 := int32(2) - i641 := int64(1) - i642 := int64(2) - - ui1 := uint(1) - ui2 := uint(2) - ui81 := uint8(1) - ui82 := uint8(2) - ui161 := uint16(1) - ui162 := uint16(2) - ui321 := uint32(1) - ui322 := uint32(2) - ui641 := uint64(1) - ui642 := uint64(2) - - return &ComplexArrayStruct{ - String: []string{s}, - StringPtr: []*string{&s}, - Int: []int{i1, i2}, - IntPtr: []*int{&i1, &i2}, - Int8: []int8{i81, i82}, - Int8Ptr: []*int8{&i81, &i82}, - Int16: []int16{i161, i162}, - Int16Ptr: []*int16{&i161, &i162}, - Int32: []int32{i321, i322}, - Int32Ptr: []*int32{&i321, &i322}, - Int64: []int64{i641, i642}, - Int64Ptr: []*int64{&i641, &i642}, - Uint: []uint{ui1, ui2}, - UintPtr: []*uint{&ui1, &ui2}, - Uint8: []uint8{ui81, ui82}, - Uint8Ptr: []*uint8{&ui81, &ui82}, - Uint16: []uint16{ui161, ui162}, - Uint16Ptr: []*uint16{&ui161, &ui162}, - Uint32: []uint32{ui321, ui322}, - Uint32Ptr: []*uint32{&ui321, &ui322}, - Uint64: []uint64{ui641, ui642}, - Uint64Ptr: []*uint64{&ui641, &ui642}, - NestedInt: [][]int{{i1}}, - NestedIntPtr: [][]*int{nil, {&i1}}, - } -} - -func BenchmarkComplexArrayDecodeStructAllTypes(b *testing.B) { - values := getComplexArrayStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - var test ComplexArrayStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } -} - -func BenchmarkComplexArrayDecodeStructAllTypesParallel(b *testing.B) { - values := getComplexArrayStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var test ComplexArrayStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } - }) -} - -func BenchmarkComplexArrayEncodeStructAllTypes(b *testing.B) { - test := getComplexArrayStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } -} - -func BenchmarkComplexArrayEncodeStructAllTypesParallel(b *testing.B) { - test := getComplexArrayStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } - }) -} - -// Complex Map ALL types - -type ComplexMapStruct struct { - String map[string]string - StringPtr map[*string]*string - Int map[int]int - IntPtr map[*int]*int - Int8 map[int8]int8 - Int8Ptr map[*int8]*int8 - Int16 map[int16]int16 - Int16Ptr map[*int16]*int16 - Int32 map[int32]int32 - Int32Ptr map[*int32]*int32 - Int64 map[int64]int64 - Int64Ptr map[*int64]*int64 - Uint map[uint]uint - UintPtr map[*uint]*uint - Uint8 map[uint8]uint8 - Uint8Ptr map[*uint8]*uint8 - Uint16 map[uint16]uint16 - Uint16Ptr map[*uint16]*uint16 - Uint32 map[uint32]uint32 - Uint32Ptr map[*uint32]*uint32 - Uint64 map[uint64]uint64 - Uint64Ptr map[*uint64]*uint64 - NestedInt map[int]map[int]int - NestedIntPtr map[*int]map[*int]*int -} - -func getComplexMapStructValues() url.Values { - return url.Values{ - "String[key]": []string{"value"}, - "StringPtr[key]": []string{"value"}, - "Int[0]": []string{"1"}, - "IntPtr[0]": []string{"1"}, - "Int8[0]": []string{"1"}, - "Int8Ptr[0]": []string{"1"}, - "Int16[0]": []string{"1"}, - "Int16Ptr[0]": []string{"1"}, - "Int32[0]": []string{"1"}, - "Int32Ptr[0]": []string{"1"}, - "Int64[0]": []string{"1"}, - "Int64Ptr[0]": []string{"1"}, - "Uint[0]": []string{"1"}, - "UintPtr[0]": []string{"1"}, - "Uint8[0]": []string{"1"}, - "Uint8Ptr[0]": []string{"1"}, - "Uint16[0]": []string{"1"}, - "Uint16Ptr[0]": []string{"1"}, - "Uint32[0]": []string{"1"}, - "Uint32Ptr[0]": []string{"1"}, - "Uint64[0]": []string{"1"}, - "Uint64Ptr[0]": []string{"1"}, - "NestedInt[1][2]": []string{"3"}, - "NestedIntPtr[1][2]": []string{"3"}, - } -} - -func getComplexMapStruct() *ComplexMapStruct { - - key := "key" - val := "value" - - i0 := int(0) - i1 := int(1) - i2 := int(2) - i3 := int(3) - i80 := int8(0) - i81 := int8(1) - i160 := int16(0) - i161 := int16(1) - i320 := int32(0) - i321 := int32(1) - i640 := int64(0) - i641 := int64(1) - - ui0 := uint(0) - ui1 := uint(1) - ui80 := uint8(0) - ui81 := uint8(1) - ui160 := uint16(0) - ui161 := uint16(1) - ui320 := uint32(0) - ui321 := uint32(1) - ui640 := uint64(0) - ui641 := uint64(1) - - return &ComplexMapStruct{ - String: map[string]string{key: val}, - StringPtr: map[*string]*string{&key: &val}, - Int: map[int]int{i0: i1}, - IntPtr: map[*int]*int{&i0: &i1}, - Int8: map[int8]int8{i80: i81}, - Int8Ptr: map[*int8]*int8{&i80: &i81}, - Int16: map[int16]int16{i160: i161}, - Int16Ptr: map[*int16]*int16{&i160: &i161}, - Int32: map[int32]int32{i320: i321}, - Int32Ptr: map[*int32]*int32{&i320: &i321}, - Int64: map[int64]int64{i640: i641}, - Int64Ptr: map[*int64]*int64{&i640: &i641}, - Uint: map[uint]uint{ui0: ui1}, - UintPtr: map[*uint]*uint{&ui0: &ui1}, - Uint8: map[uint8]uint8{ui80: ui81}, - Uint8Ptr: map[*uint8]*uint8{&ui80: &ui81}, - Uint16: map[uint16]uint16{ui160: ui161}, - Uint16Ptr: map[*uint16]*uint16{&ui160: &ui161}, - Uint32: map[uint32]uint32{ui320: ui321}, - Uint32Ptr: map[*uint32]*uint32{&ui320: &ui321}, - Uint64: map[uint64]uint64{ui640: ui641}, - Uint64Ptr: map[*uint64]*uint64{&ui640: &ui641}, - NestedInt: map[int]map[int]int{i1: {i2: i3}}, - NestedIntPtr: map[*int]map[*int]*int{&i1: {&i2: &i3}}, - } -} - -func BenchmarkComplexMapDecodeStructAllTypes(b *testing.B) { - values := getComplexMapStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - var test ComplexMapStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } -} - -func BenchmarkComplexMapDecodeStructAllTypesParallel(b *testing.B) { - values := getComplexMapStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var test ComplexMapStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } - }) -} - -func BenchmarkComplexMapEncodeStructAllTypes(b *testing.B) { - test := getComplexMapStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } -} - -func BenchmarkComplexMapEncodeStructAllTypesParallel(b *testing.B) { - test := getComplexMapStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } - }) -} - -// NestedStruct Benchmarks - -type Nested2 struct { - Value string - Nested2 *Nested2 -} - -type Nested struct { - Value string -} - -type NestedStruct struct { - Nested - NestedArray []Nested - NestedPtrArray []*Nested - Nested2 Nested2 -} - -func getNestedStructValues() url.Values { - return url.Values{ - // Nested Field - "Value": []string{"value"}, - // Nested Array - "NestedArray[0].Value": []string{"value"}, - "NestedArray[1].Value": []string{"value"}, - // Nested Array Ptr - "NestedPtrArray[0].Value": []string{"value"}, - "NestedPtrArray[1].Value": []string{"value"}, - // Nested 2 - "Nested2.Value": []string{"value"}, - "Nested2.Nested2.Value": []string{"value"}, - } -} - -func getNestedStruct() *NestedStruct { - - nested := Nested{ - Value: "value", - } - - nested2 := Nested2{ - Value: "value", - Nested2: &Nested2{Value: "value"}, - } - - return &NestedStruct{ - Nested: nested, - NestedArray: []Nested{nested, nested}, - NestedPtrArray: []*Nested{&nested, &nested}, - Nested2: nested2, - } -} - -func BenchmarkDecodeNestedStruct(b *testing.B) { - - values := getNestedStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - var test NestedStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } -} - -func BenchmarkDecodeNestedStructParallel(b *testing.B) { - - values := getNestedStructValues() - decoder := form.NewDecoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var test NestedStruct - if err := decoder.Decode(&test, values); err != nil { - b.Error(err) - } - } - }) -} - -func BenchmarkEncodeNestedStruct(b *testing.B) { - - test := getNestedStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - for n := 0; n < b.N; n++ { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } -} - -func BenchmarkEncodeNestedStructParallel(b *testing.B) { - - test := getNestedStruct() - encoder := form.NewEncoder() - - b.ReportAllocs() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if _, err := encoder.Encode(&test); err != nil { - b.Error(err) - } - } - }) -} diff --git a/toolkit/form/cache.go b/toolkit/form/cache.go deleted file mode 100644 index 2e31ecce..00000000 --- a/toolkit/form/cache.go +++ /dev/null @@ -1,142 +0,0 @@ -package form - -import ( - "github.com/goccy/go-reflect" - "sort" - "strings" - "sync" - "sync/atomic" -) - -type cacheFields []cachedField - -func (s cacheFields) Len() int { - return len(s) -} - -func (s cacheFields) Less(i, j int) bool { - return !s[i].isAnonymous -} - -func (s cacheFields) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -type cachedField struct { - idx int - name string - isAnonymous bool - isOmitEmpty bool - isExtra bool -} - -type cachedStruct struct { - fields cacheFields -} - -type structCacheMap struct { - m atomic.Value // map[reflect.Type]*cachedStruct - lock sync.Mutex - tagFn TagNameFunc -} - -// TagNameFunc allows for adding of a custom tag name parser -type TagNameFunc func(field reflect.StructField) string - -func newStructCacheMap() *structCacheMap { - - sc := new(structCacheMap) - sc.m.Store(make(map[reflect.Type]*cachedStruct)) - - return sc -} - -func (s *structCacheMap) Get(key reflect.Type) (value *cachedStruct, ok bool) { - value, ok = s.m.Load().(map[reflect.Type]*cachedStruct)[key] - return -} - -func (s *structCacheMap) Set(key reflect.Type, value *cachedStruct) { - - m := s.m.Load().(map[reflect.Type]*cachedStruct) - - nm := make(map[reflect.Type]*cachedStruct, len(m)+1) - for k, v := range m { - nm[k] = v - } - nm[key] = value - s.m.Store(nm) -} - -func (s *structCacheMap) parseStruct(mode Mode, current reflect.Value, key reflect.Type, tagName string) *cachedStruct { - - s.lock.Lock() - - // could have been multiple trying to access, but once first is done this ensures struct - // isn't parsed again. - cs, ok := s.Get(key) - if ok { - s.lock.Unlock() - return cs - } - - typ := current.Type() - cs = &cachedStruct{fields: make([]cachedField, 0, 4)} // init 4, betting most structs decoding into have at aleast 4 fields. - - numFields := current.NumField() - - var fld reflect.StructField - var name string - var idx int - var isOmitEmpty bool - var isExtra bool - - for i := 0; i < numFields; i++ { - isOmitEmpty = false - isExtra = false - fld = typ.Field(i) - - if fld.PkgPath != blank && !fld.Anonymous { - continue - } - - if s.tagFn != nil { - name = s.tagFn(fld) - } else { - name = fld.Tag.Get(tagName) - } - - if name == ignore { - continue - } - - if mode == ModeExplicit && len(name) == 0 { - continue - } - - // check for omitempty - if idx = strings.LastIndexByte(name, ','); idx != -1 { - isOmitEmpty = name[idx+1:] == "omitempty" - if isOmitEmpty { - name = name[:idx] - } - } - - if len(name) == 0 { - name = fld.Name - } - - if name == "+" { - isExtra = true - } - - cs.fields = append(cs.fields, cachedField{idx: i, name: name, isAnonymous: fld.Anonymous, isOmitEmpty: isOmitEmpty, isExtra: isExtra}) - } - - sort.Sort(cs.fields) - s.Set(typ, cs) - - s.lock.Unlock() - - return cs -} diff --git a/toolkit/form/cache_test.go b/toolkit/form/cache_test.go deleted file mode 100644 index 79a43799..00000000 --- a/toolkit/form/cache_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package form - -import ( - "github.com/goccy/go-reflect" - "testing" - - . "github.com/go-playground/assert/v2" -) - -// NOTES: -// - Run "go test" to run tests -// - Run "gocov test | gocov report" to report on test converage by file -// - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called -// -// or -// -// -- may be a good idea to change to output path to somewherelike /tmp -// go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html -// -// -// go test -cpuprofile cpu.out -// ./validator.test -test.bench=. -test.cpuprofile=cpu.prof -// go tool pprof validator.test cpu.prof -// -// -// go test -memprofile mem.out - -func TestDecoderMultipleSimultaniousParseStructRequests(t *testing.T) { - - sc := newStructCacheMap() - - type Struct struct { - Array []int - } - - proceed := make(chan struct{}) - - var test Struct - - sv := reflect.ValueOf(test) - typ := sv.Type() - - for i := 0; i < 200; i++ { - go func() { - <-proceed - s := sc.parseStruct(ModeImplicit, sv, typ, "form") - NotEqual(t, s, nil) - }() - } - - close(proceed) -} diff --git a/toolkit/form/decoder.go b/toolkit/form/decoder.go deleted file mode 100644 index 25716ca1..00000000 --- a/toolkit/form/decoder.go +++ /dev/null @@ -1,814 +0,0 @@ -package form - -import ( - "fmt" - "github.com/goccy/go-reflect" - "github.com/samber/lo" - "log" - "net/url" - "slices" - "strconv" - "strings" - "time" -) - -const ( - errArraySize = "Array size of '%d' is larger than the maximum currently set on the decoder of '%d'. To increase this limit please see, SetMaxArraySize(size uint)" - errMissingStartBracket = "Invalid formatting for key '%s' missing '[' bracket" - errMissingEndBracket = "Invalid formatting for key '%s' missing ']' bracket" -) - -type decoder struct { - d *Decoder - errs DecodeErrors - dm dataMap - values url.Values - decoded []string - maxKeyLen int - namespace []byte -} - -func (d *decoder) setError(namespace []byte, err error) { - if d.errs == nil { - d.errs = make(DecodeErrors) - } - d.errs[string(namespace)] = err -} - -func (d *decoder) findAlias(ns string) *recursiveData { - for i := 0; i < len(d.dm); i++ { - if d.dm[i].alias == ns { - return d.dm[i] - } - } - return nil -} - -func (d *decoder) append(k string, i, idx int, isNum bool) { - var rd *recursiveData - if rd = d.findAlias(k[:idx]); rd == nil { - - l := len(d.dm) + 1 - - if l > cap(d.dm) { - dm := make(dataMap, l) - copy(dm, d.dm) - rd = new(recursiveData) - rd.sliceLen = defaultSliceLen - dm[len(d.dm)] = rd - d.dm = dm - } else { - l = len(d.dm) - d.dm = d.dm[:l+1] - rd = d.dm[l] - rd.sliceLen = defaultSliceLen - rd.keys = rd.keys[0:0] - } - - rd.alias = k[:idx] - } - - // is map + key - ke := key{ - ivalue: -1, - value: k[idx+1 : i], - searchValue: k[idx : i+1], - } - - // is key is number, most likely array key, keep track of just in case an array/slice. - if isNum { - - // no need to check for error, it will always pass - // as we have done the checking to ensure - // the value is a number ahead of time. - var err error - ke.ivalue, err = strconv.Atoi(ke.value) - if err != nil { - ke.ivalue = -1 - } - - if ke.ivalue > rd.sliceLen { - rd.sliceLen = ke.ivalue - - } - } - - rd.keys = append(rd.keys, ke) -} - -func (d *decoder) parseMapData() { - // already parsed - if len(d.dm) > 0 { - return - } - - d.maxKeyLen = 0 - d.dm = d.dm[0:0] - - var i int - var idx int - var insideBracket bool - var isNum bool - - for k := range d.values { - if len(k) > d.maxKeyLen { - d.maxKeyLen = len(k) - } - - for i = 0; i < len(k); i++ { - - switch k[i] { - case '[': - idx = i - insideBracket = true - isNum = true - case ']': - - if !insideBracket { - log.Panicf(errMissingStartBracket, k) - } - - d.append(k, i, idx, isNum) - - insideBracket = false - default: - // checking if not a number, 0-9 is 48-57 in byte, see for yourself fmt.Println('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') - if insideBracket && (k[i] > 57 || k[i] < 48) { - isNum = false - } - } - } - - // if still inside bracket, that means no ending bracket was ever specified - if insideBracket { - log.Panicf(errMissingEndBracket, k) - } - } -} - -func (d *decoder) traverseStruct(v reflect.Value, typ reflect.Type, namespace []byte) (set bool) { - l := len(namespace) - first := l == 0 - - // anonymous structs will still work for caching as the whole definition is stored - // including tags - s, ok := d.d.structCache.Get(typ) - if !ok { - s = d.d.structCache.parseStruct(d.d.mode, v, typ, d.d.tagName) - } - - var extraField *cachedField - for _, f := range s.fields { - if f.isExtra { - f := f - extraField = &f - continue - } - namespace = namespace[:l] - - if f.isAnonymous { - if d.setFieldByType(v.Field(f.idx), namespace, 0) { - set = true - } - } - - names := strings.Split(f.name, ",") - for _, name := range names { - namespace = namespace[:l] - if first { - name := "[" + name + "]" - namespace = append(namespace, name...) - } else { - namespace = append(namespace, d.d.namespacePrefix...) - namespace = append(namespace, name...) - namespace = append(namespace, d.d.namespaceSuffix...) - } - - if d.setFieldByType(v.Field(f.idx), namespace, 0) { - set = true - break - } - } - } - - if extraField != nil { - namespace = namespace[:l] - if d.setFieldByType(v.Field(extraField.idx), namespace, 0) { - set = true - } - } - - return -} - -func (d *decoder) populateMap(v reflect.Value, namespace []byte) (set bool) { - var rd *recursiveData - - d.parseMapData() - - // no natural map support so skip directly to dm lookup - if rd = d.findAlias(string(namespace)); rd == nil { - return - } - - var existing bool - var kv key - var mp reflect.Value - var mk reflect.Value - - typ := v.Type() - if typ.Kind() != reflect.Map { - typ = reflect.TypeOf(map[string]interface{}{}) - } - - if v.IsNil() { - mp = reflect.MakeMap(typ) - } else { - existing = true - mp = v - } - - for i := 0; i < len(rd.keys); i++ { - newVal := reflect.New(typ.Elem()).Elem() - mk = reflect.New(typ.Key()).Elem() - kv = rd.keys[i] - - if err := d.getMapKey(kv.value, mk, namespace); err != nil { - d.setError(namespace, err) - continue - } - - if d.setFieldByType(newVal, append(namespace, kv.searchValue...), 0) { - set = true - mp.SetMapIndex(mk, newVal) - } - } - - if !set || existing { - return - } - - v.Set(mp) - return -} - -func (d *decoder) populateSlice(ok bool, arr []string, v reflect.Value, namespace []byte) (set bool) { - d.parseMapData() - // slice elements could be mixed eg. number and non-numbers Value[0]=[]string{"10"} and Value=[]string{"10","20"} - - if ok && len(arr) > 0 { - var varr reflect.Value - - var ol int - l := len(arr) - - if v.IsNil() { - varr = reflect.MakeSlice(v.Type(), len(arr), len(arr)) - } else { - - ol = v.Len() - l += ol - - if v.Cap() <= l { - varr = reflect.MakeSlice(v.Type(), l, l) - } else { - // preserve predefined capacity, possibly for reuse after decoding - varr = reflect.MakeSlice(v.Type(), l, v.Cap()) - } - reflect.Copy(varr, v) - } - - for i := ol; i < l; i++ { - newVal := reflect.New(v.Type().Elem()).Elem() - - if d.setFieldByType(newVal, namespace, i-ol) { - set = true - varr.Index(i).Set(newVal) - } - } - - v.Set(varr) - } - - // maybe it's an numbered array i.e. Phone[0].Number - if rd := d.findAlias(string(namespace)); rd != nil { - - var varr reflect.Value - var kv key - - sl := rd.sliceLen + 1 - - // checking below for maxArraySize, but if array exists and already - // has sufficient capacity allocated then we do not check as the code - // obviously allows a capacity greater than the maxArraySize. - - if v.IsNil() { - - if sl > d.d.maxArraySize { - d.setError(namespace, fmt.Errorf(errArraySize, sl, d.d.maxArraySize)) - return - } - - if v.Type().Kind() != reflect.Slice { - varr = reflect.MakeSlice(reflect.TypeOf(make([]interface{}, 0)), sl, sl) - } else { - varr = reflect.MakeSlice(v.Type(), sl, sl) - } - - } else if v.Len() < sl { - - if v.Cap() <= sl { - - if sl > d.d.maxArraySize { - d.setError(namespace, fmt.Errorf(errArraySize, sl, d.d.maxArraySize)) - return - } - - varr = reflect.MakeSlice(v.Type(), sl, sl) - } else { - varr = reflect.MakeSlice(v.Type(), sl, v.Cap()) - } - - reflect.Copy(varr, v) - - } else { - varr = v - } - - for i := 0; i < len(rd.keys); i++ { - - kv = rd.keys[i] - newVal := reflect.New(varr.Type().Elem()).Elem() - - if kv.ivalue == -1 { - d.setError(namespace, fmt.Errorf("invalid slice index '%s'", kv.value)) - continue - } - - if d.setFieldByType(newVal, append(namespace, kv.searchValue...), 0) { - set = true - varr.Index(kv.ivalue).Set(newVal) - } - } - - if !set { - return - } - - v.Set(varr) - } - return -} - -func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx int) (set bool) { - if slices.Contains(d.decoded, string(namespace)) { - return false - } - - var err error - v, kind := ExtractType(current) - - arr, ok := d.values[string(namespace)] - - if d.d.customTypeFuncs != nil { - - if ok { - if cf, ok := d.d.customTypeFuncs[v.Type()]; ok { - val, err := cf(arr[idx:]) - if err != nil { - d.setError(namespace, err) - return - } - - v.Set(reflect.ValueOf(val)) - set = true - return - } - } - } - switch kind { - case reflect.Interface: - if !ok { - rds := lo.Filter[*recursiveData](d.dm, func(item *recursiveData, index int) bool { - return item.alias == string(namespace) - }) - if len(rds) > 0 { - rd := rds[0] - if rd.sliceLen >= 0 { - set = d.populateSlice(ok, arr, v, namespace) - } else { - set = d.populateMap(v, namespace) - } - } - return - } else if idx == len(arr) { - return - } - v.Set(reflect.ValueOf(arr[idx])) - set = true - - case reflect.Ptr: - newVal := reflect.New(v.Type().Elem()) - if set = d.setFieldByType(newVal.Elem(), namespace, idx); set { - v.Set(newVal) - } - - case reflect.String: - if !ok || idx == len(arr) { - return - } - v.SetString(arr[idx]) - set = true - - case reflect.Uint, reflect.Uint64: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var u64 uint64 - if u64, err = strconv.ParseUint(arr[idx], 10, 64); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetUint(u64) - set = true - - case reflect.Uint8: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var u64 uint64 - if u64, err = strconv.ParseUint(arr[idx], 10, 8); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetUint(u64) - set = true - - case reflect.Uint16: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var u64 uint64 - if u64, err = strconv.ParseUint(arr[idx], 10, 16); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetUint(u64) - set = true - - case reflect.Uint32: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var u64 uint64 - if u64, err = strconv.ParseUint(arr[idx], 10, 32); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetUint(u64) - set = true - - case reflect.Int, reflect.Int64: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var i64 int64 - if i64, err = strconv.ParseInt(arr[idx], 10, 64); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetInt(i64) - set = true - - case reflect.Int8: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var i64 int64 - if i64, err = strconv.ParseInt(arr[idx], 10, 8); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetInt(i64) - set = true - - case reflect.Int16: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var i64 int64 - if i64, err = strconv.ParseInt(arr[idx], 10, 16); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetInt(i64) - set = true - - case reflect.Int32: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var i64 int64 - if i64, err = strconv.ParseInt(arr[idx], 10, 32); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetInt(i64) - set = true - - case reflect.Float32: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var f float64 - if f, err = strconv.ParseFloat(arr[idx], 32); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetFloat(f) - set = true - - case reflect.Float64: - if !ok || idx == len(arr) || len(arr[idx]) == 0 { - return - } - var f float64 - if f, err = strconv.ParseFloat(arr[idx], 64); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetFloat(f) - set = true - - case reflect.Bool: - if !ok || idx == len(arr) { - return - } - var b bool - if b, err = parseBool(arr[idx]); err != nil { - d.setError(namespace, fmt.Errorf("Invalid Boolean Value '%s' Type '%v' Namespace '%s'", arr[idx], v.Type(), string(namespace))) - return - } - v.SetBool(b) - set = true - - case reflect.Slice: - set = d.populateSlice(ok, arr, v, namespace) - - case reflect.Array: - d.parseMapData() - - // array elements could be mixed eg. number and non-numbers Value[0]=[]string{"10"} and Value=[]string{"10","20"} - - if ok && len(arr) > 0 { - var varr reflect.Value - l := len(arr) - overCapacity := v.Len() < l - if overCapacity { - // more values than array capacity, ignore values over capacity as it's possible some would just want - // to grab the first x number of elements; in the future strict mode logic should return an error - fmt.Println("warning number of post form array values is larger than array capacity, ignoring overflow values") - } - varr = reflect.Indirect(reflect.New(reflect.ArrayOf(v.Len(), v.Type().Elem()))) - reflect.Copy(varr, v) - - if v.Len() < len(arr) { - l = v.Len() - } - for i := 0; i < l; i++ { - newVal := reflect.New(v.Type().Elem()).Elem() - - if d.setFieldByType(newVal, namespace, i) { - set = true - varr.Index(i).Set(newVal) - } - } - v.Set(varr) - } - - // maybe it's an numbered array i.e. Phone[0].Number - if rd := d.findAlias(string(namespace)); rd != nil { - var varr reflect.Value - var kv key - - overCapacity := rd.sliceLen >= v.Len() - if overCapacity { - // more values than array capacity, ignore values over capacity as it's possible some would just want - // to grab the first x number of elements; in the future strict mode logic should return an error - fmt.Println("warning number of post form array values is larger than array capacity, ignoring overflow values") - } - varr = reflect.Indirect(reflect.New(reflect.ArrayOf(v.Len(), v.Type().Elem()))) - reflect.Copy(varr, v) - - for i := 0; i < len(rd.keys); i++ { - kv = rd.keys[i] - if kv.ivalue >= v.Len() { - continue - } - newVal := reflect.New(varr.Type().Elem()).Elem() - - if kv.ivalue == -1 { - d.setError(namespace, fmt.Errorf("invalid array index '%s'", kv.value)) - continue - } - - if d.setFieldByType(newVal, append(namespace, kv.searchValue...), 0) { - set = true - varr.Index(kv.ivalue).Set(newVal) - } - } - - if !set { - return - } - v.Set(varr) - } - - case reflect.Map: - set = d.populateMap(v, namespace) - - case reflect.Struct: - typ := v.Type() - - // if we get here then no custom time function declared so use RFC3339 by default - if typ == timeType { - - if !ok || len(arr[idx]) == 0 { - return - } - - t, err := time.Parse(time.RFC3339, arr[idx]) - if err != nil { - d.setError(namespace, err) - } - - v.Set(reflect.ValueOf(t)) - set = true - return - } - - d.parseMapData() - - // we must be recursing infinitly...but that's ok we caught it on the very first overun. - if len(namespace) > d.maxKeyLen { - return - } - - set = d.traverseStruct(v, typ, namespace) - } - - if set { - d.decoded = append(d.decoded, string(namespace)) - } - return -} - -func (d *decoder) getMapKey(key string, current reflect.Value, namespace []byte) (err error) { - - v, kind := ExtractType(current) - - if d.d.customTypeFuncs != nil { - if cf, ok := d.d.customTypeFuncs[v.Type()]; ok { - - val, er := cf([]string{key}) - if er != nil { - err = er - return - } - - v.Set(reflect.ValueOf(val)) - return - } - } - - switch kind { - case reflect.Interface: - // If interface would have been set on the struct before decoding, - // say to a struct value we would not get here but kind would be struct. - v.Set(reflect.ValueOf(key)) - return - case reflect.Ptr: - newVal := reflect.New(v.Type().Elem()) - if err = d.getMapKey(key, newVal.Elem(), namespace); err == nil { - v.Set(newVal) - } - - case reflect.String: - v.SetString(key) - - case reflect.Uint, reflect.Uint64: - - u64, e := strconv.ParseUint(key, 10, 64) - if e != nil { - err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetUint(u64) - - case reflect.Uint8: - - u64, e := strconv.ParseUint(key, 10, 8) - if e != nil { - err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetUint(u64) - - case reflect.Uint16: - - u64, e := strconv.ParseUint(key, 10, 16) - if e != nil { - err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetUint(u64) - - case reflect.Uint32: - - u64, e := strconv.ParseUint(key, 10, 32) - if e != nil { - err = fmt.Errorf("Invalid Unsigned Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetUint(u64) - - case reflect.Int, reflect.Int64: - - i64, e := strconv.ParseInt(key, 10, 64) - if e != nil { - err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetInt(i64) - - case reflect.Int8: - - i64, e := strconv.ParseInt(key, 10, 8) - if e != nil { - err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetInt(i64) - - case reflect.Int16: - - i64, e := strconv.ParseInt(key, 10, 16) - if e != nil { - err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetInt(i64) - - case reflect.Int32: - - i64, e := strconv.ParseInt(key, 10, 32) - if e != nil { - err = fmt.Errorf("Invalid Integer Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetInt(i64) - - case reflect.Float32: - - f, e := strconv.ParseFloat(key, 32) - if e != nil { - err = fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetFloat(f) - - case reflect.Float64: - - f, e := strconv.ParseFloat(key, 64) - if e != nil { - err = fmt.Errorf("Invalid Float Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetFloat(f) - - case reflect.Bool: - - b, e := parseBool(key) - if e != nil { - err = fmt.Errorf("Invalid Boolean Value '%s' Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - return - } - - v.SetBool(b) - - default: - err = fmt.Errorf("Unsupported Map Key '%s', Type '%v' Namespace '%s'", key, v.Type(), string(namespace)) - } - - return -} diff --git a/toolkit/form/decoder_test.go b/toolkit/form/decoder_test.go deleted file mode 100644 index b05001c3..00000000 --- a/toolkit/form/decoder_test.go +++ /dev/null @@ -1,1938 +0,0 @@ -package form - -import ( - "errors" - "fmt" - "net/url" - "github.com/goccy/go-reflect" - "strings" - "testing" - "time" - - . "github.com/go-playground/assert/v2" -) - -// NOTES: -// - Run "go test" to run tests -// - Run "gocov test | gocov report" to report on test converage by file -// - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called -// -// or -// -// -- may be a good idea to change to output path to somewherelike /tmp -// go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html -// -// -// go test -cpuprofile cpu.out -// ./validator.test -test.bench=. -test.cpuprofile=cpu.prof -// go tool pprof validator.test cpu.prof -// -// -// go test -memprofile mem.out - -func TestDecoderInt(t *testing.T) { - - type TestInt struct { - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - IntPtr *int - Int8Ptr *int8 - Int16Ptr *int16 - Int32Ptr *int32 - Int64Ptr *int64 - IntArray []int - IntPtrArray []*int - IntArrayArray [][]int - IntPtrArrayArray [][]*int - IntMap map[int]int - IntPtrMap map[*int]*int - NoURLValue int - IntNoValues int - Int8NoValues int8 - Int16NoValues int16 - Int32NoValues int32 - Int64NoValues int64 - } - - values := url.Values{ - "Int": []string{"3"}, - "Int8": []string{"3"}, - "Int16": []string{"3"}, - "Int32": []string{"3"}, - "Int64": []string{"3"}, - "IntPtr": []string{"3"}, - "Int8Ptr": []string{"3"}, - "Int16Ptr": []string{"3"}, - "Int32Ptr": []string{"3"}, - "Int64Ptr": []string{"3"}, - "IntArray": []string{"1", "2", "3"}, - "IntPtrArray[0]": []string{"1"}, - "IntPtrArray[2]": []string{"3"}, - "IntArrayArray[0][0]": []string{"1"}, - "IntArrayArray[0][2]": []string{"3"}, - "IntArrayArray[2][0]": []string{"1"}, - "IntPtrArrayArray[0][0]": []string{"1"}, - "IntPtrArrayArray[0][2]": []string{"3"}, - "IntPtrArrayArray[2][0]": []string{"1"}, - "IntMap[1]": []string{"3"}, - "IntPtrMap[1]": []string{"3"}, - } - - var test TestInt - - test.IntArray = make([]int, 4) - - decoder := NewDecoder() - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.Int, int(3)) - Equal(t, test.Int8, int8(3)) - Equal(t, test.Int16, int16(3)) - Equal(t, test.Int32, int32(3)) - Equal(t, test.Int64, int64(3)) - - Equal(t, *test.IntPtr, int(3)) - Equal(t, *test.Int8Ptr, int8(3)) - Equal(t, *test.Int16Ptr, int16(3)) - Equal(t, *test.Int32Ptr, int32(3)) - Equal(t, *test.Int64Ptr, int64(3)) - - Equal(t, len(test.IntArray), 7) - Equal(t, test.IntArray[0], int(0)) - Equal(t, test.IntArray[1], int(0)) - Equal(t, test.IntArray[2], int(0)) - Equal(t, test.IntArray[3], int(0)) - Equal(t, test.IntArray[4], int(1)) - Equal(t, test.IntArray[5], int(2)) - Equal(t, test.IntArray[6], int(3)) - - Equal(t, len(test.IntPtrArray), 3) - Equal(t, *test.IntPtrArray[0], int(1)) - Equal(t, test.IntPtrArray[1], nil) - Equal(t, *test.IntPtrArray[2], int(3)) - - Equal(t, len(test.IntArrayArray), 3) - Equal(t, len(test.IntArrayArray[0]), 3) - Equal(t, len(test.IntArrayArray[1]), 0) - Equal(t, len(test.IntArrayArray[2]), 1) - Equal(t, test.IntArrayArray[0][0], int(1)) - Equal(t, test.IntArrayArray[0][1], int(0)) - Equal(t, test.IntArrayArray[0][2], int(3)) - Equal(t, test.IntArrayArray[2][0], int(1)) - - Equal(t, len(test.IntPtrArrayArray), 3) - Equal(t, len(test.IntPtrArrayArray[0]), 3) - Equal(t, len(test.IntPtrArrayArray[1]), 0) - Equal(t, len(test.IntPtrArrayArray[2]), 1) - Equal(t, *test.IntPtrArrayArray[0][0], int(1)) - Equal(t, test.IntPtrArrayArray[0][1], nil) - Equal(t, *test.IntPtrArrayArray[0][2], int(3)) - Equal(t, *test.IntPtrArrayArray[2][0], int(1)) - - Equal(t, len(test.IntMap), 1) - Equal(t, len(test.IntPtrMap), 1) - - v, ok := test.IntMap[1] - Equal(t, ok, true) - Equal(t, v, int(3)) - - Equal(t, test.NoURLValue, int(0)) - - Equal(t, test.IntNoValues, int(0)) - Equal(t, test.Int8NoValues, int8(0)) - Equal(t, test.Int16NoValues, int16(0)) - Equal(t, test.Int32NoValues, int32(0)) - Equal(t, test.Int64NoValues, int64(0)) -} - -func TestDecoderUint(t *testing.T) { - - type TestUint struct { - Uint uint - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Uint64 uint64 - UintPtr *uint - Uint8Ptr *uint8 - Uint16Ptr *uint16 - Uint32Ptr *uint32 - Uint64Ptr *uint64 - UintArray []uint - UintPtrArray []*uint - UintArrayArray [][]uint - UintPtrArrayArray [][]*uint - UintMap map[uint]uint - UintPtrMap map[*uint]*uint - NoURLValue uint - UintNoValues uint - Uint8NoValues uint8 - Uint16NoValues uint16 - Uint32NoValues uint32 - Uint64NoValues uint64 - } - - values := url.Values{ - "Uint": []string{"3"}, - "Uint8": []string{"3"}, - "Uint16": []string{"3"}, - "Uint32": []string{"3"}, - "Uint64": []string{"3"}, - "UintPtr": []string{"3"}, - "Uint8Ptr": []string{"3"}, - "Uint16Ptr": []string{"3"}, - "Uint32Ptr": []string{"3"}, - "Uint64Ptr": []string{"3"}, - "UintArray": []string{"1", "2", "3"}, - "UintPtrArray[0]": []string{"1"}, - "UintPtrArray[2]": []string{"3"}, - "UintArrayArray[0][0]": []string{"1"}, - "UintArrayArray[0][2]": []string{"3"}, - "UintArrayArray[2][0]": []string{"1"}, - "UintPtrArrayArray[0][0]": []string{"1"}, - "UintPtrArrayArray[0][2]": []string{"3"}, - "UintPtrArrayArray[2][0]": []string{"1"}, - "UintMap[1]": []string{"3"}, - "UintPtrMap[1]": []string{"3"}, - } - - var test TestUint - - test.UintArray = make([]uint, 4) - - decoder := NewDecoder() - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.Uint, uint(3)) - Equal(t, test.Uint8, uint8(3)) - Equal(t, test.Uint16, uint16(3)) - Equal(t, test.Uint32, uint32(3)) - Equal(t, test.Uint64, uint64(3)) - - Equal(t, *test.UintPtr, uint(3)) - Equal(t, *test.Uint8Ptr, uint8(3)) - Equal(t, *test.Uint16Ptr, uint16(3)) - Equal(t, *test.Uint32Ptr, uint32(3)) - Equal(t, *test.Uint64Ptr, uint64(3)) - - Equal(t, len(test.UintArray), 7) - Equal(t, test.UintArray[0], uint(0)) - Equal(t, test.UintArray[1], uint(0)) - Equal(t, test.UintArray[2], uint(0)) - Equal(t, test.UintArray[3], uint(0)) - Equal(t, test.UintArray[4], uint(1)) - Equal(t, test.UintArray[5], uint(2)) - Equal(t, test.UintArray[6], uint(3)) - - Equal(t, len(test.UintPtrArray), 3) - Equal(t, *test.UintPtrArray[0], uint(1)) - Equal(t, test.UintPtrArray[1], nil) - Equal(t, *test.UintPtrArray[2], uint(3)) - - Equal(t, len(test.UintArrayArray), 3) - Equal(t, len(test.UintArrayArray[0]), 3) - Equal(t, len(test.UintArrayArray[1]), 0) - Equal(t, len(test.UintArrayArray[2]), 1) - Equal(t, test.UintArrayArray[0][0], uint(1)) - Equal(t, test.UintArrayArray[0][1], uint(0)) - Equal(t, test.UintArrayArray[0][2], uint(3)) - Equal(t, test.UintArrayArray[2][0], uint(1)) - - Equal(t, len(test.UintPtrArrayArray), 3) - Equal(t, len(test.UintPtrArrayArray[0]), 3) - Equal(t, len(test.UintPtrArrayArray[1]), 0) - Equal(t, len(test.UintPtrArrayArray[2]), 1) - Equal(t, *test.UintPtrArrayArray[0][0], uint(1)) - Equal(t, test.UintPtrArrayArray[0][1], nil) - Equal(t, *test.UintPtrArrayArray[0][2], uint(3)) - Equal(t, *test.UintPtrArrayArray[2][0], uint(1)) - - Equal(t, len(test.UintMap), 1) - Equal(t, len(test.UintPtrMap), 1) - - v, ok := test.UintMap[1] - Equal(t, ok, true) - Equal(t, v, uint(3)) - - Equal(t, test.NoURLValue, uint(0)) - - Equal(t, test.UintNoValues, uint(0)) - Equal(t, test.Uint8NoValues, uint8(0)) - Equal(t, test.Uint16NoValues, uint16(0)) - Equal(t, test.Uint32NoValues, uint32(0)) - Equal(t, test.Uint64NoValues, uint64(0)) -} - -func TestDecoderString(t *testing.T) { - - type TestString struct { - String string - StringPtr *string - StringArray []string - StringPtrArray []*string - StringArrayArray [][]string - StringPtrArrayArray [][]*string - StringMap map[string]string - StringPtrMap map[*string]*string - NoURLValue string - } - - values := url.Values{ - "String": []string{"3"}, - "StringPtr": []string{"3"}, - "StringArray": []string{"1", "2", "3"}, - "StringPtrArray[0]": []string{"1"}, - "StringPtrArray[2]": []string{"3"}, - "StringArrayArray[0][0]": []string{"1"}, - "StringArrayArray[0][2]": []string{"3"}, - "StringArrayArray[2][0]": []string{"1"}, - "StringPtrArrayArray[0][0]": []string{"1"}, - "StringPtrArrayArray[0][2]": []string{"3"}, - "StringPtrArrayArray[2][0]": []string{"1"}, - "StringMap[1]": []string{"3"}, - "StringPtrMap[1]": []string{"3"}, - } - - var test TestString - - test.StringArray = make([]string, 4) - - decoder := NewDecoder() - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.String, "3") - - Equal(t, *test.StringPtr, "3") - - Equal(t, len(test.StringArray), 7) - Equal(t, test.StringArray[0], "") - Equal(t, test.StringArray[1], "") - Equal(t, test.StringArray[2], "") - Equal(t, test.StringArray[3], "") - Equal(t, test.StringArray[4], "1") - Equal(t, test.StringArray[5], "2") - Equal(t, test.StringArray[6], "3") - - Equal(t, len(test.StringPtrArray), 3) - Equal(t, *test.StringPtrArray[0], "1") - Equal(t, test.StringPtrArray[1], nil) - Equal(t, *test.StringPtrArray[2], "3") - - Equal(t, len(test.StringArrayArray), 3) - Equal(t, len(test.StringArrayArray[0]), 3) - Equal(t, len(test.StringArrayArray[1]), 0) - Equal(t, len(test.StringArrayArray[2]), 1) - Equal(t, test.StringArrayArray[0][0], "1") - Equal(t, test.StringArrayArray[0][1], "") - Equal(t, test.StringArrayArray[0][2], "3") - Equal(t, test.StringArrayArray[2][0], "1") - - Equal(t, len(test.StringPtrArrayArray), 3) - Equal(t, len(test.StringPtrArrayArray[0]), 3) - Equal(t, len(test.StringPtrArrayArray[1]), 0) - Equal(t, len(test.StringPtrArrayArray[2]), 1) - Equal(t, *test.StringPtrArrayArray[0][0], "1") - Equal(t, test.StringPtrArrayArray[0][1], nil) - Equal(t, *test.StringPtrArrayArray[0][2], "3") - Equal(t, *test.StringPtrArrayArray[2][0], "1") - - Equal(t, len(test.StringMap), 1) - Equal(t, len(test.StringPtrMap), 1) - - v, ok := test.StringMap["1"] - Equal(t, ok, true) - Equal(t, v, "3") - - Equal(t, test.NoURLValue, "") -} - -func TestDecoderFloat(t *testing.T) { - - type TestFloat struct { - Float32 float32 - Float32Ptr *float32 - Float64 float64 - Float64Ptr *float64 - Float32Array []float32 - Float32PtrArray []*float32 - Float32ArrayArray [][]float32 - Float32PtrArrayArray [][]*float32 - Float32Map map[float32]float32 - Float32PtrMap map[*float32]*float32 - Float32NoValue float32 - Float64NoValue float64 - } - - values := url.Values{ - "Float32": []string{"3.3"}, - "Float32Ptr": []string{"3.3"}, - "Float64": []string{"3.3"}, - "Float64Ptr": []string{"3.3"}, - "Float32Array": []string{"1.1", "2.2", "3.3"}, - "Float32PtrArray[0]": []string{"1.1"}, - "Float32PtrArray[2]": []string{"3.3"}, - "Float32ArrayArray[0][0]": []string{"1.1"}, - "Float32ArrayArray[0][2]": []string{"3.3"}, - "Float32ArrayArray[2][0]": []string{"1.1"}, - "Float32PtrArrayArray[0][0]": []string{"1.1"}, - "Float32PtrArrayArray[0][2]": []string{"3.3"}, - "Float32PtrArrayArray[2][0]": []string{"1.1"}, - "Float32Map[1.1]": []string{"3.3"}, - "Float32PtrMap[1.1]": []string{"3.3"}, - } - - var test TestFloat - - test.Float32Array = make([]float32, 4) - - decoder := NewDecoder() - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.Float32, float32(3.3)) - Equal(t, test.Float64, float64(3.3)) - - Equal(t, *test.Float32Ptr, float32(3.3)) - Equal(t, *test.Float64Ptr, float64(3.3)) - - Equal(t, len(test.Float32Array), 7) - Equal(t, test.Float32Array[0], float32(0.0)) - Equal(t, test.Float32Array[1], float32(0.0)) - Equal(t, test.Float32Array[2], float32(0.0)) - Equal(t, test.Float32Array[3], float32(0.0)) - Equal(t, test.Float32Array[4], float32(1.1)) - Equal(t, test.Float32Array[5], float32(2.2)) - Equal(t, test.Float32Array[6], float32(3.3)) - - Equal(t, len(test.Float32PtrArray), 3) - Equal(t, *test.Float32PtrArray[0], float32(1.1)) - Equal(t, test.Float32PtrArray[1], nil) - Equal(t, *test.Float32PtrArray[2], float32(3.3)) - - Equal(t, len(test.Float32ArrayArray), 3) - Equal(t, len(test.Float32ArrayArray[0]), 3) - Equal(t, len(test.Float32ArrayArray[1]), 0) - Equal(t, len(test.Float32ArrayArray[2]), 1) - Equal(t, test.Float32ArrayArray[0][0], float32(1.1)) - Equal(t, test.Float32ArrayArray[0][1], float32(0.0)) - Equal(t, test.Float32ArrayArray[0][2], float32(3.3)) - Equal(t, test.Float32ArrayArray[2][0], float32(1.1)) - - Equal(t, len(test.Float32PtrArrayArray), 3) - Equal(t, len(test.Float32PtrArrayArray[0]), 3) - Equal(t, len(test.Float32PtrArrayArray[1]), 0) - Equal(t, len(test.Float32PtrArrayArray[2]), 1) - Equal(t, *test.Float32PtrArrayArray[0][0], float32(1.1)) - Equal(t, test.Float32PtrArrayArray[0][1], nil) - Equal(t, *test.Float32PtrArrayArray[0][2], float32(3.3)) - Equal(t, *test.Float32PtrArrayArray[2][0], float32(1.1)) - - Equal(t, len(test.Float32Map), 1) - Equal(t, len(test.Float32PtrMap), 1) - - v, ok := test.Float32Map[float32(1.1)] - Equal(t, ok, true) - Equal(t, v, float32(3.3)) - - Equal(t, test.Float32NoValue, float32(0.0)) - Equal(t, test.Float64NoValue, float64(0.0)) -} - -func TestDecoderBool(t *testing.T) { - - type TestBool struct { - Bool bool - BoolPtr *bool - BoolPtrNil *bool - BoolPtrEmpty *bool - BoolArray []bool - BoolPtrArray []*bool - BoolArrayArray [][]bool - BoolPtrArrayArray [][]*bool - BoolMap map[bool]bool - BoolPtrMap map[*bool]*bool - NoURLValue bool - } - - values := url.Values{ - "Bool": []string{"true"}, - "BoolPtr": []string{"true"}, - "BoolPtrEmpty": []string{""}, - "BoolArray": []string{"off", "t", "on"}, - "BoolPtrArray[0]": []string{"true"}, - "BoolPtrArray[2]": []string{"T"}, - "BoolArrayArray[0][0]": []string{"TRUE"}, - "BoolArrayArray[0][2]": []string{"True"}, - "BoolArrayArray[2][0]": []string{"true"}, - "BoolPtrArrayArray[0][0]": []string{"true"}, - "BoolPtrArrayArray[0][2]": []string{"t"}, - "BoolPtrArrayArray[2][0]": []string{"1"}, - "BoolMap[true]": []string{"true"}, - "BoolPtrMap[t]": []string{"true"}, - } - - var test TestBool - - test.BoolArray = make([]bool, 4) - - decoder := NewDecoder() - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.Bool, true) - - Equal(t, *test.BoolPtr, true) - Equal(t, test.BoolPtrNil, nil) - NotEqual(t, test.BoolPtrEmpty, nil) - Equal(t, *test.BoolPtrEmpty, false) - - Equal(t, len(test.BoolArray), 7) - Equal(t, test.BoolArray[0], false) - Equal(t, test.BoolArray[1], false) - Equal(t, test.BoolArray[2], false) - Equal(t, test.BoolArray[3], false) - Equal(t, test.BoolArray[4], false) - Equal(t, test.BoolArray[5], true) - Equal(t, test.BoolArray[6], true) - - Equal(t, len(test.BoolPtrArray), 3) - Equal(t, *test.BoolPtrArray[0], true) - Equal(t, test.BoolPtrArray[1], nil) - Equal(t, *test.BoolPtrArray[2], true) - - Equal(t, len(test.BoolArrayArray), 3) - Equal(t, len(test.BoolArrayArray[0]), 3) - Equal(t, len(test.BoolArrayArray[1]), 0) - Equal(t, len(test.BoolArrayArray[2]), 1) - Equal(t, test.BoolArrayArray[0][0], true) - Equal(t, test.BoolArrayArray[0][1], false) - Equal(t, test.BoolArrayArray[0][2], true) - Equal(t, test.BoolArrayArray[2][0], true) - - Equal(t, len(test.BoolPtrArrayArray), 3) - Equal(t, len(test.BoolPtrArrayArray[0]), 3) - Equal(t, len(test.BoolPtrArrayArray[1]), 0) - Equal(t, len(test.BoolPtrArrayArray[2]), 1) - Equal(t, *test.BoolPtrArrayArray[0][0], true) - Equal(t, test.BoolPtrArrayArray[0][1], nil) - Equal(t, *test.BoolPtrArrayArray[0][2], true) - Equal(t, *test.BoolPtrArrayArray[2][0], true) - - Equal(t, len(test.BoolMap), 1) - Equal(t, len(test.BoolPtrMap), 1) - - v, ok := test.BoolMap[true] - Equal(t, ok, true) - Equal(t, v, true) - - Equal(t, test.NoURLValue, false) -} - -func TestDecoderEqualStructMapValue(t *testing.T) { - type PhoneStruct struct { - Number string - } - - type PhoneMap map[string]string - - type TestStruct struct { - PhoneStruct PhoneStruct `form:"Phone"` - PhoneMap PhoneMap `form:"Phone"` - } - - testCases := []struct { - NamespacePrefix string - NamespaceSuffix string - Values url.Values - }{{ - NamespacePrefix: ".", - Values: url.Values{ - "Phone.Number": []string{"111"}, - "Phone[Number]": []string{"222"}, - }, - }, { - NamespacePrefix: "[", - NamespaceSuffix: "]", - Values: url.Values{ - "Phone[Number]": []string{"111"}, - }, - }} - - for _, tc := range testCases { - tc := tc - t.Run(fmt.Sprintf("Namespace_%s%s", tc.NamespacePrefix, tc.NamespaceSuffix), func(t *testing.T) { - decoder := NewDecoder() - decoder.SetNamespacePrefix(tc.NamespacePrefix) - decoder.SetNamespaceSuffix(tc.NamespaceSuffix) - - var test TestStruct - - err := decoder.Decode(&test, tc.Values) - Equal(t, err, nil) - - Equal(t, test.PhoneStruct.Number, "111") - - if tc.NamespacePrefix == "." { - Equal(t, test.PhoneMap["Number"], "222") - } else { - Equal(t, test.PhoneMap["Number"], "111") - } - }) - } -} - -func TestDecoderStruct(t *testing.T) { - - type Phone struct { - Number string - } - - type TestMapKeys struct { - MapIfaceKey map[interface{}]string - MapFloat32Key map[float32]float32 - MapFloat64Key map[float64]float64 - MapNestedInt map[int]map[int]int - MapInt8 map[int8]int8 - MapInt16 map[int16]int16 - MapInt32 map[int32]int32 - MapUint8 map[uint8]uint8 - MapUint16 map[uint16]uint16 - MapUint32 map[uint32]uint32 - } - - type TestStruct struct { - Name string `form:"name"` - Phone []Phone - PhonePtr []*Phone - NonNilPtr *Phone - Ignore string `form:"-"` - Anonymous struct { - Value string - Ignore string `form:"-"` - unexposed string - } - Time time.Time - TimePtr *time.Time - Invalid interface{} - ExistingMap map[string]string `form:"mp"` - MapNoValue map[int]int - TestMapKeys TestMapKeys - NilArray []string - TooSmallArray []string - TooSmallCapOKArray []string - ZeroLengthArray []string - TooSmallNumberedArray []string - TooSmallCapOKNumberedArray []string - BigEnoughNumberedArray []string - IfaceNonNil interface{} - IfaceInvalid interface{} - TimeMapKey map[time.Time]string - ExistingArray []string - ExistingArrayIndex []string - } - - defaultValues := url.Values{ - "name": []string{"joeybloggs"}, - "Ignore": []string{"ignore"}, - "Time": []string{"2016-01-02"}, - "TimePtr": []string{"2016-01-02"}, - "mp[key]": []string{"value"}, - "NilArray": []string{"1", "2"}, - "TooSmallArray": []string{"1", "2"}, - "TooSmallCapOKArray": []string{"1", "2"}, - "ZeroLengthArray": []string{}, - "TooSmallNumberedArray[2]": []string{"2"}, - "TooSmallCapOKNumberedArray[2]": []string{"2"}, - "BigEnoughNumberedArray[2]": []string{"1"}, - "TimeMapKey[2016-01-02]": []string{"time"}, - "ExistingArray": []string{"arr2"}, - "ExistingArrayIndex[1]": []string{"arr2"}, - } - - testCases := []struct { - NamespacePrefix string - NamespaceSuffix string - Values url.Values - }{{ - NamespacePrefix: ".", - Values: url.Values{ - "Phone[0].Number": []string{"1(111)111-1111"}, - "Phone[1].Number": []string{"9(999)999-9999"}, - "PhonePtr[0].Number": []string{"1(111)111-1111"}, - "PhonePtr[1].Number": []string{"9(999)999-9999"}, - "NonNilPtr.Number": []string{"9(999)999-9999"}, - "Anonymous.Value": []string{"Anon"}, - "TestMapKeys.MapIfaceKey[key]": []string{"3"}, - "TestMapKeys.MapFloat32Key[0.0]": []string{"3.3"}, - "TestMapKeys.MapFloat64Key[0.0]": []string{"3.3"}, - "TestMapKeys.MapNestedInt[1][2]": []string{"3"}, - "TestMapKeys.MapInt8[0]": []string{"3"}, - "TestMapKeys.MapInt16[0]": []string{"3"}, - "TestMapKeys.MapInt32[0]": []string{"3"}, - "TestMapKeys.MapUint8[0]": []string{"3"}, - "TestMapKeys.MapUint16[0]": []string{"3"}, - "TestMapKeys.MapUint32[0]": []string{"3"}, - }, - }, { - NamespacePrefix: "[", - NamespaceSuffix: "]", - Values: url.Values{ - "Phone[0][Number]": []string{"1(111)111-1111"}, - "Phone[1][Number]": []string{"9(999)999-9999"}, - "PhonePtr[0][Number]": []string{"1(111)111-1111"}, - "PhonePtr[1][Number]": []string{"9(999)999-9999"}, - "NonNilPtr[Number]": []string{"9(999)999-9999"}, - "Anonymous[Value]": []string{"Anon"}, - "TestMapKeys[MapIfaceKey][key]": []string{"3"}, - "TestMapKeys[MapFloat32Key][0.0]": []string{"3.3"}, - "TestMapKeys[MapFloat64Key][0.0]": []string{"3.3"}, - "TestMapKeys[MapNestedInt][1][2]": []string{"3"}, - "TestMapKeys[MapInt8][0]": []string{"3"}, - "TestMapKeys[MapInt16][0]": []string{"3"}, - "TestMapKeys[MapInt32][0]": []string{"3"}, - "TestMapKeys[MapUint8][0]": []string{"3"}, - "TestMapKeys[MapUint16][0]": []string{"3"}, - "TestMapKeys[MapUint32][0]": []string{"3"}, - }, - }} - - for _, tc := range testCases { - tc := tc - t.Run(fmt.Sprintf("Namespace_%s%s", tc.NamespacePrefix, tc.NamespaceSuffix), func(t *testing.T) { - decoder := NewDecoder() - decoder.SetNamespacePrefix(tc.NamespacePrefix) - decoder.SetNamespaceSuffix(tc.NamespaceSuffix) - - values := url.Values{} - - for key, vals := range defaultValues { - values[key] = vals - } - for key, vals := range tc.Values { - values[key] = vals - } - - decoder.SetTagName("form") - decoder.RegisterCustomTypeFunc(func(vals []string) (interface{}, error) { - return time.Parse("2006-01-02", vals[0]) - }, time.Time{}) - - var test TestStruct - test.ExistingMap = map[string]string{"existingkey": "existingvalue"} - test.NonNilPtr = new(Phone) - test.IfaceNonNil = new(Phone) - test.IfaceInvalid = nil - test.TooSmallArray = []string{"0"} - test.TooSmallCapOKArray = make([]string, 0, 10) - test.TooSmallNumberedArray = []string{"0"} - test.TooSmallCapOKNumberedArray = make([]string, 0, 10) - test.BigEnoughNumberedArray = make([]string, 3, 10) - test.ExistingArray = []string{"arr1"} - test.ExistingArrayIndex = []string{"arr1"} - - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.Name, "joeybloggs") - Equal(t, test.Ignore, "") - Equal(t, len(test.Phone), 2) - Equal(t, test.Phone[0].Number, "1(111)111-1111") - Equal(t, test.Phone[1].Number, "9(999)999-9999") - Equal(t, len(test.PhonePtr), 2) - Equal(t, test.PhonePtr[0].Number, "1(111)111-1111") - Equal(t, test.PhonePtr[1].Number, "9(999)999-9999") - Equal(t, test.NonNilPtr.Number, "9(999)999-9999") - Equal(t, test.Anonymous.Value, "Anon") - Equal(t, len(test.ExistingMap), 2) - Equal(t, test.ExistingMap["existingkey"], "existingvalue") - Equal(t, test.ExistingMap["key"], "value") - Equal(t, len(test.NilArray), 2) - Equal(t, test.NilArray[0], "1") - Equal(t, test.NilArray[1], "2") - Equal(t, len(test.TooSmallArray), 3) - Equal(t, test.TooSmallArray[0], "0") - Equal(t, test.TooSmallArray[1], "1") - Equal(t, test.TooSmallArray[2], "2") - Equal(t, len(test.ZeroLengthArray), 0) - Equal(t, len(test.TooSmallNumberedArray), 3) - Equal(t, test.TooSmallNumberedArray[0], "0") - Equal(t, test.TooSmallNumberedArray[1], "") - Equal(t, test.TooSmallNumberedArray[2], "2") - Equal(t, len(test.BigEnoughNumberedArray), 3) - Equal(t, cap(test.BigEnoughNumberedArray), 10) - Equal(t, test.BigEnoughNumberedArray[0], "") - Equal(t, test.BigEnoughNumberedArray[1], "") - Equal(t, test.BigEnoughNumberedArray[2], "1") - Equal(t, len(test.TooSmallCapOKArray), 2) - Equal(t, cap(test.TooSmallCapOKArray), 10) - Equal(t, test.TooSmallCapOKArray[0], "1") - Equal(t, test.TooSmallCapOKArray[1], "2") - Equal(t, len(test.TooSmallCapOKNumberedArray), 3) - Equal(t, cap(test.TooSmallCapOKNumberedArray), 10) - Equal(t, test.TooSmallCapOKNumberedArray[0], "") - Equal(t, test.TooSmallCapOKNumberedArray[1], "") - Equal(t, test.TooSmallCapOKNumberedArray[2], "2") - - Equal(t, len(test.ExistingArray), 2) - Equal(t, test.ExistingArray[0], "arr1") - Equal(t, test.ExistingArray[1], "arr2") - - Equal(t, len(test.ExistingArrayIndex), 2) - Equal(t, test.ExistingArrayIndex[0], "arr1") - Equal(t, test.ExistingArrayIndex[1], "arr2") - - tm, _ := time.Parse("2006-01-02", "2016-01-02") - Equal(t, test.Time.Equal(tm), true) - Equal(t, test.TimePtr.Equal(tm), true) - - NotEqual(t, test.TimeMapKey, nil) - Equal(t, len(test.TimeMapKey), 1) - - _, ok := test.TimeMapKey[tm] - Equal(t, ok, true) - - s := struct { - Value string - Ignore string `form:"-"` - unexposed string - }{} - - errs = decoder.Decode(&s, defaultValues) - Equal(t, errs, nil) - Equal(t, s.Value, "") - Equal(t, s.Ignore, "") - Equal(t, s.unexposed, "") - - Equal(t, test.TestMapKeys.MapIfaceKey["key"], "3") - Equal(t, test.TestMapKeys.MapFloat32Key[float32(0.0)], float32(3.3)) - Equal(t, test.TestMapKeys.MapFloat64Key[float64(0.0)], float64(3.3)) - - Equal(t, test.TestMapKeys.MapInt8[int8(0)], int8(3)) - Equal(t, test.TestMapKeys.MapInt16[int16(0)], int16(3)) - Equal(t, test.TestMapKeys.MapInt32[int32(0)], int32(3)) - - Equal(t, test.TestMapKeys.MapUint8[uint8(0)], uint8(3)) - Equal(t, test.TestMapKeys.MapUint16[uint16(0)], uint16(3)) - Equal(t, test.TestMapKeys.MapUint32[uint32(0)], uint32(3)) - - Equal(t, len(test.TestMapKeys.MapNestedInt), 1) - Equal(t, len(test.TestMapKeys.MapNestedInt[1]), 1) - Equal(t, test.TestMapKeys.MapNestedInt[1][2], 3) - }) - } -} - -func TestDecoderNativeTime(t *testing.T) { - - type TestError struct { - Time time.Time - TimeNoValue time.Time - TimePtr *time.Time - } - - values := url.Values{ - "Time": []string{"2006-01-02T15:04:05Z"}, - "TimeNoValue": []string{""}, - "TimePtr": []string{"2006-01-02T15:04:05Z"}, - } - - var test TestError - - decoder := NewDecoder() - - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - tm, _ := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") - Equal(t, test.Time.Equal(tm), true) - Equal(t, test.TimeNoValue.Equal(tm), false) - - NotEqual(t, test.TimePtr, nil) - Equal(t, (*test.TimePtr).Equal(tm), true) -} - -func TestDecoderErrors(t *testing.T) { - - type TestError struct { - Bool bool `form:"bool"` - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Uint uint - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Float32 float32 - Float64 float64 - String string - Time time.Time - MapBadIntKey map[int]int - MapBadInt8Key map[int8]int8 - MapBadInt16Key map[int16]int16 - MapBadInt32Key map[int32]int32 - MapBadUintKey map[uint]uint - MapBadUint8Key map[uint8]uint8 - MapBadUint16Key map[uint16]uint16 - MapBadUint32Key map[uint32]uint32 - MapBadFloat32Key map[float32]float32 - MapBadFloat64Key map[float64]float64 - MapBadBoolKey map[bool]bool - MapBadKeyType map[complex64]int - BadArrayValue []int - BadMapKey map[time.Time]string - OverflowNilArray []int - OverFlowExistingArray []int - BadArrayIndex []int - } - - values := url.Values{ - "bool": []string{"uh-huh"}, - "Int": []string{"bad"}, - "Int8": []string{"bad"}, - "Int16": []string{"bad"}, - "Int32": []string{"bad"}, - "Uint": []string{"bad"}, - "Uint8": []string{"bad"}, - "Uint16": []string{"bad"}, - "Uint32": []string{"bad"}, - "Float32": []string{"bad"}, - "Float64": []string{"bad"}, - "String": []string{"str bad return val"}, - "Time": []string{"bad"}, - "MapBadIntKey[key]": []string{"1"}, - "MapBadInt8Key[key]": []string{"1"}, - "MapBadInt16Key[key]": []string{"1"}, - "MapBadInt32Key[key]": []string{"1"}, - "MapBadUintKey[key]": []string{"1"}, - "MapBadUint8Key[key]": []string{"1"}, - "MapBadUint16Key[key]": []string{"1"}, - "MapBadUint32Key[key]": []string{"1"}, - "MapBadFloat32Key[key]": []string{"1.1"}, - "MapBadFloat64Key[key]": []string{"1.1"}, - "MapBadBoolKey[uh-huh]": []string{"true"}, - "MapBadKeyType[1.4]": []string{"5"}, - "BadArrayValue[0]": []string{"badintval"}, - "BadMapKey[badtime]": []string{"badtime"}, - "OverflowNilArray[999]": []string{"idx 1000"}, - "OverFlowExistingArray[999]": []string{"idx 1000"}, - "BadArrayIndex[bad index]": []string{"bad idx"}, - } - - testCases := []struct { - NamespacePrefix string - NamespaceSuffix string - }{{ - NamespacePrefix: ".", - }, { - NamespacePrefix: "[", - NamespaceSuffix: "]", - }} - - for _, tc := range testCases { - tc := tc - t.Run(fmt.Sprintf("Namespace_%s%s", tc.NamespacePrefix, tc.NamespaceSuffix), func(t *testing.T) { - decoder := NewDecoder() - decoder.SetNamespacePrefix(tc.NamespacePrefix) - decoder.SetNamespaceSuffix(tc.NamespaceSuffix) - - decoder.SetMaxArraySize(4) - decoder.RegisterCustomTypeFunc(func(vals []string) (interface{}, error) { - return nil, errors.New("Bad Type Conversion") - }, "") - - test := TestError{ - OverFlowExistingArray: make([]int, 2), - } - - errs := decoder.Decode(&test, values) - NotEqual(t, errs, nil) - - e := errs.Error() - NotEqual(t, e, "") - - err := errs.(DecodeErrors) - Equal(t, len(err), 30) - - k := err["bool"] - Equal(t, k.Error(), "Invalid Boolean Value 'uh-huh' Type 'bool' Namespace 'bool'") - - k = err["Int"] - Equal(t, k.Error(), "Invalid Integer Value 'bad' Type 'int' Namespace 'Int'") - - k = err["Int8"] - Equal(t, k.Error(), "Invalid Integer Value 'bad' Type 'int8' Namespace 'Int8'") - - k = err["Int16"] - Equal(t, k.Error(), "Invalid Integer Value 'bad' Type 'int16' Namespace 'Int16'") - - k = err["Int32"] - Equal(t, k.Error(), "Invalid Integer Value 'bad' Type 'int32' Namespace 'Int32'") - - k = err["Uint"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'bad' Type 'uint' Namespace 'Uint'") - - k = err["Uint8"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'bad' Type 'uint8' Namespace 'Uint8'") - - k = err["Uint16"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'bad' Type 'uint16' Namespace 'Uint16'") - - k = err["Uint32"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'bad' Type 'uint32' Namespace 'Uint32'") - - k = err["Float32"] - Equal(t, k.Error(), "Invalid Float Value 'bad' Type 'float32' Namespace 'Float32'") - - k = err["Float64"] - Equal(t, k.Error(), "Invalid Float Value 'bad' Type 'float64' Namespace 'Float64'") - - k = err["String"] - Equal(t, k.Error(), "Bad Type Conversion") - - k = err["Time"] - Equal(t, k.Error(), "parsing time \"bad\" as \"2006-01-02T15:04:05Z07:00\": cannot parse \"bad\" as \"2006\"") - - k = err["MapBadIntKey"] - Equal(t, k.Error(), "Invalid Integer Value 'key' Type 'int' Namespace 'MapBadIntKey'") - - k = err["MapBadInt8Key"] - Equal(t, k.Error(), "Invalid Integer Value 'key' Type 'int8' Namespace 'MapBadInt8Key'") - - k = err["MapBadInt16Key"] - Equal(t, k.Error(), "Invalid Integer Value 'key' Type 'int16' Namespace 'MapBadInt16Key'") - - k = err["MapBadInt32Key"] - Equal(t, k.Error(), "Invalid Integer Value 'key' Type 'int32' Namespace 'MapBadInt32Key'") - - k = err["MapBadUintKey"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'key' Type 'uint' Namespace 'MapBadUintKey'") - - k = err["MapBadUint8Key"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'key' Type 'uint8' Namespace 'MapBadUint8Key'") - - k = err["MapBadUint16Key"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'key' Type 'uint16' Namespace 'MapBadUint16Key'") - - k = err["MapBadUint32Key"] - Equal(t, k.Error(), "Invalid Unsigned Integer Value 'key' Type 'uint32' Namespace 'MapBadUint32Key'") - - k = err["MapBadFloat32Key"] - Equal(t, k.Error(), "Invalid Float Value 'key' Type 'float32' Namespace 'MapBadFloat32Key'") - - k = err["MapBadFloat64Key"] - Equal(t, k.Error(), "Invalid Float Value 'key' Type 'float64' Namespace 'MapBadFloat64Key'") - - k = err["MapBadBoolKey"] - Equal(t, k.Error(), "Invalid Boolean Value 'uh-huh' Type 'bool' Namespace 'MapBadBoolKey'") - - k = err["MapBadKeyType"] - Equal(t, k.Error(), "Unsupported Map Key '1.4', Type 'complex64' Namespace 'MapBadKeyType'") - - k = err["BadArrayValue[0]"] - Equal(t, k.Error(), "Invalid Integer Value 'badintval' Type 'int' Namespace 'BadArrayValue[0]'") - - k = err["OverflowNilArray"] - Equal(t, k.Error(), "Array size of '1000' is larger than the maximum currently set on the decoder of '4'. To increase this limit please see, SetMaxArraySize(size uint)") - - k = err["OverFlowExistingArray"] - Equal(t, k.Error(), "Array size of '1000' is larger than the maximum currently set on the decoder of '4'. To increase this limit please see, SetMaxArraySize(size uint)") - - k = err["BadArrayIndex"] - Equal(t, k.Error(), "invalid slice index 'bad index'") - - type TestError2 struct { - BadMapKey map[time.Time]string - } - - values2 := url.Values{ - "BadMapKey[badtime]": []string{"badtime"}, - } - - var test2 TestError2 - decoder2 := NewDecoder() - decoder2.RegisterCustomTypeFunc(func(vals []string) (interface{}, error) { - return time.Parse("2006-01-02", vals[0]) - }, time.Time{}) - - errs = decoder2.Decode(&test2, values2) - NotEqual(t, errs, nil) - - e = errs.Error() - NotEqual(t, e, "") - - k = err["BadMapKey"] - Equal(t, k.Error(), "Unsupported Map Key 'badtime', Type 'time.Time' Namespace 'BadMapKey'") - }) - } -} - -func TestDecodeAllTypes(t *testing.T) { - - values := url.Values{ - "": []string{"3"}, - } - - decoder := NewDecoder() - - var i int - - errs := decoder.Decode(&i, values) - Equal(t, errs, nil) - Equal(t, i, 3) - - var i8 int - - errs = decoder.Decode(&i8, values) - Equal(t, errs, nil) - Equal(t, i8, 3) - - var i16 int - - errs = decoder.Decode(&i16, values) - Equal(t, errs, nil) - Equal(t, i16, 3) - - var i32 int - - errs = decoder.Decode(&i32, values) - Equal(t, errs, nil) - Equal(t, i32, 3) - - var i64 int - - errs = decoder.Decode(&i64, values) - Equal(t, errs, nil) - Equal(t, i64, 3) - - var ui int - - errs = decoder.Decode(&ui, values) - Equal(t, errs, nil) - Equal(t, ui, 3) - - var ui8 int - - errs = decoder.Decode(&ui8, values) - Equal(t, errs, nil) - Equal(t, ui8, 3) - - var ui16 int - - errs = decoder.Decode(&ui16, values) - Equal(t, errs, nil) - Equal(t, ui16, 3) - - var ui32 int - - errs = decoder.Decode(&ui32, values) - Equal(t, errs, nil) - Equal(t, ui32, 3) - - var ui64 int - - errs = decoder.Decode(&ui64, values) - Equal(t, errs, nil) - Equal(t, ui64, 3) - - values = url.Values{ - "": []string{"3.4"}, - } - - var f32 float32 - - errs = decoder.Decode(&f32, values) - Equal(t, errs, nil) - Equal(t, f32, float32(3.4)) - - var f64 float64 - - errs = decoder.Decode(&f64, values) - Equal(t, errs, nil) - Equal(t, f64, float64(3.4)) - - values = url.Values{ - "": []string{"true"}, - } - - var b bool - - errs = decoder.Decode(&b, values) - Equal(t, errs, nil) - Equal(t, b, true) - - tm, _ := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") - - values = url.Values{ - "": []string{"2006-01-02T15:04:05Z"}, - } - - var dt time.Time - - errs = decoder.Decode(&dt, values) - - Equal(t, errs, nil) - Equal(t, dt, tm) - - values = url.Values{ - "": []string{"arr1", "arr2"}, - } - - // basic array - var arr []string - - errs = decoder.Decode(&arr, values) - Equal(t, errs, nil) - Equal(t, len(arr), 2) - Equal(t, arr[0], "arr1") - Equal(t, arr[1], "arr2") - - // pre-populated array - - // fmt.Println("Decoding...") - errs = decoder.Decode(&arr, values) - Equal(t, errs, nil) - Equal(t, len(arr), 4) - Equal(t, arr[0], "arr1") - Equal(t, arr[1], "arr2") - Equal(t, arr[2], "arr1") - Equal(t, arr[3], "arr2") - - // basic array Ptr - var arrPtr []*string - - errs = decoder.Decode(&arrPtr, values) - Equal(t, errs, nil) - Equal(t, len(arrPtr), 2) - Equal(t, *arrPtr[0], "arr1") - Equal(t, *arrPtr[1], "arr2") - - // pre-populated array Ptr - - // fmt.Println("Decoding...") - errs = decoder.Decode(&arrPtr, values) - Equal(t, errs, nil) - Equal(t, len(arr), 4) - Equal(t, *arrPtr[0], "arr1") - Equal(t, *arrPtr[1], "arr2") - Equal(t, *arrPtr[2], "arr1") - Equal(t, *arrPtr[3], "arr2") - - // indexed array - - values = url.Values{ - "[0]": []string{"newVal1"}, - "[1]": []string{"newVal2"}, - } - - errs = decoder.Decode(&arr, values) - Equal(t, errs, nil) - Equal(t, len(arr), 4) - Equal(t, arr[0], "newVal1") - Equal(t, arr[1], "newVal2") - Equal(t, arr[2], "arr1") - Equal(t, arr[3], "arr2") - - values = url.Values{ - "[key1]": []string{"val1"}, - "[key2]": []string{"val2"}, - } - - // basic map - var m map[string]string - - errs = decoder.Decode(&m, values) - Equal(t, errs, nil) - Equal(t, len(m), 2) - Equal(t, m["key1"], "val1") - Equal(t, m["key2"], "val2") - - // existing map - - errs = decoder.Decode(&m, values) - Equal(t, errs, nil) - Equal(t, len(m), 2) - Equal(t, m["key1"], "val1") - Equal(t, m["key2"], "val2") - - // basic map, adding more keys - - values = url.Values{ - "[key3]": []string{"val3"}, - } - errs = decoder.Decode(&m, values) - Equal(t, errs, nil) - Equal(t, len(m), 3) - Equal(t, m["key3"], "val3") - - // array of struct - - type Phone struct { - Number string - Label string - } - - values = url.Values{ - "[0].Number": []string{"999"}, - "[1].Label": []string{"label2"}, - "[1].Number": []string{"111"}, - "[0].Label": []string{"label1"}, - } - - var phones []Phone - - errs = decoder.Decode(&phones, values) - Equal(t, errs, nil) - Equal(t, len(phones), 2) - Equal(t, phones[0].Number, "999") - Equal(t, phones[0].Label, "label1") - Equal(t, phones[1].Number, "111") - Equal(t, phones[1].Label, "label2") -} - -func TestDecoderPanicsAndBadValues(t *testing.T) { - - type Phone struct { - Number string - } - - type TestError struct { - Phone []Phone - Phone2 []Phone - Phone3 []Phone - } - - values := url.Values{ - "Phone[0.Number": []string{"1(111)111-1111"}, - } - - var test TestError - - decoder := NewDecoder() - - PanicMatches(t, func() { _ = decoder.Decode(&test, values) }, "Invalid formatting for key 'Phone[0.Number' missing ']' bracket") - - i := 1 - err := decoder.Decode(i, values) - NotEqual(t, err, nil) - - _, ok := err.(*InvalidDecoderError) - Equal(t, ok, true) - Equal(t, err.Error(), "form: Decode(non-pointer int)") - - err = decoder.Decode(nil, values) - NotEqual(t, err, nil) - - _, ok = err.(*InvalidDecoderError) - Equal(t, ok, true) - Equal(t, err.Error(), "form: Decode(nil)") - - var ts *TestError - - err = decoder.Decode(ts, values) - NotEqual(t, err, nil) - - _, ok = err.(*InvalidDecoderError) - Equal(t, ok, true) - Equal(t, err.Error(), "form: Decode(nil *form.TestError)") - - values = url.Values{ - "Phone0].Number": []string{"1(111)111-1111"}, - } - - PanicMatches(t, func() { _ = decoder.Decode(&test, values) }, "Invalid formatting for key 'Phone0].Number' missing '[' bracket") - - values = url.Values{ - "Phone[[0.Number": []string{"1(111)111-1111"}, - } - - PanicMatches(t, func() { _ = decoder.Decode(&test, values) }, "Invalid formatting for key 'Phone[[0.Number' missing ']' bracket") - - values = url.Values{ - "Phone0]].Number": []string{"1(111)111-1111"}, - } - - PanicMatches(t, func() { _ = decoder.Decode(&test, values) }, "Invalid formatting for key 'Phone0]].Number' missing '[' bracket") -} - -func TestDecoderMapKeys(t *testing.T) { - - type TestMapKeys struct { - MapIfaceKey map[interface{}]string - MapFloat32Key map[float32]float32 - MapFloat64Key map[float64]float64 - MapNestedInt map[int]map[int]int - MapInt8 map[int8]int8 - MapInt16 map[int16]int16 - MapInt32 map[int32]int32 - MapUint8 map[uint8]uint8 - MapUint16 map[uint16]uint16 - MapUint32 map[uint32]uint32 - } - - values := url.Values{ - "MapIfaceKey[key]": []string{"3"}, - "MapFloat32Key[0.0]": []string{"3.3"}, - "MapFloat64Key[0.0]": []string{"3.3"}, - "MapNestedInt[1][2]": []string{"3"}, - "MapInt8[0]": []string{"3"}, - "MapInt16[0]": []string{"3"}, - "MapInt32[0]": []string{"3"}, - "MapUint8[0]": []string{"3"}, - "MapUint16[0]": []string{"3"}, - "MapUint32[0]": []string{"3"}, - } - - var test TestMapKeys - - testCases := []struct { - NamespacePrefix string - NamespaceSuffix string - }{ - { - NamespacePrefix: ".", - }, - { - NamespacePrefix: "[", - NamespaceSuffix: "]", - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(fmt.Sprintf("Namespace_%s%s", tc.NamespacePrefix, tc.NamespaceSuffix), func(t *testing.T) { - decoder := NewDecoder() - decoder.SetNamespacePrefix(tc.NamespacePrefix) - decoder.SetNamespaceSuffix(tc.NamespaceSuffix) - - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.MapIfaceKey["key"], "3") - Equal(t, test.MapFloat32Key[float32(0.0)], float32(3.3)) - Equal(t, test.MapFloat64Key[float64(0.0)], float64(3.3)) - - Equal(t, test.MapInt8[int8(0)], int8(3)) - Equal(t, test.MapInt16[int16(0)], int16(3)) - Equal(t, test.MapInt32[int32(0)], int32(3)) - - Equal(t, test.MapUint8[uint8(0)], uint8(3)) - Equal(t, test.MapUint16[uint16(0)], uint16(3)) - Equal(t, test.MapUint32[uint32(0)], uint32(3)) - - Equal(t, len(test.MapNestedInt), 1) - Equal(t, len(test.MapNestedInt[1]), 1) - Equal(t, test.MapNestedInt[1][2], 3) - }) - } -} - -func TestDecoderStructRecursion(t *testing.T) { - - type Nested struct { - Value string - Nested *Nested - } - - type TestRecursive struct { - Nested Nested - NestedPtr *Nested - NestedTwo Nested - } - - defaultValues := url.Values{ - "Value": []string{"value"}, - } - - testCases := []struct { - Values url.Values - NamespacePrefix string - NamespaceSuffix string - }{{ - NamespacePrefix: ".", - Values: url.Values{ - "Nested.Value": []string{"value"}, - "NestedPtr.Value": []string{"value"}, - "NestedTwo.Nested.Value": []string{"value"}, - }, - }, { - NamespacePrefix: "[", - NamespaceSuffix: "]", - Values: url.Values{ - "Nested[Value]": []string{"value"}, - "NestedPtr[Value]": []string{"value"}, - "NestedTwo[Nested][Value]": []string{"value"}, - }, - }} - - for _, tc := range testCases { - tc := tc - t.Run(fmt.Sprintf("Namespace_%s%s", tc.NamespacePrefix, tc.NamespaceSuffix), func(t *testing.T) { - values := url.Values{} - - for key, vals := range defaultValues { - values[key] = vals - } - for key, vals := range tc.Values { - values[key] = vals - } - - decoder := NewDecoder() - decoder.SetNamespacePrefix(tc.NamespacePrefix) - decoder.SetNamespaceSuffix(tc.NamespaceSuffix) - - var test TestRecursive - - errs := decoder.Decode(&test, values) - Equal(t, errs, nil) - - Equal(t, test.Nested.Value, "value") - Equal(t, test.NestedPtr.Value, "value") - Equal(t, test.Nested.Nested, nil) - Equal(t, test.NestedTwo.Nested.Value, "value") - }) - } - -} - -func TestDecoderFormDecode(t *testing.T) { - - type Struct2 struct { - Foo string - Bar string - } - - type Struct2Wrapper struct { - InnerSlice []Struct2 - } - - sliceValues := map[string][]string{ - "InnerSlice[0].Foo": {"foo-is-set"}, - } - - singleValues := map[string][]string{ - "Foo": {"foo-is-set"}, - } - - fd := NewDecoder() - - dst := Struct2Wrapper{} - err := fd.Decode(&dst, sliceValues) - Equal(t, err, nil) - NotEqual(t, dst.InnerSlice, nil) - Equal(t, dst.InnerSlice[0].Foo, "foo-is-set") - - dst2 := Struct2{} - err = fd.Decode(&dst2, singleValues) - Equal(t, err, nil) - Equal(t, dst2.Foo, "foo-is-set") -} - -func TestDecoderArrayKeysSort(t *testing.T) { - - type Struct struct { - Array []int - } - - values := map[string][]string{ - - "Array[2]": {"2"}, - "Array[10]": {"10"}, - } - - var test Struct - - d := NewDecoder() - - err := d.Decode(&test, values) - Equal(t, err, nil) - - Equal(t, len(test.Array), 11) - Equal(t, test.Array[2], int(2)) - Equal(t, test.Array[10], int(10)) -} - -func TestDecoderIncreasingKeys(t *testing.T) { - - type Struct struct { - Array []int - } - - values := map[string][]string{ - "Array[2]": {"2"}, - } - - var test Struct - - d := NewDecoder() - - err := d.Decode(&test, values) - Equal(t, err, nil) - - Equal(t, len(test.Array), 3) - Equal(t, test.Array[2], int(2)) - - values["Array[10]"] = []string{"10"} - - var test2 Struct - - err = d.Decode(&test2, values) - Equal(t, err, nil) - - Equal(t, len(test2.Array), 11) - Equal(t, test2.Array[2], int(2)) - Equal(t, test2.Array[10], int(10)) -} - -func TestDecoderInterface(t *testing.T) { - - var iface interface{} - - d := NewDecoder() - - values := map[string][]string{ - "": {"2"}, - } - - var i int - - iface = &i - - err := d.Decode(iface, values) - Equal(t, err, nil) - Equal(t, i, 2) - - iface = i - - err = d.Decode(iface, values) - NotEqual(t, err, nil) - - _, ok := err.(*InvalidDecoderError) - Equal(t, ok, true) - Equal(t, err.Error(), "form: Decode(non-pointer int)") - - values = map[string][]string{ - "Value": {"testVal"}, - } - - type test struct { - Value string - } - - var tst test - - iface = &tst - - err = d.Decode(iface, values) - Equal(t, err, nil) - Equal(t, tst.Value, "testVal") - - iface = tst - - err = d.Decode(iface, values) - NotEqual(t, err, nil) - - _, ok = err.(*InvalidDecoderError) - Equal(t, ok, true) - Equal(t, err.Error(), "form: Decode(non-pointer form.test)") -} - -func TestDecoderPointerToPointer(t *testing.T) { - - values := map[string][]string{ - "Value": {"testVal"}, - } - - type Test struct { - Value string - } - - var tst *Test - - d := NewDecoder() - err := d.Decode(&tst, values) - Equal(t, err, nil) - Equal(t, tst.Value, "testVal") -} - -func TestDecoderExplicit(t *testing.T) { - - type Test struct { - Name string `form:"Name"` - Age int - } - - values := map[string][]string{ - "Name": {"Joeybloggs"}, - "Age": {"3"}, - } - - var test Test - - d := NewDecoder() - d.SetMode(ModeExplicit) - - err := d.Decode(&test, values) - Equal(t, err, nil) - Equal(t, test.Name, "Joeybloggs") - Equal(t, test.Age, 0) -} - -func TestDecoderStructWithJSONTag(t *testing.T) { - type Test struct { - Name string `json:"name,omitempty"` - Age int `json:",omitempty"` - } - - values := map[string][]string{ - "name": {"Joeybloggs"}, - "Age": {"3"}, - } - - var test Test - - d := NewDecoder() - d.SetTagName("json") - - err := d.Decode(&test, values) - Equal(t, err, nil) - Equal(t, test.Name, "Joeybloggs") - Equal(t, test.Age, int(3)) -} - -func TestDecoderRegisterTagNameFunc(t *testing.T) { - - type Test struct { - Value string `json:"val,omitempty"` - Ignore string `json:"-"` - } - - values := url.Values{ - "val": []string{"joeybloggs"}, - "Ignore": []string{"ignore"}, - } - - var test Test - - decoder := NewDecoder() - decoder.RegisterTagNameFunc(func(fld reflect.StructField) string { - name := fld.Tag.Get("json") - - if commaIndex := strings.Index(name, ","); commaIndex != -1 { - name = name[:commaIndex] - } - - return name - }) - - err := decoder.Decode(&test, values) - Equal(t, err, nil) - Equal(t, test.Value, "joeybloggs") - Equal(t, test.Ignore, "") -} - -func TestDecoderEmbedModes(t *testing.T) { - - type A struct { - Field string - } - - type B struct { - A - Field string - } - - var b B - - decoder := NewDecoder() - - values := url.Values{ - "Field": []string{"Value"}, - } - - err := decoder.Decode(&b, values) - Equal(t, err, nil) - Equal(t, b.Field, "Value") - Equal(t, b.A.Field, "Value") - - values = url.Values{ - "Field": []string{"B Val"}, - "A.Field": []string{"A Val"}, - } - - err = decoder.Decode(&b, values) - Equal(t, err, nil) - Equal(t, b.Field, "B Val") - Equal(t, b.A.Field, "A Val") -} - -func TestInterfaceDecoding(t *testing.T) { - - type Test struct { - Iface interface{} - } - - var b Test - - values := url.Values{ - "Iface": []string{"1"}, - } - - decoder := NewDecoder() - err := decoder.Decode(&b, values) - Equal(t, err, nil) - Equal(t, b.Iface, "1") -} - -func TestDecodeArrayBug(t *testing.T) { - var data struct { - A [2]string - B [2]string - C [2]string - D [3]string - E [3]string - F [3]string - G [3]string - } - decoder := NewDecoder() - err := decoder.Decode(&data, url.Values{ - // Mixed types - "A": {"10"}, - "A[1]": {"20"}, - // overflow - "B": {"10", "20", "30"}, - "B[1]": {"31", "10", "20"}, - "B[2]": {"40"}, - // invalid array index - "C[q]": {""}, - // index and mix tests - "D": {"10"}, - "E": {"10", "20"}, - "F": {"10", "", "20"}, - "G": {"10"}, - "G[2]": {"20"}, - }) - NotEqual(t, err, nil) - Equal(t, err.Error(), "Field Namespace:C ERROR:invalid array index 'q'") - Equal(t, data.A[0], "10") - Equal(t, data.A[1], "20") - Equal(t, data.B[0], "10") - Equal(t, data.B[1], "31") - Equal(t, data.C[0], "") - Equal(t, data.C[1], "") - Equal(t, data.D[0], "10") - Equal(t, data.D[1], "") - Equal(t, data.D[2], "") - Equal(t, data.E[0], "10") - Equal(t, data.E[1], "20") - Equal(t, data.E[2], "") - Equal(t, data.F[0], "10") - Equal(t, data.F[1], "") - Equal(t, data.F[2], "20") - Equal(t, data.G[0], "10") - Equal(t, data.G[1], "") - Equal(t, data.G[2], "20") -} - -func TestDecoder_RegisterCustomTypeFuncOnSlice(t *testing.T) { - type customString string - - type TestStruct struct { - Slice []customString `form:"slice"` - } - - d := NewDecoder() - d.RegisterCustomTypeFunc(func(vals []string) (i interface{}, e error) { - custom := make([]customString, 0, len(vals)) - for i := 0; i < len(vals); i++ { - custom = append(custom, customString("custom"+vals[i])) - } - return custom, nil - }, []customString{}) - - var v TestStruct - err := d.Decode(&v, url.Values{"slice": []string{"v1", "v2"}}) - Equal(t, err, nil) - Equal(t, v.Slice, []customString{"customv1", "customv2"}) -} - -func TestDecoder_RegisterCustomTypeFunc(t *testing.T) { - type customString string - - type TestStruct struct { - Slice []customString `form:"slice"` - } - - d := NewDecoder() - d.RegisterCustomTypeFunc(func(vals []string) (i interface{}, e error) { - return customString("custom" + vals[0]), nil - }, customString("")) - - var v TestStruct - err := d.Decode(&v, url.Values{"slice": []string{"v1", "v2"}}) - Equal(t, err, nil) - - Equal(t, v.Slice, []customString{"customv1", "customv2"}) -} - -func TestDecoder_EmptyArrayString(t *testing.T) { - type T1 struct { - F1 string `form:"F1"` - } - in := url.Values{ - "F1": []string{}, - } - - v := new(T1) - - d := NewDecoder() - err := d.Decode(v, in) - Equal(t, err, nil) -} - -func TestDecoder_EmptyArrayBool(t *testing.T) { - type T1 struct { - F1 bool `form:"F1"` - } - in := url.Values{ - "F1": []string{}, - } - - v := new(T1) - d := NewDecoder() - err := d.Decode(v, in) - Equal(t, err, nil) -} - -func TestDecoder_InvalidSliceIndex(t *testing.T) { - type PostsRequest struct { - PostIds []string - } - in := url.Values{ - "PostIds[]": []string{"1", "2"}, - } - - v := new(PostsRequest) - d := NewDecoder() - err := d.Decode(v, in) - NotEqual(t, err, nil) - Equal(t, err.Error(), "Field Namespace:PostIds ERROR:invalid slice index ''") - - // No error with proper name - type PostsRequest2 struct { - PostIds []string `form:"PostIds[]"` - } - - v2 := new(PostsRequest2) - err = d.Decode(v2, in) - Equal(t, err, nil) - Equal(t, len(v2.PostIds), 2) - Equal(t, v2.PostIds[0], "1") - Equal(t, v2.PostIds[1], "2") -} diff --git a/toolkit/form/doc.go b/toolkit/form/doc.go deleted file mode 100644 index f553dac2..00000000 --- a/toolkit/form/doc.go +++ /dev/null @@ -1,275 +0,0 @@ -/* -Package form Decodes url.Values into Go value(s) and Encodes Go value(s) into url.Values. - - -It has the following features: - - - Primitives types cause zero allocations. - - Supports map of almost all types. - - Supports both Numbered and Normal arrays eg. "Array[0]" and just "Array" - with multiple values passed. - - Slice honours the specified index. eg. if "Slice[2]" is the only Slice - value passed down, it will be put at index 2; if slice isn't big enough - it will be expanded. - - Array honours the specified index. eg. if "Array[2]" is the only Array - value passed down, it will be put at index 2; if array isn't big enough - a warning will be printed and value ignored. - - Only creates objects as necessary eg. if no `array` or `map` values are - passed down, the `array` and `map` are left as their default values in - the struct. - - Allows for Custom Type registration. - - Handles time.Time using RFC3339 time format by default, - but can easily be changed by registering a Custom Type, see below. - - Handles Encoding & Decoding of almost all Go types eg. can Decode into - struct, array, map, int... and Encode a struct, array, map, int... - -Common Questions - -Questions - - Does it support encoding.TextUnmarshaler? - No because TextUnmarshaler only accepts []byte but posted values can have - multiple values, so is not suitable. - - Mixing array/slice with array[idx]/slice[idx], in which order are they parsed? - array/slice then array[idx]/slice[idx] - -Supported Types - -out of the box supported types - - - string - - bool - - int, int8, int16, int32, int64 - - uint, uint8, uint16, uint32, uint64 - - float32, float64 - - struct and anonymous struct - - interface{} - - time.Time` - by default using RFC3339 - - a `pointer` to one of the above types - - slice, array - - map - - `custom types` can override any of the above types - - many other types may be supported inherently (eg. bson.ObjectId is - type ObjectId string, which will get populated by the string type - - **NOTE**: map, struct and slice nesting are ad infinitum. - -Usage - -symbols - - - Use symbol `.` for separating fields/structs. (eg. `structfield.field`) - - Use `[index or key]` for access to index of a slice/array or key for map. - (eg. `arrayfield[0]`, `mapfield[keyvalue]`) - -html - -
- - - - - - - - - - - - -
- -Example - -example decoding the above HTML - - package main - - import ( - "fmt" - "log" - "net/url" - - "github.com/go-playground/form/v4" - ) - - // Address contains address information - type Address struct { - Name string - Phone string - } - - // User contains user information - type User struct { - Name string - Age uint8 - Gender string - Address []Address - Active bool `form:"active"` - MapExample map[string]string - NestedMap map[string]map[string]string - NestedArray [][]string - } - - // use a single instance of Decoder, it caches struct info - var decoder *form.Decoder - - func main() { - decoder = form.NewDecoder() - - // this simulates the results of http.Request's ParseForm() function - values := parseForm() - - var user User - - // must pass a pointer - err := decoder.Decode(&user, values) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", user) - } - - // this simulates the results of http.Request's ParseForm() function - func parseForm() url.Values { - return url.Values{ - "Name": []string{"joeybloggs"}, - "Age": []string{"3"}, - "Gender": []string{"Male"}, - "Address[0].Name": []string{"26 Here Blvd."}, - "Address[0].Phone": []string{"9(999)999-9999"}, - "Address[1].Name": []string{"26 There Blvd."}, - "Address[1].Phone": []string{"1(111)111-1111"}, - "active": []string{"true"}, - "MapExample[key]": []string{"value"}, - "NestedMap[key][key]": []string{"value"}, - "NestedArray[0][0]": []string{"value"}, - } - } - -example encoding - - package main - - import ( - "fmt" - "log" - - "github.com/go-playground/form/v4" - ) - - // Address contains address information - type Address struct { - Name string - Phone string - } - - // User contains user information - type User struct { - Name string - Age uint8 - Gender string - Address []Address - Active bool `form:"active"` - MapExample map[string]string - NestedMap map[string]map[string]string - NestedArray [][]string - } - - // use a single instance of Encoder, it caches struct info - var encoder *form.Encoder - - func main() { - encoder = form.NewEncoder() - - user := User{ - Name: "joeybloggs", - Age: 3, - Gender: "Male", - Address: []Address{ - {Name: "26 Here Blvd.", Phone: "9(999)999-9999"}, - {Name: "26 There Blvd.", Phone: "1(111)111-1111"}, - }, - Active: true, - MapExample: map[string]string{"key": "value"}, - NestedMap: map[string]map[string]string{"key": {"key": "value"}}, - NestedArray: [][]string{{"value"}}, - } - - // must pass a pointer - values, err := encoder.Encode(&user) - if err != nil { - log.Panic(err) - } - - fmt.Printf("%#v\n", values) - } - - -Registering Custom Types - -Decoder - - decoder.RegisterCustomTypeFunc(func(vals []string) (interface{}, error) { - return time.Parse("2006-01-02", vals[0]) - }, time.Time{}) - - ADDITIONAL: if a struct type is registered, the function will only be called - if a url.Value exists for the struct and not just the struct fields - eg. url.Values{"User":"Name%3Djoeybloggs"} will call the custom type function - with 'User' as the type, however url.Values{"User.Name":"joeybloggs"} will not. - -Encoder - - encoder.RegisterCustomTypeFunc(func(x interface{}) ([]string, error) { - return []string{x.(time.Time).Format("2006-01-02")}, nil - }, time.Time{}) - - -Ignoring Fields - -you can tell form to ignore fields using `-` in the tag - - type MyStruct struct { - Field string `form:"-"` - } - -Omitempty - -you can tell form to omit empty fields using `,omitempty` or `FieldName,omitempty` in the tag - - type MyStruct struct { - Field string `form:",omitempty"` - Field2 string `form:"CustomFieldName,omitempty"` - } - - -Notes - -To maximize compatibility with other systems the Encoder attempts -to avoid using array indexes in url.Values if at all possible. - - eg. - - // A struct field of - Field []string{"1", "2", "3"} - - // will be output a url.Value as - "Field": []string{"1", "2", "3"} - - and not - "Field[0]": []string{"1"} - "Field[1]": []string{"2"} - "Field[2]": []string{"3"} - - // however there are times where it is unavoidable, like with pointers - i := int(1) - Field []*string{nil, nil, &i} - - // to avoid index 1 and 2 must use index - "Field[2]": []string{"1"} - -*/ -package form diff --git a/toolkit/form/encoder.go b/toolkit/form/encoder.go deleted file mode 100644 index 6de26cd2..00000000 --- a/toolkit/form/encoder.go +++ /dev/null @@ -1,261 +0,0 @@ -package form - -import ( - "fmt" - "net/url" - "github.com/goccy/go-reflect" - "strconv" - "time" -) - -type encoder struct { - e *Encoder - errs EncodeErrors - values url.Values - namespace []byte -} - -func (e *encoder) setError(namespace []byte, err error) { - if e.errs == nil { - e.errs = make(EncodeErrors) - } - - e.errs[string(namespace)] = err -} - -func (e *encoder) setVal(namespace []byte, idx int, vals ...string) { - - arr, ok := e.values[string(namespace)] - if ok { - arr = append(arr, vals...) - } else { - arr = vals - } - - e.values[string(namespace)] = arr -} - -func (e *encoder) traverseStruct(v reflect.Value, namespace []byte, idx int) { - - typ := v.Type() - l := len(namespace) - first := l == 0 - - // anonymous structs will still work for caching as the whole definition is stored - // including tags - s, ok := e.e.structCache.Get(typ) - if !ok { - s = e.e.structCache.parseStruct(e.e.mode, v, typ, e.e.tagName) - } - - for _, f := range s.fields { - namespace = namespace[:l] - - if f.isAnonymous && e.e.embedAnonymous { - e.setFieldByType(v.Field(f.idx), namespace, idx, f.isOmitEmpty) - continue - } - - if first { - namespace = append(namespace, f.name...) - } else { - namespace = append(namespace, e.e.namespacePrefix...) - namespace = append(namespace, f.name...) - namespace = append(namespace, e.e.namespaceSuffix...) - } - - e.setFieldByType(v.Field(f.idx), namespace, idx, f.isOmitEmpty) - } -} - -func (e *encoder) setFieldByType(current reflect.Value, namespace []byte, idx int, isOmitEmpty bool) { - - if idx > -1 && current.Kind() == reflect.Ptr { - namespace = append(namespace, '[') - namespace = strconv.AppendInt(namespace, int64(idx), 10) - namespace = append(namespace, ']') - idx = -2 - } - - if isOmitEmpty && !hasValue(current) { - return - } - v, kind := ExtractType(current) - - if e.e.customTypeFuncs != nil { - - if cf, ok := e.e.customTypeFuncs[v.Type()]; ok { - - arr, err := cf(v.Interface()) - if err != nil { - e.setError(namespace, err) - return - } - - if idx > -1 { - namespace = append(namespace, '[') - namespace = strconv.AppendInt(namespace, int64(idx), 10) - namespace = append(namespace, ']') - } - - e.setVal(namespace, idx, arr...) - return - } - } - - switch kind { - case reflect.Ptr, reflect.Interface, reflect.Invalid: - return - - case reflect.String: - - e.setVal(namespace, idx, v.String()) - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - - e.setVal(namespace, idx, strconv.FormatUint(v.Uint(), 10)) - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - - e.setVal(namespace, idx, strconv.FormatInt(v.Int(), 10)) - - case reflect.Float32: - - e.setVal(namespace, idx, strconv.FormatFloat(v.Float(), 'f', -1, 32)) - - case reflect.Float64: - - e.setVal(namespace, idx, strconv.FormatFloat(v.Float(), 'f', -1, 64)) - - case reflect.Bool: - - e.setVal(namespace, idx, strconv.FormatBool(v.Bool())) - - case reflect.Slice, reflect.Array: - - if idx == -1 { - - for i := 0; i < v.Len(); i++ { - e.setFieldByType(v.Index(i), namespace, i, false) - } - - return - } - - if idx > -1 { - namespace = append(namespace, '[') - namespace = strconv.AppendInt(namespace, int64(idx), 10) - namespace = append(namespace, ']') - } - - namespace = append(namespace, '[') - l := len(namespace) - - for i := 0; i < v.Len(); i++ { - namespace = namespace[:l] - namespace = strconv.AppendInt(namespace, int64(i), 10) - namespace = append(namespace, ']') - e.setFieldByType(v.Index(i), namespace, -2, false) - } - - case reflect.Map: - - if idx > -1 { - namespace = append(namespace, '[') - namespace = strconv.AppendInt(namespace, int64(idx), 10) - namespace = append(namespace, ']') - } - - var valid bool - var s string - l := len(namespace) - - for _, key := range v.MapKeys() { - - namespace = namespace[:l] - - if s, valid = e.getMapKey(key, namespace); !valid { - continue - } - - namespace = append(namespace, '[') - namespace = append(namespace, s...) - namespace = append(namespace, ']') - - e.setFieldByType(v.MapIndex(key), namespace, -2, false) - } - - case reflect.Struct: - - // if we get here then no custom time function declared so use RFC3339 by default - if v.Type() == timeType { - - if idx > -1 { - namespace = append(namespace, '[') - namespace = strconv.AppendInt(namespace, int64(idx), 10) - namespace = append(namespace, ']') - } - - e.setVal(namespace, idx, v.Interface().(time.Time).Format(time.RFC3339)) - return - } - - if idx == -1 { - e.traverseStruct(v, namespace, idx) - return - } - - if idx > -1 { - namespace = append(namespace, '[') - namespace = strconv.AppendInt(namespace, int64(idx), 10) - namespace = append(namespace, ']') - } - - e.traverseStruct(v, namespace, -2) - } -} - -func (e *encoder) getMapKey(key reflect.Value, namespace []byte) (string, bool) { - - v, kind := ExtractType(key) - - if e.e.customTypeFuncs != nil { - - if cf, ok := e.e.customTypeFuncs[v.Type()]; ok { - arr, err := cf(v.Interface()) - if err != nil { - e.setError(namespace, err) - return "", false - } - - return arr[0], true - } - } - - switch kind { - case reflect.Interface, reflect.Ptr: - return "", false - - case reflect.String: - return v.String(), true - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return strconv.FormatUint(v.Uint(), 10), true - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return strconv.FormatInt(v.Int(), 10), true - - case reflect.Float32: - return strconv.FormatFloat(v.Float(), 'f', -1, 32), true - - case reflect.Float64: - return strconv.FormatFloat(v.Float(), 'f', -1, 64), true - - case reflect.Bool: - return strconv.FormatBool(v.Bool()), true - - default: - e.setError(namespace, fmt.Errorf("Unsupported Map Key '%v' Namespace '%s'", v.String(), namespace)) - return "", false - } -} diff --git a/toolkit/form/encoder_test.go b/toolkit/form/encoder_test.go deleted file mode 100644 index 32315610..00000000 --- a/toolkit/form/encoder_test.go +++ /dev/null @@ -1,1609 +0,0 @@ -package form - -import ( - "errors" - "github.com/goccy/go-reflect" - "strings" - "testing" - "time" - - . "github.com/go-playground/assert/v2" -) - -// NOTES: -// - Run "go test" to run tests -// - Run "gocov test | gocov report" to report on test converage by file -// - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called -// -// or -// -// -- may be a good idea to change to output path to somewherelike /tmp -// go test -coverprofile cover.out && go tool cover -html=cover.out -o cover.html -// -// -// go test -cpuprofile cpu.out -// ./validator.test -test.bench=. -test.cpuprofile=cpu.prof -// go tool pprof validator.test cpu.prof -// -// -// go test -memprofile mem.out - -func TestEncoderInt(t *testing.T) { - - type TestInt struct { - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - IntPtr *int - Int8Ptr *int8 - Int16Ptr *int16 - Int32Ptr *int32 - Int64Ptr *int64 - IntArray []int - IntPtrArray []*int - IntArrayArray [][]int - IntPtrArrayArray [][]*int - IntMap map[int]int - IntPtrMap map[*int]*int - NoValue int - NoPtrValue *int - } - - i := int(3) - i8 := int8(3) - i16 := int16(3) - i32 := int32(3) - i64 := int64(3) - - zero := int(0) - one := int(1) - two := int(2) - three := int(3) - - test := TestInt{ - Int: i, - Int8: i8, - Int16: i16, - Int32: i32, - Int64: i64, - IntPtr: &i, - Int8Ptr: &i8, - Int16Ptr: &i16, - Int32Ptr: &i32, - Int64Ptr: &i64, - IntArray: []int{one, two, three}, - IntPtrArray: []*int{&one, &two, &three}, - IntArrayArray: [][]int{{one, zero, three}}, - IntPtrArrayArray: [][]*int{{&one, &zero, &three}}, - IntMap: map[int]int{one: three, zero: two}, - IntPtrMap: map[*int]*int{&one: &three, &zero: &two}, - } - - encoder := NewEncoder() - values, errs := encoder.Encode(test) - Equal(t, errs, nil) - Equal(t, len(values), 25) - - val, ok := values["Int8"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int8"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int16"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int32"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int64"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int8"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int8Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int16Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int32Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Int64Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["IntArray"] - Equal(t, ok, true) - Equal(t, len(val), 3) - Equal(t, val[0], "1") - Equal(t, val[1], "2") - Equal(t, val[2], "3") - - val, ok = values["IntPtrArray[0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["IntPtrArray[1]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["IntPtrArray[2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["IntArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["IntArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - val, ok = values["IntArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["IntPtrArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["IntPtrArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - val, ok = values["IntPtrArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["IntMap[0]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["IntMap[1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["IntPtrMap[0]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["IntPtrMap[1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["NoValue"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - _, ok = values["NoPtrValue"] - Equal(t, ok, false) -} - -func TestEncoderUint(t *testing.T) { - - type TestUint struct { - Uint uint - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Uint64 uint64 - UintPtr *uint - Uint8Ptr *uint8 - Uint16Ptr *uint16 - Uint32Ptr *uint32 - Uint64Ptr *uint64 - UintArray []uint - UintPtrArray []*uint - UintArrayArray [][]uint - UintPtrArrayArray [][]*uint - UintMap map[uint]uint - UintPtrMap map[*uint]*uint - NoValue uint - NoPtrValue *uint - } - - i := uint(3) - i8 := uint8(3) - i16 := uint16(3) - i32 := uint32(3) - i64 := uint64(3) - - zero := uint(0) - one := uint(1) - two := uint(2) - three := uint(3) - - test := TestUint{ - Uint: i, - Uint8: i8, - Uint16: i16, - Uint32: i32, - Uint64: i64, - UintPtr: &i, - Uint8Ptr: &i8, - Uint16Ptr: &i16, - Uint32Ptr: &i32, - Uint64Ptr: &i64, - UintArray: []uint{one, two, three}, - UintPtrArray: []*uint{&one, &two, &three}, - UintArrayArray: [][]uint{{one, zero, three}}, - UintPtrArrayArray: [][]*uint{{&one, &zero, &three}}, - UintMap: map[uint]uint{one: three, zero: two}, - UintPtrMap: map[*uint]*uint{&one: &three, &zero: &two}, - } - - encoder := NewEncoder() - values, errs := encoder.Encode(test) - - Equal(t, errs, nil) - Equal(t, len(values), 25) - - val, ok := values["Uint8"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint8"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint16"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint32"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint64"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint8"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint8Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint16Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint32Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["Uint64Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["UintArray"] - Equal(t, ok, true) - Equal(t, len(val), 3) - Equal(t, val[0], "1") - Equal(t, val[1], "2") - Equal(t, val[2], "3") - - val, ok = values["UintPtrArray[0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["UintPtrArray[1]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["UintPtrArray[2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["UintArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["UintArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - val, ok = values["UintArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["UintPtrArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["UintPtrArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - val, ok = values["UintPtrArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["UintMap[0]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["UintMap[1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["UintPtrMap[0]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["UintPtrMap[1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["NoValue"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - _, ok = values["NoPtrValue"] - Equal(t, ok, false) -} - -func TestEncoderString(t *testing.T) { - - type TestString struct { - String string - StringPtr *string - StringArray []string - StringPtrArray []*string - StringArrayArray [][]string - StringPtrArrayArray [][]*string - StringMap map[string]string - StringPtrMap map[*string]*string - NoValue string - } - - one := "1" - two := "2" - three := "3" - - test := TestString{ - String: three, - StringPtr: &two, - StringArray: []string{one, "", three}, - StringPtrArray: []*string{&one, nil, &three}, - StringArrayArray: [][]string{{one, "", three}, nil, {one}}, - StringPtrArrayArray: [][]*string{{&one, nil, &three}, nil, {&one}}, - StringMap: map[string]string{one: three, three: two}, - StringPtrMap: map[*string]*string{&one: &three, &three: &two}, - } - - encoder := NewEncoder() - values, errs := encoder.Encode(test) - - Equal(t, errs, nil) - Equal(t, len(values), 17) - - val, ok := values["String"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["StringPtr"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["StringArray"] - Equal(t, ok, true) - Equal(t, len(val), 3) - Equal(t, val[0], "1") - Equal(t, val[1], "") - Equal(t, val[2], "3") - - val, ok = values["StringPtr"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["StringPtrArray[0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - _, ok = values["StringPtrArray[1]"] - Equal(t, ok, false) - - val, ok = values["StringPtrArray[2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["StringPtrArray[2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["StringArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["StringArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "") - - val, ok = values["StringArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - _, ok = values["StringArrayArray[1][1]"] - Equal(t, ok, false) - - val, ok = values["StringArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["StringPtrArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - _, ok = values["StringPtrArrayArray[0][1]"] - Equal(t, ok, false) - - val, ok = values["StringPtrArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - _, ok = values["StringPtrArrayArray[1][1]"] - Equal(t, ok, false) - - val, ok = values["StringPtrArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1") - - val, ok = values["StringMap[1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["StringMap[3]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["StringPtrMap[1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["StringPtrMap[3]"] - Equal(t, ok, true) - Equal(t, val[0], "2") - - val, ok = values["NoValue"] - Equal(t, ok, true) - Equal(t, val[0], "") -} - -func TestEncoderFloat(t *testing.T) { - - type TestFloat struct { - Float32 float32 - Float32Ptr *float32 - Float64 float64 - Float64Ptr *float64 - Float32Array []float32 - Float64Array []float64 - Float32PtrArray []*float32 - Float64PtrArray []*float64 - Float32ArrayArray [][]float32 - Float64ArrayArray [][]float64 - Float32PtrArrayArray [][]*float32 - Float64PtrArrayArray [][]*float64 - Float32Map map[float32]float32 - Float64Map map[float64]float64 - Float32PtrMap map[*float32]*float32 - Float64PtrMap map[*float64]*float64 - NoValue float32 - } - - one32 := float32(1.1) - two32 := float32(2.2) - three32 := float32(3.3) - one64 := float64(1.1) - two64 := float64(2.2) - three64 := float64(3.3) - - test := TestFloat{ - Float32: three32, - Float32Ptr: &three32, - Float64: three64, - Float64Ptr: &three64, - Float32Array: []float32{one32, two32, three32}, - Float64Array: []float64{one64, two64, three64}, - Float32PtrArray: []*float32{&one32, &two32, &three32}, - Float64PtrArray: []*float64{&one64, &two64, &three64}, - Float32ArrayArray: [][]float32{{one32, 0, three32}, nil, {one32}}, - Float64ArrayArray: [][]float64{{one64, 0, three64}, nil, {one64}}, - Float32PtrArrayArray: [][]*float32{{&one32, nil, &three32}, nil, {&one32}}, - Float64PtrArrayArray: [][]*float64{{&one64, nil, &three64}, nil, {&one64}}, - Float32Map: map[float32]float32{one32: three32, three32: two32}, - Float64Map: map[float64]float64{one64: three64, three64: two64}, - Float32PtrMap: map[*float32]*float32{&one32: &three32, &three32: &two32}, - Float64PtrMap: map[*float64]*float64{&one64: &three64, &three64: &two64}, - } - - encoder := NewEncoder() - values, errs := encoder.Encode(test) - - Equal(t, errs, nil) - Equal(t, len(values), 35) - - val, ok := values["Float32"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float32Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float64"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float64Ptr"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float32Array"] - Equal(t, ok, true) - Equal(t, len(val), 3) - Equal(t, val[0], "1.1") - Equal(t, val[1], "2.2") - Equal(t, val[2], "3.3") - - val, ok = values["Float64Array"] - Equal(t, ok, true) - Equal(t, len(val), 3) - Equal(t, val[0], "1.1") - Equal(t, val[1], "2.2") - Equal(t, val[2], "3.3") - - val, ok = values["Float32PtrArray[0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float32PtrArray[1]"] - Equal(t, ok, true) - Equal(t, val[0], "2.2") - - val, ok = values["Float32PtrArray[2]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float64PtrArray[0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float64PtrArray[1]"] - Equal(t, ok, true) - Equal(t, val[0], "2.2") - - val, ok = values["Float64PtrArray[2]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float32ArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float32ArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - val, ok = values["Float32ArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - _, ok = values["Float32ArrayArray[1][0]"] - Equal(t, ok, false) - - val, ok = values["Float32ArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float64ArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float64ArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "0") - - val, ok = values["Float64ArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - _, ok = values["Float64ArrayArray[1][0]"] - Equal(t, ok, false) - - val, ok = values["Float64ArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float32PtrArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - _, ok = values["Float32PtrArrayArray[0][1]"] - Equal(t, ok, false) - - val, ok = values["Float32PtrArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - _, ok = values["Float32PtrArrayArray[1][0]"] - Equal(t, ok, false) - - val, ok = values["Float32PtrArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float64PtrArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - _, ok = values["Float64PtrArrayArray[0][1]"] - Equal(t, ok, false) - - val, ok = values["Float64PtrArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - _, ok = values["Float64PtrArrayArray[1][0]"] - Equal(t, ok, false) - - val, ok = values["Float64PtrArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "1.1") - - val, ok = values["Float32Map[1.1]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float32Map[3.3]"] - Equal(t, ok, true) - Equal(t, val[0], "2.2") - - val, ok = values["Float64Map[1.1]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float64Map[3.3]"] - Equal(t, ok, true) - Equal(t, val[0], "2.2") - - val, ok = values["Float32PtrMap[1.1]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float32PtrMap[3.3]"] - Equal(t, ok, true) - Equal(t, val[0], "2.2") - - val, ok = values["Float64PtrMap[1.1]"] - Equal(t, ok, true) - Equal(t, val[0], "3.3") - - val, ok = values["Float64PtrMap[3.3]"] - Equal(t, ok, true) - Equal(t, val[0], "2.2") - - val, ok = values["NoValue"] - Equal(t, ok, true) - Equal(t, val[0], "0") -} - -func TestEncoderBool(t *testing.T) { - - type TestBool struct { - Bool bool - BoolPtr *bool - BoolArray []bool - BoolPtrArray []*bool - BoolArrayArray [][]bool - BoolPtrArrayArray [][]*bool - BoolMap map[bool]bool - BoolPtrMap map[*bool]*bool - NoValue bool - } - - tr := true - fa := false - - test := TestBool{ - Bool: tr, - BoolPtr: &tr, - BoolArray: []bool{fa, tr, tr}, - BoolPtrArray: []*bool{&fa, nil, &tr}, - BoolArrayArray: [][]bool{{tr, fa, tr}, nil, {tr}}, - BoolPtrArrayArray: [][]*bool{{&tr, nil, &tr}, nil, {&tr}}, - BoolMap: map[bool]bool{tr: fa, fa: true}, - BoolPtrMap: map[*bool]*bool{&tr: &fa, &fa: &tr}, - } - - encoder := NewEncoder() - values, errs := encoder.Encode(test) - - Equal(t, errs, nil) - Equal(t, len(values), 17) - - val, ok := values["Bool"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - val, ok = values["BoolPtr"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - val, ok = values["BoolArray"] - Equal(t, ok, true) - Equal(t, len(val), 3) - Equal(t, val[0], "false") - Equal(t, val[1], "true") - Equal(t, val[2], "true") - - val, ok = values["BoolPtrArray[0]"] - Equal(t, ok, true) - Equal(t, val[0], "false") - - _, ok = values["BoolPtrArray[1]"] - Equal(t, ok, false) - - val, ok = values["BoolPtrArray[2]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - val, ok = values["BoolArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - val, ok = values["BoolArrayArray[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "false") - - val, ok = values["BoolArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - _, ok = values["BoolArrayArray[1][0]"] - Equal(t, ok, false) - - val, ok = values["BoolArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - val, ok = values["BoolPtrArrayArray[0][0]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - _, ok = values["BoolPtrArrayArray[0][1]"] - Equal(t, ok, false) - - val, ok = values["BoolPtrArrayArray[0][2]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - _, ok = values["BoolPtrArrayArray[1][0]"] - Equal(t, ok, false) - - val, ok = values["BoolPtrArrayArray[2][0]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - val, ok = values["BoolMap[true]"] - Equal(t, ok, true) - Equal(t, val[0], "false") - - val, ok = values["BoolMap[false]"] - Equal(t, ok, true) - Equal(t, val[0], "true") - - val, ok = values["BoolPtrMap[true]"] - Equal(t, ok, true) - Equal(t, val[0], "false") - - val, ok = values["BoolPtrMap[false]"] - Equal(t, ok, true) - Equal(t, val[0], "true") -} - -func TestEncoderStruct(t *testing.T) { - - type Phone struct { - Number string - } - - type TestStruct struct { - Name string `form:"name"` - Ignore string `form:"-"` - NonNilPtr *Phone - Phone []Phone - PhonePtr []*Phone - - Anonymous struct { - Value string - Ignore string `form:"-"` - unexposed string - } - Time time.Time - TimePtr *time.Time - unexposed string - Invalid interface{} - ExistingMap map[string]string `form:"mp"` - MapNoValue map[int]int - Array []string - ZeroLengthArray []string - IfaceNonNil interface{} - IfaceInvalid interface{} - TimeMapKey map[time.Time]string - ArrayMap []map[int]int - ArrayTime []time.Time - } - - tm, err := time.Parse("2006-01-02", "2016-01-02") - Equal(t, err, nil) - - test := &TestStruct{ - Name: "joeybloggs", - Ignore: "ignore", - NonNilPtr: new(Phone), - Phone: []Phone{ - {Number: "1(111)111-1111"}, - {Number: "9(999)999-9999"}, - }, - PhonePtr: []*Phone{ - {Number: "1(111)111-1111"}, - {Number: "9(999)999-9999"}, - }, - Anonymous: struct { - Value string - Ignore string `form:"-"` - unexposed string - }{ - Value: "Anon", - }, - Time: tm, - TimePtr: &tm, - unexposed: "unexposed field", - ExistingMap: map[string]string{"existingkey": "existingvalue", "key": "value"}, - Array: []string{"1", "2"}, - ZeroLengthArray: []string{}, - IfaceNonNil: new(Phone), - IfaceInvalid: nil, - TimeMapKey: map[time.Time]string{tm: "time"}, - ArrayMap: []map[int]int{{1: 3}}, - ArrayTime: []time.Time{tm}, - } - - encoder := NewEncoder() - encoder.SetTagName("form") - encoder.RegisterCustomTypeFunc(func(x interface{}) ([]string, error) { - return []string{x.(time.Time).Format("2006-01-02")}, nil - }, time.Time{}) - - values, errs := encoder.Encode(test) - - Equal(t, errs, nil) - Equal(t, len(values), 16) - - val, ok := values["name"] - Equal(t, ok, true) - Equal(t, val[0], "joeybloggs") - - _, ok = values["Ignore"] - Equal(t, ok, false) - - val, ok = values["NonNilPtr.Number"] - Equal(t, ok, true) - Equal(t, val[0], "") - - val, ok = values["Phone[0].Number"] - Equal(t, ok, true) - Equal(t, val[0], "1(111)111-1111") - - val, ok = values["Phone[1].Number"] - Equal(t, ok, true) - Equal(t, val[0], "9(999)999-9999") - - val, ok = values["PhonePtr[0].Number"] - Equal(t, ok, true) - Equal(t, val[0], "1(111)111-1111") - - val, ok = values["PhonePtr[1].Number"] - Equal(t, ok, true) - Equal(t, val[0], "9(999)999-9999") - - val, ok = values["Anonymous.Value"] - Equal(t, ok, true) - Equal(t, val[0], "Anon") - - _, ok = values["Anonymous.Ignore"] - Equal(t, ok, false) - - _, ok = values["Anonymous.unexposed"] - Equal(t, ok, false) - - val, ok = values["Time"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format("2006-01-02")) - - val, ok = values["TimePtr"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format("2006-01-02")) - - _, ok = values["unexposed"] - Equal(t, ok, false) - - val, ok = values["mp[existingkey]"] - Equal(t, ok, true) - Equal(t, val[0], "existingvalue") - - val, ok = values["mp[key]"] - Equal(t, ok, true) - Equal(t, val[0], "value") - - val, ok = values["Array"] - Equal(t, ok, true) - Equal(t, len(val), 2) - Equal(t, val[0], "1") - Equal(t, val[1], "2") - - _, ok = values["ZeroLengthArray"] - Equal(t, ok, false) - - val, ok = values["IfaceNonNil.Number"] - Equal(t, ok, true) - Equal(t, val[0], "") - - _, ok = values["IfaceInvalid"] - Equal(t, ok, false) - - val, ok = values["IfaceNonNil.Number"] - Equal(t, ok, true) - Equal(t, val[0], "") - - val, ok = values["TimeMapKey["+tm.Format("2006-01-02")+"]"] - Equal(t, ok, true) - Equal(t, val[0], "time") - - val, ok = values["ArrayMap[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["ArrayTime[0]"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format("2006-01-02")) - - s := struct { - Value string - Ignore string `form:"-"` - unexposed string - ArrayTime []time.Time - }{ - Value: "tval", - Ignore: "ignore", - unexposed: "unexp", - ArrayTime: []time.Time{tm}, - } - - encoder = NewEncoder() - values, errs = encoder.Encode(&s) - Equal(t, errs, nil) - Equal(t, len(values), 2) - - val, ok = values["Value"] - Equal(t, ok, true) - Equal(t, val[0], "tval") - - _, ok = values["Ignore"] - Equal(t, ok, false) - - _, ok = values["unexposed"] - Equal(t, ok, false) - - val, ok = values["ArrayTime[0]"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format(time.RFC3339)) -} - -func TestEncoderStructCustomNamespace(t *testing.T) { - - type Phone struct { - Number string - } - - type TestStruct struct { - Name string `form:"name"` - Ignore string `form:"-"` - NonNilPtr *Phone - Phone []Phone - PhonePtr []*Phone - - Anonymous struct { - Value string - Ignore string `form:"-"` - unexposed string - } - Time time.Time - TimePtr *time.Time - unexposed string - Invalid interface{} - ExistingMap map[string]string `form:"mp"` - MapNoValue map[int]int - Array []string - ZeroLengthArray []string - IfaceNonNil interface{} - IfaceInvalid interface{} - TimeMapKey map[time.Time]string - ArrayMap []map[int]int - ArrayTime []time.Time - } - - tm, err := time.Parse("2006-01-02", "2016-01-02") - Equal(t, err, nil) - - test := &TestStruct{ - Name: "joeybloggs", - Ignore: "ignore", - NonNilPtr: new(Phone), - Phone: []Phone{ - {Number: "1(111)111-1111"}, - {Number: "9(999)999-9999"}, - }, - PhonePtr: []*Phone{ - {Number: "1(111)111-1111"}, - {Number: "9(999)999-9999"}, - }, - Anonymous: struct { - Value string - Ignore string `form:"-"` - unexposed string - }{ - Value: "Anon", - }, - Time: tm, - TimePtr: &tm, - unexposed: "unexposed field", - ExistingMap: map[string]string{"existingkey": "existingvalue", "key": "value"}, - Array: []string{"1", "2"}, - ZeroLengthArray: []string{}, - IfaceNonNil: new(Phone), - IfaceInvalid: nil, - TimeMapKey: map[time.Time]string{tm: "time"}, - ArrayMap: []map[int]int{{1: 3}}, - ArrayTime: []time.Time{tm}, - } - - encoder := NewEncoder() - encoder.SetTagName("form") - encoder.RegisterCustomTypeFunc(func(x interface{}) ([]string, error) { - return []string{x.(time.Time).Format("2006-01-02")}, nil - }, time.Time{}) - encoder.SetNamespacePrefix("[") - encoder.SetNamespaceSuffix("]") - - values, errs := encoder.Encode(test) - - Equal(t, errs, nil) - Equal(t, len(values), 16) - - val, ok := values["name"] - Equal(t, ok, true) - Equal(t, val[0], "joeybloggs") - - _, ok = values["Ignore"] - Equal(t, ok, false) - - val, ok = values["NonNilPtr[Number]"] - Equal(t, ok, true) - Equal(t, val[0], "") - - val, ok = values["Phone[0][Number]"] - Equal(t, ok, true) - Equal(t, val[0], "1(111)111-1111") - - val, ok = values["Phone[1][Number]"] - Equal(t, ok, true) - Equal(t, val[0], "9(999)999-9999") - - val, ok = values["PhonePtr[0][Number]"] - Equal(t, ok, true) - Equal(t, val[0], "1(111)111-1111") - - val, ok = values["PhonePtr[1][Number]"] - Equal(t, ok, true) - Equal(t, val[0], "9(999)999-9999") - - val, ok = values["Anonymous[Value]"] - Equal(t, ok, true) - Equal(t, val[0], "Anon") - - _, ok = values["Anonymous[Ignore]"] - Equal(t, ok, false) - - _, ok = values["Anonymous.unexposed"] - Equal(t, ok, false) - - val, ok = values["Time"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format("2006-01-02")) - - val, ok = values["TimePtr"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format("2006-01-02")) - - _, ok = values["unexposed"] - Equal(t, ok, false) - - val, ok = values["mp[existingkey]"] - Equal(t, ok, true) - Equal(t, val[0], "existingvalue") - - val, ok = values["mp[key]"] - Equal(t, ok, true) - Equal(t, val[0], "value") - - val, ok = values["Array"] - Equal(t, ok, true) - Equal(t, len(val), 2) - Equal(t, val[0], "1") - Equal(t, val[1], "2") - - _, ok = values["ZeroLengthArray"] - Equal(t, ok, false) - - val, ok = values["IfaceNonNil[Number]"] - Equal(t, ok, true) - Equal(t, val[0], "") - - _, ok = values["IfaceInvalid"] - Equal(t, ok, false) - - val, ok = values["IfaceNonNil[Number]"] - Equal(t, ok, true) - Equal(t, val[0], "") - - val, ok = values["TimeMapKey["+tm.Format("2006-01-02")+"]"] - Equal(t, ok, true) - Equal(t, val[0], "time") - - val, ok = values["ArrayMap[0][1]"] - Equal(t, ok, true) - Equal(t, val[0], "3") - - val, ok = values["ArrayTime[0]"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format("2006-01-02")) - - s := struct { - Value string - Ignore string `form:"-"` - unexposed string - ArrayTime []time.Time - }{ - Value: "tval", - Ignore: "ignore", - unexposed: "unexp", - ArrayTime: []time.Time{tm}, - } - - encoder = NewEncoder() - values, errs = encoder.Encode(&s) - Equal(t, errs, nil) - Equal(t, len(values), 2) - - val, ok = values["Value"] - Equal(t, ok, true) - Equal(t, val[0], "tval") - - _, ok = values["Ignore"] - Equal(t, ok, false) - - _, ok = values["unexposed"] - Equal(t, ok, false) - - val, ok = values["ArrayTime[0]"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format(time.RFC3339)) -} - -func TestEncoderMap(t *testing.T) { - inner := map[string]interface{}{ - "inner": "1", - } - - outer := map[string]interface{}{ - "outer": inner, - } - - enc := NewEncoder() - values, _ := enc.Encode(outer) - - val, ok := values["[outer][inner]"] - Equal(t, ok, true) - Equal(t, val[0], "1") -} - -func TestDecodeAllNonStructTypes(t *testing.T) { - - encoder := NewEncoder() - - // test integers - - i := int(3) - i8 := int8(2) - i16 := int16(1) - i32 := int32(0) - i64 := int64(3) - - values, err := encoder.Encode(i) - Equal(t, err, nil) - Equal(t, values[""][0], "3") - - values, err = encoder.Encode(i8) - Equal(t, err, nil) - Equal(t, values[""][0], "2") - - values, err = encoder.Encode(i16) - Equal(t, err, nil) - Equal(t, values[""][0], "1") - - values, err = encoder.Encode(i32) - Equal(t, err, nil) - Equal(t, values[""][0], "0") - - values, err = encoder.Encode(i64) - Equal(t, err, nil) - Equal(t, values[""][0], "3") - - // test unsigned integers - - ui := uint(3) - ui8 := uint8(2) - ui16 := uint16(1) - ui32 := uint32(0) - ui64 := uint64(3) - - values, err = encoder.Encode(ui) - Equal(t, err, nil) - Equal(t, values[""][0], "3") - - values, err = encoder.Encode(ui8) - Equal(t, err, nil) - Equal(t, values[""][0], "2") - - values, err = encoder.Encode(ui16) - Equal(t, err, nil) - Equal(t, values[""][0], "1") - - values, err = encoder.Encode(ui32) - Equal(t, err, nil) - Equal(t, values[""][0], "0") - - values, err = encoder.Encode(ui64) - Equal(t, err, nil) - Equal(t, values[""][0], "3") - - // test bool - - ok := true - values, err = encoder.Encode(ok) - Equal(t, err, nil) - Equal(t, values[""][0], "true") - - ok = false - values, err = encoder.Encode(ok) - Equal(t, err, nil) - Equal(t, values[""][0], "false") - - // test time - - tm, err := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") - Equal(t, err, nil) - - values, err = encoder.Encode(tm) - Equal(t, err, nil) - Equal(t, values[""][0], "2006-01-02T15:04:05Z") - - // test basic array - - arr := []string{"arr1", "arr2"} - - values, err = encoder.Encode(arr) - Equal(t, err, nil) - Equal(t, len(values), 1) - Equal(t, values[""][0], "arr1") - Equal(t, values[""][1], "arr2") - - // test ptr array - - s1 := "arr1" - s2 := "arr2" - arrPtr := []*string{&s1, &s2} - - values, err = encoder.Encode(arrPtr) - Equal(t, err, nil) - Equal(t, len(values), 2) - Equal(t, values["[0]"][0], "arr1") - Equal(t, values["[1]"][0], "arr2") - - // test map - - m := map[string]string{"key1": "val1", "key2": "val2"} - - values, err = encoder.Encode(m) - Equal(t, err, nil) - Equal(t, len(values), 2) - Equal(t, values["[key1]"][0], "val1") - Equal(t, values["[key2]"][0], "val2") -} - -func TestEncoderNativeTime(t *testing.T) { - - type TestError struct { - Time time.Time - TimeNoValue time.Time - } - - tm, err := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") - Equal(t, err, nil) - - test := TestError{ - Time: tm, - } - - encoder := NewEncoder() - values, errs := encoder.Encode(&test) - Equal(t, errs, nil) - - val, ok := values["Time"] - Equal(t, ok, true) - Equal(t, val[0], tm.Format(time.RFC3339)) - - val, ok = values["TimeNoValue"] - Equal(t, ok, true) - Equal(t, val[0], "0001-01-01T00:00:00Z") -} - -func TestEncoderErrors(t *testing.T) { - - tm, err := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") - Equal(t, err, nil) - - type TestError struct { - Time time.Time - BadMapKey map[time.Time]string - Iface map[interface{}]string - Struct map[struct{}]string - } - - test := TestError{ - BadMapKey: map[time.Time]string{tm: "time"}, - Iface: map[interface{}]string{nil: "time"}, - Struct: map[struct{}]string{{}: "str"}, - } - - encoder := NewEncoder() - encoder.RegisterCustomTypeFunc(func(x interface{}) ([]string, error) { - return nil, errors.New("Bad Type Conversion") - }, time.Time{}) - - values, errs := encoder.Encode(&test) - NotEqual(t, errs, nil) - - Equal(t, len(values), 0) - - e := errs.Error() - NotEqual(t, e, "") - - ee := errs.(EncodeErrors) - Equal(t, len(ee), 3) - - k := ee["Time"] - Equal(t, k.Error(), "Bad Type Conversion") - - k = ee["BadMapKey"] - Equal(t, k.Error(), "Bad Type Conversion") - - k = ee["Struct"] - Equal(t, k.Error(), "Unsupported Map Key '' Namespace 'Struct'") -} - -func TestEncoderPanicsAndBadValues(t *testing.T) { - - encoder := NewEncoder() - - values, err := encoder.Encode(nil) - NotEqual(t, err, nil) - Equal(t, values, nil) - - _, ok := err.(*InvalidEncodeError) - Equal(t, ok, true) - Equal(t, err.Error(), "form: Encode(nil)") - - type TestStruct struct { - Value string - } - - var tst *TestStruct - - values, err = encoder.Encode(tst) - NotEqual(t, err, nil) - Equal(t, values, nil) - - _, ok = err.(*InvalidEncodeError) - Equal(t, ok, true) - Equal(t, err.Error(), "form: Encode(nil *form.TestStruct)") -} - -func TestEncoderExplicit(t *testing.T) { - - type Test struct { - Name string `form:"Name"` - Age int - } - - test := &Test{ - Name: "Joeybloggs", - Age: 3, - } - - encoder := NewEncoder() - encoder.SetMode(ModeExplicit) - - values, err := encoder.Encode(test) - Equal(t, err, nil) - Equal(t, len(values), 1) - Equal(t, values["Name"][0], "Joeybloggs") -} - -func TestEncoderRegisterTagNameFunc(t *testing.T) { - - type Test struct { - Name string `json:"name"` - Age int `json:"-"` - } - - test := &Test{ - Name: "Joeybloggs", - Age: 3, - } - - encoder := NewEncoder() - encoder.RegisterTagNameFunc(func(fld reflect.StructField) string { - name := fld.Tag.Get("json") - - if commaIndex := strings.Index(name, ","); commaIndex != -1 { - name = name[:commaIndex] - } - - return name - }) - - values, err := encoder.Encode(test) - Equal(t, err, nil) - Equal(t, len(values), 1) - Equal(t, values["name"][0], "Joeybloggs") -} - -func TestEncoderEmbedModes(t *testing.T) { - - type A struct { - Field string - } - - type B struct { - A - Field string - } - - b := B{ - A: A{ - Field: "A Val", - }, - Field: "B Val", - } - - encoder := NewEncoder() - - values, err := encoder.Encode(b) - Equal(t, err, nil) - Equal(t, len(values), 1) - Equal(t, values["Field"][0], "B Val") - Equal(t, values["Field"][1], "A Val") - - encoder.SetAnonymousMode(AnonymousSeparate) - values, err = encoder.Encode(b) - Equal(t, err, nil) - Equal(t, len(values), 2) - Equal(t, values["Field"][0], "B Val") - Equal(t, values["A.Field"][0], "A Val") -} - -func TestOmitEmpty(t *testing.T) { - - type NotComparable struct { - Slice []string - } - - type Test struct { - String string `form:",omitempty"` - Array []string `form:",omitempty"` - Map map[string]string `form:",omitempty"` - String2 string `form:"str,omitempty"` - Array2 []string `form:"arr,omitempty"` - Map2 map[string]string `form:"map,omitempty"` - NotComparable `form:",omitempty"` - } - - var tst Test - - encoder := NewEncoder() - - values, err := encoder.Encode(tst) - Equal(t, err, nil) - Equal(t, len(values), 0) - - type Test2 struct { - String string - Array []string - Map map[string]string - String2 string `form:"str,omitempty"` - Array2 []string `form:"arr,omitempty"` - Map2 map[string]string `form:"map,omitempty"` - } - - var tst2 Test2 - - values, err = encoder.Encode(tst2) - Equal(t, err, nil) - Equal(t, len(values), 1) - Equal(t, values["String"][0], "") - - type Test3 struct { - String string - Array []string - Map map[string]string - String2 string `form:"str"` - Array2 []string - Map2 map[string]string - } - - var tst3 Test3 - - values, err = encoder.Encode(tst3) - Equal(t, err, nil) - Equal(t, len(values), 2) - Equal(t, values["String"][0], "") - Equal(t, values["str"][0], "") - - type T struct { - X *uint8 `form:"x,omitempty"` - Array []*string `form:"arr,omitempty"` - Array2 []*string `form:"arr2,dive,omitempty"` - } - x := uint8(0) - s := "" - tst4 := T{ - X: &x, - Array: []*string{&s}, - } - - values, err = encoder.Encode(tst4) - Equal(t, err, nil) - Equal(t, len(values), 2) - Equal(t, values["x"][0], "0") - Equal(t, values["arr[0]"][0], "") -} diff --git a/toolkit/form/form.go b/toolkit/form/form.go deleted file mode 100644 index 399813d2..00000000 --- a/toolkit/form/form.go +++ /dev/null @@ -1,49 +0,0 @@ -package form - -import ( - "github.com/goccy/go-reflect" - "time" -) - -const ( - blank = "" - ignore = "-" - fieldNS = "Field Namespace:" - errorText = " ERROR:" -) - -var ( - timeType = reflect.TypeOf(time.Time{}) -) - -// Mode specifies which mode the form decoder is to run -type Mode uint8 - -const ( - - // ModeImplicit tries to parse values for all - // fields that do not have an ignore '-' tag - ModeImplicit Mode = iota - - // ModeExplicit only parses values for field with a field tag - // and that tag is not the ignore '-' tag - ModeExplicit -) - -// AnonymousMode specifies how data should be rolled up -// or separated from anonymous structs -type AnonymousMode uint8 - -const ( - // AnonymousEmbed embeds anonymous data when encoding - // eg. type A struct { Field string } - // type B struct { A, Field string } - // encode results: url.Values{"Field":[]string{"B FieldVal", "A FieldVal"}} - AnonymousEmbed AnonymousMode = iota - - // AnonymousSeparate does not embed anonymous data when encoding - // eg. type A struct { Field string } - // type B struct { A, Field string } - // encode results: url.Values{"Field":[]string{"B FieldVal"}, "A.Field":[]string{"A FieldVal"}} - AnonymousSeparate -) diff --git a/toolkit/form/form_decoder.go b/toolkit/form/form_decoder.go deleted file mode 100644 index 1273db4e..00000000 --- a/toolkit/form/form_decoder.go +++ /dev/null @@ -1,207 +0,0 @@ -package form - -import ( - "bytes" - "github.com/goccy/go-reflect" - "github.com/samber/lo" - "net/url" - "strings" - "sync" -) - -// DecodeCustomTypeFunc allows for registering/overriding types to be parsed. -type DecodeCustomTypeFunc func([]string) (interface{}, error) - -// DecodeErrors is a map of errors encountered during form decoding -type DecodeErrors map[string]error - -func (d DecodeErrors) Error() string { - buff := bytes.NewBufferString(blank) - - for k, err := range d { - buff.WriteString(fieldNS) - buff.WriteString(k) - buff.WriteString(errorText) - buff.WriteString(err.Error()) - buff.WriteString("\n") - } - - return strings.TrimSpace(buff.String()) -} - -// An InvalidDecoderError describes an invalid argument passed to Decode. -// (The argument passed to Decode must be a non-nil pointer.) -type InvalidDecoderError struct { - Type reflect.Type -} - -func (e *InvalidDecoderError) Error() string { - - if e.Type == nil { - return "form: Decode(nil)" - } - - if e.Type.Kind() != reflect.Ptr { - return "form: Decode(non-pointer " + e.Type.String() + ")" - } - - return "form: Decode(nil " + e.Type.String() + ")" -} - -type key struct { - ivalue int - value string - searchValue string -} - -const defaultSliceLen = -1 - -type recursiveData struct { - alias string - sliceLen int - keys []key -} - -type dataMap []*recursiveData - -// Decoder is the main decode instance -type Decoder struct { - tagName string - mode Mode - structCache *structCacheMap - customTypeFuncs map[reflect.Type]DecodeCustomTypeFunc - maxArraySize int - dataPool *sync.Pool - namespacePrefix string - namespaceSuffix string -} - -// NewDecoder creates a new decoder instance with sane defaults -func NewDecoder() *Decoder { - - d := &Decoder{ - tagName: "form", - mode: ModeImplicit, - structCache: newStructCacheMap(), - maxArraySize: 10000, - namespacePrefix: ".", - } - - d.dataPool = &sync.Pool{New: func() interface{} { - return &decoder{ - d: d, - namespace: make([]byte, 0, 64), - } - }} - - return d -} - -// SetTagName sets the given tag name to be used by the decoder. -// Default is "form" -func (d *Decoder) SetTagName(tagName string) { - d.tagName = tagName -} - -// SetMode sets the mode the decoder should run -// Default is ModeImplicit -func (d *Decoder) SetMode(mode Mode) { - d.mode = mode -} - -// SetNamespacePrefix sets a struct namespace prefix. -func (d *Decoder) SetNamespacePrefix(namespacePrefix string) { - d.namespacePrefix = namespacePrefix -} - -// SetNamespaceSuffix sets a struct namespace suffix. -func (d *Decoder) SetNamespaceSuffix(namespaceSuffix string) { - d.namespaceSuffix = namespaceSuffix -} - -// SetMaxArraySize sets maximum array size that can be created. -// This limit is for the array indexing this library supports to -// avoid potential DOS or man-in-the-middle attacks using an unusually -// high number. -// DEFAULT: 10000 -func (d *Decoder) SetMaxArraySize(size uint) { - d.maxArraySize = int(size) -} - -// RegisterTagNameFunc registers a custom tag name parser function -// NOTE: This method is not thread-safe it is intended that these all be registered prior to any parsing -// -// ADDITIONAL: once a custom function has been registered the default, or custom set, tag name is ignored -// and relies 100% on the function for the name data. The return value WILL BE CACHED and so return value -// must be consistent. -func (d *Decoder) RegisterTagNameFunc(fn TagNameFunc) { - d.structCache.tagFn = fn -} - -// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types. -// NOTE: This method is not thread-safe it is intended that these all be registered prior to any parsing -// -// ADDITIONAL: if a struct type is registered, the function will only be called if a url.Value exists for -// the struct and not just the struct fields eg. url.Values{"User":"Name%3Djoeybloggs"} will call the -// custom type function with `User` as the type, however url.Values{"User.Name":"joeybloggs"} will not. -func (d *Decoder) RegisterCustomTypeFunc(fn DecodeCustomTypeFunc, types ...interface{}) { - - if d.customTypeFuncs == nil { - d.customTypeFuncs = map[reflect.Type]DecodeCustomTypeFunc{} - } - - for _, t := range types { - d.customTypeFuncs[reflect.TypeOf(t)] = fn - } -} - -// Decode parses the given values and sets the corresponding struct and/or type values -// -// Decode returns an InvalidDecoderError if interface passed is invalid. -func (d *Decoder) Decode(v interface{}, values url.Values) (err error) { - - val := reflect.ValueOf(v) - - if val.Kind() != reflect.Ptr || val.IsNil() { - return &InvalidDecoderError{reflect.TypeOf(v)} - } - - dec := d.dataPool.Get().(*decoder) - valuesCopy := make(url.Values, len(values)) - for item, v := range values { - k := "[" - _, i, ok := lo.FindIndexOf[byte]([]byte(item), func(item byte) bool { - if item == '[' || item == d.namespacePrefix[0] { - return true - } - return false - }) - if ok { - k = k + item[:i] + "]" + item[i:] - } else { - k = k + item + "]" - } - valuesCopy[k] = v - } - dec.values = valuesCopy - dec.dm = dec.dm[0:0] - dec.decoded = dec.decoded[0:0] - - val = val.Elem() - typ := val.Type() - - if val.Kind() == reflect.Struct && typ != timeType { - dec.traverseStruct(val, typ, dec.namespace[0:0]) - } else { - dec.setFieldByType(val, dec.namespace[0:0], 0) - } - - if len(dec.errs) > 0 { - err = dec.errs - dec.errs = nil - } - - d.dataPool.Put(dec) - - return -} diff --git a/toolkit/form/form_encoder.go b/toolkit/form/form_encoder.go deleted file mode 100644 index 4cd83a29..00000000 --- a/toolkit/form/form_encoder.go +++ /dev/null @@ -1,157 +0,0 @@ -package form - -import ( - "bytes" - "net/url" - "github.com/goccy/go-reflect" - "strings" - "sync" -) - -// EncodeCustomTypeFunc allows for registering/overriding types to be parsed. -type EncodeCustomTypeFunc func(x interface{}) ([]string, error) - -// EncodeErrors is a map of errors encountered during form encoding -type EncodeErrors map[string]error - -func (e EncodeErrors) Error() string { - buff := bytes.NewBufferString(blank) - - for k, err := range e { - buff.WriteString(fieldNS) - buff.WriteString(k) - buff.WriteString(errorText) - buff.WriteString(err.Error()) - buff.WriteString("\n") - } - - return strings.TrimSpace(buff.String()) -} - -// An InvalidEncodeError describes an invalid argument passed to Encode. -type InvalidEncodeError struct { - Type reflect.Type -} - -func (e *InvalidEncodeError) Error() string { - - if e.Type == nil { - return "form: Encode(nil)" - } - - return "form: Encode(nil " + e.Type.String() + ")" -} - -// Encoder is the main encode instance -type Encoder struct { - tagName string - structCache *structCacheMap - customTypeFuncs map[reflect.Type]EncodeCustomTypeFunc - dataPool *sync.Pool - mode Mode - embedAnonymous bool - namespacePrefix string - namespaceSuffix string -} - -// NewEncoder creates a new encoder instance with sane defaults -func NewEncoder() *Encoder { - - e := &Encoder{ - tagName: "form", - mode: ModeImplicit, - structCache: newStructCacheMap(), - embedAnonymous: true, - namespacePrefix: ".", - } - - e.dataPool = &sync.Pool{New: func() interface{} { - return &encoder{ - e: e, - namespace: make([]byte, 0, 64), - } - }} - - return e -} - -// SetTagName sets the given tag name to be used by the encoder. -// Default is "form" -func (e *Encoder) SetTagName(tagName string) { - e.tagName = tagName -} - -// SetMode sets the mode the encoder should run -// Default is ModeImplicit -func (e *Encoder) SetMode(mode Mode) { - e.mode = mode -} - -// SetNamespacePrefix sets a struct namespace prefix. -func (e *Encoder) SetNamespacePrefix(namespacePrefix string) { - e.namespacePrefix = namespacePrefix -} - -// SetNamespaceSuffix sets a struct namespace suffix. -func (e *Encoder) SetNamespaceSuffix(namespaceSuffix string) { - e.namespaceSuffix = namespaceSuffix -} - -// SetAnonymousMode sets the mode the encoder should run -// Default is AnonymousEmbed -func (e *Encoder) SetAnonymousMode(mode AnonymousMode) { - e.embedAnonymous = mode == AnonymousEmbed -} - -// RegisterTagNameFunc registers a custom tag name parser function -// NOTE: This method is not thread-safe it is intended that these all be registered prior to any parsing -// -// ADDITIONAL: once a custom function has been registered the default, or custom set, tag name is ignored -// and relies 100% on the function for the name data. The return value WILL BE CACHED and so return value -// must be consistent. -func (e *Encoder) RegisterTagNameFunc(fn TagNameFunc) { - e.structCache.tagFn = fn -} - -// RegisterCustomTypeFunc registers a CustomTypeFunc against a number of types -// NOTE: this method is not thread-safe it is intended that these all be registered prior to any parsing -func (e *Encoder) RegisterCustomTypeFunc(fn EncodeCustomTypeFunc, types ...interface{}) { - - if e.customTypeFuncs == nil { - e.customTypeFuncs = map[reflect.Type]EncodeCustomTypeFunc{} - } - - for _, t := range types { - e.customTypeFuncs[reflect.TypeOf(t)] = fn - } -} - -// Encode encodes the given values and sets the corresponding struct values -func (e *Encoder) Encode(v interface{}) (values url.Values, err error) { - - val, kind := ExtractType(reflect.ValueOf(v)) - - if kind == reflect.Ptr || kind == reflect.Interface || kind == reflect.Invalid { - return nil, &InvalidEncodeError{reflect.TypeOf(v)} - } - - enc := e.dataPool.Get().(*encoder) - enc.values = make(url.Values) - - if kind == reflect.Struct && val.Type() != timeType { - enc.traverseStruct(val, enc.namespace[0:0], -1) - } else { - enc.setFieldByType(val, enc.namespace[0:0], -1, false) - } - - if len(enc.errs) > 0 { - err = enc.errs - enc.errs = nil - } - - values = enc.values - - e.dataPool.Put(enc) - - return -} diff --git a/toolkit/form/logo.jpg b/toolkit/form/logo.jpg deleted file mode 100644 index 2ef34f87ea04439798afe0c8a0650477ca3ccd52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20388 zcmb5Vb95wM)HU2m$F^+jbN07+V0N*n+J0sw$~e*jM@u0skAp!N7oE5a19H z|8qb>LqR}7Lqb46!9qd9{1@Nf;9z0k{`>LYP5$>%P;ej+90n2s@_$bG|22H|1CXHr zL4Z*p2r>W^83c$7@-+y+|6V8ff2#xh-v9^wUKS(>6ae~r8t?m0{5So7CjkIZ00qWF{6LAYuKAqkq~J%mXQn(;S;$to2{FzEuXSvS$lNRty}@JBc&FLG-vvxiZ9TqvUtqi)S9?Urg3WTnRxOURZn}t@yzyHW03>S z@I(Z)$?LLS#YP5o43op9WIdf%2}HOqZ3)V6zOPK!aoir9+GtT_I~Dv&SQ)Vf8%>O( zfKF@e94nyIjc2&9eJLHGD_<(^yoeYwKU+?dI^bQUldIQ!fNjb0(60{OOwJ0XjI@qJ z0U!-fr%vGX|EQj+qmxEOw~}j+6X-r3dTk{LuyGlWW4GjgR`$kNTXo^ri^-Z)VSRb= zf5th(>sJ(g7y1n`&$~HO zIOdTv&ZZah(->vxK+Q{NOya&IK8yrUDn8-JbaNGLTvDn|%50wnxhShX#=Nt6tgBKm z{rxUG!n2t{AOBSZd@0NiH&9lOi8WvIDW&vM&us6`Gb*@DhJs~=$LjD^z$}@gcvu7~ zuialEzTfbN58fF^rwwwoIw6^E@W|hw)9`|&jhK(O4(JCOG zjA){r+1Rr?tk7d7ah?}GPi?%63L+^D#XHVwJWoe8?ao{LX|wy;D$d|FlnK4qdZ^z} zw#tD$p53OpJWJpuQrpv&5bAyH7Fm5tI%+pRa^`0m_*Qt7tmnYxNxPB@XIYz%haQAB z=h(b{imr3MjLV&r{Jf47^*mUzj&ZOQstv`$7vLKd*pUDrU?5=Mc=nB6!2h5D^gm1h zKp>-_qM;LGAd!%fGZQhfDyyiHvakt>i2hJg`$h|>Zx{iA1J-08dIg@#acC;n$Rrz6 z^;0Qaxri)?s+ppvwT;{6gx=A!rI`}&tD1mX1Zi9`7mG@b&!Iaq&r-Dxu?lc=(gdp; zoeK53jQTOR9HC)C$)i$iztLduZn^OPN(${oEAF$3j4M@IDtwPtGK*NQdQzG+w@wYs z*@L$kO}G?iVT!|8Wlnu;z&kc}@*uZCmVwZ4G%BDd4@xz@(U4Sr{O7H+lYA7aSROi1 zJ}0UZK8r|}OdBA9wGg{GEDM7*gVRKC8bH1vUzW?t?>{uZpv3I~XZ?X!tc}^$ER^m# z^ydcqq>|%s>GtGe;j?^KO##tAvbE_RnN#C18!zXi=5H#5&BqSAY)t~14r!gMxI}I2 zzCZnBdR6VA?Ut5oJqkC083lp161Xc%ErNJkPG5*s-VN2iWEl$+Q$k)#DS7NOnR|5o zqiTeT4hiTl0Fi2n`euc~L9%V-ZVi@G z803bgE$%q^z!GM(-~rloCr9Ru%cD01w z8MO@sL#Fsb#`0~fgmkCDB%P5FkIBladax7LbdJXzv8{>*kE3vRr3bxjyT=1NB5@}_ zKb4qzE$iIqrkgYCtmG<(yTEw)3O(6N72jWaYnICN*CrC&v1>99Jp&2juod)UsY5h{ zzb3U*b~yfaZ(S>20FTk0G^eJSGX_`g_w&&GfPXk2N%8yrahnuS-AUBP)2dNF8O*YP zwc7YpV|d~e>2yi+w*}vbPfuh$HVU1`DkAzt+v_s-RFn5~5b6#TOB!8dwS7;`^4ebyHE!}wJDOWWe6@=cx-KX> z1#=4RUIR?vk$vLokkqq1d~L?5vwunB6j{}dKBbG17Z`@CnQ?va-0$KL<*3mmp6 zmn-6A1VK;#=VU*(u1CdWuJmYq5hkXwaI#ktZyCG<3Ulk+@*b(?ilTEz^@%#HBP+WQ zc(R5lTa2xq0hS)+CEo0$rX%bzOfqdfw+5kBE$NBsEli*KVR<2fwdyWVvcjHrcJ%RPEX zt-Z87qTu)okTV(SpKelg+;kx}VnNE5FL1_fu&BajlegX6dMStJvU??W=*mob#fc|7 zNFwdr%89q+P2Vzec(tRrj&l(k;kb}Obi%r4D*+*6SZs6QS40=-;aZ!DV-58WyPU1PxBPM&(6MQ)PQ;T;P(C zC4hj`2?flWC_UKB(H;WWuQK5|0KFveS;vLQEth#_CwK#&rTioWAC<%qHN+`c}1mt&=TTi+}0z|u;Mb!EF zH*Br@+^~aUWaHnuraQ}}?^jxeW~i!n;{n5eA^BMc*~+s2a3P$nL?B(#lEMgGr=!#;CR zd38z(HWl|H|Jn6xm{E%B^sPD_z791DJXd0X>h`lySe&LKTyPP~&Rv2Ni^|905Qa`0 zYav>h9d+C1!na)G`<81!AP6`R8WIfjf8^SC)`kp3A!a7|p=98IO3DI;M8qnr9G7>4 zX6Wcw*EdJTB(y8y1RlTle^eX1Ads%5(>hP`-vFT)L`wX@X(J?zJtbk!tm=722hBQf zv-_^V1y6Hx7}sVw+F0x2jltS`H+1SHwkn%^8fAJ5J+o~9&!;8F-(yM06vmq%6vH>` zx6vj4;T%kI`?cJU922(a(fYg&o@x7<<+lBHHHqxameE@YysU9ur~FH%?P|&Sgbj(~ zg)>F2&(wiVKBKT#l6?fWY48z2#3e2sFKG%b33*!o)HP2+#BdVvwJ$&&-+<0a&2Z~X z$!PA@!Mtnqj|D}Ryk0dN3bM&RjR-W04&1~eLR|eOHYMJvt!z>WCCu-n4wpXTuJV(^ zNJUOMXIK>SV|Ld|sL4+@pWGx9X7yNWNm%^JDqA{s`Pn4H3pe-YGjnGl>@TtR&JUaf z<4#km$jaChJa$4E_GSLKynaja91sFU_+H;~9Of;zmWZ<@k@Nz`ec4&g8umo~VEaMg4WF?pU{C2fe#<;hvku~yZ=T>_~D7G1Ut69+opI+mHh%w;=ha^g9_v&13F;P%6$5gdxg=T!H@@`P_*;4ypKR99P>B7j7r=2~?pO!wN6)0Lu(@5VZ6W#ddv3v%-o zFSuIevc6vNdtsm)*L*MGpEN*cwH@**}4=Vxomcl*UBx6T{Z>p)Nm`0n!-?;#rfLm5mR6>K!~mSR31!d=INrX zX(NfxF1!xQSG?!Ec-^PS^aXei{Kitf_#D*<>_a_brza0_mh#TFoaNw)_<6|l+k=n< zOdR>Uj;S_GGr}MEyaQ1@_PUwuEt%L#=cIqojwdlnIOr~(-!{Don2%1{8L}h)3}meN6WC?;9>|rZ6BQTGXzEGPm55U)T+(|A0-`g7JVIkOqOn6 zzr1DFWvjr@I!2%=*n5*|8wJQza%Exi{Lw+|Q}&JtJ~<72$(`TRn-Bt^_Tdyf4XiaGQ6NF`I}q|{NqCs#!HEU^Di_*vjMPsBJX z?ys#G7u8;xT$jW%XpmgeJQvCRiTI*(gY{PjiSZ8lgxu%uZmR6Nx#GBy6VehBVfq!T z+&)=n-POJo_l?Lw&frqn2z6j};OCGkc~wY2TF;uIr-)la`OL0lBRx6{6 z6YZaZ?4vgm9sZv9mQRu0iMogX#|bNKwg8sp8HbfbH@c{r!Dh-RE)Sx-_O^U%1>q!%QV=kDC#a$CT2 z0ZYDAn^)s%QZKV@)Y)ZL)kHveq=5vOH^AGa!7>wRR7-Mc)7V*)zeu`6r*ZRM$^Q#L z#S~%FDL^Djx!4N1aC3Lka7G1E?!wEV!506=SriWeDUBneF{!uXZ8OK5v4q&Rsh!et z|C8~X8K{u}|5YMEzjJxu|JL}vOM}GB|FME!98zB29MMhP?k$th|4rTnSt!7U0uk}B z^bHq*BTS85ku25=++jcGB2BS?NgHhR_i|ErX&SUtve6f#LV=|KtKe{-oOmrFfn%iF zYJbq1L}W{0K42MG+nmffGkegP_PpLY7ShYR@#o19GQ2`*Q_$-C8maov*#I^y;4N{^7tu2s#O$!Bb!v%J(DrHA^j_PqBsVt zVG;~n5!SWom|&O5=1rN%IQ|uHDG5;S#nsR35a)Qxt$et zGgHUQXCL8DM=&%3xh;~6(k#UQ0?;71I~X-Mqm;=MLd8Mh!{iKJGu34MS%eKfQ>sx2 zF7@eY8uTYE=^rx~48TtU0Ogw{3JRQGA|aPqA*e4fOOg*XZ08o@7{`6KmtcLO!< z#i0y?(h%H>L?*v59xLfVjxETRm;rQ_cxU=YaDG?3+9fzU17Uzx5a{MU;zV$t5s*;C zp*+wmw{H2@t|2>OEtDS0+7-*>xs)Q<#{Q@=#6GsEumXYpo>bK=VGtH#yt@N4*E7O7 zb2ZB>5LmNgv>wJW|5?sh9!@+m%NzihfV^ikI?7%oeZU2I7wSvF+DnB@{Y%*k*@8-1 z7)AzEcoBe-#78>QChu4ey=%Y~2X%E*a{B@(@_zx;IdMs7YQ3^~gXQ>%I8Z^)lPNb2 zOM&syD3B>3n&B(GWrrqIyhYD<_;uQAqS2C2iZ=7C`6;urs>3F1wE5; zEbQ=NXU=OU0cJk1u23k@Iqpd`G--+_>xRz2ME+MWG2i7y(093<@iJ^YI8-t(n!U8)+ zDHB4VAhvR-AhD^*)NSB%bam<%3@!2VvQUzs5KdFWPR0&U?mr?tFi5 z0RzOssQS9dbI}NFylC8Klfq}XZb8>eLI5(O&09cNL=4l|FLx!GA7M6w#hfX&z$hTB zBbs_mehcETz!;j#AZ+xDL%k@n2b>natOX~x{7u+eQQh^PUu^D!=EkTkOU;r zs+oRC)}lv2!PtIogRP4V&`5u^{D{?CAt0yv2D$zKfT=tp1O;`J7BN2pH=IC%e1(KO zIj&>^>IX~>*nn-5U|={if0SP1bYQ*!Oxj%jO@`Cfg6Y1v$UpxfnmZ4l2$Mt*iOwp5 zlI(&G=I1f*H*tPS+FAmcpmE3OZiqU#A$y7Ovcd!UiGn0J?x72IL|cV3GQed?@5rT6 z5MV|=rS0};Tz3``4&RkP$6uMrJbw?^5;po^VU&<``jEQg_4K&E>3|#BPgFs3=)UJc zgF+DbJK2HF?r`C^R6&6I_w zNwUFXH~19-@$q)Ed#dR^z%xH~RyPzBx7ZCnU&T&GI=gyD5Me@pk+9@aU~Fv+OGWv2 zmO^rD%Dsz_A|FWf`~o|I7K5|_n>aKWnI^>XJ)07;7@F%&R7Y0uLqh(WE8A&u!Iy+Y zo!;Rr1;uj*0FdZq3+w`d4FQIzLoe&tenccyn-anS@Bac~{sl=QHg`?rg%M3~8Gn32 zcPw&?xNS1V*#8oO&Lxt1$;AaC(;?aKs0pECRd)GfKr)x^{l>Bo1__ zK=e;-1#NITjB*G`_?`}&fVxu-eCC*|y5hHh_Vk+RVLm=NrKL&w$6`=$s16iWiz*=# zD`^qA<)m^6x`?$d|A2lY4Fr`k@?fgnK*f^E0LegP`gFtaB_cp&WmNftJb_{lHX#3& z7j!|Q8d*P3r+@H!QGhAAb|>otnr!SJ0*bINkU7(&ZwLDY6NoYz00Kt{v)>Z0$k6RT z5bkFH=6_u!OG7t~B@G;=`qfIV0jb|U`32x*zy_rDC1J_v#Agw=BT+KIKqx{WL9he_ zwzrd>+~-6RIj(#(?>1z!RN8YPV?v0VGxTXFnPTM-1A81O%mBQ6i=JNdjJ zn%n(Cb1X(uv3ZSo0(5OH3yyk7a=k9K<| zLBySu195S2LVp&fb$B{@!I=fKG%?-@Im8D3-?=fGXg;OtNc7KL{PK2$t>`ECN&Cb} z{{oq;p_`<*@D?vJa!LBDFo^otrG`qKlz!F5Vz9^Jr^11mPcKDQD~6L@qM@6K%Tv*W zrcSt~=ASWF{E;-vyn;8{8h1hc^^j93@5v4+DPw&bg5Z+*lEJlUJSGsYYE;9g4yY|@J(8zeBJ!9EuK{r#RKO#dj?b|ArrGhSat40s#A_&tPJ zDFnkKl{RJ9%(#C~1(j-?GLQ-5LmOhNtjTj4r|XJ!XB1iNR>I;>jh6wwk&(hLg$_+K zD+hFyt&XGiY)!32Zeyx)3xP5K&+Wsx+dad?NFXv_PGQ>RqLjf1r()f)B5Yo0oerb6 z?nL5A{nTDGif6~BKQP&)$V}EowbsWevV}VrYOJ)Fa-YCL)eZfl5qNQfJrL4slvPRT zj&&Y>jf7tTt~GLfAdxv&BxoELKH^svXSin?=C%*!8C*_|Pkn?*;nAL!Kox}Z8(YF| zb}E1X@rja=Bb&8eon`U>On7wDBqa7gh+ca+H0FbvSqN%QE~kmpdKtWfyXO%-1frh9L(>s;`T;?O{Ob9}Qz_4BNl;D&I?H1Lw zbk-I*NdJg7(> zTn0rH(`~jkH_Q~%#AXnp%B%QaHE5Cp5S|Sa#m|qjmC31t!ymgA+iS8V1lR;b*dUFOX`r|0P zypED#MyR|Eg-=HbE(Le7tdi8=@#^3mP+i`v1xJu>ir;T(+Ek8bL6!Hmc@m^E%fZ0( zj`oh^FdO&w22dOrjqEQIV42e1p87FTw7wfdV#O?aTi zm4)mKf*u*+q>bH%C!5H?IuWE~<8+v#fpt=vW-1HMwVn}rSqzYk4$0}>i-s%6bHvP> zwTTA7y22Mj@DK+`f=nhwYhvSH?}&&Rkg99As62UJ-RWe5~p|q2 zpn&j(di;llLhq?<>hTcf;#xB%2F3ZoIID~W4oK&KRUjXi)teqNJLD{C%STfSS z$*_wtT)A17fJ&qCJi0h-1J#8P_U)QGNsB8XmhnLYe`SwF7Dtx(!kmhPzQ{ zXymzDP?Th;)dLWHw*rq*SsZMsMpXmwM6AKG4AIOpviKz;6p~#8m}l9iEMlHC2M#p7 zhhF;?KcP-Dd4JnNf0fYvTLc-1l9qQS#lZwJNT+x|mdnerSw55B6sq!nUj6nFX?CtB zF{W$Pi(wvS3OxL`C3teUr^J&HCUn7r^znvJE{zzpR3vv&H;zyahSAi|dH`J2&BcI*S_9N?% z5dRyp0m}pV(7*pDqTxw#JU^8Vv%r1-TLoUAcHx{82P6gx)q7to{FO*G4;%gmUS?Kv ze(g``Q$29nEK9ad@?(gy#q_{HNJ>641p?<=DWADHdHOZ+sl;8y zlj{CrvcP6t8j_&#loUj{C%7NZVJ46(Q`7VQq%5i%#>IyR+;buEK8`bWPthDk&DG7^ z!jUwfK$UtPymsiz=-_us{8@`end4lLv zbmjWY+puU=nPKLER?u#a-Gjk)<(gKWeU8Aqa7l2Py`62W^}!wgQe4iJ-f4f z$#bIEhc8YbKC-738y|&+Xj*}G_r}3Lh)OJ$&7iZ6ms3sQ!!s5R*kA%S8`q!covF}% z>=4(PE?)ps9u(`bPB1y~;&YMJ1es7=WuDPd&Pc=kmuN>8LBs>2!7vEWCdCAU3B_|Z zJ&iU=so{QM$$m-Lm^ipZ6z$z3&LaMN3CleEB(AZr`B>z?T#)7Hz5cF|3~}pTl9RdV z71$CDgF-)A`y$TARmoMQ3UNnnEuhrS#dxHh#8eEV#&qH5VMrO;hI|LdSzs%J+!vt# z$xuKtc2nH?yc=K`aVgNus$)AKQ1m-LDC1=y&eI-I6N*u&!`84RB}I;isP7dBd!{sl-1 z7s6ad3J}8jCAm$%pA}Zw7Yc|Tu;ap4DiG!<6dQ2gCh?1E8>fTbbdpCs3k-xI<}#E5 zyHfMgi$e;6W^jh3%}j2{W^(b?b99=P)WA6v?G&ahfYxyEwF+Q@Of*dwdH^eQCD_~* z$G{W!YN{GE&WaqWBANKXbpN87*$#9UsBB|Y3+_0ejX5XmYQQD#%n|aauZ|eKG5A`Me}o!qvf&EvAKrn)VM;GPuTxn%e-M5ZHc~1Z|cslRWz%R2^$X$ zJ!_3WW-drq6M(a9%b(vam6!@a9*UKoEYak`W+<(0Bw!CPr{XsTk0RvLl4lBdkXNUk zn`s;UHEL5=wkP07tb0f`%$UuIa$Fvy3%2X4o4Z-p zB%gotM(UU!6E1$lT!evUq9W(p(;3q$+Qg(yCVED}Nx@9An+i=_t#z~SnAI`VNGPb; zJ~do;_W1c2OXT%eYFYR<{6N5#j>0c>jspj6t;t~oWMNaR2Z0!TamnPWpM(V&-CuxV z$Bf9*jX$zLR)dL3{R%N5?2>sL+tczmR7RE`xqJpIiP%ZdiSj}>=qY26g`%8^$v%3x zr$3bsSu1P^306YqDSaysEzmznJ?uQBjVm{*oxzYa`B*s{*q_dzG|6hW?o?eXmAWk= z)Q(gd=owh*Cz_omKEb{K6E8k%V~0*i^qC7DB07Aiy?~BNpx1iQsvScT>s^Z!THew$_lLBie|yr`+Tc71s^R-n&Tv1tz+W)vv<9Go+RYrqic zoT4*p9+l<#yKcL#hDzqYG0K9tW{A1Ag^^r>dBw{ih0)(zrS8cD(5!B1d)YgWTU!Z&)`O1h?w|ubA@UcX23$*PHPooep2h7pWl8v%>rY$= z*$Q_dMq8Ri@}FjDi*kv2?R#<0JZws+*Vp?o7S90&T*R7@naq}@%^40wI9c2g*!vq% z07I7*mrE4yXUHc_*gQZH=bbCiPTY;`%XMm5W@XK}CWa64^T@E<{9h z@mY{6WcnWQS<9Tuga6S@8G zVj*Y9bdZ;eqvkIFp@85cmjd~%I6~%U=4W_(T68x@@H_kAl)ba(u3k+cDSYf|VoK}B zVg?7~JxzQzk9dZu0_#ajA$t`ktP7#oK;I^8knf!i89pX7q=F>aNq$tdgVmiZy>;+( ztr{**c)mLSW!GF(bfDN(6eds_ytW!5zSlqpo&7opKS$ODcIjbR!c+zI_euq^!0o>p zb%_83lHe(G&f$YI*!Df)G9Yz6eKYA|`3qTDq-~aOISo!I*$`XMe*Ug0!q_VVL9N$m zoho!6!^MMqcp=x0qm$(;p&V}Qgjf0ZBaE7FG~`(?_gSeP$>J7J@XwYqaFuH%O}S8Y zQQ`YLD7;rLDEazIIsN1nSoI#1(yL-=>~z^7U>ju|K)!q*J)NnNc;|m0MB7 zX5EU_4HILIGk??+h{TvJvrG@kk@%6j+&)yq(^Lt%Q=r#7`BS(pP;XRS+=EzSV2mT_ z;MW|OxY;gDHYwhSY;5V}UcFacYtDty52GHIJ`FnhliDUoE>EJky6!7XHMaPbMhWPC zyGOazr9}jER8^GWBMINb^3pX`#6jP0^rDeIEic);x_L>oJb?I%iA(7K)5aSS9{)MMM|PF#?>A|5b;ydZ zf^00XLe3AdQexp%WNyB^_wgHTT{>Q5H3hmUw1w}TWsZOX+WtFD{``|jwrJNqw(yN6 zuO3T6E7MSjl*7w%{)*?$zDGjk<c{#{9+vyo#EObgec(+ubevRmCI@H00eQ~*t zz_$#(XnDMxV|qpW85S=*<)4@7HS6>i_00$=&I+Qj_CcD2>=aI`me1LysJH=CzO5hB zzOA2a{z;29UNTbEYhuq4OnXxz(2LZO+ow;Y#lkd}6}H-DLgxKl^}ah>xqn-*ADw~o z0v{>capA>8g07xVw;3uKSk9=AozxT386^u$54l~#8$6Q^W@`=nQ%aRC+0Y&Cu_=FU z(0Zd|)$q>J+BO|m+?2^d;^mD_`V^S}!Ub>V&u2;t9^6unyrj)ZKlpJt(0O)%^bK>$ z8WH8A14JHh1N(D!`w$x@~w)me1bm=5*ZqVUzN zsgRvH+VaCGsPXJ@a8|EqG^vUeZDSRoe_X&&r69>hB6T|#T&16#dl4I~ z;qSDdXFX7t446r(k(s6oKjTRZsZIXR`J1htp2MWl)jRFv;bTtBV)G6yTK97bumx6x8)9` z95y|0P0qR`ZU<#V=Wb#ri({L`bol+%-7>VynT}|6d8TBHJ;`mV&(@TOAIA*CFY+Km zdiYFAI2_Q*;}fbP#J@-yX)efSdI(RAXn`Q!o;SojG$Q!;=bNOt{v+vcmWBWWLVdf` z|CgkZfnX@$|Mj;ZkWfhs9MFjT@|akZ(OHFr4ddo+NJZlN{)eN#D^r3X#rJZ%193^^ z8;dKpxO*a;hi4vNfIk;a)iXaYHa%@Bw5d<83Ex$lWX$l8wq0iY2OpGL!0ENW0O0x? z*A{FojI6HbJ&5I(-dVKT>io&w(4()#T7sM@cF!jJ%Y;ucH7j!}n_cR202seH>z*VV z>TFA2{1CNL^LCe_jPm&|6A37;Xv&b+H^vzEeaYfj2~o)MKIJ^+E}j_Ez0`z@vd#JO z3t>114c`2|f%u_uL@$CfI|K`VR6AV{-Ka%N?uSAXvaGhjd#$EoKiyml=gmFTNgL!^ zys@Oct$9}n4q5lov7{FAdKNC?ezYWpGrvHSZK4Ma))Ln<>8Z`1wy*eh_T$3Ukf_rf z;>ke-o@GHYF>E!t6`Tnw?2*W*X-NX| zv=`BAah3Xo4w}x(aSBr3EQRBM?mKF`*9B5dXU!Rr zpyD6=>gF})r)v^^cFyCKk<0*-&`|``&)A?%dqG#9({BA-ItjHFdlt0H#78ah>`T4# zUPLR7G}k_>X2LpHiO{t+p8)2o(k+gPx&-u~X_gwQ0H{Pt~8(_Bk` zLR)|)~&$r3<&K`fO2pyP}Yx>9Whjj~?zQY!7L9y~D z39VTRm}iAMgp9|>&-jc|B|Jq}>s9@q;KD}%%}J@6k$JzKc;4jdy@#Y1qxk~fNB&AI z`OMm#$`SV~K5P7|@FYZ9Dn5oFxN#Rx&nF0kSBL;r8^?PvN0P4qs^<( z@&c{#pFFyhAEnJio7BeWTa`$|zpEt4#Wt))tgPs_%O~m-XQ07|OWmetKhcAPp)d20 z@D`ddiI24oZX7P%>Plx@6_by&oi}F)Qy=tVlhq7Nbs>#_-#u#E-B>(@x0|{u^}EU^ z)}Ijpoz@ZR7>_*v<8R6QWuH-nQgWGM!em@iG zEpqdJHr}?^yC<=53K{xMmlXRAFYeV=6Fnlu{7bYw=(pi9YQS54HJtb&es zi{9}i+Mg?ph!{s_8OA0t{PljUEZ(gn?HH=0_UTMW7-Gg(A01C3c7um=R{qU?t81<) zXsL4Yh;~PJt-K}NXF-pwjc8z{8u`2jL{CYvsp|YOm+)ByS60fwoK8n}ui~!(uhK>h z*16lNkmb!K;-%k76qZGd${f=srbjDrBqPb4v+`Cb61Q7Qd!ea`Yx!8B^9p}5Nutpa z0t7#i1YtQMz{lzHLk<5ldcR>#8O^pUktPKby~q8|rwD`T2FeYyu2UL}0M0cjg4 zvjD`(Q*JmAH{mA&FoK^@YZ$=903f@Xjfh~ zh)1H1Z~GvP?LV-wL9-zn*zrj8TBSQs?SWf!i!Jtyio;&6L7&tw0L?_>T2)krO(_!4 zlmoRbK3@>Zhwy)!03ZP1cOL)*9Pod@`G0)}4s`}d-&xZQQQz&{|7!vuVGcK1;)G^k zRHa5FH3_XFK0i(4>KhxPGh^P9#|P?cXf3INpyO|O4d6`*-(&`ohy z(igh`$#xVLSOu)%_sYc+SdPqAnl+SZ#cC^Q!YF+(Nj@S7w6V;iX|yqZ%*YNONIiLF zlPpJq(9cm;=`U&O+DN>L&oLvfKurhxT_muE`rod3v~v z8Z*Di8FyTk2?v&ZimVT=Y9+3$gGziOequ&yF@(GWAf07)&X1)8vKd*XD~!ITj9Qg% zYJvrKWeipYw0&cEwQ{Kse_FLNU{@*@gF_AtcNKC1gwV!Kvu2LMf)baJ~jZ8 zS1a9WPAA}Q-bU3|Fam#~fT}WMrOI4aoLpff*=~gEwn4Eh#S(W8s%$u5yEm7P65x9` z_@>UrVC1IJTEEnFSMRj7T9`x6oI^8Dh~C86OrB6!gFw>%OXW$Rd%(WXlIxiTZE{!z z1tdPhum3yGM^v@)t1d(dg9ed%#(26Bm(wMlE7nIoy`~zZ5XgJQ!&ES+a-5(e?{g0H z3=c)LY#HiX9CU%rQ-^(QELvya^w~68JQ*Il67|`hfZO&#>@4Yhn_Bj11Fh}X#$_5^ zMD8T(UqjzZhh?D85`mtotXLDav>yPn+2wDgB=hCX)$}ZXpWeA=i^l{6A zi3<)#r9HXQY^^ypP4^*%XX9`nc2-!mo0Fn3l>Z8;PBTf-g+>0a(V~|OLBICs**8*X zZvciR+suY?DF4soX8#zu4OxwP^<-5`%W<8EV)s5b67#fnBjPnYX^9t9es&QK#HS<>!D=pM>6vQSlp`%Q;TxTB-bP_Y#> zixbj!Ejh#2hWT2}Sk7ZLhP} zBK-MoMSd%AM8#Cs84|w2zu@qAVg8XsT08dy>$rt%GIFo zK6_)%lruMji8d;HOVgZr@HWO3#%Zd7BN8s8)e-PAG_Ej>--}o~R6|za3(~7UF-bZu z%8E9!_GyTqk_`M<;Nfm)YMK>hs3yoG~q)R(Xg$^q&h~;*K zl}BcSrHCF>Tr-|v&!(X@OH-s&pXlpa{$nmS3)xW^t+8Kfe96upzNcPG->3=5w?a|{ zRKuOR;YEf?xq`B@K@he(r=uts9kyDM1gGcx0x&DlAPEWbcy=WKP)j+A1PGrdseJ_9 zRcu-n{TNvssmzI1VkyYjc`IN^W@|K~kpuVqnk)=0CnkR|6Gn(0`uiDwFeXCr6XCHu zF8(BDk)X*mwrltDE1yR{Pl;tZh&Ii|1KAN4F}*~{z(25FKDN1EorQ6%)@I7VoG!=6 zOLZW(>7|E30~M*y9chlqO<%@#PXOC#5x4ors_)nh&^m1+@N@_hwc3Os>*Gy?;R9s3 z-1}wI%`a8OLLG&}NtKw8pIr36dpu0|g5k4X$nzDu^sHwnJiAj9^vKqa?;kH(uQ!)C z>`dnI_K>FHBy#-AE9QM`Dsul-is-4j~WhJdDALl?5DP}(r{(}?W)g(N?QFxV$3 zjUo~?CUaO)dwOly^ms?9zkl=4B~Y)?=QqbC`njpl)vv2g7{-qXPLzBQn6+hnPBbM_ zDGtv?hb;^(Yty1M4A$CO6o{Q5#Bsxzr?@})jQj@LzjZosw_XMsSe{f}2_6DxXD)B( zylb1g?szucSC$t7jHfsggyeS!z)62=praJ^bz(px<97Tp*NC+>uZGZ25pPN`7LggS zrtBXK&^z}DgW0IHsz9%>tVf3XOmHB=@(oX&T)%KgiKpTie#Ar&iw}-lh~a9Dl<)+w z#Qr z!_e8($v#BOQpz&#pG7B$$56ZnvAdFx#Io)U!`#X?wP09-v=XDBmL@+;Xk!i%$6F=f zY7?9b^;K4w3{y5>r%25uxr$FNga@ zCQVuk3;Ulaos^&6j(}J~=$e1`SB$c4~1Tau*qW(Rlqfo=9sBW}_j0I3u6v!@kqj9;b zo<%X}1$z+TSQ5(sO1+`=RwM0hnjIB?G3&u)0XI-d7T$os3LRx>up~a{a0NSEU(oV% zf(tQkD$wy33d%c{K`3rR{q0~nVq~~5?IQ?;v#9uvSsEhkkV7N39-Qrc04L9dot5^D z*Jx)cGBv~gw_`QMnla|waq+{WU{JJQkKL}Nj#xC zo1M+k0=I=h4}>tgCkpS#Ac`cFcvsO>y2)n7-*h1Xj_Ww$ zXi{bjY>t@d)gy85r*;-M<$fFXnVXfoJ>Sho7~~378?PC#uYQ&7-GgZ7e}qonunYZh zy)q{h^y2*9s`nF*xMn^Vq{*T5ckZr|qyd^VH>B-ImA(`>0<@c-rpp1BrDl|J#WkKn zg_^om%r@q~X%}CbBwss%mlVka;-LB>AfI*y_eD6$QZTG(4e#kQAFx zbm&@2r|!CfDoPV6FsVpr&%6j)Gh@iMvU-5=I5tjSr!V3B6g)S&!$R|wj!el^xwTxfRuFMy@*6!edYj_0z` z*`W^G4GAwSGb2euaN~TGP@M8Nbxyk@^r7Zzf!0cu|1Vw+q4AIDcDR^^^Q9d6AN$2V z59}rqUW;R^UzpO+#=AjJvTF=gM$3yCGFaz80i*yA_8#e+;g zR-=t>fB(b)C=mew0s;a70|WvC0RR910003IApkK!QDJd`kr1J=;la@$@bN(Z+5iXv z0s#R(5SM|Zz9$%1Mp07}PmdS^6em_VbO!`VoB?E+-zGd@g(0yhsUjf)V5TBh2Ar1i zSO~VGCxyr(WSutnUfAOyS&3xST0jG)mf0l1f==&V z(*ZQ0AtZfgAOLDiN0tp9LMK@Lg~e3dLXn{ua01#vARUPtIgFA`6{XxnD^NJ2+@N@| z2}`#?n-^NRkOc`AlnoY;huOiZJ!O0HoZ@Jx%uC50zH+K(m|WgL(tuOc#|!NsaAt?t z*q6uO>1QBha?&`+U=NDL)sMl7e?}r}m&|c;@J@G>VsXgn)Vvd{Ad%g9Yf4u~I2cm3 zkz-UoF~D@VJuixRxT?Yx_dQ2uEuaW3tDgJCIT0IrioJ$Svd@_Khh8u!0(qP3d##wD zB6@#V!l(Uiy01)y0J$$-I>>Y8-aCWuIJqd#CK536bGiFv4}_GK^X-DN^c-px_sRO0 zo=tyun&6tAvLDhh8UhY-APB%pu7mLzDL&eh7byEDR<(sIgxMZI`#&Jjq6=*tcORMP za48uL?&@pRz2wAbL~}dtBbkcS(8>~y8mOKn{nUw?Y>mWe9KdLaZ1V#RY1ZOmZI4;r zB+5|H%j-XE4hcr|cC1ujloT<)$BZ7QP2(p12CTt_mT@sg1&fXb}U zo?jo!1`LcWc*2$$3DCoFb9hHmRR?K$v;m@wDbA9y2?aJweBqR}R0}{&B404^lSruL zbYA5W!_|yQ4v4w7NW4FECz`M`(5Pc`-jHr^U)mmhd-IBpWw2@zKicePBtQp`630AY zgft`L(La~YB8rhLz<4Kqa9q3n{VZH42|n3dLFXN#@?uJca3-*jAug~Z>eZb%-U3PC zI%a)N-#E)XAShBJST^A@K@pL$WI$@cX9rAhbXO2Hpr5z2M1Xt_C$aG36<(ol^y1_q zdNnUKaT7)0cFp*HaHaSu?rqyVC{Fm*PAW_J#F>Yw{r> z5seNIQ3RKflOrAY%bUgFUXBdmgX0(}kBjj-e7b6p!hwZNZW$BZ+)m>v!3kx!d1gJa zhza#F82P+UwI$;o5`U?m72X@b@mKi1PAi-rgjM>_;x8E%`lj*}oE{$I1k4ctTRPrO zKzYHARe-(1lj5VBOp_52sH8x8&LF`PM*^}ji57at%`-Um@doP*Y+>|6!1aIA_pBbN zI37gqMT5$l35 z3-jK;eRF|KWBz}6JHW6ynDzO?BnOiljnoE68Qw@v2^AwG`#eSpAtN-O-TwfX?kzN_ zxF;c^ZL>EUb*09X5!`PC*vae!Z!;(8SxCfSn9IZaa4ZWzT+j5qBfC7yz6h{UA6elg(rX6eQyr3>>T-<2*C#j=;*RpqQy= z4}#i1tTlo7#ECFMakf%@@>HSAu^vYXG7ze&4S?KXX-tn{Mp{XUfYz`X%4b6f3S8hm zZmpVwAeK>=YPpX+F(SB7?&f%aE9b^LP|15m4#}PTVB7`A_O$;1Txe1E{rbjmw0Pb6 zILd*C#rsi@UMezJksP3r{xN`|hANqyv@e$kjDWudVrWhTg9ZjhjdW&^XKXP0OPgkw zBc#3u1yK0N_zBF%q%*3@<~-Ze?4+5j5v(*oFEZln_o=7`@X&8ybFo;XBCk>jOKs9ImhciLk;1hBg~}hR{6&^9><6B z4ojC`U16`M7;F6H`c4eaFW3LX04EUv00II50SE&D0RR910000101+WEK~WH4ae*X8~FxHI?t= z)JZN~(K2N=0|Ujst_7Sh?v1-NLJwC5Ajs%xx)#>IuhdW07fpnqdae;Ns~-lm$Vv#8*n}_7VPsPmxIzUsy!f;Wvl@?E}iwJE`tA=S$G6UMAFP7$TpOpQE#jKFw$%z!;$ ziV28{SuAovQ;6P}mzpCD6vv`BEWC=#Sp+$YEs3BGXu6=?ci2(*V7E8={{TH@{uhdd zrI2s4jKY`zRH9XOQPM0VaF4thX6#ax^@4>pSqNBG1ys8=otrgOL6Z03^$4AQ^#Lh` z@nchw1t{DRtiiCnXN>jfzaEzeI4?LX+%Cq4Nm7c0#xA+*^@uP~fOtyr2t}r?QOd!X zj;t8CAB65x7Lv|kmx-&QHM+dlM~j3$c{PEPv?qnGTQysvwrmb`9Sb2XH%issJf^^E z0AcQerRw;PcQpnM9of|cy*bPR!Sk%~-`xdDb>r6h%*`inPOBZE;k_RroCr& zg(b>*OT$lQY9=D&MTx>>WxG(ymYBwQsJpfiPbLEjm=$d>#p@en9lY0n)bUuMRVerN z>E$UsemwciL(U}*=e!R;UcNs!3^zyjtfgt`{>?BwCiV|Wk3?z=MT3Ba3chA!Rvkl# zCk*GeXA!mqy(UT|-85Cj><&iiqxDeL!(nj3kyoae4PclpCH4eCh6|}taTUnlhJKh@ zu;j8)NWuPm%Z{qc0M_ZwMxn!wJIjGx+arb}t^WYe+%3WkWWw08&V7=MT2!i7BeO~_26>D;11#T!I`*MtRA#7$kk5G7aj--3(t{w z&q!n{7FX2-yqt=1a`+D#( z*8Iad^03;#cDP*%i$Kt^4tgo7YH@3gyGqOc=2J<6Csa-4vtF{Zm-^zb5j0Zo!2-Fz zR%|D^l}e-6-cv{rtH*h`<+jU%iQX`sXfcEyth+l7I};G{(Ge$LLAvI(%|!|#typUu zYUfw0=9z0@wQ{T0<`j=(RhR-BOocDf7X9&Ft@}cZk!&z=dCRZ~(s@1#S9I}sH#(li z6xzIrR&L@wQyl_SD27i2;emL7^*i9 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/toolkit/gocache/Makefile b/toolkit/gocache/Makefile deleted file mode 100644 index a330f326..00000000 --- a/toolkit/gocache/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -.PHONY: update-stores-version mocks test benchmark-store - -# Usage: VERSION=v4.1.3 make update-stores-version -update-stores-version: - ls store/ | xargs -I % bash -c "sed -i '' -E 's,github.com/eko/gocache/lib/v4 v[0-9]\.[0-9]\.[0-9],github.com/eko/gocache/lib/v4 ${VERSION},g' store/%/go.mod" - -mocks: - mockgen -source=lib/cache/interface.go -destination=lib/cache/cache_mock.go -package=cache - mockgen -source=lib/codec/interface.go -destination=lib/codec/codec_mock.go -package=codec - mockgen -source=lib/metrics/interface.go -destination=lib/metrics/metrics_mock.go -package=metrics - mockgen -source=lib/store/interface.go -destination=lib/store/store_mock.go -package=store - mockgen -source=store/bigcache/bigcache.go -destination=store/bigcache/bigcache_mock.go -package=bigcache - mockgen -source=store/memcache/memcache.go -destination=store/memcache/memcache_mock.go -package=memcache - mockgen -source=store/redis/redis.go -destination=store/redis/redis_mock.go -package=redis - mockgen -source=store/rediscluster/rediscluster.go -destination=store/rediscluster/rediscluster_mock.go -package=rediscluster - mockgen -source=store/ristretto/ristretto.go -destination=store/ristretto/ristretto_mock.go -package=ristretto - mockgen -source=store/freecache/freecache.go -destination=store/freecache/freecache_mock.go -package=freecache - mockgen -source=store/go_cache/go_cache.go -destination=store/go_cache/go_cache_mock.go -package=go_cache - mockgen -source=store/hazelcast/hazelcast.go -destination=store/hazelcast/hazelcast_mock.go -package=hazelcast - -test: - cd lib; GOGC=10 go test -v -p=4 ./... - cd store/bigcache; GOGC=10 go test -v -p=4 ./... - cd store/freecache; GOGC=10 go test -v -p=4 ./... - cd store/go_cache; GOGC=10 go test -v -p=4 ./... - cd store/memcache; GOGC=10 go test -v -p=4 ./... - cd store/pegasus; GOGC=10 go test -v -p=4 ./... - cd store/redis; GOGC=10 go test -v -p=4 ./... - cd store/rediscluster; GOGC=10 go test -v -p=4 ./... - cd store/ristretto; GOGC=10 go test -v -p=4 ./... diff --git a/toolkit/gocache/README.md b/toolkit/gocache/README.md deleted file mode 100644 index 23103704..00000000 --- a/toolkit/gocache/README.md +++ /dev/null @@ -1,554 +0,0 @@ -[![Test](https://github.com/eko/gocache/actions/workflows/all.yml/badge.svg?branch=master)](https://github.com/eko/gocache/actions/workflows/all.yml) -[![GoDoc](https://godoc.org/github.com/eko/gocache?status.png)](https://godoc.org/github.com/eko/gocache) -[![GoReportCard](https://goreportcard.com/badge/github.com/eko/gocache)](https://goreportcard.com/report/github.com/eko/gocache) -[![codecov](https://codecov.io/gh/eko/gocache/branch/master/graph/badge.svg)](https://codecov.io/gh/eko/gocache) - -Gocache -======= - -Guess what is Gocache? a Go cache library. -This is an extendable cache library that brings you a lot of features for caching data. - -## Overview - -Here is what it brings in detail: - -* ✅ Multiple cache stores: actually in memory, redis, or your own custom store -* ✅ A chain cache: use multiple cache with a priority order (memory then fallback to a redis shared cache for instance) -* ✅ A loadable cache: allow you to call a callback function to put your data back in cache -* ✅ A metric cache to let you store metrics about your caches usage (hits, miss, set success, set error, ...) -* ✅ A marshaler to automatically marshal/unmarshal your cache values as a struct -* ✅ Define default values in stores and override them when setting data -* ✅ Cache invalidation by expiration time and/or using tags -* ✅ Use of Generics - -## Built-in stores - -* [Memory (bigcache)](https://github.com/allegro/bigcache) (allegro/bigcache) -* [Memory (ristretto)](https://github.com/dgraph-io/ristretto) (dgraph-io/ristretto) -* [Memory (go-cache)](https://github.com/patrickmn/go-cache) (patrickmn/go-cache) -* [Memcache](https://github.com/bradfitz/gomemcache) (bradfitz/memcache) -* [Redis](https://github.com/go-redis/redis) (go-redis/redis) -* [Redis (rueidis)](https://github.com/redis/rueidis) (redis/rueidis) -* [Freecache](https://github.com/coocood/freecache) (coocood/freecache) -* [Pegasus](https://pegasus.apache.org/) ([apache/incubator-pegasus](https://github.com/apache/incubator-pegasus)) [benchmark](https://pegasus.apache.org/overview/benchmark/) -* [Hazelcast](https://github.com/hazelcast/hazelcast-go-client) (hazelcast-go-client/hazelcast) -* More to come soon - -## Built-in metrics providers - -* [Prometheus](https://github.com/prometheus/client_golang) - -## Installation - -To begin working with the latest version of gocache, you can import the library in your project: - -```go -go get github.com/eko/gocache/lib/v4 -``` - -and then, import the store(s) you want to use between all available ones: - -```go -go get github.com/eko/gocache/store/bigcache/v4 -go get github.com/eko/gocache/store/freecache/v4 -go get github.com/eko/gocache/store/go_cache/v4 -go get github.com/eko/gocache/store/hazelcast/v4 -go get github.com/eko/gocache/store/memcache/v4 -go get github.com/eko/gocache/store/pegasus/v4 -go get github.com/eko/gocache/store/redis/v4 -go get github.com/eko/gocache/store/rediscluster/v4 -go get github.com/eko/gocache/store/rueidis/v4 -go get github.com/eko/gocache/store/ristretto/v4 -``` - -Then, simply use the following import statements: - -```go -import ( - "github.com/eko/gocache/lib/v4/cache" - "github.com/eko/gocache/store/redis/v4" -) -``` - -If you run into any errors, please be sure to run `go mod tidy` to clean your go.mod file. - -## Available cache features in detail - -### A simple cache - -Here is a simple cache instantiation with Redis but you can also look at other available stores: - -#### Memcache - -```go -memcacheStore := memcache_store.NewMemcache( - memcache.New("10.0.0.1:11211", "10.0.0.2:11211", "10.0.0.3:11212"), - store.WithExpiration(10*time.Second), -) - -cacheManager := cache.New[[]byte](memcacheStore) -err := cacheManager.Set(ctx, "my-key", []byte("my-value"), - store.WithExpiration(15*time.Second), // Override default value of 10 seconds defined in the store -) -if err != nil { - panic(err) -} - -value := cacheManager.Get(ctx, "my-key") - -cacheManager.Delete(ctx, "my-key") - -cacheManager.Clear(ctx) // Clears the entire cache, in case you want to flush all cache -``` - -#### Memory (using Bigcache) - -```go -bigcacheClient, _ := bigcache.NewBigCache(bigcache.DefaultConfig(5 * time.Minute)) -bigcacheStore := bigcache_store.NewBigcache(bigcacheClient) - -cacheManager := cache.New[[]byte](bigcacheStore) -err := cacheManager.Set(ctx, "my-key", []byte("my-value")) -if err != nil { - panic(err) -} - -value := cacheManager.Get(ctx, "my-key") -``` - -#### Memory (using Ristretto) - -```go -import ( - "github.com/dgraph-io/ristretto" - "github.com/eko/gocache/lib/v4/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - ristretto_store "github.com/eko/gocache/store/ristretto/v4" -) -ristrettoCache, err := ristretto.NewCache(&ristretto.Config{ - NumCounters: 1000, - MaxCost: 100, - BufferItems: 64, -}) -if err != nil { - panic(err) -} -ristrettoStore := ristretto_store.NewRistretto(ristrettoCache) - -cacheManager := cache.New[string](ristrettoStore) -err := cacheManager.Set(ctx, "my-key", "my-value", store.WithCost(2)) -if err != nil { - panic(err) -} - -value := cacheManager.Get(ctx, "my-key") - -cacheManager.Delete(ctx, "my-key") -``` - -#### Memory (using Go-cache) - -```go -gocacheClient := gocache.New(5*time.Minute, 10*time.Minute) -gocacheStore := gocache_store.NewGoCache(gocacheClient) - -cacheManager := cache.New[[]byte](gocacheStore) -err := cacheManager.Set(ctx, "my-key", []byte("my-value")) -if err != nil { - panic(err) -} - -value, err := cacheManager.Get(ctx, "my-key") -if err != nil { - panic(err) -} -fmt.Printf("%s", value) -``` - -#### Redis - -```go -redisStore := redis_store.NewRedis(redis.NewClient(&redis.Options{ - Addr: "127.0.0.1:6379", -})) - -cacheManager := cache.New[string](redisStore) -err := cacheManager.Set(ctx, "my-key", "my-value", store.WithExpiration(15*time.Second)) -if err != nil { - panic(err) -} - -value, err := cacheManager.Get(ctx, "my-key") -switch err { - case nil: - fmt.Printf("Get the key '%s' from the redis cache. Result: %s", "my-key", value) - case redis.Nil: - fmt.Printf("Failed to find the key '%s' from the redis cache.", "my-key") - default: - fmt.Printf("Failed to get the value from the redis cache with key '%s': %v", "my-key", err) -} -``` - -#### [Redis Client-Side Caching](https://redis.io/docs/manual/client-side-caching/) (using rueidis) - -```go -client, err := rueidis.NewClient(rueidis.ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) -if err != nil { - panic(err) -} - -cacheManager := cache.New[string](rueidis_store.NewRueidis( - client, - store.WithExpiration(15*time.Second), - store.WithClientSideCaching(15*time.Second)), -) - -if err = cacheManager.Set(ctx, "my-key", "my-value"); err != nil { - panic(err) -} - -value, err := cacheManager.Get(ctx, "my-key") -if err != nil { - log.Fatalf("Failed to get the value from the redis cache with key '%s': %v", "my-key", err) -} -log.Printf("Get the key '%s' from the redis cache. Result: %s", "my-key", value) -``` - -#### Freecache - -```go -freecacheStore := freecache_store.NewFreecache(freecache.NewCache(1000), store.WithExpiration(10 * time.Second)) - -cacheManager := cache.New[[]byte](freecacheStore) -err := cacheManager.Set(ctx, "by-key", []byte("my-value"), opts) -if err != nil { - panic(err) -} - -value := cacheManager.Get(ctx, "my-key") -``` - -#### Pegasus - -```go -pegasusStore, err := pegasus_store.NewPegasus(&store.OptionsPegasus{ - MetaServers: []string{"127.0.0.1:34601", "127.0.0.1:34602", "127.0.0.1:34603"}, -}) - -if err != nil { - fmt.Println(err) - return -} - -cacheManager := cache.New[string](pegasusStore) -err = cacheManager.Set(ctx, "my-key", "my-value", store.WithExpiration(10 * time.Second)) -if err != nil { - panic(err) -} - -value, _ := cacheManager.Get(ctx, "my-key") -``` - -#### Hazelcast - -```go -hzClient, err := hazelcast.StartNewClient(ctx) -if err != nil { - log.Fatalf("Failed to start client: %v", err) -} - -hzMapName:= "gocache" - -hazelcastStore := hazelcast_store.NewHazelcast(hzClient, hzMapName) - -cacheManager := cache.New[string](hazelcastStore) -err := cacheManager.Set(ctx, "my-key", "my-value", store.WithExpiration(15*time.Second)) -if err != nil { - panic(err) -} - -value, err := cacheManager.Get(ctx, "my-key") -if err != nil { - panic(err) -} -fmt.Printf("Get the key '%s' from the hazelcast cache. Result: %s", "my-key", value) -``` - -### A chained cache - -Here, we will chain caches in the following order: first in memory with Ristretto store, then in Redis (as a fallback): - -```go -// Initialize Ristretto cache and Redis client -ristrettoCache, err := ristretto.NewCache(&ristretto.Config{NumCounters: 1000, MaxCost: 100, BufferItems: 64}) -if err != nil { - panic(err) -} - -redisClient := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}) - -// Initialize stores -ristrettoStore := ristretto_store.NewRistretto(ristrettoCache) -redisStore := redis_store.NewRedis(redisClient, store.WithExpiration(5*time.Second)) - -// Initialize chained cache -cacheManager := cache.NewChain[any]( - cache.New[any](ristrettoStore), - cache.New[any](redisStore), -) - -// ... Then, do what you want with your cache -``` - -`Chain` cache also put data back in previous caches when it's found so in this case, if ristretto doesn't have the data in its cache but redis have, data will also get setted back into ristretto (memory) cache. - -### A loadable cache - -This cache will provide a load function that acts as a callable function and will set your data back in your cache in case they are not available: - -```go -type Book struct { - ID string - Name string -} - -// Initialize Redis client and store -redisClient := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}) -redisStore := redis_store.NewRedis(redisClient) - -// Initialize a load function that loads your data from a custom source -loadFunction := func(ctx context.Context, key any) (*Book, error) { - // ... retrieve value from available source - return &Book{ID: 1, Name: "My test amazing book"}, nil -} - -// Initialize loadable cache -cacheManager := cache.NewLoadable[*Book]( - loadFunction, - cache.New[*Book](redisStore), -) - -// ... Then, you can get your data and your function will automatically put them in cache(s) -``` - -Of course, you can also pass a `Chain` cache into the `Loadable` one so if your data is not available in all caches, it will bring it back in all caches. - -### A metric cache to retrieve cache statistics - -This cache will record metrics depending on the metric provider you pass to it. Here we give a Prometheus provider: - -```go -// Initialize Redis client and store -redisClient := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}) -redisStore := redis_store.NewRedis(redisClient) - -// Initializes Prometheus metrics service -promMetrics := metrics.NewPrometheus("my-test-app") - -// Initialize metric cache -cacheManager := cache.NewMetric[any]( - promMetrics, - cache.New[any](redisStore), -) - -// ... Then, you can get your data and metrics will be observed by Prometheus -``` - -### A marshaler wrapper - -Some caches like Redis stores and returns the value as a string so you have to marshal/unmarshal your structs if you want to cache an object. That's why we bring a marshaler service that wraps your cache and make the work for you: - -```go -// Initialize Redis client and store -redisClient := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}) -redisStore := redis_store.NewRedis(redisClient) - -// Initialize chained cache -cacheManager := cache.NewMetric[any]( - promMetrics, - cache.New[any](redisStore), -) - -// Initializes marshaler -marshal := marshaler.New(cacheManager) - -key := BookQuery{Slug: "my-test-amazing-book"} -value := Book{ID: 1, Name: "My test amazing book", Slug: "my-test-amazing-book"} - -err = marshal.Set(ctx, key, value) -if err != nil { - panic(err) -} - -returnedValue, err := marshal.Get(ctx, key, new(Book)) -if err != nil { - panic(err) -} - -// Then, do what you want with the value - -marshal.Delete(ctx, "my-key") -``` - -The only thing you have to do is to specify the struct in which you want your value to be un-marshalled as a second argument when calling the `.Get()` method. - - -### Cache invalidation using tags - -You can attach some tags to items you create so you can easily invalidate some of them later. - -Tags are stored using the same storage you choose for your cache. - -Here is an example on how to use it: - -```go -// Initialize Redis client and store -redisClient := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}) -redisStore := redis_store.NewRedis(redisClient) - -// Initialize chained cache -cacheManager := cache.NewMetric[*Book]( - promMetrics, - cache.New[*Book](redisStore), -) - -// Initializes marshaler -marshal := marshaler.New(cacheManager) - -key := BookQuery{Slug: "my-test-amazing-book"} -value := &Book{ID: 1, Name: "My test amazing book", Slug: "my-test-amazing-book"} - -// Set an item in the cache and attach it a "book" tag -err = marshal.Set(ctx, key, value, store.WithTags([]string{"book"})) -if err != nil { - panic(err) -} - -// Remove all items that have the "book" tag -err := marshal.Invalidate(ctx, store.WithInvalidateTags([]string{"book"})) -if err != nil { - panic(err) -} - -returnedValue, err := marshal.Get(ctx, key, new(Book)) -if err != nil { - // Should be triggered because item has been deleted so it cannot be found. - panic(err) -} -``` - -Mix this with expiration times on your caches to have a fine-tuned control on how your data are cached. - -```go -package main - -import ( - "fmt" - "log" - "time" - - "github.com/eko/gocache/lib/v4/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "github.com/redis/go-redis/v9" -) - -func main() { - redisStore := redis_store.NewRedis(redis.NewClient(&redis.Options{ - Addr: "127.0.0.1:6379", - }), nil) - - cacheManager := cache.New[string](redisStore) - err := cacheManager.Set(ctx, "my-key", "my-value", store.WithExpiration(15*time.Second)) - if err != nil { - panic(err) - } - - key := "my-key" - value, err := cacheManager.Get(ctx, key) - if err != nil { - log.Fatalf("unable to get cache key '%s' from the cache: %v", key, err) - } - - fmt.Printf("%#+v\n", value) -} - -``` - -### Write your own custom cache - -Cache respect the following interface so you can write your own (proprietary?) cache logic if needed by implementing the following interface: - -```go -type CacheInterface[T any] interface { - Get(ctx context.Context, key any) (T, error) - Set(ctx context.Context, key any, object T, options ...store.Option) error - Delete(ctx context.Context, key any) error - Invalidate(ctx context.Context, options ...store.InvalidateOption) error - Clear(ctx context.Context) error - GetType() string -} -``` - -Or, in case you use a setter cache, also implement the `GetCodec()` method: - -```go -type SetterCacheInterface[T any] interface { - CacheInterface[T] - GetWithTTL(ctx context.Context, key any) (T, time.Duration, error) - - GetCodec() codec.CodecInterface -} -``` - -As all caches available in this library implement `CacheInterface`, you will be able to mix your own caches with your own. - -### Write your own custom store - -You also have the ability to write your own custom store by implementing the following interface: - -```go -type StoreInterface interface { - Get(ctx context.Context, key any) (any, error) - GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) - Set(ctx context.Context, key any, value any, options ...Option) error - Delete(ctx context.Context, key any) error - Invalidate(ctx context.Context, options ...InvalidateOption) error - Clear(ctx context.Context) error - GetType() string -} -``` - -Of course, I suggest you to have a look at current caches or stores to implement your own. - -### Custom cache key generator - -You can implement the following interface in order to generate a custom cache key: - -```go -type CacheKeyGenerator interface { - GetCacheKey() string -} -``` - -### Benchmarks - -![Benchmarks](https://raw.githubusercontent.com/eko/gocache/master/lib/misc/benchmarks.jpeg) - -## Run tests - -To generate mocks using mockgen library, run: - -```bash -$ make mocks -``` - -Test suite can be run with: - -```bash -$ make test # run unit test -``` - -## Community - -Please feel free to contribute on this library and do not hesitate to open an issue if you want to discuss about a feature. diff --git a/toolkit/gocache/lib/cache/cache.go b/toolkit/gocache/lib/cache/cache.go deleted file mode 100644 index 5791d530..00000000 --- a/toolkit/gocache/lib/cache/cache.go +++ /dev/null @@ -1,117 +0,0 @@ -package cache - -import ( - "context" - "crypto" - "fmt" - "reflect" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // CacheType represents the cache type as a string value - CacheType = "cache" -) - -// Cache represents the configuration needed by a cache -type Cache[T any] struct { - codec codec.CodecInterface -} - -// New instantiates a new cache entry -func New[T any](store store.StoreInterface) *Cache[T] { - return &Cache[T]{ - codec: codec.New(store), - } -} - -// Get returns the object stored in cache if it exists -func (c *Cache[T]) Get(ctx context.Context, key any) (T, error) { - cacheKey := c.getCacheKey(key) - - value, err := c.codec.Get(ctx, cacheKey) - if err != nil { - return *new(T), err - } - - if v, ok := value.(T); ok { - return v, nil - } - - return *new(T), nil -} - -// GetWithTTL returns the object stored in cache and its corresponding TTL -func (c *Cache[T]) GetWithTTL(ctx context.Context, key any) (T, time.Duration, error) { - cacheKey := c.getCacheKey(key) - - value, duration, err := c.codec.GetWithTTL(ctx, cacheKey) - if err != nil { - return *new(T), duration, err - } - - if v, ok := value.(T); ok { - return v, duration, nil - } - - return *new(T), duration, nil -} - -// Set populates the cache item using the given key -func (c *Cache[T]) Set(ctx context.Context, key any, object T, options ...store.Option) error { - cacheKey := c.getCacheKey(key) - return c.codec.Set(ctx, cacheKey, object, options...) -} - -// Delete removes the cache item using the given key -func (c *Cache[T]) Delete(ctx context.Context, key any) error { - cacheKey := c.getCacheKey(key) - return c.codec.Delete(ctx, cacheKey) -} - -// Invalidate invalidates cache item from given options -func (c *Cache[T]) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - return c.codec.Invalidate(ctx, options...) -} - -// Clear resets all cache data -func (c *Cache[T]) Clear(ctx context.Context) error { - return c.codec.Clear(ctx) -} - -// GetCodec returns the current codec -func (c *Cache[T]) GetCodec() codec.CodecInterface { - return c.codec -} - -// GetType returns the cache type -func (c *Cache[T]) GetType() string { - return CacheType -} - -// getCacheKey returns the cache key for the given key object by returning -// the key if type is string or by computing a checksum of key structure -// if its type is other than string -func (c *Cache[T]) getCacheKey(key any) string { - switch v := key.(type) { - case string: - return v - case CacheKeyGenerator: - return v.GetCacheKey() - default: - return checksum(key) - } -} - -// checksum hashes a given object into a string -func checksum(object any) string { - digester := crypto.MD5.New() - fmt.Fprint(digester, reflect.TypeOf(object)) - fmt.Fprint(digester, object) - hash := digester.Sum(nil) - - return fmt.Sprintf("%x", hash) -} diff --git a/toolkit/gocache/lib/cache/cache_mock.go b/toolkit/gocache/lib/cache/cache_mock.go deleted file mode 100644 index 1e7fe989..00000000 --- a/toolkit/gocache/lib/cache/cache_mock.go +++ /dev/null @@ -1,318 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: lib/cache/interface.go - -// Package cache is a generated GoMock package. -package cache - -import ( - context "context" - reflect "reflect" - time "time" - - codec "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - gomock "go.uber.org/mock/gomock" -) - -// MockCacheInterface is a mock of CacheInterface interface. -type MockCacheInterface[T any] struct { - ctrl *gomock.Controller - recorder *MockCacheInterfaceMockRecorder[T] -} - -// MockCacheInterfaceMockRecorder is the mock recorder for MockCacheInterface. -type MockCacheInterfaceMockRecorder[T any] struct { - mock *MockCacheInterface[T] -} - -// NewMockCacheInterface creates a new mock instance. -func NewMockCacheInterface[T any](ctrl *gomock.Controller) *MockCacheInterface[T] { - mock := &MockCacheInterface[T]{ctrl: ctrl} - mock.recorder = &MockCacheInterfaceMockRecorder[T]{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockCacheInterface[T]) EXPECT() *MockCacheInterfaceMockRecorder[T] { - return m.recorder -} - -// Clear mocks base method. -func (m *MockCacheInterface[T]) Clear(ctx context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Clear", ctx) - ret0, _ := ret[0].(error) - return ret0 -} - -// Clear indicates an expected call of Clear. -func (mr *MockCacheInterfaceMockRecorder[T]) Clear(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockCacheInterface[T])(nil).Clear), ctx) -} - -// Delete mocks base method. -func (m *MockCacheInterface[T]) Delete(ctx context.Context, key any) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", ctx, key) - ret0, _ := ret[0].(error) - return ret0 -} - -// Delete indicates an expected call of Delete. -func (mr *MockCacheInterfaceMockRecorder[T]) Delete(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockCacheInterface[T])(nil).Delete), ctx, key) -} - -// Get mocks base method. -func (m *MockCacheInterface[T]) Get(ctx context.Context, key any) (T, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", ctx, key) - ret0, _ := ret[0].(T) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockCacheInterfaceMockRecorder[T]) Get(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockCacheInterface[T])(nil).Get), ctx, key) -} - -// GetType mocks base method. -func (m *MockCacheInterface[T]) GetType() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetType") - ret0, _ := ret[0].(string) - return ret0 -} - -// GetType indicates an expected call of GetType. -func (mr *MockCacheInterfaceMockRecorder[T]) GetType() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetType", reflect.TypeOf((*MockCacheInterface[T])(nil).GetType)) -} - -// Invalidate mocks base method. -func (m *MockCacheInterface[T]) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Invalidate", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Invalidate indicates an expected call of Invalidate. -func (mr *MockCacheInterfaceMockRecorder[T]) Invalidate(ctx interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invalidate", reflect.TypeOf((*MockCacheInterface[T])(nil).Invalidate), varargs...) -} - -// Set mocks base method. -func (m *MockCacheInterface[T]) Set(ctx context.Context, key any, object T, options ...store.Option) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, key, object} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Set", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockCacheInterfaceMockRecorder[T]) Set(ctx, key, object interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, key, object}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockCacheInterface[T])(nil).Set), varargs...) -} - -// MockCacheKeyGenerator is a mock of CacheKeyGenerator interface. -type MockCacheKeyGenerator struct { - ctrl *gomock.Controller - recorder *MockCacheKeyGeneratorMockRecorder -} - -// MockCacheKeyGeneratorMockRecorder is the mock recorder for MockCacheKeyGenerator. -type MockCacheKeyGeneratorMockRecorder struct { - mock *MockCacheKeyGenerator -} - -// NewMockCacheKeyGenerator creates a new mock instance. -func NewMockCacheKeyGenerator(ctrl *gomock.Controller) *MockCacheKeyGenerator { - mock := &MockCacheKeyGenerator{ctrl: ctrl} - mock.recorder = &MockCacheKeyGeneratorMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockCacheKeyGenerator) EXPECT() *MockCacheKeyGeneratorMockRecorder { - return m.recorder -} - -// GetCacheKey mocks base method. -func (m *MockCacheKeyGenerator) GetCacheKey() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCacheKey") - ret0, _ := ret[0].(string) - return ret0 -} - -// GetCacheKey indicates an expected call of GetCacheKey. -func (mr *MockCacheKeyGeneratorMockRecorder) GetCacheKey() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCacheKey", reflect.TypeOf((*MockCacheKeyGenerator)(nil).GetCacheKey)) -} - -// MockSetterCacheInterface is a mock of SetterCacheInterface interface. -type MockSetterCacheInterface[T any] struct { - ctrl *gomock.Controller - recorder *MockSetterCacheInterfaceMockRecorder[T] -} - -// MockSetterCacheInterfaceMockRecorder is the mock recorder for MockSetterCacheInterface. -type MockSetterCacheInterfaceMockRecorder[T any] struct { - mock *MockSetterCacheInterface[T] -} - -// NewMockSetterCacheInterface creates a new mock instance. -func NewMockSetterCacheInterface[T any](ctrl *gomock.Controller) *MockSetterCacheInterface[T] { - mock := &MockSetterCacheInterface[T]{ctrl: ctrl} - mock.recorder = &MockSetterCacheInterfaceMockRecorder[T]{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSetterCacheInterface[T]) EXPECT() *MockSetterCacheInterfaceMockRecorder[T] { - return m.recorder -} - -// Clear mocks base method. -func (m *MockSetterCacheInterface[T]) Clear(ctx context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Clear", ctx) - ret0, _ := ret[0].(error) - return ret0 -} - -// Clear indicates an expected call of Clear. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) Clear(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).Clear), ctx) -} - -// Delete mocks base method. -func (m *MockSetterCacheInterface[T]) Delete(ctx context.Context, key any) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", ctx, key) - ret0, _ := ret[0].(error) - return ret0 -} - -// Delete indicates an expected call of Delete. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) Delete(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).Delete), ctx, key) -} - -// Get mocks base method. -func (m *MockSetterCacheInterface[T]) Get(ctx context.Context, key any) (T, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", ctx, key) - ret0, _ := ret[0].(T) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) Get(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).Get), ctx, key) -} - -// GetCodec mocks base method. -func (m *MockSetterCacheInterface[T]) GetCodec() codec.CodecInterface { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCodec") - ret0, _ := ret[0].(codec.CodecInterface) - return ret0 -} - -// GetCodec indicates an expected call of GetCodec. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) GetCodec() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCodec", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).GetCodec)) -} - -// GetType mocks base method. -func (m *MockSetterCacheInterface[T]) GetType() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetType") - ret0, _ := ret[0].(string) - return ret0 -} - -// GetType indicates an expected call of GetType. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) GetType() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetType", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).GetType)) -} - -// GetWithTTL mocks base method. -func (m *MockSetterCacheInterface[T]) GetWithTTL(ctx context.Context, key any) (T, time.Duration, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetWithTTL", ctx, key) - ret0, _ := ret[0].(T) - ret1, _ := ret[1].(time.Duration) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// GetWithTTL indicates an expected call of GetWithTTL. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) GetWithTTL(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithTTL", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).GetWithTTL), ctx, key) -} - -// Invalidate mocks base method. -func (m *MockSetterCacheInterface[T]) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Invalidate", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Invalidate indicates an expected call of Invalidate. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) Invalidate(ctx interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invalidate", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).Invalidate), varargs...) -} - -// Set mocks base method. -func (m *MockSetterCacheInterface[T]) Set(ctx context.Context, key any, object T, options ...store.Option) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, key, object} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Set", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockSetterCacheInterfaceMockRecorder[T]) Set(ctx, key, object interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, key, object}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockSetterCacheInterface[T])(nil).Set), varargs...) -} diff --git a/toolkit/gocache/lib/cache/cache_test.go b/toolkit/gocache/lib/cache/cache_test.go deleted file mode 100644 index 7c3f36db..00000000 --- a/toolkit/gocache/lib/cache/cache_test.go +++ /dev/null @@ -1,381 +0,0 @@ -package cache - -import ( - "context" - "errors" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNew(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - // When - cache := New[any](store) - - // Then - assert.IsType(t, new(Cache[any]), cache) - assert.IsType(t, new(codec.Codec), cache.codec) - - assert.Equal(t, store, cache.codec.GetStore()) -} - -func TestCacheSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - value := &struct { - Hello string - }{ - Hello: "world", - } - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Set(ctx, "my-key", value, store.OptionsMatcher{ - Expiration: 5 * time.Second, - }).Return(nil) - - cache := New[any](mockedStore) - - // When - err := cache.Set(ctx, "my-key", value, store.WithExpiration(5*time.Second)) - assert.Nil(t, err) -} - -func TestCacheSetWhenErrorOccurs(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - value := &struct { - Hello string - }{ - Hello: "world", - } - - storeErr := errors.New("an error has occurred while inserting data into store") - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Set(ctx, "my-key", value, store.OptionsMatcher{ - Expiration: 5 * time.Second, - }).Return(storeErr) - - cache := New[any](mockedStore) - - // When - err := cache.Set(ctx, "my-key", value, store.WithExpiration(5*time.Second)) - assert.Equal(t, storeErr, err) -} - -func TestCacheGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Get(ctx, "my-key").Return(cacheValue, nil) - - cache := New[any](store) - - // When - value, err := cache.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestCacheGetWhenNotFound(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - returnedErr := errors.New("unable to find item in store") - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Get(ctx, "my-key").Return(nil, returnedErr) - - cache := New[any](store) - - // When - value, err := cache.Get(ctx, "my-key") - - // Then - assert.Nil(t, value) - assert.Equal(t, returnedErr, err) -} - -func TestCacheGetWithTTL(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - expiration := 1 * time.Second - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().GetWithTTL(ctx, "my-key"). - Return(cacheValue, expiration, nil) - - cache := New[any](store) - - // When - value, ttl, err := cache.GetWithTTL(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - assert.Equal(t, expiration, ttl) -} - -func TestCacheGetWithTTLWhenNotFound(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - returnedErr := errors.New("unable to find item in store") - expiration := 0 * time.Second - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().GetWithTTL(ctx, "my-key"). - Return(nil, expiration, returnedErr) - - cache := New[any](store) - - // When - value, ttl, err := cache.GetWithTTL(ctx, "my-key") - - // Then - assert.Nil(t, value) - assert.Equal(t, returnedErr, err) - assert.Equal(t, expiration, ttl) -} - -func TestCacheGetCodec(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - cache := New[any](store) - - // When - value := cache.GetCodec() - - // Then - assert.IsType(t, new(codec.Codec), value) - assert.Equal(t, store, value.GetStore()) -} - -func TestCacheGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - cache := New[any](store) - - // When - Then - assert.Equal(t, CacheType, cache.GetType()) -} - -func TestCacheGetCacheKeyWhenKeyIsString(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - cache := New[any](store) - - // When - computedKey := cache.getCacheKey("my-Key") - - // Then - assert.Equal(t, "my-Key", computedKey) -} - -func TestCacheGetCacheKeyWhenKeyIsStruct(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - cache := New[any](store) - - // When - key := &struct { - Hello string - }{ - Hello: "world", - } - - computedKey := cache.getCacheKey(key) - - // Then - assert.Equal(t, "8144fe5310cf0e62ac83fd79c113aad2", computedKey) -} - -type StructWithGenerator struct{} - -func (_ *StructWithGenerator) GetCacheKey() string { - return "my-generated-key" -} - -func TestCacheGetCacheKeyWhenKeyImplementsGenerator(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - cache := New[any](store) - - // When - key := &StructWithGenerator{} - - generatedKey := cache.getCacheKey(key) - // Then - assert.Equal(t, "my-generated-key", generatedKey) -} - -func TestCacheDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Delete(ctx, "my-key").Return(nil) - - cache := New[any](store) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Nil(t, err) -} - -func TestCacheInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Invalidate(ctx, store.InvalidateOptionsMatcher{ - Tags: []string{"tag1"}, - }).Return(nil) - - cache := New[any](mockedStore) - - // When - err := cache.Invalidate(ctx, store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestCacheInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error during invalidation") - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Invalidate(ctx, store.InvalidateOptionsMatcher{ - Tags: []string{"tag1"}, - }).Return(expectedErr) - - cache := New[any](mockedStore) - - // When - err := cache.Invalidate(ctx, store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestCacheClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Clear(ctx).Return(nil) - - cache := New[any](store) - - // When - err := cache.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestCacheClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error during invalidation") - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Clear(ctx).Return(expectedErr) - - cache := New[any](store) - - // When - err := cache.Clear(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestCacheDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to delete key") - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Delete(ctx, "my-key").Return(expectedErr) - - cache := New[any](store) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Equal(t, expectedErr, err) -} diff --git a/toolkit/gocache/lib/cache/chain.go b/toolkit/gocache/lib/cache/chain.go deleted file mode 100644 index f528bb96..00000000 --- a/toolkit/gocache/lib/cache/chain.go +++ /dev/null @@ -1,130 +0,0 @@ -package cache - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // ChainType represents the chain cache type as a string value - ChainType = "chain" -) - -type chainKeyValue[T any] struct { - key any - value T - ttl time.Duration - storeType *string -} - -// ChainCache represents the configuration needed by a cache aggregator -type ChainCache[T any] struct { - caches []SetterCacheInterface[T] - setChannel chan *chainKeyValue[T] -} - -// NewChain instantiates a new cache aggregator -func NewChain[T any](caches ...SetterCacheInterface[T]) *ChainCache[T] { - chain := &ChainCache[T]{ - caches: caches, - setChannel: make(chan *chainKeyValue[T], 10000), - } - - go chain.setter() - - return chain -} - -// setter sets a value in available caches, until a given cache layer -func (c *ChainCache[T]) setter() { - for item := range c.setChannel { - for _, cache := range c.caches { - if item.storeType != nil && *item.storeType == cache.GetCodec().GetStore().GetType() { - break - } - - cache.Set(context.Background(), item.key, item.value, store.WithExpiration(item.ttl)) - } - } -} - -// Get returns the object stored in cache if it exists -func (c *ChainCache[T]) Get(ctx context.Context, key any) (T, error) { - var object T - var err error - var ttl time.Duration - - for _, cache := range c.caches { - storeType := cache.GetCodec().GetStore().GetType() - object, ttl, err = cache.GetWithTTL(ctx, key) - if err == nil { - // Set the value back until this cache layer - c.setChannel <- &chainKeyValue[T]{key, object, ttl, &storeType} - return object, nil - } - } - - return object, err -} - -// Set sets a value in available caches -func (c *ChainCache[T]) Set(ctx context.Context, key any, object T, options ...store.Option) error { - errs := []error{} - for _, cache := range c.caches { - err := cache.Set(ctx, key, object, options...) - if err != nil { - storeType := cache.GetCodec().GetStore().GetType() - errs = append(errs, fmt.Errorf("Unable to set item into cache with store '%s': %v", storeType, err)) - } - } - if len(errs) > 0 { - errStr := "" - for k, v := range errs { - errStr += fmt.Sprintf("error %d of %d: %v", k+1, len(errs), v.Error()) - } - return errors.New(errStr) - } - - return nil -} - -// Delete removes a value from all available caches -func (c *ChainCache[T]) Delete(ctx context.Context, key any) error { - for _, cache := range c.caches { - cache.Delete(ctx, key) - } - - return nil -} - -// Invalidate invalidates cache item from given options -func (c *ChainCache[T]) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - for _, cache := range c.caches { - cache.Invalidate(ctx, options...) - } - - return nil -} - -// Clear resets all cache data -func (c *ChainCache[T]) Clear(ctx context.Context) error { - for _, cache := range c.caches { - cache.Clear(ctx) - } - - return nil -} - -// GetCaches returns all Chained caches -func (c *ChainCache[T]) GetCaches() []SetterCacheInterface[T] { - return c.caches -} - -// GetType returns the cache type -func (c *ChainCache[T]) GetType() string { - return ChainType -} diff --git a/toolkit/gocache/lib/cache/chain_test.go b/toolkit/gocache/lib/cache/chain_test.go deleted file mode 100644 index 287b7a9b..00000000 --- a/toolkit/gocache/lib/cache/chain_test.go +++ /dev/null @@ -1,453 +0,0 @@ -package cache - -import ( - "context" - "errors" - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewChain(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache2 := NewMockSetterCacheInterface[any](ctrl) - - // When - cache := NewChain[any](cache1, cache2) - - // Then - assert.IsType(t, new(ChainCache[any]), cache) - - assert.Equal(t, []SetterCacheInterface[any]{cache1, cache2}, cache.caches) -} - -func TestChainGetCaches(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache2 := NewMockSetterCacheInterface[any](ctrl) - - cache := NewChain[any](cache1, cache2) - - // When - caches := cache.GetCaches() - - // Then - assert.Equal(t, []SetterCacheInterface[any]{cache1, cache2}, caches) - - assert.Equal(t, cache1, caches[0]) - assert.Equal(t, cache2, caches[1]) -} - -func TestChainGetWhenAvailableInFirstCache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - // Cache 1 - store1 := store.NewMockStoreInterface(ctrl) - store1.EXPECT().GetType().AnyTimes().Return("store1") - - codec1 := codec.NewMockCodecInterface(ctrl) - codec1.EXPECT().GetStore().AnyTimes().Return(store1) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().GetCodec().AnyTimes().Return(codec1) - cache1.EXPECT().GetWithTTL(ctx, "my-key").Return(cacheValue, - 0*time.Second, nil) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - - cache := NewChain[any](cache1, cache2) - - // When - value, err := cache.Get(ctx, "my-key") - - // Wait for data to be processed - time.Sleep(100 * time.Millisecond) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestChainGetWhenAvailableInSecondCache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - // Cache 1 - store1 := store.NewMockStoreInterface(ctrl) - store1.EXPECT().GetType().AnyTimes().Return("store1") - - codec1 := codec.NewMockCodecInterface(ctrl) - codec1.EXPECT().GetStore().AnyTimes().Return(store1) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().GetCodec().AnyTimes().Return(codec1) - cache1.EXPECT().GetWithTTL(ctx, "my-key").Return(nil, 0*time.Second, - errors.New("unable to find in cache 1")) - cache1.EXPECT().Set(ctx, "my-key", cacheValue, &store.OptionsMatcher{}).AnyTimes().Return(nil) - - // Cache 2 - store2 := store.NewMockStoreInterface(ctrl) - store2.EXPECT().GetType().AnyTimes().Return("store2") - - codec2 := codec.NewMockCodecInterface(ctrl) - codec2.EXPECT().GetStore().AnyTimes().Return(store2) - - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().GetCodec().AnyTimes().Return(codec2) - cache2.EXPECT().GetWithTTL(ctx, "my-key").Return(cacheValue, - 0*time.Second, nil) - - cache := NewChain[any](cache1, cache2) - - // When - value, err := cache.Get(ctx, "my-key") - - // Wait for data to be processed - time.Sleep(100 * time.Millisecond) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestChainGetWhenNotAvailableInAnyCache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache 1 - store1 := store.NewMockStoreInterface(ctrl) - store1.EXPECT().GetType().Return("store1") - - codec1 := codec.NewMockCodecInterface(ctrl) - codec1.EXPECT().GetStore().Return(store1) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().GetCodec().Return(codec1) - cache1.EXPECT().GetWithTTL(ctx, "my-key").Return(nil, 0*time.Second, - errors.New("unable to find in cache 1")) - - // Cache 2 - store2 := store.NewMockStoreInterface(ctrl) - store2.EXPECT().GetType().Return("store2") - - codec2 := codec.NewMockCodecInterface(ctrl) - codec2.EXPECT().GetStore().Return(store2) - - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().GetCodec().Return(codec2) - cache2.EXPECT().GetWithTTL(ctx, "my-key").Return(nil, 0*time.Second, - errors.New("unable to find in cache 2")) - - cache := NewChain[any](cache1, cache2) - - // When - value, err := cache.Get(ctx, "my-key") - - // Wait for data to be processed - time.Sleep(100 * time.Millisecond) - - // Then - assert.Equal(t, errors.New("unable to find in cache 2"), err) - assert.Equal(t, nil, value) -} - -func TestChainSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Set(ctx, "my-key", cacheValue).Return(nil) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Set(ctx, "my-key", cacheValue).Return(nil) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Set(ctx, "my-key", cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestChainSetWhenErrorOnSetting(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - expectedErr := errors.New("an unexpected error occurred while setting data") - - // Cache 1 - store1 := store.NewMockStoreInterface(ctrl) - store1.EXPECT().GetType().Return("store1") - - codec1 := codec.NewMockCodecInterface(ctrl) - codec1.EXPECT().GetStore().Return(store1) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().GetCodec().Return(codec1) - cache1.EXPECT().Set(ctx, "my-key", cacheValue).Return(expectedErr) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Set(ctx, "my-key", cacheValue) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Set(ctx, "my-key", cacheValue) - - // Then - assert.Error(t, err) - assert.Equal(t, fmt.Sprintf("error 1 of 1: Unable to set item into cache with store 'store1': %s", expectedErr.Error()), err.Error()) -} - -func TestChainDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Delete(ctx, "my-key").Return(nil) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Delete(ctx, "my-key").Return(nil) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Nil(t, err) -} - -func TestChainDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Delete(ctx, "my-key").Return(errors.New("an error has occurred while deleting key")) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Delete(ctx, "my-key").Return(nil) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Nil(t, err) -} - -func TestChainInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Invalidate(ctx).Return(nil) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Invalidate(ctx).Return(nil) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Invalidate(ctx) - - // Then - assert.Nil(t, err) -} - -func TestChainInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Invalidate(ctx).Return(errors.New("an unexpected error has occurred while invalidation data")) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Invalidate(ctx).Return(nil) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Invalidate(ctx) - - // Then - assert.Nil(t, err) -} - -func TestChainClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Clear(ctx).Return(nil) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Clear(ctx).Return(nil) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestChainClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Clear(ctx).Return(errors.New("an unexpected error has occurred while invalidation data")) - - // Cache 2 - cache2 := NewMockSetterCacheInterface[any](ctrl) - cache2.EXPECT().Clear(ctx).Return(nil) - - cache := NewChain[any](cache1, cache2) - - // When - err := cache.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestChainGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - - cache := NewChain[any](cache1) - - // When - Then - assert.Equal(t, ChainType, cache.GetType()) -} - -func TestCacheChecksum(t *testing.T) { - testCases := []struct { - value any - expectedHash string - }{ - {value: 273273623, expectedHash: "a187c153af38575778244cb3796536da"}, - {value: "hello-world", expectedHash: "f31215be6928a6f6e0c7c1cf2c68054e"}, - {value: []byte(`hello-world`), expectedHash: "f097ebac995e666eb074e019cd39d99b"}, - {value: struct{ Label string }{}, expectedHash: "2938da2beee350d6ea988e404109f428"}, - {value: struct{ Label string }{Label: "hello-world"}, expectedHash: "4119a1c8530a0420859f1c6ecf2dc0b7"}, - {value: struct{ Label string }{Label: "hello-everyone"}, expectedHash: "1d7e7ed4acd56d2635f7cb33aa702bdd"}, - } - - for _, tc := range testCases { - value := checksum(tc.value) - - assert.Equal(t, tc.expectedHash, value) - } -} - -func TestChainSetWhenErrorInChain(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - store1 := NewMockSetterCacheInterface[any](ctrl) - - store1.EXPECT().GetType().AnyTimes().Return("store1") - codec1 := codec.NewMockCodecInterface(ctrl) - codec1.EXPECT().GetStore().AnyTimes().Return(store1) - store1.EXPECT().GetCodec().AnyTimes().Return(codec1) - - ctx := context.Background() - key := "test-key" - value := "test-value" - interError := errors.New("an issue occurred with the cache") - store1.EXPECT().Set(ctx, key, value, nil).DoAndReturn(func(_, _, _, _ interface{}) error { - return interError - }) - - store2 := NewMockSetterCacheInterface[any](ctrl) - - cache := NewChain[any](store1, store2) - - // assert store2 set is called - store2.EXPECT().Set(ctx, key, value, nil).Return(nil) - - // When - Then - err := cache.Set(ctx, key, value, nil) - - expErr := errors.New("error 1 of 1: Unable to set item into cache with store 'store1': an issue occurred with the cache") - // Then - assert.Equal(t, expErr, err) -} diff --git a/toolkit/gocache/lib/cache/interface.go b/toolkit/gocache/lib/cache/interface.go deleted file mode 100644 index ed3c7e2c..00000000 --- a/toolkit/gocache/lib/cache/interface.go +++ /dev/null @@ -1,39 +0,0 @@ -package cache - -import ( - "context" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// CacheInterface represents the interface for all caches (aggregates, metric, memory, redis, ...) -type CacheInterface[T any] interface { - Get(ctx context.Context, key any) (T, error) - Set(ctx context.Context, key any, object T, options ...store.Option) error - Delete(ctx context.Context, key any) error - Invalidate(ctx context.Context, options ...store.InvalidateOption) error - Clear(ctx context.Context) error - GetType() string -} - -type CacheKeyGenerator interface { - GetCacheKey() string -} - -// SetterCacheInterface represents the interface for caches that allows -// storage (for instance: memory, redis, ...) -type SetterCacheInterface[T any] interface { - // CacheInterface[T] TODO: Waiting for gomock to support nested interfaces with generics. - Get(ctx context.Context, key any) (T, error) - Set(ctx context.Context, key any, object T, options ...store.Option) error - Delete(ctx context.Context, key any) error - Invalidate(ctx context.Context, options ...store.InvalidateOption) error - Clear(ctx context.Context) error - GetType() string - - GetWithTTL(ctx context.Context, key any) (T, time.Duration, error) - - GetCodec() codec.CodecInterface -} diff --git a/toolkit/gocache/lib/cache/loadable.go b/toolkit/gocache/lib/cache/loadable.go deleted file mode 100644 index dd95463c..00000000 --- a/toolkit/gocache/lib/cache/loadable.go +++ /dev/null @@ -1,141 +0,0 @@ -package cache - -import ( - "context" - "errors" - "fmt" - "sync" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "golang.org/x/sync/singleflight" -) - -const ( - // LoadableType represents the loadable cache type as a string value - LoadableType = "loadable" -) - -type loadableKeyValue[T any] struct { - key any - value T -} - -type LoadFunction[T any] func(ctx context.Context, key any) (T, error) - -// LoadableCache represents a cache that uses a function to load data -type LoadableCache[T any] struct { - singleFlight singleflight.Group - loadFunc LoadFunction[T] - cache CacheInterface[T] - setChannel chan *loadableKeyValue[T] - setterWg *sync.WaitGroup -} - -// NewLoadable instantiates a new cache that uses a function to load data -func NewLoadable[T any](loadFunc LoadFunction[T], cache CacheInterface[T]) *LoadableCache[T] { - loadable := &LoadableCache[T]{ - singleFlight: singleflight.Group{}, - loadFunc: loadFunc, - cache: cache, - setChannel: make(chan *loadableKeyValue[T], 10000), - setterWg: &sync.WaitGroup{}, - } - - loadable.setterWg.Add(1) - go loadable.setter() - - return loadable -} - -func (c *LoadableCache[T]) setter() { - defer c.setterWg.Done() - - for item := range c.setChannel { - c.Set(context.Background(), item.key, item.value) - - cacheKey := c.getCacheKey(item.key) - c.singleFlight.Forget(cacheKey) - } -} - -// Get returns the object stored in cache if it exists -func (c *LoadableCache[T]) Get(ctx context.Context, key any) (T, error) { - var err error - - object, err := c.cache.Get(ctx, key) - if err == nil { - return object, err - } - - // Unable to find in cache, try to load it from load function - cacheKey := c.getCacheKey(key) - zero := *new(T) - - loadedResult, err, _ := c.singleFlight.Do( - cacheKey, - func() (any, error) { - return c.loadFunc(ctx, key) - }, - ) - if err != nil { - return zero, err - } - - var ok bool - if object, ok = loadedResult.(T); !ok { - return zero, errors.New( - fmt.Sprintf("returned value can't be cast to %T", zero), - ) - } - - // Then, put it back in cache - c.setChannel <- &loadableKeyValue[T]{key, object} - - return object, err -} - -// Set sets a value in available caches -func (c *LoadableCache[T]) Set(ctx context.Context, key any, object T, options ...store.Option) error { - return c.cache.Set(ctx, key, object, options...) -} - -// Delete removes a value from cache -func (c *LoadableCache[T]) Delete(ctx context.Context, key any) error { - return c.cache.Delete(ctx, key) -} - -// Invalidate invalidates cache item from given options -func (c *LoadableCache[T]) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - return c.cache.Invalidate(ctx, options...) -} - -// Clear resets all cache data -func (c *LoadableCache[T]) Clear(ctx context.Context) error { - return c.cache.Clear(ctx) -} - -// GetType returns the cache type -func (c *LoadableCache[T]) GetType() string { - return LoadableType -} - -func (c *LoadableCache[T]) Close() error { - close(c.setChannel) - c.setterWg.Wait() - - return nil -} - -// getCacheKey returns the cache key for the given key object by returning -// the key if type is string or by computing a checksum of key structure -// if its type is other than string -func (c *LoadableCache[T]) getCacheKey(key any) string { - switch v := key.(type) { - case string: - return v - case CacheKeyGenerator: - return v.GetCacheKey() - default: - return checksum(key) - } -} diff --git a/toolkit/gocache/lib/cache/loadable_test.go b/toolkit/gocache/lib/cache/loadable_test.go deleted file mode 100644 index 26bd0d6b..00000000 --- a/toolkit/gocache/lib/cache/loadable_test.go +++ /dev/null @@ -1,301 +0,0 @@ -package cache - -import ( - "context" - "errors" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "go.uber.org/mock/gomock" -) - -func TestNewLoadable(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "test data loaded", nil - } - - // When - cache := NewLoadable[any](loadFunc, cache1) - - // Then - assert.IsType(t, new(LoadableCache[any]), cache) - - assert.IsType(t, new(LoadFunction[any]), &cache.loadFunc) - assert.Equal(t, cache1, cache.cache) -} - -func TestLoadableGetWhenAlreadyInCache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Get(ctx, "my-key").Return(cacheValue, nil) - - loadFunc := func(_ context.Context, key any) (any, error) { - return nil, errors.New("should not be called") - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - value, err := cache.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestLoadableGetWhenNotAvailableInLoadFunc(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // Cache - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Get(ctx, "my-key").Return(nil, errors.New("unable to find in cache 1")) - - loadFunc := func(_ context.Context, key any) (any, error) { - return nil, errors.New("an error has occurred while loading data from custom source") - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - value, err := cache.Get(ctx, "my-key") - - // Then - assert.Nil(t, value) - assert.Equal(t, errors.New("an error has occurred while loading data from custom source"), err) -} - -func TestLoadableGetWhenAvailableInLoadFunc(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - // Cache 1 - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Get(ctx, "my-key").Return(nil, errors.New("unable to find in cache 1")) - cache1.EXPECT().Get(ctx, "my-key").Return(nil, errors.New("unable to find in cache 1")) - cache1.EXPECT().Get(ctx, "my-key").Return(nil, errors.New("unable to find in cache 1")) - cache1.EXPECT().Set(ctx, "my-key", cacheValue).AnyTimes().Return(nil) - - var loadCallCount int32 - pauseLoadFn := make(chan struct{}) - - loadFunc := func(_ context.Context, key any) (any, error) { - atomic.AddInt32(&loadCallCount, 1) - <-pauseLoadFn - time.Sleep(time.Millisecond * 10) - return cacheValue, nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - const numRequests = 3 - var started sync.WaitGroup - started.Add(numRequests) - var finished sync.WaitGroup - finished.Add(numRequests) - for i := 0; i < numRequests; i++ { - go func() { - defer finished.Done() - started.Done() - // When - value, err := cache.Get(ctx, "my-key") - - // Wait for data to be processed - for len(cache.setChannel) > 0 { - time.Sleep(1 * time.Millisecond) - } - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - }() - } - - started.Wait() - close(pauseLoadFn) - finished.Wait() - - assert.Equal(t, int32(1), loadCallCount) -} - -func TestLoadableDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Delete(ctx, "my-key").Return(nil) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "a value", nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Nil(t, err) -} - -func TestLoadableDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to delete key") - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Delete(ctx, "my-key").Return(expectedErr) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "a value", nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestLoadableInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Invalidate(ctx).Return(nil) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "a value", nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - err := cache.Invalidate(ctx) - - // Then - assert.Nil(t, err) -} - -func TestLoadableInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error when invalidating data") - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Invalidate(ctx).Return(expectedErr) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "a value", nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - err := cache.Invalidate(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestLoadableClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Clear(ctx).Return(nil) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "a value", nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - err := cache.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestLoadableClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error when invalidating data") - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Clear(ctx).Return(expectedErr) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "a value", nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - err := cache.Clear(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestLoadableGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - - loadFunc := func(_ context.Context, key any) (any, error) { - return "test data loaded", nil - } - - cache := NewLoadable[any](loadFunc, cache1) - - // When - Then - assert.Equal(t, LoadableType, cache.GetType()) -} diff --git a/toolkit/gocache/lib/cache/metric.go b/toolkit/gocache/lib/cache/metric.go deleted file mode 100644 index c832062e..00000000 --- a/toolkit/gocache/lib/cache/metric.go +++ /dev/null @@ -1,78 +0,0 @@ -package cache - -import ( - "context" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/metrics" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // MetricType represents the metric cache type as a string value - MetricType = "metric" -) - -// MetricCache is the struct that specifies metrics available for different caches -type MetricCache[T any] struct { - metrics metrics.MetricsInterface - cache CacheInterface[T] -} - -// NewMetric creates a new cache with metrics and a given cache storage -func NewMetric[T any](metrics metrics.MetricsInterface, cache CacheInterface[T]) *MetricCache[T] { - metricCache := &MetricCache[T]{ - metrics: metrics, - cache: cache, - } - - metricCache.updateMetrics(cache) - - return metricCache -} - -// Get obtains a value from cache and also records metrics -func (c *MetricCache[T]) Get(ctx context.Context, key any) (T, error) { - result, err := c.cache.Get(ctx, key) - - c.updateMetrics(c.cache) - - return result, err -} - -// Set sets a value from the cache -func (c *MetricCache[T]) Set(ctx context.Context, key any, object T, options ...store.Option) error { - return c.cache.Set(ctx, key, object, options...) -} - -// Delete removes a value from the cache -func (c *MetricCache[T]) Delete(ctx context.Context, key any) error { - return c.cache.Delete(ctx, key) -} - -// Invalidate invalidates cache item from given options -func (c *MetricCache[T]) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - return c.cache.Invalidate(ctx, options...) -} - -// Clear resets all cache data -func (c *MetricCache[T]) Clear(ctx context.Context) error { - return c.cache.Clear(ctx) -} - -// Get obtains a value from cache and also records metrics -func (c *MetricCache[T]) updateMetrics(cache CacheInterface[T]) { - switch current := cache.(type) { - case *ChainCache[T]: - for _, cache := range current.GetCaches() { - c.updateMetrics(cache) - } - - case SetterCacheInterface[T]: - c.metrics.RecordFromCodec(current.GetCodec()) - } -} - -// GetType returns the cache type -func (c *MetricCache[T]) GetType() string { - return MetricType -} diff --git a/toolkit/gocache/lib/cache/metric_test.go b/toolkit/gocache/lib/cache/metric_test.go deleted file mode 100644 index b77e8f07..00000000 --- a/toolkit/gocache/lib/cache/metric_test.go +++ /dev/null @@ -1,291 +0,0 @@ -package cache - -import ( - "context" - "errors" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/metrics" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewMetric(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - // When - cache := NewMetric[any](metrics, cache1) - - // Then - assert.IsType(t, new(MetricCache[any]), cache) - - assert.Equal(t, cache1, cache.cache) - assert.Equal(t, metrics, cache.metrics) -} - -func TestMetricGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Get(ctx, "my-key").Return(cacheValue, nil) - cache1.EXPECT().GetCodec().Return(codec1).MinTimes(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).MinTimes(1) - - cache := NewMetric[any](metrics, cache1) - - // When - value, err := cache.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestMetricGetWhenChainCache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - store1 := store.NewMockStoreInterface(ctrl) - store1.EXPECT().GetType().AnyTimes().Return("store1") - - codec1 := codec.NewMockCodecInterface(ctrl) - codec1.EXPECT().GetStore().AnyTimes().Return(store1) - - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().GetWithTTL(ctx, "my-key").Return(cacheValue, - 0*time.Second, nil) - cache1.EXPECT().GetCodec().AnyTimes().Return(codec1) - - chainCache := NewChain[any](cache1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).AnyTimes() - - cache := NewMetric[any](metrics, chainCache) - - // When - value, err := cache.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestMetricSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - value := &struct { - Hello string - }{ - Hello: "world", - } - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Set(ctx, "my-key", value).Return(nil) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - err := cache.Set(ctx, "my-key", value) - - // Then - assert.Nil(t, err) -} - -func TestMetricDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Delete(ctx, "my-key").Return(nil) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Nil(t, err) -} - -func TestMetricDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to delete key") - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Delete(ctx, "my-key").Return(expectedErr) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - err := cache.Delete(ctx, "my-key") - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestMetricInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Invalidate(ctx).Return(nil) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - err := cache.Invalidate(ctx) - - // Then - assert.Nil(t, err) -} - -func TestMetricInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error while invalidating data") - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Invalidate(ctx).Return(expectedErr) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - err := cache.Invalidate(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestMetricClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Clear(ctx).Return(nil) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - err := cache.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestMetricClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error while clearing cache") - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().Clear(ctx).Return(expectedErr) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - err := cache.Clear(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestMetricGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - codec1 := codec.NewMockCodecInterface(ctrl) - cache1 := NewMockSetterCacheInterface[any](ctrl) - cache1.EXPECT().GetCodec().Return(codec1).Times(1) - metrics := metrics.NewMockMetricsInterface(ctrl) - metrics.EXPECT().RecordFromCodec(codec1).Times(1) - - cache := NewMetric[any](metrics, cache1) - - // When - Then - assert.Equal(t, MetricType, cache.GetType()) -} diff --git a/toolkit/gocache/lib/codec/codec.go b/toolkit/gocache/lib/codec/codec.go deleted file mode 100644 index 0ad38910..00000000 --- a/toolkit/gocache/lib/codec/codec.go +++ /dev/null @@ -1,142 +0,0 @@ -package codec - -import ( - "context" - "sync" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// Stats allows to returns some statistics of codec usage -type Stats struct { - Hits int - Miss int - SetSuccess int - SetError int - DeleteSuccess int - DeleteError int - InvalidateSuccess int - InvalidateError int - ClearSuccess int - ClearError int -} - -// Codec represents an instance of a cache store -type Codec struct { - store store.StoreInterface - stats *Stats - statsMtx sync.Mutex -} - -// New return a new codec instance -func New(store store.StoreInterface) *Codec { - return &Codec{ - store: store, - stats: &Stats{}, - } -} - -// Get allows to retrieve the value from a given key identifier -func (c *Codec) Get(ctx context.Context, key any) (any, error) { - val, err := c.store.Get(ctx, key) - - c.statsMtx.Lock() - defer c.statsMtx.Unlock() - if err == nil { - c.stats.Hits++ - } else { - c.stats.Miss++ - } - - return val, err -} - -// GetWithTTL allows to retrieve the value from a given key identifier and its corresponding TTL -func (c *Codec) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - val, ttl, err := c.store.GetWithTTL(ctx, key) - - c.statsMtx.Lock() - defer c.statsMtx.Unlock() - if err == nil { - c.stats.Hits++ - } else { - c.stats.Miss++ - } - - return val, ttl, err -} - -// Set allows to set a value for a given key identifier and also allows to specify -// an expiration time -func (c *Codec) Set(ctx context.Context, key any, value any, options ...store.Option) error { - err := c.store.Set(ctx, key, value, options...) - - c.statsMtx.Lock() - defer c.statsMtx.Unlock() - if err == nil { - c.stats.SetSuccess++ - } else { - c.stats.SetError++ - } - - return err -} - -// Delete allows to remove a value for a given key identifier -func (c *Codec) Delete(ctx context.Context, key any) error { - err := c.store.Delete(ctx, key) - - c.statsMtx.Lock() - defer c.statsMtx.Unlock() - if err == nil { - c.stats.DeleteSuccess++ - } else { - c.stats.DeleteError++ - } - - return err -} - -// Invalidate invalidates some cach items from given options -func (c *Codec) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - err := c.store.Invalidate(ctx, options...) - - c.statsMtx.Lock() - defer c.statsMtx.Unlock() - if err == nil { - c.stats.InvalidateSuccess++ - } else { - c.stats.InvalidateError++ - } - - return err -} - -// Clear resets all codec store data -func (c *Codec) Clear(ctx context.Context) error { - err := c.store.Clear(ctx) - - c.statsMtx.Lock() - defer c.statsMtx.Unlock() - if err == nil { - c.stats.ClearSuccess++ - } else { - c.stats.ClearError++ - } - - return err -} - -// GetStore returns the store associated to this codec -func (c *Codec) GetStore() store.StoreInterface { - return c.store -} - -// GetStats returns some statistics about the current codec -func (c *Codec) GetStats() *Stats { - c.statsMtx.Lock() - defer c.statsMtx.Unlock() - stats := *c.stats - return &stats -} diff --git a/toolkit/gocache/lib/codec/codec_mock.go b/toolkit/gocache/lib/codec/codec_mock.go deleted file mode 100644 index c9f3ce85..00000000 --- a/toolkit/gocache/lib/codec/codec_mock.go +++ /dev/null @@ -1,162 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: lib/codec/interface.go - -// Package codec is a generated GoMock package. -package codec - -import ( - context "context" - reflect "reflect" - time "time" - - store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - gomock "go.uber.org/mock/gomock" -) - -// MockCodecInterface is a mock of CodecInterface interface. -type MockCodecInterface struct { - ctrl *gomock.Controller - recorder *MockCodecInterfaceMockRecorder -} - -// MockCodecInterfaceMockRecorder is the mock recorder for MockCodecInterface. -type MockCodecInterfaceMockRecorder struct { - mock *MockCodecInterface -} - -// NewMockCodecInterface creates a new mock instance. -func NewMockCodecInterface(ctrl *gomock.Controller) *MockCodecInterface { - mock := &MockCodecInterface{ctrl: ctrl} - mock.recorder = &MockCodecInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockCodecInterface) EXPECT() *MockCodecInterfaceMockRecorder { - return m.recorder -} - -// Clear mocks base method. -func (m *MockCodecInterface) Clear(ctx context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Clear", ctx) - ret0, _ := ret[0].(error) - return ret0 -} - -// Clear indicates an expected call of Clear. -func (mr *MockCodecInterfaceMockRecorder) Clear(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockCodecInterface)(nil).Clear), ctx) -} - -// Delete mocks base method. -func (m *MockCodecInterface) Delete(ctx context.Context, key any) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", ctx, key) - ret0, _ := ret[0].(error) - return ret0 -} - -// Delete indicates an expected call of Delete. -func (mr *MockCodecInterfaceMockRecorder) Delete(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockCodecInterface)(nil).Delete), ctx, key) -} - -// Get mocks base method. -func (m *MockCodecInterface) Get(ctx context.Context, key any) (any, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", ctx, key) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockCodecInterfaceMockRecorder) Get(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockCodecInterface)(nil).Get), ctx, key) -} - -// GetStats mocks base method. -func (m *MockCodecInterface) GetStats() *Stats { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetStats") - ret0, _ := ret[0].(*Stats) - return ret0 -} - -// GetStats indicates an expected call of GetStats. -func (mr *MockCodecInterfaceMockRecorder) GetStats() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStats", reflect.TypeOf((*MockCodecInterface)(nil).GetStats)) -} - -// GetStore mocks base method. -func (m *MockCodecInterface) GetStore() store.StoreInterface { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetStore") - ret0, _ := ret[0].(store.StoreInterface) - return ret0 -} - -// GetStore indicates an expected call of GetStore. -func (mr *MockCodecInterfaceMockRecorder) GetStore() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStore", reflect.TypeOf((*MockCodecInterface)(nil).GetStore)) -} - -// GetWithTTL mocks base method. -func (m *MockCodecInterface) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetWithTTL", ctx, key) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(time.Duration) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// GetWithTTL indicates an expected call of GetWithTTL. -func (mr *MockCodecInterfaceMockRecorder) GetWithTTL(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithTTL", reflect.TypeOf((*MockCodecInterface)(nil).GetWithTTL), ctx, key) -} - -// Invalidate mocks base method. -func (m *MockCodecInterface) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Invalidate", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Invalidate indicates an expected call of Invalidate. -func (mr *MockCodecInterfaceMockRecorder) Invalidate(ctx interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invalidate", reflect.TypeOf((*MockCodecInterface)(nil).Invalidate), varargs...) -} - -// Set mocks base method. -func (m *MockCodecInterface) Set(ctx context.Context, key, value any, options ...store.Option) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, key, value} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Set", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockCodecInterfaceMockRecorder) Set(ctx, key, value interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, key, value}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockCodecInterface)(nil).Set), varargs...) -} diff --git a/toolkit/gocache/lib/codec/codec_test.go b/toolkit/gocache/lib/codec/codec_test.go deleted file mode 100644 index 27bbf3fd..00000000 --- a/toolkit/gocache/lib/codec/codec_test.go +++ /dev/null @@ -1,448 +0,0 @@ -package codec - -import ( - "context" - "errors" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNew(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - // When - codec := New(store) - - // Then - assert.IsType(t, new(Codec), codec) -} - -func TestGetWhenHit(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Get(ctx, "my-key").Return(cacheValue, nil) - - codec := New(store) - - // When - value, err := codec.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - - assert.Equal(t, 1, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestGetWithTTLWhenHit(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().GetWithTTL(ctx, "my-key").Return(cacheValue, 1*time.Second, nil) - - codec := New(store) - - // When - value, ttl, err := codec.GetWithTTL(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - assert.Equal(t, 1*time.Second, ttl) - - assert.Equal(t, 1, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestGetWithTTLWhenMiss(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to find in store") - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().GetWithTTL(ctx, "my-key").Return(nil, 0*time.Second, expectedErr) - - codec := New(store) - - // When - value, ttl, err := codec.GetWithTTL(ctx, "my-key") - - // Then - assert.Equal(t, expectedErr, err) - assert.Nil(t, value) - assert.Equal(t, 0*time.Second, ttl) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 1, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestGetWhenMiss(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to find in store") - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Get(ctx, "my-key").Return(nil, expectedErr) - - codec := New(store) - - // When - value, err := codec.Get(ctx, "my-key") - - // Then - assert.Equal(t, expectedErr, err) - assert.Nil(t, value) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 1, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestSetWhenSuccess(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Set(ctx, "my-key", cacheValue, store.OptionsMatcher{ - Expiration: 5 * time.Second, - }).Return(nil) - - codec := New(mockedStore) - - // When - err := codec.Set(ctx, "my-key", cacheValue, store.WithExpiration(5*time.Second)) - - // Then - assert.Nil(t, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 1, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestSetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &struct { - Hello string - }{ - Hello: "world", - } - - expectedErr := errors.New("unable to set value in store") - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Set(ctx, "my-key", cacheValue, store.OptionsMatcher{ - Expiration: 5 * time.Second, - }).Return(expectedErr) - - codec := New(mockedStore) - - // When - err := codec.Set(ctx, "my-key", cacheValue, store.WithExpiration(5*time.Second)) - - // Then - assert.Equal(t, expectedErr, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 1, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestDeleteWhenSuccess(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Delete(ctx, "my-key").Return(nil) - - codec := New(store) - - // When - err := codec.Delete(ctx, "my-key") - - // Then - assert.Nil(t, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 1, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TesDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to delete key") - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Delete(ctx, "my-key").Return(expectedErr) - - codec := New(store) - - // When - err := codec.Delete(ctx, "my-key") - - // Then - assert.Equal(t, expectedErr, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 1, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestInvalidateWhenSuccess(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Invalidate(ctx, store.InvalidateOptionsMatcher{ - Tags: []string{"tag1"}, - }).Return(nil) - - codec := New(mockedStore) - - // When - err := codec.Invalidate(ctx, store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 1, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error when invalidating data") - - mockedStore := store.NewMockStoreInterface(ctrl) - mockedStore.EXPECT().Invalidate(ctx, store.InvalidateOptionsMatcher{ - Tags: []string{"tag1"}, - }).Return(expectedErr) - - codec := New(mockedStore) - - // When - err := codec.Invalidate(ctx, store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Equal(t, expectedErr, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 1, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestClearWhenSuccess(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Clear(ctx).Return(nil) - - codec := New(store) - - // When - err := codec.Clear(ctx) - - // Then - assert.Nil(t, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 1, codec.GetStats().ClearSuccess) - assert.Equal(t, 0, codec.GetStats().ClearError) -} - -func TestClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error when clearing cache") - - store := store.NewMockStoreInterface(ctrl) - store.EXPECT().Clear(ctx).Return(expectedErr) - - codec := New(store) - - // When - err := codec.Clear(ctx) - - // Then - assert.Equal(t, expectedErr, err) - - assert.Equal(t, 0, codec.GetStats().Hits) - assert.Equal(t, 0, codec.GetStats().Miss) - assert.Equal(t, 0, codec.GetStats().SetSuccess) - assert.Equal(t, 0, codec.GetStats().SetError) - assert.Equal(t, 0, codec.GetStats().DeleteSuccess) - assert.Equal(t, 0, codec.GetStats().DeleteError) - assert.Equal(t, 0, codec.GetStats().InvalidateSuccess) - assert.Equal(t, 0, codec.GetStats().InvalidateError) - assert.Equal(t, 0, codec.GetStats().ClearSuccess) - assert.Equal(t, 1, codec.GetStats().ClearError) -} - -func TestGetStore(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - codec := New(store) - - // When - Then - assert.Equal(t, store, codec.GetStore()) -} - -func TestGetStats(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - store := store.NewMockStoreInterface(ctrl) - - codec := New(store) - - // When - Then - expectedStats := &Stats{} - assert.Equal(t, expectedStats, codec.GetStats()) -} diff --git a/toolkit/gocache/lib/codec/interface.go b/toolkit/gocache/lib/codec/interface.go deleted file mode 100644 index 284c5d13..00000000 --- a/toolkit/gocache/lib/codec/interface.go +++ /dev/null @@ -1,21 +0,0 @@ -package codec - -import ( - "context" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// CodecInterface represents an instance of a cache codec -type CodecInterface interface { - Get(ctx context.Context, key any) (any, error) - GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) - Set(ctx context.Context, key any, value any, options ...store.Option) error - Delete(ctx context.Context, key any) error - Invalidate(ctx context.Context, options ...store.InvalidateOption) error - Clear(ctx context.Context) error - - GetStore() store.StoreInterface - GetStats() *Stats -} diff --git a/toolkit/gocache/lib/marshaler/marshaler.go b/toolkit/gocache/lib/marshaler/marshaler.go deleted file mode 100644 index f39b76fa..00000000 --- a/toolkit/gocache/lib/marshaler/marshaler.go +++ /dev/null @@ -1,67 +0,0 @@ -package marshaler - -import ( - "context" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "github.com/vmihailenco/msgpack/v5" -) - -// Marshaler is the struct that marshal and unmarshal cache values -type Marshaler struct { - cache cache.CacheInterface[any] -} - -// New creates a new marshaler that marshals/unmarshals cache values -func New(cache cache.CacheInterface[any]) *Marshaler { - return &Marshaler{ - cache: cache, - } -} - -// Get obtains a value from cache and unmarshal value with given object -func (c *Marshaler) Get(ctx context.Context, key any, returnObj any) (any, error) { - result, err := c.cache.Get(ctx, key) - if err != nil { - return nil, err - } - - switch v := result.(type) { - case []byte: - err = msgpack.Unmarshal(v, returnObj) - case string: - err = msgpack.Unmarshal([]byte(v), returnObj) - } - - if err != nil { - return nil, err - } - - return returnObj, nil -} - -// Set sets a value in cache by marshaling value -func (c *Marshaler) Set(ctx context.Context, key, object any, options ...store.Option) error { - bytes, err := msgpack.Marshal(object) - if err != nil { - return err - } - - return c.cache.Set(ctx, key, bytes, options...) -} - -// Delete removes a value from the cache -func (c *Marshaler) Delete(ctx context.Context, key any) error { - return c.cache.Delete(ctx, key) -} - -// Invalidate invalidate cache values using given options -func (c *Marshaler) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - return c.cache.Invalidate(ctx, options...) -} - -// Clear reset all cache data -func (c *Marshaler) Clear(ctx context.Context) error { - return c.cache.Clear(ctx) -} diff --git a/toolkit/gocache/lib/marshaler/marshaler_test.go b/toolkit/gocache/lib/marshaler/marshaler_test.go deleted file mode 100644 index 9f239a4d..00000000 --- a/toolkit/gocache/lib/marshaler/marshaler_test.go +++ /dev/null @@ -1,327 +0,0 @@ -package marshaler - -import ( - "context" - "errors" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "github.com/vmihailenco/msgpack/v5" - "go.uber.org/mock/gomock" -) - -type testCacheValue struct { - Hello string -} - -func TestNew(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - cache := cache.NewMockCacheInterface[any](ctrl) - - // When - marshaler := New(cache) - - // Then - assert.IsType(t, new(Marshaler), marshaler) - assert.Equal(t, cache, marshaler.cache) -} - -func TestGetWhenStoreReturnsSliceOfBytes(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &testCacheValue{ - Hello: "world", - } - - cacheValueBytes, err := msgpack.Marshal(cacheValue) - if err != nil { - assert.Error(t, err) - } - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Get(ctx, "my-key").Return(cacheValueBytes, nil) - - marshaler := New(cache) - - // When - value, err := marshaler.Get(ctx, "my-key", new(testCacheValue)) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestGetWhenStoreReturnsString(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &testCacheValue{ - Hello: "world", - } - - cacheValueBytes, err := msgpack.Marshal(cacheValue) - if err != nil { - assert.Error(t, err) - } - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Get(ctx, "my-key").Return(string(cacheValueBytes), nil) - - marshaler := New(cache) - - // When - value, err := marshaler.Get(ctx, "my-key", new(testCacheValue)) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestGetWhenUnmarshalingError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Get(ctx, "my-key").Return("unknown-string", nil) - - marshaler := New(cache) - - // When - value, err := marshaler.Get(ctx, "my-key", new(testCacheValue)) - - // Then - assert.NotNil(t, err) - assert.Nil(t, value) -} - -func TestGetWhenNotFoundInStore(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to find item in store") - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Get(ctx, "my-key").Return(nil, expectedErr) - - marshaler := New(cache) - - // When - value, err := marshaler.Get(ctx, "my-key", new(testCacheValue)) - - // Then - assert.Equal(t, expectedErr, err) - assert.Nil(t, value) -} - -func TestSetWhenStruct(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := &testCacheValue{ - Hello: "world", - } - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Set( - ctx, - "my-key", - []byte{0x81, 0xa5, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0xa5, 0x77, 0x6f, 0x72, 0x6c, 0x64}, - store.OptionsMatcher{ - Expiration: 5 * time.Second, - }, - ).Return(nil) - - marshaler := New(cache) - - // When - err := marshaler.Set(ctx, "my-key", cacheValue, store.WithExpiration(5*time.Second)) - - // Then - assert.Nil(t, err) -} - -func TestSetWhenString(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := "test" - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Set( - ctx, - "my-key", - []byte{0xa4, 0x74, 0x65, 0x73, 0x74}, - store.OptionsMatcher{ - Expiration: 5 * time.Second, - }, - ).Return(nil) - - marshaler := New(cache) - - // When - err := marshaler.Set(ctx, "my-key", cacheValue, store.WithExpiration(5*time.Second)) - - // Then - assert.Nil(t, err) -} - -func TestSetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheValue := "test" - - expectedErr := errors.New("an unexpected error occurred") - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Set( - ctx, - "my-key", - []byte{0xa4, 0x74, 0x65, 0x73, 0x74}, - store.OptionsMatcher{Expiration: 5 * time.Second}, - ).Return(expectedErr) - - marshaler := New(cache) - - // When - err := marshaler.Set(ctx, "my-key", cacheValue, store.WithExpiration(5*time.Second)) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Delete(ctx, "my-key").Return(nil) - - marshaler := New(cache) - - // When - err := marshaler.Delete(ctx, "my-key") - - // Then - assert.Nil(t, err) -} - -func TestDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to delete key") - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Delete(ctx, "my-key").Return(expectedErr) - - marshaler := New(cache) - - // When - err := marshaler.Delete(ctx, "my-key") - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Invalidate(ctx, store.InvalidateOptionsMatcher{ - Tags: []string{"tag1"}, - }).Return(nil) - - marshaler := New(cache) - - // When - err := marshaler.Invalidate(ctx, store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestInvalidatingWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unexpected error when invalidating data") - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Invalidate(ctx, store.InvalidateOptionsMatcher{Tags: []string{"tag1"}}).Return(expectedErr) - - marshaler := New(cache) - - // When - err := marshaler.Invalidate(ctx, store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Clear(ctx).Return(nil) - - marshaler := New(cache) - - // When - err := marshaler.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("an unexpected error occurred") - - cache := cache.NewMockCacheInterface[any](ctrl) - cache.EXPECT().Clear(ctx).Return(expectedErr) - - marshaler := New(cache) - - // When - err := marshaler.Clear(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} diff --git a/toolkit/gocache/lib/metrics/interface.go b/toolkit/gocache/lib/metrics/interface.go deleted file mode 100644 index cf584803..00000000 --- a/toolkit/gocache/lib/metrics/interface.go +++ /dev/null @@ -1,8 +0,0 @@ -package metrics - -import "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - -// MetricsInterface represents the metrics interface for all available providers -type MetricsInterface interface { - RecordFromCodec(codec codec.CodecInterface) -} diff --git a/toolkit/gocache/lib/metrics/metrics_mock.go b/toolkit/gocache/lib/metrics/metrics_mock.go deleted file mode 100644 index f95ffbfd..00000000 --- a/toolkit/gocache/lib/metrics/metrics_mock.go +++ /dev/null @@ -1,47 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: lib/metrics/interface.go - -// Package metrics is a generated GoMock package. -package metrics - -import ( - reflect "reflect" - - codec "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - gomock "go.uber.org/mock/gomock" -) - -// MockMetricsInterface is a mock of MetricsInterface interface. -type MockMetricsInterface struct { - ctrl *gomock.Controller - recorder *MockMetricsInterfaceMockRecorder -} - -// MockMetricsInterfaceMockRecorder is the mock recorder for MockMetricsInterface. -type MockMetricsInterfaceMockRecorder struct { - mock *MockMetricsInterface -} - -// NewMockMetricsInterface creates a new mock instance. -func NewMockMetricsInterface(ctrl *gomock.Controller) *MockMetricsInterface { - mock := &MockMetricsInterface{ctrl: ctrl} - mock.recorder = &MockMetricsInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockMetricsInterface) EXPECT() *MockMetricsInterfaceMockRecorder { - return m.recorder -} - -// RecordFromCodec mocks base method. -func (m *MockMetricsInterface) RecordFromCodec(codec codec.CodecInterface) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RecordFromCodec", codec) -} - -// RecordFromCodec indicates an expected call of RecordFromCodec. -func (mr *MockMetricsInterfaceMockRecorder) RecordFromCodec(codec interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordFromCodec", reflect.TypeOf((*MockMetricsInterface)(nil).RecordFromCodec), codec) -} diff --git a/toolkit/gocache/lib/metrics/prometheus.go b/toolkit/gocache/lib/metrics/prometheus.go deleted file mode 100644 index 6d62c42b..00000000 --- a/toolkit/gocache/lib/metrics/prometheus.go +++ /dev/null @@ -1,102 +0,0 @@ -package metrics - -import ( - "github.com/prometheus/client_golang/prometheus" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" -) - -const ( - defaultNamespace = "cache" -) - -// Prometheus represents the prometheus struct for collecting metrics -type Prometheus struct { - service string - namespace string - collector *prometheus.GaugeVec - registerer prometheus.Registerer - codecChannel chan codec.CodecInterface -} - -// PrometheusOption is a type for defining Prometheus options -type PrometheusOption func(*Prometheus) - -// WithCodecChannel sets the prometheus codec channel -func WithCodecChannel(codecChannel chan codec.CodecInterface) PrometheusOption { - return func(m *Prometheus) { - m.codecChannel = codecChannel - } -} - -// WithNamespace sets the prometheus namespace -func WithNamespace(namespace string) PrometheusOption { - return func(m *Prometheus) { - m.namespace = namespace - } -} - -// WithRegisterer sets the prometheus registerer -func WithRegisterer(registerer prometheus.Registerer) PrometheusOption { - return func(m *Prometheus) { - m.registerer = registerer - } -} - -// NewPrometheus initializes a new prometheus metric instance -func NewPrometheus(service string, options ...PrometheusOption) *Prometheus { - instance := &Prometheus{ - namespace: defaultNamespace, - registerer: prometheus.DefaultRegisterer, - service: service, - codecChannel: make(chan codec.CodecInterface, 10000), - } - - for _, option := range options { - option(instance) - } - - instance.collector = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "collector", - Namespace: instance.namespace, - Help: "This represent the number of items in cache", - }, - []string{"service", "store", "metric"}, - ) - - instance.registerer.MustRegister(instance.collector) - - go instance.recorder() - - return instance -} - -// Record records a metric in prometheus by specifying the store name, metric name and value -func (m *Prometheus) record(store, metric string, value float64) { - m.collector.WithLabelValues(m.service, store, metric).Set(value) -} - -// Recorder records metrics in prometheus by retrieving values from the codec channel -func (m *Prometheus) recorder() { - for codec := range m.codecChannel { - stats := codec.GetStats() - storeType := codec.GetStore().GetType() - - m.record(storeType, "hit_count", float64(stats.Hits)) - m.record(storeType, "miss_count", float64(stats.Miss)) - - m.record(storeType, "set_success", float64(stats.SetSuccess)) - m.record(storeType, "set_error", float64(stats.SetError)) - - m.record(storeType, "delete_success", float64(stats.DeleteSuccess)) - m.record(storeType, "delete_error", float64(stats.DeleteError)) - - m.record(storeType, "invalidate_success", float64(stats.InvalidateSuccess)) - m.record(storeType, "invalidate_error", float64(stats.InvalidateError)) - } -} - -// RecordFromCodec sends the given codec into the codec channel to be read from recorder -func (m *Prometheus) RecordFromCodec(codec codec.CodecInterface) { - m.codecChannel <- codec -} diff --git a/toolkit/gocache/lib/metrics/prometheus_test.go b/toolkit/gocache/lib/metrics/prometheus_test.go deleted file mode 100644 index 7cf8678f..00000000 --- a/toolkit/gocache/lib/metrics/prometheus_test.go +++ /dev/null @@ -1,166 +0,0 @@ -package metrics - -import ( - "testing" - "time" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/testutil" - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/codec" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewPrometheus(t *testing.T) { - // Given - serviceName := "my-test-service-name" - - // When - metrics := NewPrometheus(serviceName) - - // Then - assert.IsType(t, new(Prometheus), metrics) - - assert.Equal(t, serviceName, metrics.service) - assert.Equal(t, defaultNamespace, metrics.namespace) - assert.Equal(t, prometheus.DefaultRegisterer, metrics.registerer) - - assert.IsType(t, new(prometheus.GaugeVec), metrics.collector) -} - -func TestNewPrometheus_WithOptions(t *testing.T) { - // Given - serviceName := "my-test-service-name" - - customNamespace := "my_custom_namespace" - customRegistry := prometheus.NewRegistry() - customChannel := make(chan codec.CodecInterface, 100) - - // When - metrics := NewPrometheus( - serviceName, - WithCodecChannel(customChannel), - WithNamespace(customNamespace), - WithRegisterer(customRegistry), - ) - - // Then - assert.IsType(t, new(Prometheus), metrics) - - assert.Equal(t, serviceName, metrics.service) - assert.Equal(t, customChannel, metrics.codecChannel) - assert.Equal(t, customNamespace, metrics.namespace) - assert.Equal(t, customRegistry, metrics.registerer) - - assert.IsType(t, new(prometheus.GaugeVec), metrics.collector) -} - -func TestRecord(t *testing.T) { - // Given - customRegistry := prometheus.NewRegistry() - - metrics := NewPrometheus( - "my-test-service-name", - WithRegisterer(customRegistry), - ) - - // When - metrics.record("redis", "hit_count", 6) - - // Then - metric, err := metrics.collector.GetMetricWithLabelValues("my-test-service-name", "redis", "hit_count") - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - v := testutil.ToFloat64(metric) - - assert.Equal(t, float64(6), v) -} - -func TestRecordFromCodec(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - redisStore := store.NewMockStoreInterface(ctrl) - redisStore.EXPECT().GetType().Return("redis") - - stats := &codec.Stats{ - Hits: 4, - Miss: 6, - SetSuccess: 12, - SetError: 3, - DeleteSuccess: 8, - DeleteError: 5, - InvalidateSuccess: 2, - InvalidateError: 1, - } - - testCodec := codec.NewMockCodecInterface(ctrl) - testCodec.EXPECT().GetStats().Return(stats) - testCodec.EXPECT().GetStore().Return(redisStore) - - customRegistry := prometheus.NewRegistry() - - metrics := NewPrometheus( - "my-test-service-name", - WithRegisterer(customRegistry), - ) - - // When - metrics.RecordFromCodec(testCodec) - - // Wait for data to be processed - for len(metrics.codecChannel) > 0 { - time.Sleep(1 * time.Millisecond) - } - - // Then - testCases := []struct { - metricName string - expected float64 - }{ - { - metricName: "hit_count", - expected: float64(stats.Hits), - }, - { - metricName: "miss_count", - expected: float64(stats.Miss), - }, - { - metricName: "set_success", - expected: float64(stats.SetSuccess), - }, - { - metricName: "set_error", - expected: float64(stats.SetError), - }, - { - metricName: "delete_success", - expected: float64(stats.DeleteSuccess), - }, - { - metricName: "delete_error", - expected: float64(stats.DeleteError), - }, - { - metricName: "invalidate_success", - expected: float64(stats.InvalidateSuccess), - }, - { - metricName: "invalidate_error", - expected: float64(stats.InvalidateError), - }, - } - - for _, tc := range testCases { - metric, err := metrics.collector.GetMetricWithLabelValues("my-test-service-name", "redis", tc.metricName) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - v := testutil.ToFloat64(metric) - - assert.Equal(t, tc.expected, v) - } -} diff --git a/toolkit/gocache/lib/misc/benchmarks.jpeg b/toolkit/gocache/lib/misc/benchmarks.jpeg deleted file mode 100644 index 8d9c5823021f64047c59ca20e5c705d3d588d993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49481 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⩔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 diff --git a/toolkit/gocache/lib/store/errors.go b/toolkit/gocache/lib/store/errors.go deleted file mode 100644 index 6c62407d..00000000 --- a/toolkit/gocache/lib/store/errors.go +++ /dev/null @@ -1,27 +0,0 @@ -package store - -const NOT_FOUND_ERR string = "value not found in store" - -type NotFound struct { - cause error -} - -func NotFoundWithCause(e error) error { - err := NotFound{ - cause: e, - } - return &err -} - -func (e NotFound) Cause() error { - return e.cause -} - -func (e NotFound) Is(err error) bool { - return err.Error() == NOT_FOUND_ERR -} - -func (e NotFound) Error() string { - return NOT_FOUND_ERR -} -func (e NotFound) Unwrap() error { return e.cause } diff --git a/toolkit/gocache/lib/store/errors_test.go b/toolkit/gocache/lib/store/errors_test.go deleted file mode 100644 index 9727acb5..00000000 --- a/toolkit/gocache/lib/store/errors_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package store - -import ( - "errors" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestNotFoundIs(t *testing.T) { - expectedErr := errors.New(("this is an expected error cause")) - err := NotFoundWithCause(nil) - assert.True(t, errors.Is(err, NotFound{cause: expectedErr})) - - err2 := &NotFound{} - assert.True(t, errors.Is(err2, &NotFound{})) - - _, ok := err.(*NotFound) - assert.True(t, ok) - - assert.True(t, err.Error() == NotFound{}.Error()) -} diff --git a/toolkit/gocache/lib/store/interface.go b/toolkit/gocache/lib/store/interface.go deleted file mode 100644 index 66eb37cf..00000000 --- a/toolkit/gocache/lib/store/interface.go +++ /dev/null @@ -1,17 +0,0 @@ -package store - -import ( - "context" - "time" -) - -// StoreInterface is the interface for all available stores -type StoreInterface interface { - Get(ctx context.Context, key any) (any, error) - GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) - Set(ctx context.Context, key any, value any, options ...Option) error - Delete(ctx context.Context, key any) error - Invalidate(ctx context.Context, options ...InvalidateOption) error - Clear(ctx context.Context) error - GetType() string -} diff --git a/toolkit/gocache/lib/store/invalidate_options.go b/toolkit/gocache/lib/store/invalidate_options.go deleted file mode 100644 index aa3ed66e..00000000 --- a/toolkit/gocache/lib/store/invalidate_options.go +++ /dev/null @@ -1,39 +0,0 @@ -package store - -// InvalidateOption represents a cache invalidation function. -type InvalidateOption func(o *InvalidateOptions) - -type InvalidateOptions struct { - Tags []string -} - -func (o *InvalidateOptions) isEmpty() bool { - return len(o.Tags) == 0 -} - -func ApplyInvalidateOptionsWithDefault(defaultOptions *InvalidateOptions, opts ...InvalidateOption) *InvalidateOptions { - returnedOptions := ApplyInvalidateOptions(opts...) - - if returnedOptions == new(InvalidateOptions) { - returnedOptions = defaultOptions - } - - return returnedOptions -} - -func ApplyInvalidateOptions(opts ...InvalidateOption) *InvalidateOptions { - o := &InvalidateOptions{} - - for _, opt := range opts { - opt(o) - } - - return o -} - -// WithInvalidateTags allows setting the invalidate tags. -func WithInvalidateTags(tags []string) InvalidateOption { - return func(o *InvalidateOptions) { - o.Tags = tags - } -} diff --git a/toolkit/gocache/lib/store/invalidate_options_test.go b/toolkit/gocache/lib/store/invalidate_options_test.go deleted file mode 100644 index 4f95ebb9..00000000 --- a/toolkit/gocache/lib/store/invalidate_options_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package store - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestInvalidateOptionsTagsValue(t *testing.T) { - // Given - options := InvalidateOptions{ - Tags: []string{"tag1", "tag2", "tag3"}, - } - - // When - Then - assert.Equal(t, []string{"tag1", "tag2", "tag3"}, options.Tags) -} diff --git a/toolkit/gocache/lib/store/options.go b/toolkit/gocache/lib/store/options.go deleted file mode 100644 index 5e58a7d0..00000000 --- a/toolkit/gocache/lib/store/options.go +++ /dev/null @@ -1,79 +0,0 @@ -package store - -import ( - "time" -) - -// Option represents a store option function. -type Option func(o *Options) - -type Options struct { - SynchronousSet bool - Cost int64 - Expiration time.Duration - Tags []string - ClientSideCacheExpiration time.Duration -} - -func (o *Options) IsEmpty() bool { - return o.Cost == 0 && o.Expiration == 0 && len(o.Tags) == 0 -} - -func ApplyOptionsWithDefault(defaultOptions *Options, opts ...Option) *Options { - returnedOptions := &Options{} - *returnedOptions = *defaultOptions - - for _, opt := range opts { - opt(returnedOptions) - } - - return returnedOptions -} - -func ApplyOptions(opts ...Option) *Options { - o := &Options{} - - for _, opt := range opts { - opt(o) - } - - return o -} - -// WithCost allows setting the memory capacity used by the item when setting a value. -// Actually it seems to be used by Ristretto library only. -func WithCost(cost int64) Option { - return func(o *Options) { - o.Cost = cost - } -} - -// WithSynchronousSet allows setting the behavior when setting a value, whether to wait until all buffered writes have been applied or not. -// Currently to be used by Ristretto library only. -func WithSynchronousSet() Option { - return func(o *Options) { - o.SynchronousSet = true - } -} - -// WithExpiration allows to specify an expiration time when setting a value. -func WithExpiration(expiration time.Duration) Option { - return func(o *Options) { - o.Expiration = expiration - } -} - -// WithTags allows to specify associated tags to the current value. -func WithTags(tags []string) Option { - return func(o *Options) { - o.Tags = tags - } -} - -// WithClientSideCaching allows setting the client side caching, enabled by default -// Currently to be used by Rueidis(redis) library only. -func WithClientSideCaching(clientSideCacheExpiration time.Duration) Option { - return func(o *Options) { - o.ClientSideCacheExpiration = clientSideCacheExpiration - } -} diff --git a/toolkit/gocache/lib/store/options_test.go b/toolkit/gocache/lib/store/options_test.go deleted file mode 100644 index bb132b73..00000000 --- a/toolkit/gocache/lib/store/options_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package store - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestOptionsCostValue(t *testing.T) { - // Given - options := &Options{ - Cost: 7, - } - - // When - Then - assert.Equal(t, int64(7), options.Cost) -} - -func TestOptionsExpirationValue(t *testing.T) { - // Given - options := &Options{ - Expiration: 25 * time.Second, - } - - // When - Then - assert.Equal(t, 25*time.Second, options.Expiration) -} - -func TestOptionsTagsValue(t *testing.T) { - // Given - options := &Options{ - Tags: []string{"tag1", "tag2", "tag3"}, - } - - // When - Then - assert.Equal(t, []string{"tag1", "tag2", "tag3"}, options.Tags) -} - -func Test_applyOptionsWithDefault(t *testing.T) { - // Given - defaultOptions := &Options{ - Expiration: 25 * time.Second, - } - - // When - options := ApplyOptionsWithDefault(defaultOptions, WithCost(7)) - - // Then - assert.Equal(t, int64(7), options.Cost) - assert.Equal(t, 25*time.Second, options.Expiration) -} diff --git a/toolkit/gocache/lib/store/options_test_matchers.go b/toolkit/gocache/lib/store/options_test_matchers.go deleted file mode 100644 index b4029a85..00000000 --- a/toolkit/gocache/lib/store/options_test_matchers.go +++ /dev/null @@ -1,64 +0,0 @@ -package store - -import ( - "fmt" - "time" - - "golang.org/x/exp/slices" -) - -type OptionsMatcher struct { - Cost int64 - Expiration time.Duration - Tags []string -} - -func (m OptionsMatcher) Matches(x interface{}) bool { - switch values := x.(type) { - case []Option: - opts := &Options{} - for _, value := range values { - value(opts) - } - - return opts.Cost == m.Cost && - opts.Expiration == m.Expiration && - slices.Equal(opts.Tags, m.Tags) - } - - return false -} - -func (m OptionsMatcher) String() string { - return fmt.Sprintf( - "options should match (cost: %v expiration: %v tags: %v)", - m.Cost, - m.Expiration, - m.Tags, - ) -} - -type InvalidateOptionsMatcher struct { - Tags []string -} - -func (m InvalidateOptionsMatcher) Matches(x interface{}) bool { - switch values := x.(type) { - case []InvalidateOption: - opts := &InvalidateOptions{} - for _, value := range values { - value(opts) - } - - return slices.Equal(opts.Tags, m.Tags) - } - - return false -} - -func (m InvalidateOptionsMatcher) String() string { - return fmt.Sprintf( - "invalidate options should match (tags: %v)", - m.Tags, - ) -} diff --git a/toolkit/gocache/lib/store/store_mock.go b/toolkit/gocache/lib/store/store_mock.go deleted file mode 100644 index d5178f17..00000000 --- a/toolkit/gocache/lib/store/store_mock.go +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: lib/store/interface.go - -// Package store is a generated GoMock package. -package store - -import ( - context "context" - reflect "reflect" - time "time" - - gomock "go.uber.org/mock/gomock" -) - -// MockStoreInterface is a mock of StoreInterface interface. -type MockStoreInterface struct { - ctrl *gomock.Controller - recorder *MockStoreInterfaceMockRecorder -} - -// MockStoreInterfaceMockRecorder is the mock recorder for MockStoreInterface. -type MockStoreInterfaceMockRecorder struct { - mock *MockStoreInterface -} - -// NewMockStoreInterface creates a new mock instance. -func NewMockStoreInterface(ctrl *gomock.Controller) *MockStoreInterface { - mock := &MockStoreInterface{ctrl: ctrl} - mock.recorder = &MockStoreInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockStoreInterface) EXPECT() *MockStoreInterfaceMockRecorder { - return m.recorder -} - -// Clear mocks base method. -func (m *MockStoreInterface) Clear(ctx context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Clear", ctx) - ret0, _ := ret[0].(error) - return ret0 -} - -// Clear indicates an expected call of Clear. -func (mr *MockStoreInterfaceMockRecorder) Clear(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockStoreInterface)(nil).Clear), ctx) -} - -// Delete mocks base method. -func (m *MockStoreInterface) Delete(ctx context.Context, key any) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", ctx, key) - ret0, _ := ret[0].(error) - return ret0 -} - -// Delete indicates an expected call of Delete. -func (mr *MockStoreInterfaceMockRecorder) Delete(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockStoreInterface)(nil).Delete), ctx, key) -} - -// Get mocks base method. -func (m *MockStoreInterface) Get(ctx context.Context, key any) (any, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", ctx, key) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockStoreInterfaceMockRecorder) Get(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockStoreInterface)(nil).Get), ctx, key) -} - -// GetType mocks base method. -func (m *MockStoreInterface) GetType() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetType") - ret0, _ := ret[0].(string) - return ret0 -} - -// GetType indicates an expected call of GetType. -func (mr *MockStoreInterfaceMockRecorder) GetType() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetType", reflect.TypeOf((*MockStoreInterface)(nil).GetType)) -} - -// GetWithTTL mocks base method. -func (m *MockStoreInterface) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetWithTTL", ctx, key) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(time.Duration) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// GetWithTTL indicates an expected call of GetWithTTL. -func (mr *MockStoreInterfaceMockRecorder) GetWithTTL(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithTTL", reflect.TypeOf((*MockStoreInterface)(nil).GetWithTTL), ctx, key) -} - -// Invalidate mocks base method. -func (m *MockStoreInterface) Invalidate(ctx context.Context, options ...InvalidateOption) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Invalidate", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Invalidate indicates an expected call of Invalidate. -func (mr *MockStoreInterfaceMockRecorder) Invalidate(ctx interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invalidate", reflect.TypeOf((*MockStoreInterface)(nil).Invalidate), varargs...) -} - -// Set mocks base method. -func (m *MockStoreInterface) Set(ctx context.Context, key, value any, options ...Option) error { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, key, value} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Set", varargs...) - ret0, _ := ret[0].(error) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockStoreInterfaceMockRecorder) Set(ctx, key, value interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, key, value}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockStoreInterface)(nil).Set), varargs...) -} diff --git a/toolkit/gocache/store/bigcache/bigcache.go b/toolkit/gocache/store/bigcache/bigcache.go deleted file mode 100644 index 4df44ebe..00000000 --- a/toolkit/gocache/store/bigcache/bigcache.go +++ /dev/null @@ -1,152 +0,0 @@ -package bigcache - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// BigcacheClientInterface represents a allegro/bigcache client -type BigcacheClientInterface interface { - Get(key string) ([]byte, error) - Set(key string, entry []byte) error - Delete(key string) error - Reset() error -} - -const ( - // BigcacheType represents the storage type as a string value - BigcacheType = "bigcache" - // BigcacheTagPattern represents the tag pattern to be used as a key in specified storage - BigcacheTagPattern = "gocache_tag_%s" -) - -// BigcacheStore is a store for Bigcache -type BigcacheStore struct { - client BigcacheClientInterface - options *store.Options -} - -// NewBigcache creates a new store to Bigcache instance(s) -func NewBigcache(client BigcacheClientInterface, options ...store.Option) *BigcacheStore { - return &BigcacheStore{ - client: client, - options: store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key -func (s *BigcacheStore) Get(_ context.Context, key any) (any, error) { - item, err := s.client.Get(key.(string)) - if err != nil { - return nil, err - } - if item == nil { - return nil, store.NotFoundWithCause(errors.New("unable to retrieve data from bigcache")) - } - - return item, err -} - -// Not implemented for BigcacheStore -func (s *BigcacheStore) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - return nil, 0, errors.New("method not implemented for codec, use Get() instead") -} - -// Set defines data in Bigcache for given key identifier -func (s *BigcacheStore) Set(ctx context.Context, key any, value any, options ...store.Option) error { - opts := store.ApplyOptionsWithDefault(s.options, options...) - - var val []byte - switch v := value.(type) { - case string: - val = []byte(v) - case []byte: - val = v - default: - return errors.New("value type not supported by Bigcache store") - } - - err := s.client.Set(key.(string), val) - if err != nil { - return err - } - - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, key, tags) - } - - return nil -} - -func (s *BigcacheStore) setTags(ctx context.Context, key any, tags []string) { - for _, tag := range tags { - tagKey := fmt.Sprintf(BigcacheTagPattern, tag) - cacheKeys := []string{} - - if result, err := s.Get(ctx, tagKey); err == nil { - if bytes, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(bytes), ",") - } - } - - alreadyInserted := false - for _, cacheKey := range cacheKeys { - if cacheKey == key.(string) { - alreadyInserted = true - break - } - } - - if !alreadyInserted { - cacheKeys = append(cacheKeys, key.(string)) - } - - s.Set(ctx, tagKey, []byte(strings.Join(cacheKeys, ",")), store.WithExpiration(720*time.Hour)) - } -} - -// Delete removes data from Bigcache for given key identifier -func (s *BigcacheStore) Delete(_ context.Context, key any) error { - return s.client.Delete(key.(string)) -} - -// Invalidate invalidates some cache data in Bigcache for given options -func (s *BigcacheStore) Invalidate(ctx context.Context, options ...store.InvalidateOption) error { - opts := store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(BigcacheTagPattern, tag) - result, err := s.Get(ctx, tagKey) - if err != nil { - return nil - } - - cacheKeys := []string{} - if bytes, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(bytes), ",") - } - - for _, cacheKey := range cacheKeys { - s.Delete(ctx, cacheKey) - } - } - } - - return nil -} - -// Clear resets all data in the store -func (s *BigcacheStore) Clear(_ context.Context) error { - return s.client.Reset() -} - -// GetType returns the store type -func (s *BigcacheStore) GetType() string { - return BigcacheType -} diff --git a/toolkit/gocache/store/bigcache/bigcache_bench_test.go b/toolkit/gocache/store/bigcache/bigcache_bench_test.go deleted file mode 100644 index 1cdc9a58..00000000 --- a/toolkit/gocache/store/bigcache/bigcache_bench_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package bigcache - -import ( - "context" - "fmt" - "math" - "testing" - "time" - - "github.com/allegro/bigcache/v3" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkBigcacheSet(b *testing.B) { - ctx := context.Background() - - client, _ := bigcache.NewBigCache(bigcache.DefaultConfig(5 * time.Minute)) - store := NewBigcache(client, nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkBigcacheGet(b *testing.B) { - ctx := context.Background() - - client, _ := bigcache.NewBigCache(bigcache.DefaultConfig(5 * time.Minute)) - store := NewBigcache(client, nil) - - key := "test" - value := []byte("value") - - store.Set(ctx, key, value, nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/bigcache/bigcache_mock.go b/toolkit/gocache/store/bigcache/bigcache_mock.go deleted file mode 100644 index b412a795..00000000 --- a/toolkit/gocache/store/bigcache/bigcache_mock.go +++ /dev/null @@ -1,91 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/bigcache/bigcache.go - -// Package bigcache is a generated GoMock package. -package bigcache - -import ( - reflect "reflect" - - gomock "go.uber.org/mock/gomock" -) - -// MockBigcacheClientInterface is a mock of BigcacheClientInterface interface. -type MockBigcacheClientInterface struct { - ctrl *gomock.Controller - recorder *MockBigcacheClientInterfaceMockRecorder -} - -// MockBigcacheClientInterfaceMockRecorder is the mock recorder for MockBigcacheClientInterface. -type MockBigcacheClientInterfaceMockRecorder struct { - mock *MockBigcacheClientInterface -} - -// NewMockBigcacheClientInterface creates a new mock instance. -func NewMockBigcacheClientInterface(ctrl *gomock.Controller) *MockBigcacheClientInterface { - mock := &MockBigcacheClientInterface{ctrl: ctrl} - mock.recorder = &MockBigcacheClientInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBigcacheClientInterface) EXPECT() *MockBigcacheClientInterfaceMockRecorder { - return m.recorder -} - -// Delete mocks base method. -func (m *MockBigcacheClientInterface) Delete(key string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", key) - ret0, _ := ret[0].(error) - return ret0 -} - -// Delete indicates an expected call of Delete. -func (mr *MockBigcacheClientInterfaceMockRecorder) Delete(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockBigcacheClientInterface)(nil).Delete), key) -} - -// Get mocks base method. -func (m *MockBigcacheClientInterface) Get(key string) ([]byte, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", key) - ret0, _ := ret[0].([]byte) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockBigcacheClientInterfaceMockRecorder) Get(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockBigcacheClientInterface)(nil).Get), key) -} - -// Reset mocks base method. -func (m *MockBigcacheClientInterface) Reset() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Reset") - ret0, _ := ret[0].(error) - return ret0 -} - -// Reset indicates an expected call of Reset. -func (mr *MockBigcacheClientInterfaceMockRecorder) Reset() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockBigcacheClientInterface)(nil).Reset)) -} - -// Set mocks base method. -func (m *MockBigcacheClientInterface) Set(key string, entry []byte) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Set", key, entry) - ret0, _ := ret[0].(error) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockBigcacheClientInterfaceMockRecorder) Set(key, entry interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockBigcacheClientInterface)(nil).Set), key, entry) -} diff --git a/toolkit/gocache/store/bigcache/bigcache_test.go b/toolkit/gocache/store/bigcache/bigcache_test.go deleted file mode 100644 index 66b6c362..00000000 --- a/toolkit/gocache/store/bigcache/bigcache_test.go +++ /dev/null @@ -1,340 +0,0 @@ -package bigcache - -import ( - "context" - "errors" - "testing" - - "github.com/stretchr/testify/assert" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewBigcache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockBigcacheClientInterface(ctrl) - - // When - store := NewBigcache(client) - - // Then - assert.IsType(t, new(BigcacheStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, new(lib_store.Options), store.options) -} - -func TestBigcacheGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(cacheValue, nil) - - store := NewBigcache(client) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestBigcacheGetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - expectedErr := errors.New("an unexpected error occurred") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(nil, expectedErr) - - store := NewBigcache(client) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Equal(t, expectedErr, err) - assert.Nil(t, value) -} - -func TestBigcacheGetWithTTL(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - client := NewMockBigcacheClientInterface(ctrl) - store := NewBigcache(client) - - expectedErr := errors.New("method not implemented for codec, use Get() instead") - - // When - value, _, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Equal(t, expectedErr, err) - assert.Nil(t, value) -} - -func TestBigcacheSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue).Return(nil) - - store := NewBigcache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheSetString(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - // The value is string when failback from Redis - cacheValue := "my-cache-value" - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, []byte(cacheValue)).Return(nil) - - store := NewBigcache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheSetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - expectedErr := errors.New("an unexpected error occurred") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue).Return(expectedErr) - - store := NewBigcache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestBigcacheSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue).Return(nil) - client.EXPECT().Get("gocache_tag_tag1").Return(nil, nil) - client.EXPECT().Set("gocache_tag_tag1", []byte("my-key")).Return(nil) - - store := NewBigcache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheSetWithTagsWhenAlreadyInserted(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue).Return(nil) - client.EXPECT().Get("gocache_tag_tag1").Return([]byte("my-key,a-second-key"), nil) - client.EXPECT().Set("gocache_tag_tag1", []byte("my-key,a-second-key")).Return(nil) - - store := NewBigcache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Delete(cacheKey).Return(nil) - - store := NewBigcache(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to delete key") - - cacheKey := "my-key" - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Delete(cacheKey).Return(expectedErr) - - store := NewBigcache(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestBigcacheInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("a23fdf987h2svc23,jHG2372x38hf74") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, nil) - client.EXPECT().Delete("a23fdf987h2svc23").Return(nil) - client.EXPECT().Delete("jHG2372x38hf74").Return(nil) - - store := NewBigcache(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("a23fdf987h2svc23,jHG2372x38hf74") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, nil) - client.EXPECT().Delete("a23fdf987h2svc23").Return(errors.New("unexpected error")) - client.EXPECT().Delete("jHG2372x38hf74").Return(nil) - - store := NewBigcache(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Reset().Return(nil) - - store := NewBigcache(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestBigcacheClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("an unexpected error occurred") - - client := NewMockBigcacheClientInterface(ctrl) - client.EXPECT().Reset().Return(expectedErr) - - store := NewBigcache(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestBigcacheGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockBigcacheClientInterface(ctrl) - - store := NewBigcache(client) - - // When - Then - assert.Equal(t, BigcacheType, store.GetType()) -} diff --git a/toolkit/gocache/store/freecache/freecache.go b/toolkit/gocache/store/freecache/freecache.go deleted file mode 100644 index 5232a9b1..00000000 --- a/toolkit/gocache/store/freecache/freecache.go +++ /dev/null @@ -1,189 +0,0 @@ -package freecache - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // FreecacheType represents the storage type as a string value - FreecacheType = "freecache" - // FreecacheTagPattern represents the tag pattern to be used as a key in specified storage - FreecacheTagPattern = "freecache_tag_%s" -) - -// FreecacheClientInterface represents a coocood/freecache client -type FreecacheClientInterface interface { - Get(key []byte) (value []byte, err error) - GetInt(key int64) (value []byte, err error) - TTL(key []byte) (timeLeft uint32, err error) - Set(key, value []byte, expireSeconds int) (err error) - SetInt(key int64, value []byte, expireSeconds int) (err error) - Del(key []byte) (affected bool) - DelInt(key int64) (affected bool) - Clear() -} - -// FreecacheStore is a store for freecache -type FreecacheStore struct { - client FreecacheClientInterface - options *lib_store.Options -} - -// NewFreecache creates a new store to freecache instance(s) -func NewFreecache(client FreecacheClientInterface, options ...lib_store.Option) *FreecacheStore { - return &FreecacheStore{ - client: client, - options: lib_store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key. It returns the value or not found error -func (f *FreecacheStore) Get(_ context.Context, key any) (any, error) { - var err error - var result any - if k, ok := key.(string); ok { - result, err = f.client.Get([]byte(k)) - if err != nil { - return nil, lib_store.NotFoundWithCause(errors.New("value not found in Freecache store")) - } - return result, err - } - - return nil, errors.New("key type not supported by Freecache store") -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (f *FreecacheStore) GetWithTTL(_ context.Context, key any) (any, time.Duration, error) { - if k, ok := key.(string); ok { - result, err := f.client.Get([]byte(k)) - if err != nil { - return nil, 0, lib_store.NotFoundWithCause(errors.New("value not found in Freecache store")) - } - - ttl, err := f.client.TTL([]byte(k)) - if err != nil { - return nil, 0, lib_store.NotFoundWithCause(errors.New("value not found in Freecache store")) - } - - return result, time.Duration(ttl) * time.Second, err - } - - return nil, 0, errors.New("key type not supported by Freecache store") -} - -// Set sets a key, value and expiration for a cache entry and stores it in the cache. -// If the key is larger than 65535 or value is larger than 1/1024 of the cache size, -// the entry will not be written to the cache. expireSeconds <= 0 means no expire, -// but it can be evicted when cache is full. -func (f *FreecacheStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - var err error - var val []byte - - // Using default options set during cache initialization - opts := lib_store.ApplyOptionsWithDefault(f.options, options...) - - // type check for value, as freecache only supports value of type []byte - switch v := value.(type) { - case []byte: - val = v - default: - return errors.New("value type not supported by Freecache store") - } - - if k, ok := key.(string); ok { - err = f.client.Set([]byte(k), val, int(opts.Expiration.Seconds())) - if err != nil { - return fmt.Errorf("size of key: %v, value: %v, err: %v", k, len(val), err) - } - if tags := opts.Tags; len(tags) > 0 { - f.setTags(ctx, key, tags) - } - return nil - } - return errors.New("key type not supported by Freecache store") -} - -func (f *FreecacheStore) setTags(ctx context.Context, key any, tags []string) { - for _, tag := range tags { - tagKey := fmt.Sprintf(FreecacheTagPattern, tag) - cacheKeys := f.getCacheKeysForTag(ctx, tagKey) - - alreadyInserted := false - for _, cacheKey := range cacheKeys { - if cacheKey == key.(string) { - alreadyInserted = true - break - } - } - - if !alreadyInserted { - cacheKeys = append(cacheKeys, key.(string)) - } - - f.Set(ctx, tagKey, []byte(strings.Join(cacheKeys, ",")), lib_store.WithExpiration(720*time.Hour)) - } -} - -func (f *FreecacheStore) getCacheKeysForTag(ctx context.Context, tagKey string) []string { - cacheKeys := []string{} - if result, err := f.Get(ctx, tagKey); err == nil && result != nil { - if str, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(str), ",") - } - } - return cacheKeys -} - -// Delete deletes an item in the cache by key and returns err or nil if a delete occurred -func (f *FreecacheStore) Delete(_ context.Context, key any) error { - if v, ok := key.(string); ok { - if f.client.Del([]byte(v)) { - return nil - } - return fmt.Errorf("failed to delete key %v", key) - } - return errors.New("key type not supported by Freecache store") -} - -// Invalidate invalidates some cache data in freecache for given options -func (f *FreecacheStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(FreecacheTagPattern, tag) - cacheKeys := f.getCacheKeysForTag(ctx, tagKey) - - for _, cacheKey := range cacheKeys { - err := f.Delete(ctx, cacheKey) - if err != nil { - return err - } - } - - err := f.Delete(ctx, tagKey) - if err != nil { - return err - } - } - } - - return nil -} - -// Clear resets all data in the store -func (f *FreecacheStore) Clear(_ context.Context) error { - f.client.Clear() - return nil -} - -// GetType returns the store type -func (f *FreecacheStore) GetType() string { - return FreecacheType -} diff --git a/toolkit/gocache/store/freecache/freecache_bench_test.go b/toolkit/gocache/store/freecache/freecache_bench_test.go deleted file mode 100644 index 49082200..00000000 --- a/toolkit/gocache/store/freecache/freecache_bench_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package freecache - -import ( - "context" - "fmt" - "math" - "testing" - "time" - - "github.com/coocood/freecache" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkFreecacheSet(b *testing.B) { - ctx := context.Background() - - c := freecache.NewCache(1000) - freecacheStore := NewFreecache(c, lib_store.WithExpiration(10*time.Second)) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - _ = freecacheStore.Set(ctx, key, value) - } - }) - } -} - -func BenchmarkFreecacheGet(b *testing.B) { - ctx := context.Background() - - c := freecache.NewCache(1000) - freecacheStore := NewFreecache(c, lib_store.WithExpiration(10*time.Second)) - key := "test" - value := []byte("value") - - err := freecacheStore.Set(ctx, key, value) - if err != nil { - b.Error(err) - } - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = freecacheStore.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/freecache/freecache_mock.go b/toolkit/gocache/store/freecache/freecache_mock.go deleted file mode 100644 index 3ee86e23..00000000 --- a/toolkit/gocache/store/freecache/freecache_mock.go +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/freecache/freecache.go - -// Package freecache is a generated GoMock package. -package freecache - -import ( - reflect "reflect" - - gomock "go.uber.org/mock/gomock" -) - -// MockFreecacheClientInterface is a mock of FreecacheClientInterface interface. -type MockFreecacheClientInterface struct { - ctrl *gomock.Controller - recorder *MockFreecacheClientInterfaceMockRecorder -} - -// MockFreecacheClientInterfaceMockRecorder is the mock recorder for MockFreecacheClientInterface. -type MockFreecacheClientInterfaceMockRecorder struct { - mock *MockFreecacheClientInterface -} - -// NewMockFreecacheClientInterface creates a new mock instance. -func NewMockFreecacheClientInterface(ctrl *gomock.Controller) *MockFreecacheClientInterface { - mock := &MockFreecacheClientInterface{ctrl: ctrl} - mock.recorder = &MockFreecacheClientInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockFreecacheClientInterface) EXPECT() *MockFreecacheClientInterfaceMockRecorder { - return m.recorder -} - -// Clear mocks base method. -func (m *MockFreecacheClientInterface) Clear() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Clear") -} - -// Clear indicates an expected call of Clear. -func (mr *MockFreecacheClientInterfaceMockRecorder) Clear() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockFreecacheClientInterface)(nil).Clear)) -} - -// Del mocks base method. -func (m *MockFreecacheClientInterface) Del(key []byte) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Del", key) - ret0, _ := ret[0].(bool) - return ret0 -} - -// Del indicates an expected call of Del. -func (mr *MockFreecacheClientInterfaceMockRecorder) Del(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Del", reflect.TypeOf((*MockFreecacheClientInterface)(nil).Del), key) -} - -// DelInt mocks base method. -func (m *MockFreecacheClientInterface) DelInt(key int64) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DelInt", key) - ret0, _ := ret[0].(bool) - return ret0 -} - -// DelInt indicates an expected call of DelInt. -func (mr *MockFreecacheClientInterfaceMockRecorder) DelInt(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DelInt", reflect.TypeOf((*MockFreecacheClientInterface)(nil).DelInt), key) -} - -// Get mocks base method. -func (m *MockFreecacheClientInterface) Get(key []byte) ([]byte, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", key) - ret0, _ := ret[0].([]byte) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockFreecacheClientInterfaceMockRecorder) Get(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockFreecacheClientInterface)(nil).Get), key) -} - -// GetInt mocks base method. -func (m *MockFreecacheClientInterface) GetInt(key int64) ([]byte, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetInt", key) - ret0, _ := ret[0].([]byte) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetInt indicates an expected call of GetInt. -func (mr *MockFreecacheClientInterfaceMockRecorder) GetInt(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInt", reflect.TypeOf((*MockFreecacheClientInterface)(nil).GetInt), key) -} - -// Set mocks base method. -func (m *MockFreecacheClientInterface) Set(key, value []byte, expireSeconds int) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Set", key, value, expireSeconds) - ret0, _ := ret[0].(error) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockFreecacheClientInterfaceMockRecorder) Set(key, value, expireSeconds interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockFreecacheClientInterface)(nil).Set), key, value, expireSeconds) -} - -// SetInt mocks base method. -func (m *MockFreecacheClientInterface) SetInt(key int64, value []byte, expireSeconds int) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetInt", key, value, expireSeconds) - ret0, _ := ret[0].(error) - return ret0 -} - -// SetInt indicates an expected call of SetInt. -func (mr *MockFreecacheClientInterfaceMockRecorder) SetInt(key, value, expireSeconds interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetInt", reflect.TypeOf((*MockFreecacheClientInterface)(nil).SetInt), key, value, expireSeconds) -} - -// TTL mocks base method. -func (m *MockFreecacheClientInterface) TTL(key []byte) (uint32, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TTL", key) - ret0, _ := ret[0].(uint32) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// TTL indicates an expected call of TTL. -func (mr *MockFreecacheClientInterfaceMockRecorder) TTL(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TTL", reflect.TypeOf((*MockFreecacheClientInterface)(nil).TTL), key) -} diff --git a/toolkit/gocache/store/freecache/freecache_test.go b/toolkit/gocache/store/freecache/freecache_test.go deleted file mode 100644 index ca1cf1d3..00000000 --- a/toolkit/gocache/store/freecache/freecache_test.go +++ /dev/null @@ -1,501 +0,0 @@ -package freecache - -import ( - "context" - "errors" - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/assert" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewFreecache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockFreecacheClientInterface(ctrl) - - // When - store := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - - // Then - assert.IsType(t, new(FreecacheStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, &lib_store.Options{ - Expiration: 6 * time.Second, - }, store.options) -} - -func TestNewFreecacheDefaultOptions(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockFreecacheClientInterface(ctrl) - - // When - store := NewFreecache(client) - - // Then - assert.IsType(t, new(FreecacheStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, new(lib_store.Options), store.options) -} - -func TestFreecacheGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte("key1")).Return([]byte("val1"), nil) - client.EXPECT().Get([]byte("key2")).Return([]byte("val2"), nil) - - s := NewFreecache(client) - - value, err := s.Get(ctx, "key1") - assert.Nil(t, err) - assert.Equal(t, []byte("val1"), value) - - value, err = s.Get(ctx, "key2") - assert.Nil(t, err) - assert.Equal(t, []byte("val2"), value) -} - -func TestFreecacheGetNotFound(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte("key1")).Return(nil, errors.New("value not found in store")) - - s := NewFreecache(client) - - value, err := s.Get(ctx, "key1") - assert.EqualError(t, err, "value not found in store") - assert.Nil(t, value) -} - -func TestFreecacheGetWithInvalidKey(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockFreecacheClientInterface(ctrl) - - s := NewFreecache(client) - - value, err := s.Get(ctx, []byte("key1")) - assert.Error(t, err, "key type not supported by Freecache store") - assert.Nil(t, value) -} - -func TestFreecacheGetWithTTL(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte(cacheKey)).Return(cacheValue, nil) - client.EXPECT().TTL([]byte(cacheKey)).Return(uint32(5), nil) - - store := NewFreecache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - assert.Equal(t, 5*time.Second, ttl) -} - -func TestFreecacheGetWithTTLWhenMissingItem(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte(cacheKey)).Return(nil, lib_store.NotFound{}) - - store := NewFreecache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.ErrorIs(t, err, lib_store.NotFound{}) - assert.Nil(t, value) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestFreecacheGetWithTTLWhenErrorAtTTL(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte(cacheKey)).Return(cacheValue, nil) - client.EXPECT().TTL([]byte(cacheKey)).Return(uint32(0), lib_store.NotFound{}) - - store := NewFreecache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.ErrorIs(t, err, lib_store.NotFound{}) - assert.Nil(t, value) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestFreecacheGetWithTTLWhenInvalidKey(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockFreecacheClientInterface(ctrl) - - s := NewFreecache(client) - - value, ttl, err := s.GetWithTTL(ctx, []byte("key1")) - assert.Error(t, err, "key type not supported by Freecache store") - assert.Nil(t, value) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestFreecacheSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Set([]byte(cacheKey), cacheValue, 6).Return(nil) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - err := s.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(6*time.Second)) - assert.Nil(t, err) -} - -func TestFreecacheSetWithDefaultOptions(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Set([]byte(cacheKey), cacheValue, 0).Return(nil) - - s := NewFreecache(client) - err := s.Set(ctx, cacheKey, cacheValue) - assert.Nil(t, err) -} - -func TestFreecacheSetInvalidValue(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - expectedErr := errors.New("value type not supported by Freecache store") - - client := NewMockFreecacheClientInterface(ctrl) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - err := s.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(6*time.Second)) - assert.Equal(t, expectedErr, err) -} - -func TestFreecacheSetInvalidSize(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - expectedErr := fmt.Errorf("size of key: %v, value: %v, err: %v", cacheKey, cacheValue, errors.New("")) - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Set([]byte(cacheKey), cacheValue, 6).Return(expectedErr) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - err := s.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(6*time.Second)) - assert.NotNil(t, err) -} - -func TestFreecacheSetInvalidKey(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := 1 - cacheValue := []byte("my-cache-value") - - expectedErr := errors.New("key type not supported by Freecache store") - - client := NewMockFreecacheClientInterface(ctrl) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - err := s.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(6*time.Second)) - assert.Equal(t, expectedErr, err) -} - -func TestFreecacheDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "key" - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Del(gomock.Any()).Return(true) - - s := NewFreecache(client) - err := s.Delete(ctx, cacheKey) - assert.Nil(t, err) -} - -func TestFreecacheDeleteFailed(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "key" - expectedErr := fmt.Errorf("failed to delete key %v", cacheKey) - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Del(gomock.Any()).Return(false) - - s := NewFreecache(client) - err := s.Delete(ctx, cacheKey) - assert.Equal(t, expectedErr, err) -} - -func TestFreecacheDeleteInvalidKey(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := 1 - expectedErr := errors.New("key type not supported by Freecache store") - client := NewMockFreecacheClientInterface(ctrl) - - s := NewFreecache(client) - err := s.Delete(ctx, cacheKey) - assert.Equal(t, expectedErr, err) -} - -func TestFreecacheSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Set([]byte(cacheKey), cacheValue, 6).Return(nil) - client.EXPECT().Get([]byte("freecache_tag_tag1")).MaxTimes(1).Return(nil, errors.New("value not found in store")) - client.EXPECT().Set([]byte("freecache_tag_tag1"), []byte("my-key"), 2592000).Return(nil) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - err := s.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(6*time.Second), lib_store.WithTags([]string{"tag1"})) - assert.Nil(t, err) -} - -func TestFreecacheInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("my-key") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte("freecache_tag_tag1")).Return(cacheKeys, nil) - client.EXPECT().Del([]byte("my-key")).Return(true) - client.EXPECT().Del([]byte("freecache_tag_tag1")).Return(true) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := s.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestFreecacheTagsAlreadyPresent(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - oldCacheKeys := []byte("key1,key2") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Set([]byte(cacheKey), cacheValue, 6).Return(nil) - client.EXPECT().Get([]byte("freecache_tag_tag1")).MaxTimes(1).Return(oldCacheKeys, nil) - client.EXPECT().Set([]byte("freecache_tag_tag1"), []byte("key1,key2,my-key"), 2592000).Return(nil) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - err := s.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(6*time.Second), lib_store.WithTags([]string{"tag1"})) - assert.Nil(t, err) -} - -func TestFreecacheTagsRefreshTime(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - oldCacheKeys := []byte("my-key") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Set([]byte(cacheKey), cacheValue, 6).Return(nil) - client.EXPECT().Get([]byte("freecache_tag_tag1")).MaxTimes(1).Return(oldCacheKeys, nil) - client.EXPECT().Set([]byte("freecache_tag_tag1"), []byte("my-key"), 2592000).Return(nil) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - err := s.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(6*time.Second), lib_store.WithTags([]string{"tag1"})) - assert.Nil(t, err) -} - -func TestFreecacheInvalidateMultipleKeys(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("my-key,key1,key2") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte("freecache_tag_tag1")).Return(cacheKeys, nil) - client.EXPECT().Del([]byte("my-key")).Return(true) - client.EXPECT().Del([]byte("key1")).Return(true) - client.EXPECT().Del([]byte("key2")).Return(true) - client.EXPECT().Del([]byte("freecache_tag_tag1")).Return(true) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := s.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestFreecacheFailedInvalidateMultipleKeys(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("my-key,key1,key2") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte("freecache_tag_tag1")).Return(cacheKeys, nil) - client.EXPECT().Del([]byte("my-key")).Return(false) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := s.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.EqualError(t, err, "failed to delete key my-key") -} - -func TestFreecacheFailedInvalidatePattern(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("my-key,key1,key2") - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Get([]byte("freecache_tag_tag1")).Return(cacheKeys, nil) - client.EXPECT().Del([]byte("my-key")).Return(true) - client.EXPECT().Del([]byte("key1")).Return(true) - client.EXPECT().Del([]byte("key2")).Return(true) - client.EXPECT().Del([]byte("freecache_tag_tag1")).Return(false) - - s := NewFreecache(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := s.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.EqualError(t, err, "failed to delete key freecache_tag_tag1") -} - -func TestFreecacheClearAll(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockFreecacheClientInterface(ctrl) - client.EXPECT().Clear() - - s := NewFreecache(client) - - // When - err := s.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestFreecacheGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockFreecacheClientInterface(ctrl) - - s := NewFreecache(client) - - // When - ty := s.GetType() - - // Then - assert.Equal(t, FreecacheType, ty) -} diff --git a/toolkit/gocache/store/go_cache/go_cache.go b/toolkit/gocache/store/go_cache/go_cache.go deleted file mode 100644 index b1983eb4..00000000 --- a/toolkit/gocache/store/go_cache/go_cache.go +++ /dev/null @@ -1,158 +0,0 @@ -package go_cache - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // GoCacheType represents the storage type as a string value - GoCacheType = "go-cache" - // GoCacheTagPattern represents the tag pattern to be used as a key in specified storage - GoCacheTagPattern = "gocache_tag_%s" -) - -// GoCacheClientInterface represents a github.com/patrickmn/go-cache client -type GoCacheClientInterface interface { - Get(k string) (any, bool) - GetWithExpiration(k string) (any, time.Time, bool) - Set(k string, x any, d time.Duration) - Delete(k string) - Flush() -} - -// GoCacheStore is a store for GoCache (memory) library -type GoCacheStore struct { - mu sync.RWMutex - client GoCacheClientInterface - options *lib_store.Options -} - -// NewGoCache creates a new store to GoCache (memory) library instance -func NewGoCache(client GoCacheClientInterface, options ...lib_store.Option) *GoCacheStore { - return &GoCacheStore{ - client: client, - options: lib_store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key -func (s *GoCacheStore) Get(_ context.Context, key any) (any, error) { - var err error - keyStr := key.(string) - value, exists := s.client.Get(keyStr) - if !exists { - err = lib_store.NotFoundWithCause(errors.New("value not found in GoCache store")) - } - - return value, err -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (s *GoCacheStore) GetWithTTL(_ context.Context, key any) (any, time.Duration, error) { - data, t, exists := s.client.GetWithExpiration(key.(string)) - if !exists { - return data, 0, lib_store.NotFoundWithCause(errors.New("value not found in GoCache store")) - } - duration := time.Until(t) - return data, duration, nil -} - -// Set defines data in GoCache memoey cache for given key identifier -func (s *GoCacheStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptions(options...) - if opts == nil { - opts = s.options - } - - s.client.Set(key.(string), value, opts.Expiration) - - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, key, tags) - } - - return nil -} - -func (s *GoCacheStore) setTags(ctx context.Context, key any, tags []string) { - for _, tag := range tags { - tagKey := fmt.Sprintf(GoCacheTagPattern, tag) - var cacheKeys map[string]struct{} - - if result, err := s.Get(ctx, tagKey); err == nil { - if bytes, ok := result.(map[string]struct{}); ok { - cacheKeys = bytes - } - } - - s.mu.RLock() - if _, exists := cacheKeys[key.(string)]; exists { - s.mu.RUnlock() - continue - } - s.mu.RUnlock() - - if cacheKeys == nil { - cacheKeys = make(map[string]struct{}) - } - - s.mu.Lock() - cacheKeys[key.(string)] = struct{}{} - s.mu.Unlock() - - s.client.Set(tagKey, cacheKeys, 720*time.Hour) - } -} - -// Delete removes data in GoCache memoey cache for given key identifier -func (s *GoCacheStore) Delete(_ context.Context, key any) error { - s.client.Delete(key.(string)) - return nil -} - -// Invalidate invalidates some cache data in GoCache memoey cache for given options -func (s *GoCacheStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(GoCacheTagPattern, tag) - result, err := s.Get(ctx, tagKey) - if err != nil { - zlogger.Warn().Msg(err.Error()) - continue - } - - var cacheKeys map[string]struct{} - if bytes, ok := result.(map[string]struct{}); ok { - cacheKeys = bytes - } - - s.mu.RLock() - for cacheKey := range cacheKeys { - _ = s.Delete(ctx, cacheKey) - } - s.mu.RUnlock() - } - } - - return nil -} - -// GetType returns the store type -func (s *GoCacheStore) GetType() string { - return GoCacheType -} - -// Clear resets all data in the store -func (s *GoCacheStore) Clear(_ context.Context) error { - s.client.Flush() - return nil -} diff --git a/toolkit/gocache/store/go_cache/go_cache_bench_test.go b/toolkit/gocache/store/go_cache/go_cache_bench_test.go deleted file mode 100644 index 540a8ca8..00000000 --- a/toolkit/gocache/store/go_cache/go_cache_bench_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package go_cache - -import ( - "context" - "fmt" - "math" - "testing" - "time" - - cache "github.com/patrickmn/go-cache" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkGoCacheSet(b *testing.B) { - ctx := context.Background() - - client := cache.New(10*time.Second, 30*time.Second) - - store := NewGoCache(client, nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkGoCacheGet(b *testing.B) { - ctx := context.Background() - - client := cache.New(10*time.Second, 30*time.Second) - - store := NewGoCache(client, nil) - - key := "test" - value := []byte("value") - - store.Set(ctx, key, value, nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/go_cache/go_cache_mock.go b/toolkit/gocache/store/go_cache/go_cache_mock.go deleted file mode 100644 index 3562647d..00000000 --- a/toolkit/gocache/store/go_cache/go_cache_mock.go +++ /dev/null @@ -1,102 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/go_cache/go_cache.go - -// Package go_cache is a generated GoMock package. -package go_cache - -import ( - reflect "reflect" - time "time" - - gomock "go.uber.org/mock/gomock" -) - -// MockGoCacheClientInterface is a mock of GoCacheClientInterface interface. -type MockGoCacheClientInterface struct { - ctrl *gomock.Controller - recorder *MockGoCacheClientInterfaceMockRecorder -} - -// MockGoCacheClientInterfaceMockRecorder is the mock recorder for MockGoCacheClientInterface. -type MockGoCacheClientInterfaceMockRecorder struct { - mock *MockGoCacheClientInterface -} - -// NewMockGoCacheClientInterface creates a new mock instance. -func NewMockGoCacheClientInterface(ctrl *gomock.Controller) *MockGoCacheClientInterface { - mock := &MockGoCacheClientInterface{ctrl: ctrl} - mock.recorder = &MockGoCacheClientInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockGoCacheClientInterface) EXPECT() *MockGoCacheClientInterfaceMockRecorder { - return m.recorder -} - -// Delete mocks base method. -func (m *MockGoCacheClientInterface) Delete(k string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Delete", k) -} - -// Delete indicates an expected call of Delete. -func (mr *MockGoCacheClientInterfaceMockRecorder) Delete(k interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockGoCacheClientInterface)(nil).Delete), k) -} - -// Flush mocks base method. -func (m *MockGoCacheClientInterface) Flush() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Flush") -} - -// Flush indicates an expected call of Flush. -func (mr *MockGoCacheClientInterfaceMockRecorder) Flush() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Flush", reflect.TypeOf((*MockGoCacheClientInterface)(nil).Flush)) -} - -// Get mocks base method. -func (m *MockGoCacheClientInterface) Get(k string) (any, bool) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", k) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(bool) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockGoCacheClientInterfaceMockRecorder) Get(k interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockGoCacheClientInterface)(nil).Get), k) -} - -// GetWithExpiration mocks base method. -func (m *MockGoCacheClientInterface) GetWithExpiration(k string) (any, time.Time, bool) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetWithExpiration", k) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(time.Time) - ret2, _ := ret[2].(bool) - return ret0, ret1, ret2 -} - -// GetWithExpiration indicates an expected call of GetWithExpiration. -func (mr *MockGoCacheClientInterfaceMockRecorder) GetWithExpiration(k interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWithExpiration", reflect.TypeOf((*MockGoCacheClientInterface)(nil).GetWithExpiration), k) -} - -// Set mocks base method. -func (m *MockGoCacheClientInterface) Set(k string, x any, d time.Duration) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Set", k, x, d) -} - -// Set indicates an expected call of Set. -func (mr *MockGoCacheClientInterfaceMockRecorder) Set(k, x, d interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockGoCacheClientInterface)(nil).Set), k, x, d) -} diff --git a/toolkit/gocache/store/go_cache/go_cache_test.go b/toolkit/gocache/store/go_cache/go_cache_test.go deleted file mode 100644 index 21abbdbd..00000000 --- a/toolkit/gocache/store/go_cache/go_cache_test.go +++ /dev/null @@ -1,346 +0,0 @@ -package go_cache - -import ( - "context" - "fmt" - "testing" - "time" - - "github.com/patrickmn/go-cache" - "github.com/stretchr/testify/assert" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewGoCache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockGoCacheClientInterface(ctrl) - // When - store := NewGoCache(client, lib_store.WithCost(8)) - - // Then - assert.IsType(t, new(GoCacheStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, &lib_store.Options{Cost: 8}, store.options) -} - -func TestGoCacheGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(cacheValue, true) - - store := NewGoCache(client) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestGoCacheGetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(nil, false) - - store := NewGoCache(client) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Nil(t, value) - assert.Error(t, err, lib_store.NotFound{}) -} - -func TestGoCacheGetWithTTL(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().GetWithExpiration(cacheKey).Return(cacheValue, time.Now(), true) - - store := NewGoCache(client) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - assert.Equal(t, int64(0), ttl.Milliseconds()) -} - -func TestGoCacheGetWithTTLWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().GetWithExpiration(cacheKey).Return(nil, time.Now(), false) - - store := NewGoCache(client) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Nil(t, value) - assert.Error(t, err, lib_store.NotFound{}) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestGoCacheSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue, 0*time.Second) - - store := NewGoCache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithCost(4)) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheSetWhenNoOptionsGiven(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue, 0*time.Second) - - store := NewGoCache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue, 0*time.Second) - client.EXPECT().Get("gocache_tag_tag1").Return(nil, true) - cacheKeys := map[string]struct{}{"my-key": {}} - client.EXPECT().Set("gocache_tag_tag1", cacheKeys, 720*time.Hour) - - store := NewGoCache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheSetWithTagsWhenAlreadyInserted(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Set(cacheKey, cacheValue, 0*time.Second) - - cacheKeys := map[string]struct{}{"my-key": {}, "a-second-key": {}} - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, true) - - store := NewGoCache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Delete(cacheKey) - - store := NewGoCache(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := map[string]struct{}{"a23fdf987h2svc23": {}, "jHG2372x38hf74": {}} - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, true) - client.EXPECT().Delete("a23fdf987h2svc23") - client.EXPECT().Delete("jHG2372x38hf74") - - store := NewGoCache(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("a23fdf987h2svc23,jHG2372x38hf74") - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, false) - - store := NewGoCache(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockGoCacheClientInterface(ctrl) - client.EXPECT().Flush() - - store := NewGoCache(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestGoCacheGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockGoCacheClientInterface(ctrl) - - store := NewGoCache(client) - - // When - Then - assert.Equal(t, GoCacheType, store.GetType()) -} - -func TestGoCacheSetTagsConcurrency(t *testing.T) { - ctx := context.Background() - - client := cache.New(10*time.Second, 30*time.Second) - store := NewGoCache(client) - - for i := 0; i < 200; i++ { - go func(i int) { - key := fmt.Sprintf("%d", i) - - err := store.Set( - ctx, - key, - []string{"one", "two"}, - lib_store.WithTags([]string{"tag1", "tag2", "tag3"}), - ) - assert.Nil(t, err, err) - }(i) - } -} - -func TestGoCacheInvalidateConcurrency(t *testing.T) { - ctx := context.Background() - - client := cache.New(10*time.Second, 30*time.Second) - store := NewGoCache(client) - - var tags []string - for i := 0; i < 200; i++ { - tags = append(tags, fmt.Sprintf("tag%d", i)) - } - - for i := 0; i < 200; i++ { - - go func(i int) { - key := fmt.Sprintf("%d", i) - - err := store.Set(ctx, key, []string{"one", "two"}, lib_store.WithTags(tags)) - assert.Nil(t, err, err) - }(i) - - go func(i int) { - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{fmt.Sprintf("tag%d", i)})) - assert.Nil(t, err, err) - }(i) - - } -} diff --git a/toolkit/gocache/store/hazelcast/hazelcast.go b/toolkit/gocache/store/hazelcast/hazelcast.go deleted file mode 100644 index 03320a46..00000000 --- a/toolkit/gocache/store/hazelcast/hazelcast.go +++ /dev/null @@ -1,184 +0,0 @@ -package hazelcast - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - "github.com/hazelcast/hazelcast-go-client" - "github.com/hazelcast/hazelcast-go-client/types" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "golang.org/x/sync/errgroup" -) - -// HazelcastMapInterface represents a hazelcast/hazelcast-go-client map -type HazelcastMapInterface interface { - Get(ctx context.Context, key any) (any, error) - GetEntryView(ctx context.Context, key any) (*types.SimpleEntryView, error) - SetWithTTL(ctx context.Context, key any, value any, ttl time.Duration) error - Remove(ctx context.Context, key any) (any, error) - Clear(ctx context.Context) error -} - -type HazelcastMapInterfaceProvider func(ctx context.Context) (HazelcastMapInterface, error) - -const ( - // HazelcastType represents the storage type as a string value - HazelcastType = "hazelcast" - // HazelcastTagPattern represents the tag pattern to be used as a key in specified storage - HazelcastTagPattern = "gocache_tag_%s" - - TagKeyExpiry = 720 * time.Hour -) - -// HazelcastStore is a store for Hazelcast -type HazelcastStore struct { - mapProvider HazelcastMapInterfaceProvider - options *lib_store.Options -} - -// NewHazelcast creates a new store to Hazelcast instance(s) -func NewHazelcast(hzClient *hazelcast.Client, mapName string, options ...lib_store.Option) *HazelcastStore { - return &HazelcastStore{ - mapProvider: func(ctx context.Context) (HazelcastMapInterface, error) { - return hzClient.GetMap(ctx, mapName) - }, - options: lib_store.ApplyOptions(options...), - } -} - -// newHazelcast creates a new store with given HazelcastMapInterface for test purpose -func newHazelcast(hzMap HazelcastMapInterface, options ...lib_store.Option) *HazelcastStore { - return &HazelcastStore{ - mapProvider: func(ctx context.Context) (HazelcastMapInterface, error) { - return hzMap, nil - }, - options: lib_store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key -func (s *HazelcastStore) Get(ctx context.Context, key any) (any, error) { - hzMap, err := s.mapProvider(ctx) - if err != nil { - return nil, err - } - value, err := hzMap.Get(ctx, key) - if err != nil { - return nil, err - } - if value == nil { - return nil, lib_store.NotFoundWithCause(errors.New("unable to retrieve data from hazelcast")) - } - return value, err -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (s *HazelcastStore) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - hzMap, err := s.mapProvider(ctx) - if err != nil { - return nil, 0, err - } - entryView, err := hzMap.GetEntryView(ctx, key) - if err != nil { - return nil, 0, err - } - if entryView == nil { - return nil, 0, lib_store.NotFoundWithCause(errors.New("unable to retrieve data from hazelcast")) - } - return entryView.Value, time.Duration(entryView.TTL) * time.Millisecond, err -} - -// Set defines data in Hazelcast for given key identifier -func (s *HazelcastStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptionsWithDefault(s.options, options...) - hzMap, err := s.mapProvider(ctx) - if err != nil { - return err - } - err = hzMap.SetWithTTL(ctx, key, value, opts.Expiration) - if err != nil { - return err - } - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, hzMap, key, tags) - } - return nil -} - -func (s *HazelcastStore) setTags(ctx context.Context, hzMap HazelcastMapInterface, key any, tags []string) { - group, ctx := errgroup.WithContext(ctx) - for _, tag := range tags { - currentTag := tag - group.Go(func() error { - tagKey := fmt.Sprintf(HazelcastTagPattern, currentTag) - tagValue, err := hzMap.Get(ctx, tagKey) - if err != nil { - return err - } - if tagValue == nil { - return hzMap.SetWithTTL(ctx, tagKey, key.(string), TagKeyExpiry) - } - cacheKeys := strings.Split(tagValue.(string), ",") - for _, cacheKey := range cacheKeys { - if key == cacheKey { - return nil - } - } - cacheKeys = append(cacheKeys, key.(string)) - newTagValue := strings.Join(cacheKeys, ",") - return hzMap.SetWithTTL(ctx, tagKey, newTagValue, TagKeyExpiry) - }) - } - group.Wait() -} - -// Delete removes data from Hazelcast for given key identifier -func (s *HazelcastStore) Delete(ctx context.Context, key any) error { - hzMap, err := s.mapProvider(ctx) - if err != nil { - return err - } - _, err = hzMap.Remove(ctx, key) - return err -} - -// Invalidate invalidates some cache data in Hazelcast for given options -func (s *HazelcastStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - if tags := opts.Tags; len(tags) > 0 { - hzMap, err := s.mapProvider(ctx) - if err != nil { - return err - } - for _, tag := range tags { - tagKey := fmt.Sprintf(HazelcastTagPattern, tag) - tagValue, err := hzMap.Get(ctx, tagKey) - if err != nil || tagValue == nil { - continue - } - cacheKeys := strings.Split(tagValue.(string), ",") - for _, cacheKey := range cacheKeys { - hzMap.Remove(ctx, cacheKey) - } - hzMap.Remove(ctx, tagKey) - } - } - return nil -} - -// Clear resets all data in the store -func (s *HazelcastStore) Clear(ctx context.Context) error { - hzMap, err := s.mapProvider(ctx) - if err != nil { - return err - } - return hzMap.Clear(ctx) -} - -// GetType returns the store type -func (s *HazelcastStore) GetType() string { - return HazelcastType -} diff --git a/toolkit/gocache/store/hazelcast/hazelcast_benchmark_test.go b/toolkit/gocache/store/hazelcast/hazelcast_benchmark_test.go deleted file mode 100644 index 8b098e72..00000000 --- a/toolkit/gocache/store/hazelcast/hazelcast_benchmark_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package hazelcast - -import ( - "context" - "fmt" - "math" - "testing" - - "github.com/hazelcast/hazelcast-go-client" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkHazelcastSet(b *testing.B) { - ctx := context.Background() - - hzClient, err := hazelcast.StartNewClient(ctx) - if err != nil { - b.Fatalf("Failed to start client: %v", err) - } - - store := NewHazelcast(hzClient, "gocache") - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkHazelcastGet(b *testing.B) { - ctx := context.Background() - - hzClient, err := hazelcast.StartNewClient(ctx) - if err != nil { - b.Fatalf("Failed to start client: %v", err) - } - - store := NewHazelcast(hzClient, "gocache") - - key := "test" - value := []byte("value") - - store.Set(ctx, key, value) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/hazelcast/hazelcast_mock.go b/toolkit/gocache/store/hazelcast/hazelcast_mock.go deleted file mode 100644 index 1b306501..00000000 --- a/toolkit/gocache/store/hazelcast/hazelcast_mock.go +++ /dev/null @@ -1,110 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/hazelcast/hazelcast.go - -// Package hazelcast is a generated GoMock package. -package hazelcast - -import ( - context "context" - reflect "reflect" - time "time" - - types "github.com/hazelcast/hazelcast-go-client/types" - gomock "go.uber.org/mock/gomock" -) - -// MockHazelcastMapInterface is a mock of HazelcastMapInterface interface. -type MockHazelcastMapInterface struct { - ctrl *gomock.Controller - recorder *MockHazelcastMapInterfaceMockRecorder -} - -// MockHazelcastMapInterfaceMockRecorder is the mock recorder for MockHazelcastMapInterface. -type MockHazelcastMapInterfaceMockRecorder struct { - mock *MockHazelcastMapInterface -} - -// NewMockHazelcastMapInterface creates a new mock instance. -func NewMockHazelcastMapInterface(ctrl *gomock.Controller) *MockHazelcastMapInterface { - mock := &MockHazelcastMapInterface{ctrl: ctrl} - mock.recorder = &MockHazelcastMapInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockHazelcastMapInterface) EXPECT() *MockHazelcastMapInterfaceMockRecorder { - return m.recorder -} - -// Clear mocks base method. -func (m *MockHazelcastMapInterface) Clear(ctx context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Clear", ctx) - ret0, _ := ret[0].(error) - return ret0 -} - -// Clear indicates an expected call of Clear. -func (mr *MockHazelcastMapInterfaceMockRecorder) Clear(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockHazelcastMapInterface)(nil).Clear), ctx) -} - -// Get mocks base method. -func (m *MockHazelcastMapInterface) Get(ctx context.Context, key any) (any, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", ctx, key) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockHazelcastMapInterfaceMockRecorder) Get(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockHazelcastMapInterface)(nil).Get), ctx, key) -} - -// GetEntryView mocks base method. -func (m *MockHazelcastMapInterface) GetEntryView(ctx context.Context, key any) (*types.SimpleEntryView, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetEntryView", ctx, key) - ret0, _ := ret[0].(*types.SimpleEntryView) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetEntryView indicates an expected call of GetEntryView. -func (mr *MockHazelcastMapInterfaceMockRecorder) GetEntryView(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEntryView", reflect.TypeOf((*MockHazelcastMapInterface)(nil).GetEntryView), ctx, key) -} - -// Remove mocks base method. -func (m *MockHazelcastMapInterface) Remove(ctx context.Context, key any) (any, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Remove", ctx, key) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Remove indicates an expected call of Remove. -func (mr *MockHazelcastMapInterfaceMockRecorder) Remove(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Remove", reflect.TypeOf((*MockHazelcastMapInterface)(nil).Remove), ctx, key) -} - -// SetWithTTL mocks base method. -func (m *MockHazelcastMapInterface) SetWithTTL(ctx context.Context, key, value any, ttl time.Duration) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetWithTTL", ctx, key, value, ttl) - ret0, _ := ret[0].(error) - return ret0 -} - -// SetWithTTL indicates an expected call of SetWithTTL. -func (mr *MockHazelcastMapInterfaceMockRecorder) SetWithTTL(ctx, key, value, ttl interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWithTTL", reflect.TypeOf((*MockHazelcastMapInterface)(nil).SetWithTTL), ctx, key, value, ttl) -} diff --git a/toolkit/gocache/store/hazelcast/hazelcast_test.go b/toolkit/gocache/store/hazelcast/hazelcast_test.go deleted file mode 100644 index 8bff8d76..00000000 --- a/toolkit/gocache/store/hazelcast/hazelcast_test.go +++ /dev/null @@ -1,201 +0,0 @@ -package hazelcast - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "go.uber.org/mock/gomock" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func TestNewHazelcast(t *testing.T) { - // Given - mapName := "gocache" - - // When - store := NewHazelcast(nil, mapName, lib_store.WithExpiration(6*time.Second)) - - // Then - assert.IsType(t, new(HazelcastStore), store) - assert.NotNil(t, store.mapProvider) - assert.Equal(t, &lib_store.Options{Expiration: 6 * time.Second}, store.options) -} - -func TestHazelcastGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().Get(ctx, "my-key").Return("my-value", nil) - - store := newHazelcast(hzMap) - - // When - value, err := store.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.NotNil(t, value) -} - -func TestHazelcastSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().SetWithTTL(ctx, cacheKey, cacheValue, 5*time.Second).Return(nil) - - store := newHazelcast(hzMap, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(5*time.Second)) - - // Then - assert.Nil(t, err) -} - -func TestHazelcastSetWhenNoOptionsGiven(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().SetWithTTL(ctx, cacheKey, cacheValue, 6*time.Second).Return(nil) - - store := newHazelcast(hzMap, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestHazelcastSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().SetWithTTL(ctx, cacheKey, cacheValue, time.Duration(0)).Return(nil) - hzMap.EXPECT().SetWithTTL(gomock.Any(), "gocache_tag_tag1", cacheKey, TagKeyExpiry).Return(nil) - hzMap.EXPECT().Get(gomock.Any(), "gocache_tag_tag1").Return(nil, nil) - - store := newHazelcast(hzMap) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestHazelcastDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().Remove(ctx, "my-key").Return(0, nil) - - store := newHazelcast(hzMap) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestHazelcastInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().Get(ctx, "gocache_tag_tag1").Return(nil, nil) - - store := newHazelcast(hzMap) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestHazelcastInvalidateWhenCacheKeysExist(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := "my-key0,my-key1,my-key2" - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().Get(ctx, "gocache_tag_tag1").Return(cacheKeys, nil) - hzMap.EXPECT().Remove(ctx, "my-key0").Return("my-value0", nil) - hzMap.EXPECT().Remove(ctx, "my-key1").Return("my-value1", nil) - hzMap.EXPECT().Remove(ctx, "my-key2").Return("my-value2", nil) - hzMap.EXPECT().Remove(ctx, "gocache_tag_tag1").Return(cacheKeys, nil) - - store := newHazelcast(hzMap) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestHazelcastClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - hzMap := NewMockHazelcastMapInterface(ctrl) - hzMap.EXPECT().Clear(ctx).Return(nil) - - store := newHazelcast(hzMap, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestHazelcastType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - hzMap := NewMockHazelcastMapInterface(ctrl) - - store := newHazelcast(hzMap) - - // When - Then - assert.Equal(t, HazelcastType, store.GetType()) -} diff --git a/toolkit/gocache/store/memcache/memcache.go b/toolkit/gocache/store/memcache/memcache.go deleted file mode 100644 index 238d4d07..00000000 --- a/toolkit/gocache/store/memcache/memcache.go +++ /dev/null @@ -1,199 +0,0 @@ -package memcache - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "golang.org/x/sync/errgroup" - - "github.com/bradfitz/gomemcache/memcache" -) - -// MemcacheClientInterface represents a bradfitz/gomemcache client -type MemcacheClientInterface interface { - Get(key string) (item *memcache.Item, err error) - Set(item *memcache.Item) error - Delete(item string) error - FlushAll() error - CompareAndSwap(item *memcache.Item) error - Add(item *memcache.Item) error -} - -const ( - // MemcacheType represents the storage type as a string value - MemcacheType = "memcache" - // MemcacheTagPattern represents the tag pattern to be used as a key in specified storage - MemcacheTagPattern = "gocache_tag_%s" - - TagKeyExpiry = 720 * time.Hour -) - -// MemcacheStore is a store for Memcache -type MemcacheStore struct { - client MemcacheClientInterface - options *lib_store.Options -} - -// NewMemcache creates a new store to Memcache instance(s) -func NewMemcache(client MemcacheClientInterface, options ...lib_store.Option) *MemcacheStore { - return &MemcacheStore{ - client: client, - options: lib_store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key -func (s *MemcacheStore) Get(_ context.Context, key any) (any, error) { - item, err := s.client.Get(key.(string)) - if err != nil { - return nil, err - } - if item == nil { - return nil, lib_store.NotFoundWithCause(errors.New("unable to retrieve data from memcache")) - } - - return item.Value, err -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (s *MemcacheStore) GetWithTTL(_ context.Context, key any) (any, time.Duration, error) { - item, err := s.client.Get(key.(string)) - if err != nil { - return nil, 0, err - } - if item == nil { - return nil, 0, lib_store.NotFoundWithCause(errors.New("unable to retrieve data from memcache")) - } - - return item.Value, time.Duration(item.Expiration) * time.Second, err -} - -// Set defines data in Memcache for given key identifier -func (s *MemcacheStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptionsWithDefault(s.options, options...) - - item := &memcache.Item{ - Key: key.(string), - Value: value.([]byte), - Expiration: int32(opts.Expiration.Seconds()), - } - - err := s.client.Set(item) - if err != nil { - return err - } - - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, key, tags) - } - - return nil -} - -func (s *MemcacheStore) setTags(ctx context.Context, key any, tags []string) { - group, ctx := errgroup.WithContext(ctx) - for _, tag := range tags { - currentTag := tag - group.Go(func() error { - tagKey := fmt.Sprintf(MemcacheTagPattern, currentTag) - - var err error - for i := 0; i < 3; i++ { - if err = s.addKeyToTagValue(tagKey, key); err == nil { - return nil - } - // loop to retry any failure (including race conditions) - } - - return err - }) - } - - group.Wait() -} - -func (s *MemcacheStore) addKeyToTagValue(tagKey string, key any) error { - var ( - cacheKeys = []string{} - result *memcache.Item - err error - ) - - result, err = s.client.Get(tagKey) - if err == nil { - cacheKeys = strings.Split(string(result.Value), ",") - } else if !errors.Is(err, memcache.ErrCacheMiss) { - return err - } - - for _, cacheKey := range cacheKeys { - // if key already exists, nothing to do - if cacheKey == key.(string) { - return nil - } - } - - cacheKeys = append(cacheKeys, key.(string)) - - newVal := []byte(strings.Join(cacheKeys, ",")) - - if result == nil { - // if key didnt exist, use Add to create only if still not there - return s.client.Add(&memcache.Item{ - Key: tagKey, - Value: newVal, - Expiration: int32(TagKeyExpiry.Seconds()), - }) - } - - // update existing value - // using CompareAndSwap to ensure not to run over writes between Get and here - result.Value = newVal - result.Expiration = int32(TagKeyExpiry.Seconds()) - return s.client.CompareAndSwap(result) -} - -// Delete removes data from Memcache for given key identifier -func (s *MemcacheStore) Delete(_ context.Context, key any) error { - return s.client.Delete(key.(string)) -} - -// Invalidate invalidates some cache data in Memcache for given options -func (s *MemcacheStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(MemcacheTagPattern, tag) - result, err := s.Get(ctx, tagKey) - if err != nil { - return nil - } - - cacheKeys := []string{} - if bytes, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(bytes), ",") - } - - for _, cacheKey := range cacheKeys { - s.Delete(ctx, cacheKey) - } - } - } - - return nil -} - -// Clear resets all data in the store -func (s *MemcacheStore) Clear(_ context.Context) error { - return s.client.FlushAll() -} - -// GetType returns the store type -func (s *MemcacheStore) GetType() string { - return MemcacheType -} diff --git a/toolkit/gocache/store/memcache/memcache_bench_test.go b/toolkit/gocache/store/memcache/memcache_bench_test.go deleted file mode 100644 index cf8db474..00000000 --- a/toolkit/gocache/store/memcache/memcache_bench_test.go +++ /dev/null @@ -1,56 +0,0 @@ -package memcache - -import ( - "context" - "fmt" - "math" - "testing" - "time" - - "github.com/bradfitz/gomemcache/memcache" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkMemcacheSet(b *testing.B) { - ctx := context.Background() - - store := NewMemcache( - memcache.New("127.0.0.1:11211"), - lib_store.WithExpiration(100*time.Second), - ) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkMemcacheGet(b *testing.B) { - ctx := context.Background() - - store := NewMemcache( - memcache.New("127.0.0.1:11211"), - lib_store.WithExpiration(100*time.Second), - ) - - key := "test" - value := []byte("value") - - store.Set(ctx, key, value, nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/memcache/memcache_mock.go b/toolkit/gocache/store/memcache/memcache_mock.go deleted file mode 100644 index 55742280..00000000 --- a/toolkit/gocache/store/memcache/memcache_mock.go +++ /dev/null @@ -1,120 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/memcache/memcache.go - -// Package memcache is a generated GoMock package. -package memcache - -import ( - reflect "reflect" - - memcache "github.com/bradfitz/gomemcache/memcache" - gomock "go.uber.org/mock/gomock" -) - -// MockMemcacheClientInterface is a mock of MemcacheClientInterface interface. -type MockMemcacheClientInterface struct { - ctrl *gomock.Controller - recorder *MockMemcacheClientInterfaceMockRecorder -} - -// MockMemcacheClientInterfaceMockRecorder is the mock recorder for MockMemcacheClientInterface. -type MockMemcacheClientInterfaceMockRecorder struct { - mock *MockMemcacheClientInterface -} - -// NewMockMemcacheClientInterface creates a new mock instance. -func NewMockMemcacheClientInterface(ctrl *gomock.Controller) *MockMemcacheClientInterface { - mock := &MockMemcacheClientInterface{ctrl: ctrl} - mock.recorder = &MockMemcacheClientInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockMemcacheClientInterface) EXPECT() *MockMemcacheClientInterfaceMockRecorder { - return m.recorder -} - -// Add mocks base method. -func (m *MockMemcacheClientInterface) Add(item *memcache.Item) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Add", item) - ret0, _ := ret[0].(error) - return ret0 -} - -// Add indicates an expected call of Add. -func (mr *MockMemcacheClientInterfaceMockRecorder) Add(item interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockMemcacheClientInterface)(nil).Add), item) -} - -// CompareAndSwap mocks base method. -func (m *MockMemcacheClientInterface) CompareAndSwap(item *memcache.Item) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CompareAndSwap", item) - ret0, _ := ret[0].(error) - return ret0 -} - -// CompareAndSwap indicates an expected call of CompareAndSwap. -func (mr *MockMemcacheClientInterfaceMockRecorder) CompareAndSwap(item interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompareAndSwap", reflect.TypeOf((*MockMemcacheClientInterface)(nil).CompareAndSwap), item) -} - -// Delete mocks base method. -func (m *MockMemcacheClientInterface) Delete(item string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", item) - ret0, _ := ret[0].(error) - return ret0 -} - -// Delete indicates an expected call of Delete. -func (mr *MockMemcacheClientInterfaceMockRecorder) Delete(item interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockMemcacheClientInterface)(nil).Delete), item) -} - -// FlushAll mocks base method. -func (m *MockMemcacheClientInterface) FlushAll() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FlushAll") - ret0, _ := ret[0].(error) - return ret0 -} - -// FlushAll indicates an expected call of FlushAll. -func (mr *MockMemcacheClientInterfaceMockRecorder) FlushAll() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushAll", reflect.TypeOf((*MockMemcacheClientInterface)(nil).FlushAll)) -} - -// Get mocks base method. -func (m *MockMemcacheClientInterface) Get(key string) (*memcache.Item, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", key) - ret0, _ := ret[0].(*memcache.Item) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockMemcacheClientInterfaceMockRecorder) Get(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMemcacheClientInterface)(nil).Get), key) -} - -// Set mocks base method. -func (m *MockMemcacheClientInterface) Set(item *memcache.Item) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Set", item) - ret0, _ := ret[0].(error) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockMemcacheClientInterfaceMockRecorder) Set(item interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockMemcacheClientInterface)(nil).Set), item) -} diff --git a/toolkit/gocache/store/memcache/memcache_test.go b/toolkit/gocache/store/memcache/memcache_test.go deleted file mode 100644 index 44ab92e4..00000000 --- a/toolkit/gocache/store/memcache/memcache_test.go +++ /dev/null @@ -1,417 +0,0 @@ -package memcache - -import ( - "context" - "errors" - "testing" - "time" - - "github.com/bradfitz/gomemcache/memcache" - "github.com/stretchr/testify/assert" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewMemcache(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockMemcacheClientInterface(ctrl) - - // When - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // Then - assert.IsType(t, new(MemcacheStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, &lib_store.Options{Expiration: 3 * time.Second}, store.options) -} - -func TestMemcacheGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(&memcache.Item{ - Value: cacheValue, - }, nil) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestMemcacheGetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - expectedErr := errors.New("an unexpected error occurred") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(nil, expectedErr) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Equal(t, expectedErr, err) - assert.Nil(t, value) -} - -func TestMemcacheGetWithTTL(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(&memcache.Item{ - Value: cacheValue, - Expiration: int32(5), - }, nil) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - assert.Equal(t, 5*time.Second, ttl) -} - -func TestMemcacheGetWithTTLWhenMissingItem(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(nil, nil) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.NotNil(t, err) - assert.Nil(t, value) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestMemcacheGetWithTTLWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - expectedErr := errors.New("an unexpected error occurred") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(nil, expectedErr) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Equal(t, expectedErr, err) - assert.Nil(t, value) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestMemcacheSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Set(&memcache.Item{ - Key: cacheKey, - Value: cacheValue, - Expiration: int32(5), - }).Return(nil) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(5*time.Second)) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheSetWhenNoOptionsGiven(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Set(&memcache.Item{ - Key: cacheKey, - Value: cacheValue, - Expiration: int32(3), - }).Return(nil) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheSetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - expectedErr := errors.New("an unexpected error occurred") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Set(&memcache.Item{ - Key: cacheKey, - Value: cacheValue, - Expiration: int32(3), - }).Return(expectedErr) - - store := NewMemcache(client, lib_store.WithExpiration(3*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestMemcacheSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - tagKey := "gocache_tag_tag1" - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Set(gomock.Any()).AnyTimes().Return(nil) - client.EXPECT().Get(tagKey).Return(nil, memcache.ErrCacheMiss) - client.EXPECT().Add(&memcache.Item{ - Key: tagKey, - Value: []byte(cacheKey), - Expiration: int32(TagKeyExpiry.Seconds()), - }).Return(nil) - - store := NewMemcache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheSetWithTagsWhenAlreadyInserted(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Set(gomock.Any()).AnyTimes().Return(nil) - client.EXPECT().Get("gocache_tag_tag1").Return(&memcache.Item{ - Value: []byte("my-key,a-second-key"), - }, nil) - - store := NewMemcache(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Delete(cacheKey).Return(nil) - - store := NewMemcache(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheDeleteWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("unable to delete key") - - cacheKey := "my-key" - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Delete(cacheKey).Return(expectedErr) - - store := NewMemcache(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestMemcacheInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := &memcache.Item{ - Value: []byte("a23fdf987h2svc23,jHG2372x38hf74"), - } - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, nil) - client.EXPECT().Delete("a23fdf987h2svc23").Return(nil) - client.EXPECT().Delete("jHG2372x38hf74").Return(nil) - - store := NewMemcache(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := &memcache.Item{ - Value: []byte("a23fdf987h2svc23,jHG2372x38hf74"), - } - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, nil) - client.EXPECT().Delete("a23fdf987h2svc23").Return(errors.New("unexpected error")) - client.EXPECT().Delete("jHG2372x38hf74").Return(nil) - - store := NewMemcache(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().FlushAll().Return(nil) - - store := NewMemcache(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestMemcacheClearWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - expectedErr := errors.New("an unexpected error occurred") - - client := NewMockMemcacheClientInterface(ctrl) - client.EXPECT().FlushAll().Return(expectedErr) - - store := NewMemcache(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Equal(t, expectedErr, err) -} - -func TestMemcacheGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockMemcacheClientInterface(ctrl) - - store := NewMemcache(client) - - // When - Then - assert.Equal(t, MemcacheType, store.GetType()) -} diff --git a/toolkit/gocache/store/pegasus/pegasus.go b/toolkit/gocache/store/pegasus/pegasus.go deleted file mode 100644 index 1e54f175..00000000 --- a/toolkit/gocache/store/pegasus/pegasus.go +++ /dev/null @@ -1,305 +0,0 @@ -package pegasus - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - "github.com/XiaoMi/pegasus-go-client/admin" - "github.com/XiaoMi/pegasus-go-client/pegasus" - "github.com/spf13/cast" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // PegasusType represents the storage type as a string value - PegasusType = "pegasus" - // PegasusTagPattern represents the tag pattern to be used as a key in specified storage - PegasusTagPattern = "gocache_tag_%s" - // Pegasus ttl(time-to-live) in seconds: -1 if ttl is not set; -2 if entry doesn't exist - PegasusNOTTL = -1 - PegasusNOENTRY = -2 - - DefaultTable = "gocache_pegasus" - DefaultTablePartitionNum = 4 - DefaultScanNum = 100 -) - -// empty represent empty sort key, more info reference: https://github.com/XiaoMi/pegasus-go-client/blob/f3b6b08bc4c227982bb5b73106329435fda97a38/pegasus/table_connector.go#L83 -var empty = []byte("-") - -// OptionsPegasus is options of Pegasus -type OptionsPegasus struct { - *lib_store.Options - MetaServers []string - - TableName string - TablePartitionNum int - TableScanNum int -} - -// PegasusStore is a store for Pegasus -type PegasusStore struct { - client pegasus.Client - options *OptionsPegasus -} - -// NewPegasus creates a new store to pegasus instance(s) -func NewPegasus(ctx context.Context, options *OptionsPegasus) (*PegasusStore, error) { - if options == nil { - options = &OptionsPegasus{} - } - - if err := createTable(ctx, options); err != nil { - return nil, err - } - - client := pegasus.NewClient(pegasus.Config{ - MetaServers: options.MetaServers, - }) - table, err := client.OpenTable(ctx, options.TableName) - if err != nil { - return nil, err - } - defer table.Close() - - return &PegasusStore{ - client: client, - options: options, - }, nil -} - -// validateOptions validate pegasus options -func validateOptions(options *OptionsPegasus) error { - if len(options.MetaServers) == 0 { - return errors.New("pegasus meta servers must fill") - } - if len(options.TableName) == 0 { - options.TableName = DefaultTable - } - if options.TablePartitionNum < 1 { - options.TablePartitionNum = DefaultTablePartitionNum - } - if options.TableScanNum < 1 { - options.TableScanNum = DefaultScanNum - } - - return nil -} - -// createTable for create table by options -func createTable(ctx context.Context, options *OptionsPegasus) error { - if err := validateOptions(options); err != nil { - return err - } - - tableClient := admin.NewClient(admin.Config{MetaServers: options.MetaServers}) - tableList, err := tableClient.ListTables(ctx) - if err != nil { - return err - } - - for i := range tableList { - if tableList[i].Name == options.TableName { - return nil - } - } - - // if not found then create table of options - return tableClient.CreateTable(ctx, options.TableName, options.TablePartitionNum) -} - -// dropTable for drop table -func dropTable(ctx context.Context, options *OptionsPegasus) error { - if err := validateOptions(options); err != nil { - return err - } - - tableClient := admin.NewClient(admin.Config{MetaServers: options.MetaServers}) - return tableClient.DropTable(ctx, options.TableName) -} - -// Close when exit store -func (p *PegasusStore) Close() error { - return p.client.Close() -} - -// Get returns data stored from a given key -func (p *PegasusStore) Get(ctx context.Context, key any) (any, error) { - table, err := p.client.OpenTable(ctx, p.options.TableName) - if err != nil { - return nil, err - } - defer table.Close() - - value, err := table.Get(ctx, []byte(cast.ToString(key)), empty) - if err != nil { - return nil, err - } - if value == nil { - return nil, &lib_store.NotFound{} - } - return value, nil -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (p *PegasusStore) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - table, err := p.client.OpenTable(ctx, p.options.TableName) - if err != nil { - return nil, 0, err - } - defer table.Close() - - value, err := table.Get(ctx, []byte(cast.ToString(key)), empty) - if err != nil { - return nil, 0, err - } - if value == nil { - return nil, 0, &lib_store.NotFound{} - } - - ttl, err := table.TTL(ctx, []byte(cast.ToString(key)), empty) - if err != nil { - return nil, 0, err - } - - return value, time.Duration(ttl) * time.Second, nil -} - -// Set defines data in Pegasus for given key identifier -func (p *PegasusStore) Set(ctx context.Context, key, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptions(options...) - - table, err := p.client.OpenTable(ctx, p.options.TableName) - if err != nil { - return err - } - defer table.Close() - - err = table.SetTTL(ctx, []byte(cast.ToString(key)), empty, []byte(cast.ToString(value)), opts.Expiration) - if err != nil { - return err - } - - if tags := opts.Tags; len(tags) > 0 { - if err = p.setTags(ctx, key, tags); err != nil { - return err - } - } - return nil -} - -func (p *PegasusStore) setTags(ctx context.Context, key any, tags []string) error { - for _, tag := range tags { - tagKey := fmt.Sprintf(PegasusTagPattern, tag) - cacheKeys := []string{} - - if result, err := p.Get(ctx, tagKey); err == nil { - if bytes, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(bytes), ",") - } - } - - alreadyInserted := false - for _, cacheKey := range cacheKeys { - if cacheKey == key.(string) { - alreadyInserted = true - break - } - } - - if !alreadyInserted { - cacheKeys = append(cacheKeys, key.(string)) - } - - if err := p.Set(ctx, tagKey, []byte(strings.Join(cacheKeys, ",")), lib_store.WithExpiration(720*time.Hour)); err != nil { - return err - } - } - - return nil -} - -// Delete removes data from Pegasus for given key identifier -func (p *PegasusStore) Delete(ctx context.Context, key any) error { - table, err := p.client.OpenTable(ctx, p.options.TableName) - if err != nil { - return err - } - defer table.Close() - - return table.Del(ctx, []byte(cast.ToString(key)), empty) -} - -// Invalidate invalidates some cache data in Pegasus for given options -func (p *PegasusStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(PegasusTagPattern, tag) - result, err := p.Get(ctx, tagKey) - if err != nil { - return nil - } - - cacheKeys := []string{} - if bytes, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(bytes), ",") - } - - for _, cacheKey := range cacheKeys { - if err := p.Delete(ctx, cacheKey); err != nil { - return err - } - } - } - } - - return nil -} - -// Clear resets all data in the store -func (p *PegasusStore) Clear(ctx context.Context) error { - table, err := p.client.OpenTable(ctx, p.options.TableName) - if err != nil { - return err - } - defer table.Close() - - // init full scan - scanners, err := table.GetUnorderedScanners(ctx, p.options.TablePartitionNum, &pegasus.ScannerOptions{ - BatchSize: p.options.TableScanNum, - // Values can be optimized out during scanning to reduce the workload. - NoValue: true, - }) - if err != nil { - return err - } - - // full scan and delete - for _, scanner := range scanners { - // Iterates sequentially. - for { - completed, hashKey, _, _, err := scanner.Next(ctx) - if err != nil { - return err - } - if completed { - break - } - err = p.Delete(ctx, hashKey) - if err != nil { - return err - } - } - } - return nil -} - -// GetType returns the store type -func (p *PegasusStore) GetType() string { - return PegasusType -} diff --git a/toolkit/gocache/store/pegasus/pegasus_bench_test.go b/toolkit/gocache/store/pegasus/pegasus_bench_test.go deleted file mode 100644 index 5996463a..00000000 --- a/toolkit/gocache/store/pegasus/pegasus_bench_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package pegasus - -import ( - "context" - "fmt" - "math" - "testing" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// run go test -bench='BenchmarkPegasusStore*' -benchtime=1s -count=1 -run=none -func BenchmarkPegasusStore_Set(b *testing.B) { - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - p.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkPegasusStore_Get(b *testing.B) { - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - key := "test" - value := []byte("value") - - p.Set(ctx, key, value, nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = p.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/pegasus/pegasus_test.go b/toolkit/gocache/store/pegasus/pegasus_test.go deleted file mode 100644 index 9a59b91b..00000000 --- a/toolkit/gocache/store/pegasus/pegasus_test.go +++ /dev/null @@ -1,219 +0,0 @@ -package pegasus - -import ( - "context" - "testing" - "time" - - "github.com/smartystreets/assertions/should" - . "github.com/smartystreets/goconvey/convey" - "github.com/spf13/cast" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// run go test -run='TestPegasus*' -race -cover -coverprofile=coverage.txt -covermode=atomic -v ./... -// install local pegasus onebox reference https://pegasus.apache.org/en/docs/build/compile-from-source/ -func testPegasusOptions() *OptionsPegasus { - return &OptionsPegasus{ - MetaServers: []string{"127.0.0.1:34601", "127.0.0.1:34602", "127.0.0.1:34603"}, - TableName: "test_pegasus_table", - TablePartitionNum: 1, - } -} - -func skipPegasusTest(t *testing.T) { - t.Skip("Pegasus Test skipping because local pegasus onebox not install!") -} - -func TestNewPegasus(t *testing.T) { - Convey("Pegasus TestNewPegasus should return client and nil error", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, err := NewPegasus(ctx, testPegasusOptions()) - So(err, ShouldBeNil) - defer p.Close() - }) -} - -func Test_validateOptions(t *testing.T) { - Convey("Pegasus Test validateOptions", t, func() { - Convey("Test nil validateOptions", func() { - So(validateOptions(&OptionsPegasus{}), ShouldNotBeNil) - }) - Convey("Test correct validateOptions", func() { - So(validateOptions(testPegasusOptions()), ShouldBeNil) - }) - }) -} - -func Test_createTable(t *testing.T) { - Convey("Pegasus Test createTable should return nil", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - err := createTable(ctx, testPegasusOptions()) - So(err, ShouldBeNil) - }) -} - -func Test_dropTable(t *testing.T) { - Convey("Pegasus Test dropTable should return nil", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - err := dropTable(ctx, testPegasusOptions()) - So(err, ShouldBeNil) - }) -} - -func TestPegasusStore_Close(t *testing.T) { - Convey("Pegasus TestClose for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - So(p.Close(), ShouldBeNil) - }) -} - -func TestPegasusStore_Get(t *testing.T) { - Convey("Pegasus TestGet for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - k, v := "test-gocache-key", "test-gocache-value" - p.Set(ctx, k, v) - value, err := p.Get(ctx, k) - So(cast.ToString(value), ShouldEqual, v) - So(err, ShouldBeNil) - }) -} - -func TestPegasusStore_GetWithTTL(t *testing.T) { - Convey("Pegasus TestGetWithTTL for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - Convey("test set ttl that not achieve", func() { - k, v, retention := "test-gocache-key-01", "test-gocache-value", time.Minute*10 - p.Set(ctx, k, v, lib_store.WithExpiration(retention)) - - value, ttl, err := p.GetWithTTL(ctx, k) - So(cast.ToString(value), ShouldEqual, v) - So(ttl, should.BeLessThanOrEqualTo, retention) - So(err, ShouldBeNil) - }) - Convey("test no ttl", func() { - k, v := "test-gocache-key-02", "test-gocache-value" - p.Set(ctx, k, v) - - value, ttl, err := p.GetWithTTL(ctx, k) - So(cast.ToString(value), ShouldEqual, v) - So(ttl, should.BeLessThanOrEqualTo, PegasusNOTTL) - So(err, ShouldBeNil) - }) - Convey("test set ttl that already achieve", func() { - k, v, retention := "test-gocache-key-03", "test-gocache-value", time.Millisecond*10 - p.Set(ctx, k, v, lib_store.WithExpiration(retention)) - time.Sleep(time.Second * 1) - - value, ttl, err := p.GetWithTTL(ctx, k) - So(cast.ToString(value), ShouldBeEmpty) - So(ttl, should.BeLessThanOrEqualTo, PegasusNOENTRY) - So(err, ShouldBeNil) - }) - }) -} - -func TestPegasusStore_Set(t *testing.T) { - Convey("Pegasus TestSet for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - k, v := "test-gocache-key", "test-gocache-value" - err := p.Set(ctx, k, v) - So(err, ShouldBeNil) - }) -} - -func TestPegasusStore_setTags(t *testing.T) { - Convey("Pegasus Test set tags for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - k, tags := "test-gocache-tags-key", []string{"test01", "test02"} - err := p.setTags(ctx, k, tags) - So(err, ShouldBeNil) - }) -} - -func TestPegasusStore_Delete(t *testing.T) { - Convey("Pegasus TestDelete for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - k, v := "test-gocache-key", "test-gocache-value" - p.Set(ctx, k, v) - - err := p.Delete(ctx, k) - So(err, ShouldBeNil) - }) -} - -func TestPegasusStore_Invalidate(t *testing.T) { - Convey("Pegasus TestInvalidate for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - err := p.Invalidate(ctx) - So(err, ShouldBeNil) - }) -} - -func TestPegasusStore_Clear(t *testing.T) { - Convey("Pegasus TestClear for pegasus store", t, func() { - skipPegasusTest(t) - - ctx := context.Background() - - p, _ := NewPegasus(ctx, testPegasusOptions()) - defer p.Close() - - k1, v1 := "test-gocache-key-01", "test-gocache-value" - k2, v2 := "test-gocache-key-01", "test-gocache-value" - p.Set(ctx, k1, v1) - p.Set(ctx, k2, v2) - - err := p.Clear(ctx) - So(err, ShouldBeNil) - }) -} diff --git a/toolkit/gocache/store/redis/redis.go b/toolkit/gocache/store/redis/redis.go deleted file mode 100644 index e4c5716d..00000000 --- a/toolkit/gocache/store/redis/redis.go +++ /dev/null @@ -1,140 +0,0 @@ -package redis - -import ( - "context" - "fmt" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" - - redis "github.com/redis/go-redis/v9" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// RedisClientInterface represents a go-redis/redis client -type RedisClientInterface interface { - Get(ctx context.Context, key string) *redis.StringCmd - TTL(ctx context.Context, key string) *redis.DurationCmd - Expire(ctx context.Context, key string, expiration time.Duration) *redis.BoolCmd - Set(ctx context.Context, key string, values any, expiration time.Duration) *redis.StatusCmd - Del(ctx context.Context, keys ...string) *redis.IntCmd - FlushAll(ctx context.Context) *redis.StatusCmd - SAdd(ctx context.Context, key string, members ...any) *redis.IntCmd - SMembers(ctx context.Context, key string) *redis.StringSliceCmd -} - -const ( - // RedisType represents the storage type as a string value - RedisType = "redis" - // RedisTagPattern represents the tag pattern to be used as a key in specified storage - RedisTagPattern = "gocache_tag_%s" -) - -// RedisStore is a store for Redis -type RedisStore struct { - client RedisClientInterface - options *lib_store.Options -} - -// NewRedis creates a new store to Redis instance(s) -func NewRedis(client RedisClientInterface, options ...lib_store.Option) *RedisStore { - return &RedisStore{ - client: client, - options: lib_store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key -func (s *RedisStore) Get(ctx context.Context, key any) (any, error) { - object, err := s.client.Get(ctx, key.(string)).Result() - if err == redis.Nil { - return nil, lib_store.NotFoundWithCause(err) - } - return object, err -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (s *RedisStore) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - object, err := s.client.Get(ctx, key.(string)).Result() - if err == redis.Nil { - return nil, 0, lib_store.NotFoundWithCause(err) - } - if err != nil { - return nil, 0, err - } - - ttl, err := s.client.TTL(ctx, key.(string)).Result() - if err != nil { - return nil, 0, err - } - - return object, ttl, err -} - -// Set defines data in Redis for given key identifier -func (s *RedisStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptionsWithDefault(s.options, options...) - - err := s.client.Set(ctx, key.(string), value, opts.Expiration).Err() - if err != nil { - return err - } - - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, key, tags) - } - - return nil -} - -func (s *RedisStore) setTags(ctx context.Context, key any, tags []string) { - for _, tag := range tags { - tagKey := fmt.Sprintf(RedisTagPattern, tag) - s.client.SAdd(ctx, tagKey, key.(string)) - s.client.Expire(ctx, tagKey, 720*time.Hour) - } -} - -// Delete removes data from Redis for given key identifier -func (s *RedisStore) Delete(ctx context.Context, key any) error { - _, err := s.client.Del(ctx, key.(string)).Result() - return err -} - -// Invalidate invalidates some cache data in Redis for given options -func (s *RedisStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(RedisTagPattern, tag) - cacheKeys, err := s.client.SMembers(ctx, tagKey).Result() - if err != nil { - zlogger.Warn().Msg(err.Error()) - continue - } - - for _, cacheKey := range cacheKeys { - s.Delete(ctx, cacheKey) - } - - s.Delete(ctx, tagKey) - } - } - - return nil -} - -// GetType returns the store type -func (s *RedisStore) GetType() string { - return RedisType -} - -// Clear resets all data in the store -func (s *RedisStore) Clear(ctx context.Context) error { - if err := s.client.FlushAll(ctx).Err(); err != nil { - return err - } - - return nil -} diff --git a/toolkit/gocache/store/redis/redis_bench_test.go b/toolkit/gocache/store/redis/redis_bench_test.go deleted file mode 100644 index ed17758d..00000000 --- a/toolkit/gocache/store/redis/redis_bench_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package redis - -import ( - "context" - "fmt" - "math" - "testing" - - redis "github.com/redis/go-redis/v9" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkRedisSet(b *testing.B) { - ctx := context.Background() - - store := NewRedis(redis.NewClient(&redis.Options{ - Addr: "localhost:6379", - })) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkRedisGet(b *testing.B) { - ctx := context.Background() - - store := NewRedis(redis.NewClient(&redis.Options{ - Addr: "localhost:6379", - })) - - key := "test" - value := []byte("value") - - store.Set(ctx, key, value) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/redis/redis_mock.go b/toolkit/gocache/store/redis/redis_mock.go deleted file mode 100644 index fc103f45..00000000 --- a/toolkit/gocache/store/redis/redis_mock.go +++ /dev/null @@ -1,159 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/redis/redis.go - -// Package redis is a generated GoMock package. -package redis - -import ( - context "context" - reflect "reflect" - time "time" - - v9 "github.com/redis/go-redis/v9" - gomock "go.uber.org/mock/gomock" -) - -// MockRedisClientInterface is a mock of RedisClientInterface interface. -type MockRedisClientInterface struct { - ctrl *gomock.Controller - recorder *MockRedisClientInterfaceMockRecorder -} - -// MockRedisClientInterfaceMockRecorder is the mock recorder for MockRedisClientInterface. -type MockRedisClientInterfaceMockRecorder struct { - mock *MockRedisClientInterface -} - -// NewMockRedisClientInterface creates a new mock instance. -func NewMockRedisClientInterface(ctrl *gomock.Controller) *MockRedisClientInterface { - mock := &MockRedisClientInterface{ctrl: ctrl} - mock.recorder = &MockRedisClientInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockRedisClientInterface) EXPECT() *MockRedisClientInterfaceMockRecorder { - return m.recorder -} - -// Del mocks base method. -func (m *MockRedisClientInterface) Del(ctx context.Context, keys ...string) *v9.IntCmd { - m.ctrl.T.Helper() - varargs := []interface{}{ctx} - for _, a := range keys { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Del", varargs...) - ret0, _ := ret[0].(*v9.IntCmd) - return ret0 -} - -// Del indicates an expected call of Del. -func (mr *MockRedisClientInterfaceMockRecorder) Del(ctx interface{}, keys ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx}, keys...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Del", reflect.TypeOf((*MockRedisClientInterface)(nil).Del), varargs...) -} - -// Expire mocks base method. -func (m *MockRedisClientInterface) Expire(ctx context.Context, key string, expiration time.Duration) *v9.BoolCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Expire", ctx, key, expiration) - ret0, _ := ret[0].(*v9.BoolCmd) - return ret0 -} - -// Expire indicates an expected call of Expire. -func (mr *MockRedisClientInterfaceMockRecorder) Expire(ctx, key, expiration interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Expire", reflect.TypeOf((*MockRedisClientInterface)(nil).Expire), ctx, key, expiration) -} - -// FlushAll mocks base method. -func (m *MockRedisClientInterface) FlushAll(ctx context.Context) *v9.StatusCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FlushAll", ctx) - ret0, _ := ret[0].(*v9.StatusCmd) - return ret0 -} - -// FlushAll indicates an expected call of FlushAll. -func (mr *MockRedisClientInterfaceMockRecorder) FlushAll(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushAll", reflect.TypeOf((*MockRedisClientInterface)(nil).FlushAll), ctx) -} - -// Get mocks base method. -func (m *MockRedisClientInterface) Get(ctx context.Context, key string) *v9.StringCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", ctx, key) - ret0, _ := ret[0].(*v9.StringCmd) - return ret0 -} - -// Get indicates an expected call of Get. -func (mr *MockRedisClientInterfaceMockRecorder) Get(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockRedisClientInterface)(nil).Get), ctx, key) -} - -// SAdd mocks base method. -func (m *MockRedisClientInterface) SAdd(ctx context.Context, key string, members ...any) *v9.IntCmd { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, key} - for _, a := range members { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "SAdd", varargs...) - ret0, _ := ret[0].(*v9.IntCmd) - return ret0 -} - -// SAdd indicates an expected call of SAdd. -func (mr *MockRedisClientInterfaceMockRecorder) SAdd(ctx, key interface{}, members ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, key}, members...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SAdd", reflect.TypeOf((*MockRedisClientInterface)(nil).SAdd), varargs...) -} - -// SMembers mocks base method. -func (m *MockRedisClientInterface) SMembers(ctx context.Context, key string) *v9.StringSliceCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SMembers", ctx, key) - ret0, _ := ret[0].(*v9.StringSliceCmd) - return ret0 -} - -// SMembers indicates an expected call of SMembers. -func (mr *MockRedisClientInterfaceMockRecorder) SMembers(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SMembers", reflect.TypeOf((*MockRedisClientInterface)(nil).SMembers), ctx, key) -} - -// Set mocks base method. -func (m *MockRedisClientInterface) Set(ctx context.Context, key string, values any, expiration time.Duration) *v9.StatusCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Set", ctx, key, values, expiration) - ret0, _ := ret[0].(*v9.StatusCmd) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockRedisClientInterfaceMockRecorder) Set(ctx, key, values, expiration interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockRedisClientInterface)(nil).Set), ctx, key, values, expiration) -} - -// TTL mocks base method. -func (m *MockRedisClientInterface) TTL(ctx context.Context, key string) *v9.DurationCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TTL", ctx, key) - ret0, _ := ret[0].(*v9.DurationCmd) - return ret0 -} - -// TTL indicates an expected call of TTL. -func (mr *MockRedisClientInterfaceMockRecorder) TTL(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TTL", reflect.TypeOf((*MockRedisClientInterface)(nil).TTL), ctx, key) -} diff --git a/toolkit/gocache/store/redis/redis_test.go b/toolkit/gocache/store/redis/redis_test.go deleted file mode 100644 index 725b847a..00000000 --- a/toolkit/gocache/store/redis/redis_test.go +++ /dev/null @@ -1,183 +0,0 @@ -package redis - -import ( - "context" - "testing" - "time" - - redis "github.com/redis/go-redis/v9" - "github.com/stretchr/testify/assert" - "go.uber.org/mock/gomock" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func TestNewRedis(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockRedisClientInterface(ctrl) - - // When - store := NewRedis(client, lib_store.WithExpiration(6*time.Second)) - - // Then - assert.IsType(t, new(RedisStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, &lib_store.Options{Expiration: 6 * time.Second}, store.options) -} - -func TestRedisGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockRedisClientInterface(ctrl) - client.EXPECT().Get(ctx, "my-key").Return(&redis.StringCmd{}) - - store := NewRedis(client) - - // When - value, err := store.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.NotNil(t, value) -} - -func TestRedisSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRedisClientInterface(ctrl) - client.EXPECT().Set(ctx, "my-key", cacheValue, 5*time.Second).Return(&redis.StatusCmd{}) - - store := NewRedis(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(5*time.Second)) - - // Then - assert.Nil(t, err) -} - -func TestRedisSetWhenNoOptionsGiven(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRedisClientInterface(ctrl) - client.EXPECT().Set(ctx, "my-key", cacheValue, 6*time.Second).Return(&redis.StatusCmd{}) - - store := NewRedis(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestRedisSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRedisClientInterface(ctrl) - client.EXPECT().Set(ctx, cacheKey, cacheValue, time.Duration(0)).Return(&redis.StatusCmd{}) - client.EXPECT().SAdd(ctx, "gocache_tag_tag1", "my-key").Return(&redis.IntCmd{}) - client.EXPECT().Expire(ctx, "gocache_tag_tag1", 720*time.Hour).Return(&redis.BoolCmd{}) - - store := NewRedis(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRedisDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockRedisClientInterface(ctrl) - client.EXPECT().Del(ctx, "my-key").Return(&redis.IntCmd{}) - - store := NewRedis(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestRedisInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := &redis.StringSliceCmd{} - - client := NewMockRedisClientInterface(ctrl) - client.EXPECT().SMembers(ctx, "gocache_tag_tag1").Return(cacheKeys) - client.EXPECT().Del(ctx, "gocache_tag_tag1").Return(&redis.IntCmd{}) - - store := NewRedis(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRedisClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockRedisClientInterface(ctrl) - client.EXPECT().FlushAll(ctx).Return(&redis.StatusCmd{}) - - store := NewRedis(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestRedisGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockRedisClientInterface(ctrl) - - store := NewRedis(client) - - // When - Then - assert.Equal(t, RedisType, store.GetType()) -} diff --git a/toolkit/gocache/store/rediscluster/rediscluster.go b/toolkit/gocache/store/rediscluster/rediscluster.go deleted file mode 100644 index 9e078cbe..00000000 --- a/toolkit/gocache/store/rediscluster/rediscluster.go +++ /dev/null @@ -1,137 +0,0 @@ -package rediscluster - -import ( - "context" - "fmt" - "time" - - redis "github.com/redis/go-redis/v9" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// RedisClusterClientInterface represents a go-redis/redis clusclient -type RedisClusterClientInterface interface { - Get(ctx context.Context, key string) *redis.StringCmd - TTL(ctx context.Context, key string) *redis.DurationCmd - Expire(ctx context.Context, key string, expiration time.Duration) *redis.BoolCmd - Set(ctx context.Context, key string, values any, expiration time.Duration) *redis.StatusCmd - Del(ctx context.Context, keys ...string) *redis.IntCmd - FlushAll(ctx context.Context) *redis.StatusCmd - SAdd(ctx context.Context, key string, members ...any) *redis.IntCmd - SMembers(ctx context.Context, key string) *redis.StringSliceCmd -} - -const ( - // RedisType represents the storage type as a string value - RedisClusterType = "rediscluster" - // RedisTagPattern represents the tag pattern to be used as a key in specified storage - RedisClusterTagPattern = "gocache_tag_%s" -) - -// RedisStore is a store for Redis -type RedisClusterStore struct { - clusclient RedisClusterClientInterface - options *lib_store.Options -} - -// NewRedis creates a new store to Redis instance(s) -func NewRedisCluster(client RedisClusterClientInterface, options ...lib_store.Option) *RedisClusterStore { - return &RedisClusterStore{ - clusclient: client, - options: lib_store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key -func (s *RedisClusterStore) Get(ctx context.Context, key any) (any, error) { - object, err := s.clusclient.Get(ctx, key.(string)).Result() - if err == redis.Nil { - return nil, lib_store.NotFoundWithCause(err) - } - return object, err -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (s *RedisClusterStore) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - object, err := s.clusclient.Get(ctx, key.(string)).Result() - if err == redis.Nil { - return nil, 0, lib_store.NotFoundWithCause(err) - } - if err != nil { - return nil, 0, err - } - - ttl, err := s.clusclient.TTL(ctx, key.(string)).Result() - if err != nil { - return nil, 0, err - } - - return object, ttl, err -} - -// Set defines data in Redis for given key identifier -func (s *RedisClusterStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptionsWithDefault(s.options, options...) - - err := s.clusclient.Set(ctx, key.(string), value, opts.Expiration).Err() - if err != nil { - return err - } - - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, key, tags) - } - - return nil -} - -func (s *RedisClusterStore) setTags(ctx context.Context, key any, tags []string) { - for _, tag := range tags { - tagKey := fmt.Sprintf(RedisClusterTagPattern, tag) - s.clusclient.SAdd(ctx, tagKey, key.(string)) - s.clusclient.Expire(ctx, tagKey, 720*time.Hour) - } -} - -// Delete removes data from Redis for given key identifier -func (s *RedisClusterStore) Delete(ctx context.Context, key any) error { - _, err := s.clusclient.Del(ctx, key.(string)).Result() - return err -} - -// Invalidate invalidates some cache data in Redis for given options -func (s *RedisClusterStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(RedisClusterTagPattern, tag) - cacheKeys, err := s.clusclient.SMembers(ctx, tagKey).Result() - if err != nil { - continue - } - - for _, cacheKey := range cacheKeys { - s.Delete(ctx, cacheKey) - } - - s.Delete(ctx, tagKey) - } - } - - return nil -} - -// Clear resets all data in the store -func (s *RedisClusterStore) Clear(ctx context.Context) error { - if err := s.clusclient.FlushAll(ctx).Err(); err != nil { - return err - } - - return nil -} - -// GetType returns the store type -func (s *RedisClusterStore) GetType() string { - return RedisClusterType -} diff --git a/toolkit/gocache/store/rediscluster/rediscluster_bench_test.go b/toolkit/gocache/store/rediscluster/rediscluster_bench_test.go deleted file mode 100644 index 71aa275d..00000000 --- a/toolkit/gocache/store/rediscluster/rediscluster_bench_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package rediscluster - -import ( - "context" - "fmt" - "math" - "strings" - "testing" - - redis "github.com/redis/go-redis/v9" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -// should be configured to connect to real Redis Cluster -func BenchmarkRedisClusterSet(b *testing.B) { - ctx := context.Background() - - addr := strings.Split("redis:6379", ",") - store := NewRedisCluster(redis.NewClusterClient(&redis.ClusterOptions{ - Addrs: addr, - }), nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkRedisClusterGet(b *testing.B) { - ctx := context.Background() - - addr := strings.Split("redis:6379", ",") - store := NewRedisCluster(redis.NewClusterClient(&redis.ClusterOptions{ - Addrs: addr, - }), nil) - - key := "test" - value := []byte("value") - - store.Set(ctx, key, value, nil) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/rediscluster/rediscluster_mock.go b/toolkit/gocache/store/rediscluster/rediscluster_mock.go deleted file mode 100644 index 2dbe81d2..00000000 --- a/toolkit/gocache/store/rediscluster/rediscluster_mock.go +++ /dev/null @@ -1,159 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/rediscluster/rediscluster.go - -// Package rediscluster is a generated GoMock package. -package rediscluster - -import ( - context "context" - reflect "reflect" - time "time" - - v9 "github.com/redis/go-redis/v9" - gomock "go.uber.org/mock/gomock" -) - -// MockRedisClusterClientInterface is a mock of RedisClusterClientInterface interface. -type MockRedisClusterClientInterface struct { - ctrl *gomock.Controller - recorder *MockRedisClusterClientInterfaceMockRecorder -} - -// MockRedisClusterClientInterfaceMockRecorder is the mock recorder for MockRedisClusterClientInterface. -type MockRedisClusterClientInterfaceMockRecorder struct { - mock *MockRedisClusterClientInterface -} - -// NewMockRedisClusterClientInterface creates a new mock instance. -func NewMockRedisClusterClientInterface(ctrl *gomock.Controller) *MockRedisClusterClientInterface { - mock := &MockRedisClusterClientInterface{ctrl: ctrl} - mock.recorder = &MockRedisClusterClientInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockRedisClusterClientInterface) EXPECT() *MockRedisClusterClientInterfaceMockRecorder { - return m.recorder -} - -// Del mocks base method. -func (m *MockRedisClusterClientInterface) Del(ctx context.Context, keys ...string) *v9.IntCmd { - m.ctrl.T.Helper() - varargs := []interface{}{ctx} - for _, a := range keys { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Del", varargs...) - ret0, _ := ret[0].(*v9.IntCmd) - return ret0 -} - -// Del indicates an expected call of Del. -func (mr *MockRedisClusterClientInterfaceMockRecorder) Del(ctx interface{}, keys ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx}, keys...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Del", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).Del), varargs...) -} - -// Expire mocks base method. -func (m *MockRedisClusterClientInterface) Expire(ctx context.Context, key string, expiration time.Duration) *v9.BoolCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Expire", ctx, key, expiration) - ret0, _ := ret[0].(*v9.BoolCmd) - return ret0 -} - -// Expire indicates an expected call of Expire. -func (mr *MockRedisClusterClientInterfaceMockRecorder) Expire(ctx, key, expiration interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Expire", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).Expire), ctx, key, expiration) -} - -// FlushAll mocks base method. -func (m *MockRedisClusterClientInterface) FlushAll(ctx context.Context) *v9.StatusCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FlushAll", ctx) - ret0, _ := ret[0].(*v9.StatusCmd) - return ret0 -} - -// FlushAll indicates an expected call of FlushAll. -func (mr *MockRedisClusterClientInterfaceMockRecorder) FlushAll(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushAll", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).FlushAll), ctx) -} - -// Get mocks base method. -func (m *MockRedisClusterClientInterface) Get(ctx context.Context, key string) *v9.StringCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", ctx, key) - ret0, _ := ret[0].(*v9.StringCmd) - return ret0 -} - -// Get indicates an expected call of Get. -func (mr *MockRedisClusterClientInterfaceMockRecorder) Get(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).Get), ctx, key) -} - -// SAdd mocks base method. -func (m *MockRedisClusterClientInterface) SAdd(ctx context.Context, key string, members ...any) *v9.IntCmd { - m.ctrl.T.Helper() - varargs := []interface{}{ctx, key} - for _, a := range members { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "SAdd", varargs...) - ret0, _ := ret[0].(*v9.IntCmd) - return ret0 -} - -// SAdd indicates an expected call of SAdd. -func (mr *MockRedisClusterClientInterfaceMockRecorder) SAdd(ctx, key interface{}, members ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{ctx, key}, members...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SAdd", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).SAdd), varargs...) -} - -// SMembers mocks base method. -func (m *MockRedisClusterClientInterface) SMembers(ctx context.Context, key string) *v9.StringSliceCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SMembers", ctx, key) - ret0, _ := ret[0].(*v9.StringSliceCmd) - return ret0 -} - -// SMembers indicates an expected call of SMembers. -func (mr *MockRedisClusterClientInterfaceMockRecorder) SMembers(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SMembers", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).SMembers), ctx, key) -} - -// Set mocks base method. -func (m *MockRedisClusterClientInterface) Set(ctx context.Context, key string, values any, expiration time.Duration) *v9.StatusCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Set", ctx, key, values, expiration) - ret0, _ := ret[0].(*v9.StatusCmd) - return ret0 -} - -// Set indicates an expected call of Set. -func (mr *MockRedisClusterClientInterfaceMockRecorder) Set(ctx, key, values, expiration interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).Set), ctx, key, values, expiration) -} - -// TTL mocks base method. -func (m *MockRedisClusterClientInterface) TTL(ctx context.Context, key string) *v9.DurationCmd { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TTL", ctx, key) - ret0, _ := ret[0].(*v9.DurationCmd) - return ret0 -} - -// TTL indicates an expected call of TTL. -func (mr *MockRedisClusterClientInterfaceMockRecorder) TTL(ctx, key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TTL", reflect.TypeOf((*MockRedisClusterClientInterface)(nil).TTL), ctx, key) -} diff --git a/toolkit/gocache/store/rediscluster/rediscluster_test.go b/toolkit/gocache/store/rediscluster/rediscluster_test.go deleted file mode 100644 index 5b8946c5..00000000 --- a/toolkit/gocache/store/rediscluster/rediscluster_test.go +++ /dev/null @@ -1,182 +0,0 @@ -package rediscluster - -import ( - "context" - "testing" - "time" - - redis "github.com/redis/go-redis/v9" - "github.com/stretchr/testify/assert" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewRedisCluster(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockRedisClusterClientInterface(ctrl) - - // When - store := NewRedisCluster(client, lib_store.WithExpiration(6*time.Second)) - - // Then - assert.IsType(t, new(RedisClusterStore), store) - assert.Equal(t, client, store.clusclient) - assert.Equal(t, &lib_store.Options{Expiration: 6 * time.Second}, store.options) -} - -func TestRedisClusterGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockRedisClusterClientInterface(ctrl) - client.EXPECT().Get(ctx, "my-key").Return(&redis.StringCmd{}) - - store := NewRedisCluster(client) - - // When - value, err := store.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.NotNil(t, value) -} - -func TestRedisClusterSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRedisClusterClientInterface(ctrl) - client.EXPECT().Set(ctx, "my-key", cacheValue, 5*time.Second).Return(&redis.StatusCmd{}) - - store := NewRedisCluster(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithExpiration(5*time.Second)) - - // Then - assert.Nil(t, err) -} - -func TestRedisClusterSetWhenNoOptionsGiven(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRedisClusterClientInterface(ctrl) - client.EXPECT().Set(ctx, "my-key", cacheValue, 6*time.Second).Return(&redis.StatusCmd{}) - - store := NewRedisCluster(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestRedisClusterSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRedisClusterClientInterface(ctrl) - client.EXPECT().Set(ctx, cacheKey, cacheValue, time.Duration(0)).Return(&redis.StatusCmd{}) - client.EXPECT().SAdd(ctx, "gocache_tag_tag1", "my-key").Return(&redis.IntCmd{}) - client.EXPECT().Expire(ctx, "gocache_tag_tag1", 720*time.Hour).Return(&redis.BoolCmd{}) - - store := NewRedisCluster(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRedisClusterDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockRedisClusterClientInterface(ctrl) - client.EXPECT().Del(ctx, "my-key").Return(&redis.IntCmd{}) - - store := NewRedisCluster(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestRedisClusterInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := &redis.StringSliceCmd{} - - client := NewMockRedisClusterClientInterface(ctrl) - client.EXPECT().SMembers(ctx, "gocache_tag_tag1").Return(cacheKeys) - client.EXPECT().Del(ctx, "gocache_tag_tag1").Return(&redis.IntCmd{}) - - store := NewRedisCluster(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRedisClusterClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockRedisClusterClientInterface(ctrl) - client.EXPECT().FlushAll(ctx).Return(&redis.StatusCmd{}) - - store := NewRedisCluster(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestRedisClusterGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockRedisClusterClientInterface(ctrl) - - store := NewRedisCluster(client) - - // When - Then - assert.Equal(t, RedisClusterType, store.GetType()) -} diff --git a/toolkit/gocache/store/ristretto/ristretto.go b/toolkit/gocache/store/ristretto/ristretto.go deleted file mode 100644 index dc938e35..00000000 --- a/toolkit/gocache/store/ristretto/ristretto.go +++ /dev/null @@ -1,157 +0,0 @@ -package ristretto - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" - - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // RistrettoType represents the storage type as a string value - RistrettoType = "ristretto" - // RistrettoTagPattern represents the tag pattern to be used as a key in specified storage - RistrettoTagPattern = "gocache_tag_%s" -) - -// RistrettoClientInterface represents a dgraph-io/ristretto client -type RistrettoClientInterface interface { - Get(key any) (any, bool) - SetWithTTL(key, value any, cost int64, ttl time.Duration) bool - Del(key any) - Clear() - Wait() -} - -// RistrettoStore is a store for Ristretto (memory) library -type RistrettoStore struct { - client RistrettoClientInterface - options *lib_store.Options -} - -// NewRistretto creates a new store to Ristretto (memory) library instance -func NewRistretto(client RistrettoClientInterface, options ...lib_store.Option) *RistrettoStore { - return &RistrettoStore{ - client: client, - options: lib_store.ApplyOptions(options...), - } -} - -// Get returns data stored from a given key -func (s *RistrettoStore) Get(_ context.Context, key any) (any, error) { - var err error - - value, exists := s.client.Get(key) - if !exists { - err = lib_store.NotFoundWithCause(errors.New("value not found in Ristretto store")) - } - - return value, err -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (s *RistrettoStore) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - value, err := s.Get(ctx, key) - return value, 0, err -} - -// Set defines data in Ristretto memory cache for given key identifier -func (s *RistrettoStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptionsWithDefault(s.options, options...) - - var err error - - if set := s.client.SetWithTTL(key, value, opts.Cost, opts.Expiration); !set { - err = fmt.Errorf("An error has occurred while setting value '%v' on key '%v'", value, key) - } - - if err != nil { - return err - } - - if opts.SynchronousSet { - s.client.Wait() - } - - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, key, tags) - } - - return nil -} - -func (s *RistrettoStore) setTags(ctx context.Context, key any, tags []string) { - for _, tag := range tags { - tagKey := fmt.Sprintf(RistrettoTagPattern, tag) - cacheKeys := []string{} - - if result, err := s.Get(ctx, tagKey); err == nil { - if bytes, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(bytes), ",") - } - } - - alreadyInserted := false - for _, cacheKey := range cacheKeys { - if cacheKey == key.(string) { - alreadyInserted = true - break - } - } - - if !alreadyInserted { - cacheKeys = append(cacheKeys, key.(string)) - } - - s.Set(ctx, tagKey, []byte(strings.Join(cacheKeys, ",")), lib_store.WithExpiration(720*time.Hour)) - } -} - -// Delete removes data in Ristretto memory cache for given key identifier -func (s *RistrettoStore) Delete(_ context.Context, key any) error { - s.client.Del(key) - return nil -} - -// Invalidate invalidates some cache data in Redis for given options -func (s *RistrettoStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(RistrettoTagPattern, tag) - result, err := s.Get(ctx, tagKey) - if err != nil { - zlogger.Warn().Msg(err.Error()) - continue - } - - cacheKeys := []string{} - if bytes, ok := result.([]byte); ok { - cacheKeys = strings.Split(string(bytes), ",") - } - - for _, cacheKey := range cacheKeys { - s.Delete(ctx, cacheKey) - } - } - } - - return nil -} - -// Clear resets all data in the store -func (s *RistrettoStore) Clear(_ context.Context) error { - s.client.Clear() - return nil -} - -// GetType returns the store type -func (s *RistrettoStore) GetType() string { - return RistrettoType -} diff --git a/toolkit/gocache/store/ristretto/ristretto_bench_test.go b/toolkit/gocache/store/ristretto/ristretto_bench_test.go deleted file mode 100644 index 8d64c010..00000000 --- a/toolkit/gocache/store/ristretto/ristretto_bench_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package ristretto - -import ( - "context" - "fmt" - "math" - "testing" - - "github.com/dgraph-io/ristretto" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkRistrettoSet(b *testing.B) { - ctx := context.Background() - - client, err := ristretto.NewCache(&ristretto.Config{ - NumCounters: 1000, - MaxCost: 100, - BufferItems: 64, - }) - if err != nil { - panic(err) - } - store := NewRistretto(client) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkRistrettoSetWithSynchronousSet(b *testing.B) { - ctx := context.Background() - - client, err := ristretto.NewCache(&ristretto.Config{ - NumCounters: 1000, - MaxCost: 100, - BufferItems: 64, - }) - if err != nil { - panic(err) - } - store := NewRistretto(client, lib_store.WithSynchronousSet()) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := []byte(fmt.Sprintf("value-%d", n)) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkRistrettoGet(b *testing.B) { - ctx := context.Background() - - client, err := ristretto.NewCache(&ristretto.Config{ - NumCounters: 1000, - MaxCost: 100, - BufferItems: 64, - }) - if err != nil { - panic(err) - } - store := NewRistretto(client) - - key := "test" - value := []byte("value") - - store.Set(ctx, key, value) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/ristretto/ristretto_mock.go b/toolkit/gocache/store/ristretto/ristretto_mock.go deleted file mode 100644 index 1c96d9b8..00000000 --- a/toolkit/gocache/store/ristretto/ristretto_mock.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: store/ristretto/ristretto.go - -// Package ristretto is a generated GoMock package. -package ristretto - -import ( - reflect "reflect" - time "time" - - gomock "go.uber.org/mock/gomock" -) - -// MockRistrettoClientInterface is a mock of RistrettoClientInterface interface. -type MockRistrettoClientInterface struct { - ctrl *gomock.Controller - recorder *MockRistrettoClientInterfaceMockRecorder -} - -// MockRistrettoClientInterfaceMockRecorder is the mock recorder for MockRistrettoClientInterface. -type MockRistrettoClientInterfaceMockRecorder struct { - mock *MockRistrettoClientInterface -} - -// NewMockRistrettoClientInterface creates a new mock instance. -func NewMockRistrettoClientInterface(ctrl *gomock.Controller) *MockRistrettoClientInterface { - mock := &MockRistrettoClientInterface{ctrl: ctrl} - mock.recorder = &MockRistrettoClientInterfaceMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockRistrettoClientInterface) EXPECT() *MockRistrettoClientInterfaceMockRecorder { - return m.recorder -} - -// Clear mocks base method. -func (m *MockRistrettoClientInterface) Clear() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Clear") -} - -// Clear indicates an expected call of Clear. -func (mr *MockRistrettoClientInterfaceMockRecorder) Clear() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Clear", reflect.TypeOf((*MockRistrettoClientInterface)(nil).Clear)) -} - -// Del mocks base method. -func (m *MockRistrettoClientInterface) Del(key any) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Del", key) -} - -// Del indicates an expected call of Del. -func (mr *MockRistrettoClientInterfaceMockRecorder) Del(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Del", reflect.TypeOf((*MockRistrettoClientInterface)(nil).Del), key) -} - -// Get mocks base method. -func (m *MockRistrettoClientInterface) Get(key any) (any, bool) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", key) - ret0, _ := ret[0].(any) - ret1, _ := ret[1].(bool) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockRistrettoClientInterfaceMockRecorder) Get(key interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockRistrettoClientInterface)(nil).Get), key) -} - -// SetWithTTL mocks base method. -func (m *MockRistrettoClientInterface) SetWithTTL(key, value any, cost int64, ttl time.Duration) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetWithTTL", key, value, cost, ttl) - ret0, _ := ret[0].(bool) - return ret0 -} - -// SetWithTTL indicates an expected call of SetWithTTL. -func (mr *MockRistrettoClientInterfaceMockRecorder) SetWithTTL(key, value, cost, ttl interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWithTTL", reflect.TypeOf((*MockRistrettoClientInterface)(nil).SetWithTTL), key, value, cost, ttl) -} - -// Wait mocks base method. -func (m *MockRistrettoClientInterface) Wait() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Wait") -} - -// Wait indicates an expected call of Wait. -func (mr *MockRistrettoClientInterfaceMockRecorder) Wait() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Wait", reflect.TypeOf((*MockRistrettoClientInterface)(nil).Wait)) -} diff --git a/toolkit/gocache/store/ristretto/ristretto_test.go b/toolkit/gocache/store/ristretto/ristretto_test.go deleted file mode 100644 index ac953cfd..00000000 --- a/toolkit/gocache/store/ristretto/ristretto_test.go +++ /dev/null @@ -1,338 +0,0 @@ -package ristretto - -import ( - "context" - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/assert" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewRistretto(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockRistrettoClientInterface(ctrl) - - // When - store := NewRistretto(client, lib_store.WithCost(8)) - - // Then - assert.IsType(t, new(RistrettoStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, &lib_store.Options{Cost: 8}, store.options) -} - -func TestRistrettoGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(cacheValue, true) - - store := NewRistretto(client) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) -} - -func TestRistrettoGetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(nil, false) - - store := NewRistretto(client) - - // When - value, err := store.Get(ctx, cacheKey) - - // Then - assert.Nil(t, value) - assert.IsType(t, &lib_store.NotFound{}, err) -} - -func TestRistrettoGetWithTTL(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(cacheValue, true) - - store := NewRistretto(client) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Nil(t, err) - assert.Equal(t, cacheValue, value) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestRistrettoGetWithTTLWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Get(cacheKey).Return(nil, false) - - store := NewRistretto(client) - - // When - value, ttl, err := store.GetWithTTL(ctx, cacheKey) - - // Then - assert.Nil(t, value) - assert.IsType(t, &lib_store.NotFound{}, err) - assert.Equal(t, 0*time.Second, ttl) -} - -func TestRistrettoSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().SetWithTTL(cacheKey, cacheValue, int64(4), 0*time.Second).Return(true) - - store := NewRistretto(client, lib_store.WithCost(7)) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithCost(4)) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoSetWhenNoOptionsGiven(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().SetWithTTL(cacheKey, cacheValue, int64(7), 0*time.Second).Return(true) - - store := NewRistretto(client, lib_store.WithCost(7)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoSetWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().SetWithTTL(cacheKey, cacheValue, int64(7), 0*time.Second).Return(false) - - store := NewRistretto(client, lib_store.WithCost(7)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Equal(t, fmt.Errorf("An error has occurred while setting value '%v' on key '%v'", cacheValue, cacheKey), err) -} - -func TestRistrettoSetWithSynchronousSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().SetWithTTL(cacheKey, cacheValue, int64(7), 0*time.Second).Return(true) - client.EXPECT().Wait() - - store := NewRistretto(client, lib_store.WithCost(7), lib_store.WithSynchronousSet()) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithSynchronousSet()) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().SetWithTTL(cacheKey, cacheValue, int64(0), 0*time.Second).Return(true) - client.EXPECT().Get("gocache_tag_tag1").Return(nil, true) - client.EXPECT().SetWithTTL("gocache_tag_tag1", []byte("my-key"), int64(0), 720*time.Hour).Return(true) - - store := NewRistretto(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoSetWithTagsWhenAlreadyInserted(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := []byte("my-cache-value") - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().SetWithTTL(cacheKey, cacheValue, int64(0), 0*time.Second).Return(true) - client.EXPECT().Get("gocache_tag_tag1").Return([]byte("my-key,a-second-key"), true) - client.EXPECT().SetWithTTL("gocache_tag_tag1", []byte("my-key,a-second-key"), int64(0), 720*time.Hour).Return(true) - - store := NewRistretto(client) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Del(cacheKey) - - store := NewRistretto(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("a23fdf987h2svc23,jHG2372x38hf74") - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, true) - client.EXPECT().Del("a23fdf987h2svc23") - client.EXPECT().Del("jHG2372x38hf74") - - store := NewRistretto(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoInvalidateWhenError(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKeys := []byte("a23fdf987h2svc23,jHG2372x38hf74") - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Get("gocache_tag_tag1").Return(cacheKeys, false) - - store := NewRistretto(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := NewMockRistrettoClientInterface(ctrl) - client.EXPECT().Clear() - - store := NewRistretto(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestRistrettoGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := NewMockRistrettoClientInterface(ctrl) - - store := NewRistretto(client) - - // When - Then - assert.Equal(t, RistrettoType, store.GetType()) -} diff --git a/toolkit/gocache/store/rueidis/rueidis.go b/toolkit/gocache/store/rueidis/rueidis.go deleted file mode 100644 index 3dfd7068..00000000 --- a/toolkit/gocache/store/rueidis/rueidis.go +++ /dev/null @@ -1,130 +0,0 @@ -package rueidis - -import ( - "context" - "fmt" - "time" - - "github.com/redis/rueidis" - "github.com/redis/rueidis/rueidiscompat" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -const ( - // RueidisType represents the storage type as a string value - RueidisType = "rueidis" - // RueidisTagPattern represents the tag pattern to be used as a key in specified storage - RueidisTagPattern = "gocache_tag_%s" - - defaultClientSideCacheExpiration = 10 * time.Second -) - -// RueidisStore is a store for Redis -type RueidisStore struct { - client rueidis.Client - options *lib_store.Options -} - -// NewRueidis creates a new store to Redis instance(s) -func NewRueidis(client rueidis.Client, options ...lib_store.Option) *RueidisStore { - // defaults client side cache expiration to 10s - appliedOptions := lib_store.ApplyOptions(options...) - - if appliedOptions.ClientSideCacheExpiration == 0 { - appliedOptions.ClientSideCacheExpiration = defaultClientSideCacheExpiration - } - - return &RueidisStore{ - client: client, - options: appliedOptions, - } -} - -// Get returns data stored from a given key -func (s *RueidisStore) Get(ctx context.Context, key any) (any, error) { - cmd := s.client.B().Get().Key(key.(string)).Cache() - res := s.client.DoCache(ctx, cmd, s.options.ClientSideCacheExpiration) - str, err := res.ToString() - if rueidis.IsRedisNil(err) { - err = lib_store.NotFoundWithCause(err) - } - return str, err -} - -// GetWithTTL returns data stored from a given key and its corresponding TTL -func (s *RueidisStore) GetWithTTL(ctx context.Context, key any) (any, time.Duration, error) { - cmd := s.client.B().Get().Key(key.(string)).Cache() - res := s.client.DoCache(ctx, cmd, s.options.ClientSideCacheExpiration) - str, err := res.ToString() - if rueidis.IsRedisNil(err) { - err = lib_store.NotFoundWithCause(err) - } - return str, time.Duration(res.CacheTTL()) * time.Second, err -} - -// Set defines data in Redis for given key identifier -func (s *RueidisStore) Set(ctx context.Context, key any, value any, options ...lib_store.Option) error { - opts := lib_store.ApplyOptionsWithDefault(s.options, options...) - ttl := int64(opts.Expiration.Seconds()) - cmd := s.client.B().Set().Key(key.(string)).Value(value.(string)).ExSeconds(ttl).Build() - err := s.client.Do(ctx, cmd).Error() - if err != nil { - return err - } - - if tags := opts.Tags; len(tags) > 0 { - s.setTags(ctx, key, tags) - } - - return nil -} - -func (s *RueidisStore) setTags(ctx context.Context, key any, tags []string) { - ttl := 720 * time.Hour - for _, tag := range tags { - tagKey := fmt.Sprintf(RueidisTagPattern, tag) - s.client.DoMulti(ctx, - s.client.B().Sadd().Key(tagKey).Member(key.(string)).Build(), - s.client.B().Expire().Key(tagKey).Seconds(int64(ttl.Seconds())).Build(), - ) - } -} - -// Delete removes data from Redis for given key identifier -func (s *RueidisStore) Delete(ctx context.Context, key any) error { - return s.client.Do(ctx, s.client.B().Del().Key(key.(string)).Build()).Error() -} - -// Invalidate invalidates some cache data in Redis for given options -func (s *RueidisStore) Invalidate(ctx context.Context, options ...lib_store.InvalidateOption) error { - opts := lib_store.ApplyInvalidateOptions(options...) - - if tags := opts.Tags; len(tags) > 0 { - for _, tag := range tags { - tagKey := fmt.Sprintf(RueidisTagPattern, tag) - - cacheKeys, err := s.client.Do(ctx, s.client.B().Smembers().Key(tagKey).Build()).AsStrSlice() - if err != nil { - continue - } - - for _, cacheKey := range cacheKeys { - s.Delete(ctx, cacheKey) - } - - s.Delete(ctx, tagKey) - } - } - - return nil -} - -// GetType returns the store type -func (s *RueidisStore) GetType() string { - return RueidisType -} - -// Clear resets all data in the store -func (s *RueidisStore) Clear(ctx context.Context) error { - return rueidiscompat.NewAdapter(s.client).FlushAll(ctx).Err() -} diff --git a/toolkit/gocache/store/rueidis/rueidis_bench_test.go b/toolkit/gocache/store/rueidis/rueidis_bench_test.go deleted file mode 100644 index acc12ea9..00000000 --- a/toolkit/gocache/store/rueidis/rueidis_bench_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package rueidis - -import ( - "context" - "fmt" - "math" - "testing" - "time" - - "github.com/redis/rueidis" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" -) - -func BenchmarkRueidisSet(b *testing.B) { - ctx := context.Background() - - ruedisClient, _ := rueidis.NewClient(rueidis.ClientOption{ - InitAddress: []string{"localhost:26379"}, - Sentinel: rueidis.SentinelOption{ - MasterSet: "mymaster", - }, - SelectDB: 0, - }) - - store := NewRueidis(ruedisClient, lib_store.WithExpiration(time.Hour*4)) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - key := fmt.Sprintf("test-%d", n) - value := fmt.Sprintf("value-%d", n) - - store.Set(ctx, key, value, lib_store.WithTags([]string{fmt.Sprintf("tag-%d", n)})) - } - }) - } -} - -func BenchmarkRueidisGet(b *testing.B) { - ctx := context.Background() - - ruedisClient, _ := rueidis.NewClient(rueidis.ClientOption{ - InitAddress: []string{"localhost:26379"}, - Sentinel: rueidis.SentinelOption{ - MasterSet: "mymaster", - }, - SelectDB: 0, - }) - - store := NewRueidis(ruedisClient, lib_store.WithExpiration(time.Hour*4)) - - key := "test" - value := "value" - - _ = store.Set(ctx, key, value) - - for k := 0.; k <= 10; k++ { - n := int(math.Pow(2, k)) - b.Run(fmt.Sprintf("%d", n), func(b *testing.B) { - for i := 0; i < b.N*n; i++ { - _, _ = store.Get(ctx, key) - } - }) - } -} diff --git a/toolkit/gocache/store/rueidis/rueidis_test.go b/toolkit/gocache/store/rueidis/rueidis_test.go deleted file mode 100644 index dabffffe..00000000 --- a/toolkit/gocache/store/rueidis/rueidis_test.go +++ /dev/null @@ -1,214 +0,0 @@ -package rueidis - -import ( - "context" - "testing" - "time" - - "github.com/redis/rueidis" - "github.com/redis/rueidis/mock" - - "github.com/stretchr/testify/assert" - lib_store "github.com/unionj-cloud/go-doudou/v2/toolkit/gocache/lib/store" - "go.uber.org/mock/gomock" -) - -func TestNewRueidis(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - // rueidis mock client - client := mock.NewClient(ctrl) - - // When - store := NewRueidis(client, lib_store.WithExpiration(6*time.Second), lib_store.WithClientSideCaching(time.Second*8)) - - // Then - assert.IsType(t, new(RueidisStore), store) - assert.Equal(t, client, store.client) - assert.Equal(t, &lib_store.Options{Expiration: 6 * time.Second, ClientSideCacheExpiration: time.Second * 8}, store.options) -} - -func TestRueidisGet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // rueidis mock client - client := mock.NewClient(ctrl) - client.EXPECT().DoCache(ctx, mock.Match("GET", "my-key"), defaultClientSideCacheExpiration).Return(mock.Result(mock.RedisString("my-value"))) - - store := NewRueidis(client) - - // When - value, err := store.Get(ctx, "my-key") - - // Then - assert.Nil(t, err) - assert.Equal(t, value, "my-value") -} - -func TestRueidisGetNotFound(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - // rueidis mock client - client := mock.NewClient(ctrl) - client.EXPECT().DoCache(ctx, mock.Match("GET", "my-key"), defaultClientSideCacheExpiration).Return(mock.Result(mock.RedisNil())) - - store := NewRueidis(client) - - // When - value, err := store.Get(ctx, "my-key") - - // Then - assert.NotNil(t, err) - assert.Equal(t, value, "") -} - -func TestRueidisSet(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - // rueidis mock client - client := mock.NewClient(ctrl) - client.EXPECT().Do(ctx, mock.Match("SET", cacheKey, cacheValue, "EX", "10")).Return(mock.Result(mock.RedisString(""))) - - store := NewRueidis(client, lib_store.WithExpiration(time.Second*10)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestRueidisSetWhenNoOptionsGiven(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := mock.NewClient(ctrl) - client.EXPECT().Do(ctx, mock.Match("SET", cacheKey, cacheValue, "EX", "6")).Return(mock.Result(mock.RedisString(""))) - - store := NewRueidis(client, lib_store.WithExpiration(6*time.Second)) - - // When - err := store.Set(ctx, cacheKey, cacheValue) - - // Then - assert.Nil(t, err) -} - -func TestRedisSetWithTags(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - cacheValue := "my-cache-value" - - client := mock.NewClient(ctrl) - client.EXPECT().Do(ctx, mock.Match("SET", cacheKey, cacheValue, "EX", "10")).Return(mock.Result(mock.RedisString(""))) - client.EXPECT().DoMulti(ctx, - mock.Match("SADD", "gocache_tag_tag1", "my-key"), - mock.Match("EXPIRE", "gocache_tag_tag1", "2592000"), - ).Return([]rueidis.RedisResult{ - mock.Result(mock.RedisString("")), - mock.Result(mock.RedisString("")), - }) - - store := NewRueidis(client, lib_store.WithExpiration(time.Second*10)) - - // When - err := store.Set(ctx, cacheKey, cacheValue, lib_store.WithTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRedisDelete(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - cacheKey := "my-key" - - client := mock.NewClient(ctrl) - client.EXPECT().Do(ctx, mock.Match("DEL", cacheKey)).Return(mock.Result(mock.RedisInt64(1))) - - store := NewRueidis(client) - - // When - err := store.Delete(ctx, cacheKey) - - // Then - assert.Nil(t, err) -} - -func TestRedisInvalidate(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := mock.NewClient(ctrl) - client.EXPECT().Do(ctx, mock.Match("SMEMBERS", "gocache_tag_tag1")).Return(mock.Result(mock.RedisArray())) - client.EXPECT().Do(ctx, mock.Match("DEL", "gocache_tag_tag1")).Return(mock.Result(mock.RedisInt64(1))) - - store := NewRueidis(client) - - // When - err := store.Invalidate(ctx, lib_store.WithInvalidateTags([]string{"tag1"})) - - // Then - assert.Nil(t, err) -} - -func TestRedisClear(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - ctx := context.Background() - - client := mock.NewClient(ctrl) - client.EXPECT().Nodes().Return(map[string]rueidis.Client{ - "client1": client, - }) - client.EXPECT().Do(ctx, mock.Match("ROLE")).Return(mock.Result(mock.RedisArray(mock.RedisString("master")))) - client.EXPECT().Do(ctx, mock.Match("FLUSHALL")).Return(mock.Result(mock.RedisString(""))) - - store := NewRueidis(client) - - // When - err := store.Clear(ctx) - - // Then - assert.Nil(t, err) -} - -func TestRedisGetType(t *testing.T) { - // Given - ctrl := gomock.NewController(t) - - client := mock.NewClient(ctrl) - - store := NewRueidis(client) - - // When - Then - assert.Equal(t, RueidisType, store.GetType()) -} diff --git a/toolkit/gormgen/License b/toolkit/gormgen/License deleted file mode 100644 index 6e63bec5..00000000 --- a/toolkit/gormgen/License +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021-NOW Jinzhu - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/toolkit/gormgen/README.md b/toolkit/gormgen/README.md deleted file mode 100644 index c9aa70b7..00000000 --- a/toolkit/gormgen/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# GORM Gen - -Friendly & Safer GORM powered by Code Generation. - -[![Release](https://img.shields.io/github/v/release/go-gorm/gen)](https://github.com/go-gorm/gen/releases) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-gorm/gen)](https://goreportcard.com/report/github.com/go-gorm/gen) -[![MIT license](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT) -[![OpenIssue](https://img.shields.io/github/issues/go-gorm/gen)](https://github.com/go-gorm/gen/issues?q=is%3Aopen+is%3Aissue) -[![ClosedIssue](https://img.shields.io/github/issues-closed/go-gorm/gen)](https://github.com/go-gorm/gen/issues?q=is%3Aissue+is%3Aclosed) -[![TODOs](https://badgen.net/https/api.tickgit.com/badgen/github.com/go-gorm/gen)](https://www.tickgit.com/browse?repo=github.com/go-gorm/gen) -[![Go.Dev reference](https://img.shields.io/badge/go.dev-reference-blue?logo=go&logoColor=white)](https://pkg.go.dev/github.com/wubin1989/gen?tab=doc) - -## Overview - -- Idiomatic & Reusable API from Dynamic Raw SQL -- 100% Type-safe DAO API without `interface{}` -- Database To Struct follows GORM conventions -- GORM under the hood, supports all features, plugins, DBMS that GORM supports - -## Getting Started - -* Gen Guides [https://github.com/wubin1989/gen/index.html](https://github.com/wubin1989/gen/index.html) -* GORM Guides [http://github.com/wubin1989/docs](http://github.com/wubin1989/docs) - -## Maintainers - -[@riverchu](https://github.com/riverchu) [@iDer](https://github.com/idersec) [@qqxhb](https://github.com/qqxhb) [@dino-ma](https://github.com/dino-ma) - -[@jinzhu](https://github.com/jinzhu) - -## Contributing - -[You can help to deliver a better GORM/Gen, check out things you can do](https://github.com/wubin1989/contribute.html) - -## License - -Released under the [MIT License](https://github.com/go-gorm/gen/blob/master/License) diff --git a/toolkit/gormgen/condition.go b/toolkit/gormgen/condition.go deleted file mode 100644 index badcd3bc..00000000 --- a/toolkit/gormgen/condition.go +++ /dev/null @@ -1,66 +0,0 @@ -package gormgen - -import ( - "fmt" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" - "github.com/wubin1989/datatypes" - "github.com/wubin1989/gorm/clause" -) - -// Cond convert expression array to condition array -func Cond(exprs ...clause.Expression) []Condition { - return exprToCondition(exprs...) -} - -var _ Condition = &condContainer{} - -type condContainer struct { - value interface{} - err error -} - -func (c *condContainer) BeCond() interface{} { return c.value } -func (c *condContainer) CondError() error { return c.err } - -func exprToCondition(exprs ...clause.Expression) []Condition { - conds := make([]Condition, 0, len(exprs)) - for _, e := range exprs { - switch e := e.(type) { - case *datatypes.JSONQueryExpression, *datatypes.JSONOverlapsExpression, *datatypes.JSONArrayExpression: - conds = append(conds, &condContainer{value: e}) - default: - conds = append(conds, &condContainer{err: fmt.Errorf("unsupported Expression %T to converted to Condition", e)}) - } - } - return conds -} - -func condToExpression(conds []Condition) ([]clause.Expression, error) { - if len(conds) == 0 { - return nil, nil - } - exprs := make([]clause.Expression, 0, len(conds)) - for _, cond := range conds { - if cond == nil { - continue - } - if err := cond.CondError(); err != nil { - return nil, err - } - - switch cond.(type) { - case *condContainer, field.Expr, SubQuery: - default: - return nil, fmt.Errorf("unsupported condition: %+v", cond) - } - - switch e := cond.BeCond().(type) { - case []clause.Expression: - exprs = append(exprs, e...) - case clause.Expression: - exprs = append(exprs, e) - } - } - return exprs, nil -} diff --git a/toolkit/gormgen/config.go b/toolkit/gormgen/config.go deleted file mode 100644 index c15c97c8..00000000 --- a/toolkit/gormgen/config.go +++ /dev/null @@ -1,159 +0,0 @@ -package gormgen - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/gobwas/glob" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/utils/tests" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" -) - -// GenerateMode generate mode -type GenerateMode uint - -const ( - // WithDefaultQuery create default query in generated code - WithDefaultQuery GenerateMode = 1 << iota - - // WithoutContext generate code without context constrain - WithoutContext - - // WithQueryInterface generate code with exported interface object - WithQueryInterface -) - -// Config generator's basic configuration -type Config struct { - db *gorm.DB // db connection - - RootDir string // project root path - OutPath string // query code path - OutFile string // query code file name, default: gen.go - ModelPkgPath string // generated model code's package name - DtoPkgPath string // generated dto code's package name - WithUnitTest bool // generate unit test for query code - - // generate model global configuration - FieldNullable bool // generate pointer when field is nullable - FieldCoverable bool // generate pointer when field has default value, to fix problem zero value cannot be assign: https://gorm.io/docs/create.html#Default-Values - FieldSignable bool // detect integer field's unsigned type, adjust generated data type - FieldWithIndexTag bool // generate with gorm index tag - FieldWithTypeTag bool // generate with gorm column type tag - - Mode GenerateMode // generate mode - - queryPkgName string // generated query code's package name - modelPkgPath string // model pkg path in target project - dtoPkgPath string // dto pkg path in target project - dbNameOpts []model.SchemaNameOpt - importPkgPaths []string - - // name strategy for syncing table from db - tableNameNS func(tableName string) (targetTableName string) - modelNameNS func(tableName string) (modelName string) - fileNameNS func(tableName string) (fileName string) - - dataTypeMap map[string]func(columnType gorm.ColumnType) (dataType string) - fieldJSONTagNS func(columnName string, columnType string) (tagContent string) - - modelOpts []ModelOpt - - ConfigPackage string - - FilterTableGlob glob.Glob - ExcludeTableGlob glob.Glob - GenGenGo bool -} - -// WithOpts set global model options -func (cfg *Config) WithOpts(opts ...ModelOpt) { - if cfg.modelOpts == nil { - cfg.modelOpts = opts - } else { - cfg.modelOpts = append(cfg.modelOpts, opts...) - } -} - -// WithDbNameOpts set get database name function -func (cfg *Config) WithDbNameOpts(opts ...model.SchemaNameOpt) { - if cfg.dbNameOpts == nil { - cfg.dbNameOpts = opts - } else { - cfg.dbNameOpts = append(cfg.dbNameOpts, opts...) - } -} - -// WithTableNameStrategy specify table name naming strategy, only work when syncing table from db -func (cfg *Config) WithTableNameStrategy(ns func(tableName string) (targetTableName string)) { - cfg.tableNameNS = ns -} - -// WithModelNameStrategy specify model struct name naming strategy, only work when syncing table from db -func (cfg *Config) WithModelNameStrategy(ns func(tableName string) (modelName string)) { - cfg.modelNameNS = ns -} - -// WithFileNameStrategy specify file name naming strategy, only work when syncing table from db -func (cfg *Config) WithFileNameStrategy(ns func(tableName string) (fileName string)) { - cfg.fileNameNS = ns -} - -// WithDataTypeMap specify data type mapping relationship, only work when syncing table from db -func (cfg *Config) WithDataTypeMap(newMap map[string]func(columnType gorm.ColumnType) (dataType string)) { - cfg.dataTypeMap = newMap -} - -// WithJSONTagNameStrategy specify json tag naming strategy -func (cfg *Config) WithJSONTagNameStrategy(ns func(columnName string, columnType string) (tagContent string)) { - cfg.fieldJSONTagNS = ns -} - -// WithImportPkgPath specify import package path -func (cfg *Config) WithImportPkgPath(paths ...string) { - for i, path := range paths { - path = strings.TrimSpace(path) - if len(path) > 0 && path[0] != '"' && path[len(path)-1] != '"' { // without quote - path = `"` + path + `"` - } - paths[i] = path - } - cfg.importPkgPaths = append(cfg.importPkgPaths, paths...) -} - -// Revise format path and db -func (cfg *Config) Revise() (err error) { - if strings.TrimSpace(cfg.ModelPkgPath) == "" { - cfg.ModelPkgPath = model.DefaultModelPkg - } - if strings.TrimSpace(cfg.DtoPkgPath) == "" { - cfg.DtoPkgPath = model.DefaultDtoPkg - } - - cfg.OutPath, err = filepath.Abs(cfg.OutPath) - if err != nil { - return fmt.Errorf("outpath is invalid: %w", err) - } - if cfg.OutPath == "" { - cfg.OutPath = fmt.Sprintf(".%squery%s", string(os.PathSeparator), string(os.PathSeparator)) - } - if cfg.OutFile == "" { - cfg.OutFile = filepath.Join(cfg.OutPath, "gen.go") - } else if !strings.Contains(cfg.OutFile, string(os.PathSeparator)) { - cfg.OutFile = filepath.Join(cfg.OutPath, cfg.OutFile) - } - cfg.queryPkgName = filepath.Base(cfg.OutPath) - - if cfg.db == nil { - cfg.db, _ = gorm.Open(tests.DummyDialector{}) - } - - return nil -} - -func (cfg *Config) judgeMode(mode GenerateMode) bool { return cfg.Mode&mode != 0 } diff --git a/toolkit/gormgen/do.go b/toolkit/gormgen/do.go deleted file mode 100644 index f1bbbc24..00000000 --- a/toolkit/gormgen/do.go +++ /dev/null @@ -1,1055 +0,0 @@ -package gormgen - -import ( - "context" - "database/sql" - "fmt" - "reflect" - "strings" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/callbacks" - "github.com/wubin1989/gorm/clause" - "github.com/wubin1989/gorm/schema" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/helper" -) - -// ResultInfo query/execute info -type ResultInfo struct { - RowsAffected int64 - Error error -} - -var _ Dao = new(DO) - -// DO (data object): implement basic query methods -// the structure embedded with a *gorm.DB, and has a element item "alias" will be used when used as a sub query -type DO struct { - *DOConfig - db *gorm.DB - alias string // for subquery - modelType reflect.Type - tableName string - - backfillData interface{} -} - -func (d DO) getInstance(db *gorm.DB) *DO { - d.db = db - return &d -} - -type doOptions func(*gorm.DB) *gorm.DB - -var ( - // Debug use DB in debug mode - Debug doOptions = func(db *gorm.DB) *gorm.DB { return db.Debug() } -) - -// UseDB specify a db connection(*gorm.DB) -func (d *DO) UseDB(db *gorm.DB, opts ...DOOption) { - db = db.Session(&gorm.Session{Context: context.Background()}) - d.db = db - config := &DOConfig{} - for _, opt := range opts { - if opt != nil { - if applyErr := opt.Apply(config); applyErr != nil { - panic(applyErr) - } - } - } - d.DOConfig = config -} - -// ReplaceDB replace db connection -func (d *DO) ReplaceDB(db *gorm.DB) { - d.db = db.Session(&gorm.Session{}) -} - -// ReplaceConnPool replace db connection pool -func (d *DO) ReplaceConnPool(pool gorm.ConnPool) { - d.db = d.db.Session(&gorm.Session{Initialized: true}).Session(&gorm.Session{}) - d.db.Statement.ConnPool = pool -} - -// UseModel specify a data model structure as a source for table name -func (d *DO) UseModel(model interface{}) { - d.modelType = d.indirect(model) - - err := d.db.Statement.Parse(model) - if err != nil { - panic(fmt.Errorf("Cannot parse model: %+v\n%w", model, err)) - } - d.tableName = d.db.Statement.Schema.Table -} - -func (d *DO) indirect(value interface{}) reflect.Type { - mt := reflect.TypeOf(value) - if mt.Kind() == reflect.Ptr { - mt = mt.Elem() - } - return mt -} - -// UseTable specify table name -func (d *DO) UseTable(tableName string) { - d.db = d.db.Table(tableName).Session(new(gorm.Session)) - //d.db.Statement.Schema.Table=tableName - d.tableName = tableName -} - -// TableName return table name -func (d DO) TableName() string { - return d.tableName -} - -// Returning backfill data -func (d DO) Returning(value interface{}, columns ...string) Dao { - d.backfillData = value - - var targetCulumns []clause.Column - for _, column := range columns { - targetCulumns = append(targetCulumns, clause.Column{Name: column}) - } - d.db = d.db.Clauses(clause.Returning{Columns: targetCulumns}) - return &d -} - -// Session replace db with new session -func (d *DO) Session(config *gorm.Session) Dao { return d.getInstance(d.db.Session(config)) } - -// UnderlyingDB return the underlying database connection -func (d *DO) UnderlyingDB() *gorm.DB { return d.underlyingDB() } - -// Quote return qutoed data -func (d *DO) Quote(raw string) string { return d.db.Statement.Quote(raw) } - -// Build implement the interface of claues.Expression -// only call WHERE clause's Build -func (d *DO) Build(builder clause.Builder) { - for _, e := range d.buildCondition() { - e.Build(builder) - } -} - -func (d *DO) buildCondition() []clause.Expression { - return d.db.Statement.BuildCondition(d.db) -} - -// underlyingDO return self -func (d *DO) underlyingDO() *DO { return d } - -// underlyingDB return self.db -func (d *DO) underlyingDB() *gorm.DB { return d.db } - -func (d *DO) withError(err error) *DO { - if err == nil { - return d - } - - newDB := d.db.Session(new(gorm.Session)) - _ = newDB.AddError(err) - return d.getInstance(newDB) -} - -// BeCond implements Condition -func (d *DO) BeCond() interface{} { return d.buildCondition() } - -// CondError implements Condition -func (d *DO) CondError() error { return nil } - -// Debug return a DO with db in debug mode -func (d *DO) Debug() Dao { return d.getInstance(d.db.Debug()) } - -// WithContext return a DO with db with context -func (d *DO) WithContext(ctx context.Context) Dao { return d.getInstance(d.db.WithContext(ctx)) } - -// Clauses specify Clauses -func (d *DO) Clauses(conds ...clause.Expression) Dao { - if err := checkConds(conds); err != nil { - newDB := d.db.Session(new(gorm.Session)) - _ = newDB.AddError(err) - return d.getInstance(newDB) - } - return d.getInstance(d.db.Clauses(conds...)) -} - -// As alias cannot be heired, As must used on tail -func (d DO) As(alias string) Dao { - d.alias = alias - d.db = d.db.Table(fmt.Sprintf("%s AS %s", d.Quote(d.TableName()), d.Quote(alias))) - return &d -} - -// Alias return alias name -func (d *DO) Alias() string { return d.alias } - -// Columns return columns for Subquery -func (*DO) Columns(cols ...field.Expr) Columns { return cols } - -// ======================== chainable api ======================== - -// Not ... -func (d *DO) Not(conds ...Condition) Dao { - exprs, err := condToExpression(conds) - if err != nil { - return d.withError(err) - } - if len(exprs) == 0 { - return d - } - return d.getInstance(d.db.Clauses(clause.Where{Exprs: []clause.Expression{clause.Not(exprs...)}})) -} - -// Or ... -func (d *DO) Or(conds ...Condition) Dao { - exprs, err := condToExpression(conds) - if err != nil { - return d.withError(err) - } - if len(exprs) == 0 { - return d - } - return d.getInstance(d.db.Clauses(clause.Where{Exprs: []clause.Expression{clause.Or(clause.And(exprs...))}})) -} - -// Select ... -func (d *DO) Select(columns ...field.Expr) Dao { - if len(columns) == 0 { - return d.getInstance(d.db.Clauses(clause.Select{})) - } - query, args := buildExpr4Select(d.db.Statement, columns...) - return d.getInstance(d.db.Select(query, args...)) -} - -// Where ... -func (d *DO) Where(conds ...Condition) Dao { - exprs, err := condToExpression(conds) - if err != nil { - return d.withError(err) - } - if len(exprs) == 0 { - return d - } - return d.getInstance(d.db.Clauses(clause.Where{Exprs: exprs})) -} - -// Order ... -func (d *DO) Order(columns ...field.Expr) Dao { - // lazy build Columns - // if c, ok := d.db.Statement.Clauses[clause.OrderBy{}.Name()]; ok { - // if order, ok := c.Expression.(clause.OrderBy); ok { - // if expr, ok := order.Expression.(clause.CommaExpression); ok { - // expr.Exprs = append(expr.Exprs, toExpression(columns)...) - // return d.newInstance(d.db.Clauses(clause.OrderBy{Expression: expr})) - // } - // } - // } - // return d.newInstance(d.db.Clauses(clause.OrderBy{Expression: clause.CommaExpression{Exprs: toExpression(columns)}})) - if len(columns) == 0 { - return d - } - return d.getInstance(d.db.Order(d.toOrderValue(columns...))) -} - -func (d *DO) toOrderValue(columns ...field.Expr) string { - // eager build Columns - stmt := &gorm.Statement{DB: d.db.Statement.DB, Table: d.db.Statement.Table, Schema: d.db.Statement.Schema} - - for i, c := range columns { - if i != 0 { - stmt.WriteByte(',') - } - c.Build(stmt) - } - - return d.db.Dialector.Explain(stmt.SQL.String(), stmt.Vars...) -} - -// Distinct ... -func (d *DO) Distinct(columns ...field.Expr) Dao { - return d.getInstance(d.db.Distinct(toInterfaceSlice(toColExprFullName(d.db.Statement, columns...))...)) -} - -// Omit ... -func (d *DO) Omit(columns ...field.Expr) Dao { - if len(columns) == 0 { - return d - } - return d.getInstance(d.db.Omit(getColumnName(columns...)...)) -} - -// Group ... -func (d *DO) Group(columns ...field.Expr) Dao { - if len(columns) == 0 { - return d - } - - stmt := &gorm.Statement{DB: d.db.Statement.DB, Table: d.db.Statement.Table, Schema: d.db.Statement.Schema} - - for i, c := range columns { - if i != 0 { - stmt.WriteByte(',') - } - c.Build(stmt) - } - - return d.getInstance(d.db.Group(stmt.SQL.String())) -} - -// Having ... -func (d *DO) Having(conds ...Condition) Dao { - exprs, err := condToExpression(conds) - if err != nil { - return d.withError(err) - } - if len(exprs) == 0 { - return d - } - return d.getInstance(d.db.Clauses(clause.GroupBy{Having: exprs})) -} - -// Limit ... -func (d *DO) Limit(limit int) Dao { - return d.getInstance(d.db.Limit(limit)) -} - -// Offset ... -func (d *DO) Offset(offset int) Dao { - return d.getInstance(d.db.Offset(offset)) -} - -// Scopes ... -func (d *DO) Scopes(funcs ...func(Dao) Dao) Dao { - fcs := make([]func(*gorm.DB) *gorm.DB, len(funcs)) - for i, f := range funcs { - sf := f - fcs[i] = func(tx *gorm.DB) *gorm.DB { return sf(d.getInstance(tx)).(*DO).db } - } - return d.getInstance(d.db.Scopes(fcs...)) -} - -// Unscoped ... -func (d *DO) Unscoped() Dao { - return d.getInstance(d.db.Unscoped()) -} - -// Join ... -func (d *DO) Join(table schema.Tabler, conds ...field.Expr) Dao { - return d.join(table, clause.InnerJoin, conds) -} - -// LeftJoin ... -func (d *DO) LeftJoin(table schema.Tabler, conds ...field.Expr) Dao { - return d.join(table, clause.LeftJoin, conds) -} - -// RightJoin ... -func (d *DO) RightJoin(table schema.Tabler, conds ...field.Expr) Dao { - return d.join(table, clause.RightJoin, conds) -} - -func (d *DO) join(table schema.Tabler, joinType clause.JoinType, conds []field.Expr) Dao { - if len(conds) == 0 { - return d.withError(ErrEmptyCondition) - } - - join := clause.Join{ - Type: joinType, - Table: clause.Table{Name: table.TableName()}, - ON: clause.Where{Exprs: toExpression(conds...)}, - } - if do, ok := table.(Dao); ok { - join.Expression = helper.NewJoinTblExpr(join, Table(do).underlyingDB().Statement.TableExpr) - } - if al, ok := table.(interface{ Alias() string }); ok { - join.Table.Alias = al.Alias() - } - - from := getFromClause(d.db) - from.Joins = append(from.Joins, join) - return d.getInstance(d.db.Clauses(from)) -} - -// Attrs ... -func (d *DO) Attrs(attrs ...field.AssignExpr) Dao { - if len(attrs) == 0 { - return d - } - return d.getInstance(d.db.Attrs(d.attrsValue(attrs)...)) -} - -// Assign ... -func (d *DO) Assign(attrs ...field.AssignExpr) Dao { - if len(attrs) == 0 { - return d - } - return d.getInstance(d.db.Assign(d.attrsValue(attrs)...)) -} - -func (d *DO) attrsValue(attrs []field.AssignExpr) []interface{} { - values := make([]interface{}, 0, len(attrs)) - for _, attr := range attrs { - if expr, ok := attr.AssignExpr().(clause.Eq); ok { - values = append(values, expr) - } - } - return values -} - -// Joins ... -func (d *DO) Joins(field field.RelationField) Dao { - var args []interface{} - - if conds := field.GetConds(); len(conds) > 0 { - var exprs []clause.Expression - for _, oe := range toExpression(conds...) { - switch e := oe.(type) { - case clause.Eq: - if c, ok := e.Column.(clause.Column); ok { - c.Table = field.Name() - e.Column = c - } - exprs = append(exprs, e) - case clause.Neq: - if c, ok := e.Column.(clause.Column); ok { - c.Table = field.Name() - e.Column = c - } - exprs = append(exprs, e) - case clause.Gt: - if c, ok := e.Column.(clause.Column); ok { - c.Table = field.Name() - e.Column = c - } - exprs = append(exprs, e) - case clause.Gte: - if c, ok := e.Column.(clause.Column); ok { - c.Table = field.Name() - e.Column = c - } - exprs = append(exprs, e) - case clause.Lt: - if c, ok := e.Column.(clause.Column); ok { - c.Table = field.Name() - e.Column = c - } - exprs = append(exprs, e) - case clause.Lte: - if c, ok := e.Column.(clause.Column); ok { - c.Table = field.Name() - e.Column = c - } - exprs = append(exprs, e) - case clause.Like: - if c, ok := e.Column.(clause.Column); ok { - c.Table = field.Name() - e.Column = c - } - exprs = append(exprs, e) - } - } - - args = append(args, d.db.Clauses(clause.Where{ - Exprs: exprs, - })) - } - if columns := field.GetSelects(); len(columns) > 0 { - colNames := make([]string, len(columns)) - for i, c := range columns { - colNames[i] = string(c.ColumnName()) - } - args = append(args, func(db *gorm.DB) *gorm.DB { - return db.Select(colNames) - }) - } - if columns := field.GetOrderCol(); len(columns) > 0 { - var os []string - for _, oe := range columns { - switch e := oe.RawExpr().(type) { - case clause.Expr: - vs := []interface{}{} - for _, v := range e.Vars { - if c, ok := v.(clause.Column); ok { - vs = append(vs, clause.Column{ - Table: field.Name(), - Name: c.Name, - Alias: c.Alias, - Raw: c.Raw, - }) - } - } - e.Vars = vs - newStmt := &gorm.Statement{DB: d.db.Statement.DB, Table: d.db.Statement.Table, Schema: d.db.Statement.Schema} - e.Build(newStmt) - os = append(os, newStmt.SQL.String()) - } - } - args = append(args, d.db.Order(strings.Join(os, ","))) - } - if clauses := field.GetClauses(); len(clauses) > 0 { - args = append(args, func(db *gorm.DB) *gorm.DB { - return db.Clauses(clauses...) - }) - } - if funcs := field.GetScopes(); len(funcs) > 0 { - for _, f := range funcs { - args = append(args, (func(*gorm.DB) *gorm.DB)(f)) - } - } - if offset, limit := field.GetPage(); offset|limit != 0 { - args = append(args, func(db *gorm.DB) *gorm.DB { - return db.Offset(offset).Limit(limit) - }) - } - - return d.getInstance(d.db.Joins(field.Path(), args...)) -} - -// Preload ... -func (d *DO) Preload(field field.RelationField) Dao { - var args []interface{} - if conds := field.GetConds(); len(conds) > 0 { - args = append(args, toExpressionInterface(conds...)...) - } - if columns := field.GetSelects(); len(columns) > 0 { - colNames := make([]string, len(columns)) - for i, c := range columns { - colNames[i] = string(c.ColumnName()) - } - args = append(args, func(db *gorm.DB) *gorm.DB { - return db.Select(colNames) - }) - } - if columns := field.GetOrderCol(); len(columns) > 0 { - args = append(args, func(db *gorm.DB) *gorm.DB { - return db.Order(d.toOrderValue(columns...)) - }) - } - if clauses := field.GetClauses(); len(clauses) > 0 { - args = append(args, func(db *gorm.DB) *gorm.DB { - return db.Clauses(clauses...) - }) - } - if funcs := field.GetScopes(); len(funcs) > 0 { - for _, f := range funcs { - args = append(args, (func(*gorm.DB) *gorm.DB)(f)) - } - } - if offset, limit := field.GetPage(); offset|limit != 0 { - args = append(args, func(db *gorm.DB) *gorm.DB { - return db.Offset(offset).Limit(limit) - }) - } - return d.getInstance(d.db.Preload(field.Path(), args...)) -} - -// UpdateFrom specify update sub query -func (d *DO) UpdateFrom(q SubQuery) Dao { - var tableName strings.Builder - d.db.Statement.QuoteTo(&tableName, d.TableName()) - if d.alias != "" { - tableName.WriteString(" AS ") - d.db.Statement.QuoteTo(&tableName, d.alias) - } - - tableName.WriteByte(',') - if _, ok := q.underlyingDB().Statement.Clauses["SELECT"]; ok || len(q.underlyingDB().Statement.Selects) > 0 { - tableName.WriteString("(" + q.underlyingDB().ToSQL(func(tx *gorm.DB) *gorm.DB { return tx.Table(q.underlyingDO().TableName()).Find(nil) }) + ")") - } else { - d.db.Statement.QuoteTo(&tableName, q.underlyingDO().TableName()) - } - if alias := q.underlyingDO().alias; alias != "" { - tableName.WriteString(" AS ") - d.db.Statement.QuoteTo(&tableName, alias) - } - - return d.getInstance(d.db.Clauses(clause.Update{Table: clause.Table{Name: tableName.String(), Raw: true}})) -} - -func getFromClause(db *gorm.DB) *clause.From { - if db == nil || db.Statement == nil { - return &clause.From{} - } - c, ok := db.Statement.Clauses[clause.From{}.Name()] - if !ok || c.Expression == nil { - return &clause.From{} - } - from, ok := c.Expression.(clause.From) - if !ok { - return &clause.From{} - } - return &from -} - -// ======================== finisher api ======================== - -// Create ... -func (d *DO) Create(value interface{}) error { - return d.db.Create(value).Error -} - -// CreateInBatches ... -func (d *DO) CreateInBatches(value interface{}, batchSize int) error { - return d.db.CreateInBatches(value, batchSize).Error -} - -// Save ... -func (d *DO) Save(value interface{}) error { - return d.db.Clauses(clause.OnConflict{UpdateAll: true}).Create(value).Error -} - -// First ... -func (d *DO) First() (result interface{}, err error) { - return d.singleQuery(d.db.First) -} - -// Take ... -func (d *DO) Take() (result interface{}, err error) { - return d.singleQuery(d.db.Take) -} - -// Last ... -func (d *DO) Last() (result interface{}, err error) { - return d.singleQuery(d.db.Last) -} - -func (d *DO) singleQuery(query func(dest interface{}, conds ...interface{}) *gorm.DB) (result interface{}, err error) { - if d.modelType == nil { - return d.singleScan() - } - - result = d.newResultPointer() - if err := query(result).Error; err != nil { - return nil, err - } - return result, nil -} - -func (d *DO) singleScan() (result interface{}, err error) { - result = map[string]interface{}{} - err = d.db.Scan(result).Error - return -} - -// Find ... -func (d *DO) Find() (results interface{}, err error) { - return d.multiQuery(d.db.Find) -} - -func (d *DO) multiQuery(query func(dest interface{}, conds ...interface{}) *gorm.DB) (results interface{}, err error) { - if d.modelType == nil { - return d.findToMap() - } - - resultsPtr := d.newResultSlicePointer() - err = query(resultsPtr).Error - return reflect.Indirect(reflect.ValueOf(resultsPtr)).Interface(), err -} - -func (d *DO) findToMap() (interface{}, error) { - var results []map[string]interface{} - err := d.db.Find(&results).Error - return results, err -} - -// FindInBatches ... -func (d *DO) FindInBatches(dest interface{}, batchSize int, fc func(tx Dao, batch int) error) error { - return d.db.FindInBatches(dest, batchSize, func(tx *gorm.DB, batch int) error { return fc(d.getInstance(tx), batch) }).Error -} - -// FirstOrInit ... -func (d *DO) FirstOrInit() (result interface{}, err error) { - return d.singleQuery(d.db.FirstOrInit) -} - -// FirstOrCreate ... -func (d *DO) FirstOrCreate() (result interface{}, err error) { - return d.singleQuery(d.db.FirstOrCreate) -} - -// Update ... -func (d *DO) Update(column field.Expr, value interface{}) (info ResultInfo, err error) { - tx := d.db.Model(d.newResultPointer()) - columnStr := column.BuildColumn(d.db.Statement, field.WithoutQuote).String() - - var result *gorm.DB - switch value := value.(type) { - case field.AssignExpr: - result = tx.Update(columnStr, value.AssignExpr()) - case SubQuery: - result = tx.Update(columnStr, value.underlyingDB()) - default: - result = tx.Update(columnStr, value) - } - return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error -} - -// UpdateSimple ... -func (d *DO) UpdateSimple(columns ...field.AssignExpr) (info ResultInfo, err error) { - if len(columns) == 0 { - return - } - - result := d.db.Model(d.newResultPointer()).Clauses(d.assignSet(columns)).Omit("*").Updates(map[string]interface{}{}) - return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error -} - -// Updates ... -func (d *DO) Updates(value interface{}) (info ResultInfo, err error) { - var rawTyp, valTyp reflect.Type - - rawTyp = reflect.TypeOf(value) - if rawTyp.Kind() == reflect.Ptr { - valTyp = rawTyp.Elem() - } else { - valTyp = rawTyp - } - - tx := d.db - if d.backfillData != nil { - tx = tx.Model(d.backfillData) - } - switch { - case valTyp != d.modelType: // different type with model - if d.backfillData == nil { - tx = tx.Model(d.newResultPointer()) - } - case rawTyp.Kind() == reflect.Ptr: // ignore ptr value - default: // for fixing "reflect.Value.Addr of unaddressable value" panic - ptr := reflect.New(d.modelType) - ptr.Elem().Set(reflect.ValueOf(value)) - value = ptr.Interface() - } - result := tx.Updates(value) - return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error -} - -// UpdateColumn ... -func (d *DO) UpdateColumn(column field.Expr, value interface{}) (info ResultInfo, err error) { - tx := d.db.Model(d.newResultPointer()) - columnStr := column.BuildColumn(d.db.Statement, field.WithoutQuote).String() - - var result *gorm.DB - switch value := value.(type) { - case field.Expr: - result = tx.UpdateColumn(columnStr, value.RawExpr()) - case SubQuery: - result = d.db.UpdateColumn(columnStr, value.underlyingDB()) - default: - result = d.db.UpdateColumn(columnStr, value) - } - return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error -} - -// UpdateColumnSimple ... -func (d *DO) UpdateColumnSimple(columns ...field.AssignExpr) (info ResultInfo, err error) { - if len(columns) == 0 { - return - } - - result := d.db.Model(d.newResultPointer()).Clauses(d.assignSet(columns)).Omit("*").UpdateColumns(map[string]interface{}{}) - return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error -} - -// UpdateColumns ... -func (d *DO) UpdateColumns(value interface{}) (info ResultInfo, err error) { - result := d.db.Model(d.newResultPointer()).UpdateColumns(value) - return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error -} - -// assignSet fetch all set -func (d *DO) assignSet(exprs []field.AssignExpr) (set clause.Set) { - for _, expr := range exprs { - column := clause.Column{Table: d.alias, Name: string(expr.ColumnName())} - switch e := expr.AssignExpr().(type) { - case clause.Expr: - set = append(set, clause.Assignment{Column: column, Value: e}) - case clause.Eq: - set = append(set, clause.Assignment{Column: column, Value: e.Value}) - case clause.Set: - set = append(set, e...) - } - } - - stmt := d.db.Session(&gorm.Session{}).Statement - stmt.Dest = map[string]interface{}{} - return append(set, callbacks.ConvertToAssignments(stmt)...) -} - -// Delete ... -func (d *DO) Delete(models ...interface{}) (info ResultInfo, err error) { - var result *gorm.DB - if len(models) == 0 || reflect.ValueOf(models[0]).Len() == 0 { - result = d.db.Model(d.newResultPointer()).Delete(reflect.New(d.modelType).Interface()) - } else { - targets := reflect.MakeSlice(reflect.SliceOf(reflect.PtrTo(d.modelType)), 0, len(models)) - value := reflect.ValueOf(models[0]) - for i := 0; i < value.Len(); i++ { - targets = reflect.Append(targets, value.Index(i)) - } - result = d.db.Delete(targets.Interface()) - } - return ResultInfo{RowsAffected: result.RowsAffected, Error: result.Error}, result.Error -} - -// Count ... -func (d *DO) Count() (count int64, err error) { - return count, d.db.Session(&gorm.Session{}).Model(d.newResultPointer()).Count(&count).Error -} - -// Row ... -func (d *DO) Row() *sql.Row { - return d.db.Model(d.newResultPointer()).Row() -} - -// Rows ... -func (d *DO) Rows() (*sql.Rows, error) { - return d.db.Model(d.newResultPointer()).Rows() -} - -// Scan ... -func (d *DO) Scan(dest interface{}) error { - return d.db.Model(d.newResultPointer()).Scan(dest).Error -} - -// Fetch ... -func (d *DO) Fetch(dest interface{}) error { - return d.db.Model(d.newResultPointer()).Find(dest).Error -} - -// Pluck ... -func (d *DO) Pluck(column field.Expr, dest interface{}) error { - return d.db.Model(d.newResultPointer()).Pluck(column.ColumnName().String(), dest).Error -} - -// ScanRows ... -func (d *DO) ScanRows(rows *sql.Rows, dest interface{}) error { - return d.db.Model(d.newResultPointer()).ScanRows(rows, dest) -} - -// WithResult ... -func (d DO) WithResult(fc func(tx Dao)) ResultInfo { - d.db = d.db.Set("", "") - fc(&d) - return ResultInfo{RowsAffected: d.db.RowsAffected, Error: d.db.Error} -} - -func (d *DO) newResultPointer() interface{} { - if d.backfillData != nil { - return d.backfillData - } - if d.modelType == nil { - return nil - } - return reflect.New(d.modelType).Interface() -} - -func (d *DO) newResultSlicePointer() interface{} { - return reflect.New(reflect.SliceOf(reflect.PtrTo(d.modelType))).Interface() -} - -func toColExprFullName(stmt *gorm.Statement, columns ...field.Expr) []string { - return buildColExpr(stmt, columns, field.WithAll) -} - -func getColumnName(columns ...field.Expr) (result []string) { - for _, c := range columns { - result = append(result, c.ColumnName().String()) - } - return result -} - -func buildColExpr(stmt *gorm.Statement, cols []field.Expr, opts ...field.BuildOpt) []string { - results := make([]string, len(cols)) - for i, c := range cols { - switch c.RawExpr().(type) { - case clause.Column: - results[i] = c.BuildColumn(stmt, opts...).String() - case clause.Expression: - sql, args := c.BuildWithArgs(stmt) - results[i] = stmt.Dialector.Explain(sql.String(), args...) - } - } - return results -} - -func buildExpr4Select(stmt *gorm.Statement, exprs ...field.Expr) (query string, args []interface{}) { - if len(exprs) == 0 { - return "", nil - } - - var queryItems []string - for _, e := range exprs { - sql, vars := e.BuildWithArgs(stmt) - queryItems = append(queryItems, sql.String()) - args = append(args, vars...) - } - if len(args) == 0 { - return queryItems[0], toInterfaceSlice(queryItems[1:]) - } - return strings.Join(queryItems, ","), args -} - -func toExpression(exprs ...field.Expr) []clause.Expression { - result := make([]clause.Expression, len(exprs)) - for i, e := range exprs { - result[i] = singleExpr(e) - } - return result -} - -func toExpressionInterface(exprs ...field.Expr) []interface{} { - result := make([]interface{}, len(exprs)) - for i, e := range exprs { - result[i] = singleExpr(e) - } - return result -} - -func singleExpr(e field.Expr) clause.Expression { - switch v := e.RawExpr().(type) { - case clause.Expression: - return v - case clause.Column: - return clause.NamedExpr{SQL: "?", Vars: []interface{}{v}} - default: - return clause.Expr{} - } -} - -func toInterfaceSlice(value interface{}) []interface{} { - switch v := value.(type) { - case string: - return []interface{}{v} - case []string: - res := make([]interface{}, len(v)) - for i, item := range v { - res[i] = item - } - return res - case []clause.Column: - res := make([]interface{}, len(v)) - for i, item := range v { - res[i] = item - } - return res - default: - return nil - } -} - -// ======================== New Table ======================== - -// Table return a new table produced by subquery, -// the return value has to be used as root node -// -// Table(u.Select(u.ID, u.Name).Where(u.Age.Gt(18))).Select() -// -// the above usage is equivalent to SQL statement: -// -// SELECT * FROM (SELECT `id`, `name` FROM `users_info` WHERE `age` > ?)" -func Table(subQueries ...SubQuery) Dao { - if len(subQueries) == 0 { - return &DO{} - } - - tablePlaceholder := make([]string, len(subQueries)) - tableExprs := make([]interface{}, len(subQueries)) - for i, query := range subQueries { - tablePlaceholder[i] = "(?)" - - do := query.underlyingDO() - // ignore alias, or will misuse with sub query alias - tableExprs[i] = do.db.Table(do.TableName()) - if do.alias != "" { - tablePlaceholder[i] += " AS " + do.Quote(do.alias) - } - } - - return &DO{ - db: subQueries[0].underlyingDO().db.Session(&gorm.Session{NewDB: true}). - Table(strings.Join(tablePlaceholder, ", "), tableExprs...), - } -} - -// ======================== sub query method ======================== - -// Columns columns array -type Columns []field.Expr - -// Set assign value by subquery -func (cs Columns) Set(query SubQuery) field.AssignExpr { - return field.AssignSubQuery(cs, query.underlyingDB()) -} - -// In accept query or value -func (cs Columns) In(queryOrValue Condition) field.Expr { - if len(cs) == 0 { - return field.EmptyExpr() - } - - switch query := queryOrValue.(type) { - case field.Value: - return field.ContainsValue(cs, query) - case SubQuery: - return field.ContainsSubQuery(cs, query.underlyingDB()) - default: - return field.EmptyExpr() - } -} - -// NotIn ... -func (cs Columns) NotIn(queryOrValue Condition) field.Expr { - return field.Not(cs.In(queryOrValue)) -} - -// Eq ... -func (cs Columns) Eq(query SubQuery) field.Expr { - if len(cs) == 0 { - return field.EmptyExpr() - } - return field.CompareSubQuery(field.EqOp, cs[0], query.underlyingDB()) -} - -// Neq ... -func (cs Columns) Neq(query SubQuery) field.Expr { - if len(cs) == 0 { - return field.EmptyExpr() - } - return field.CompareSubQuery(field.NeqOp, cs[0], query.underlyingDB()) -} - -// Gt ... -func (cs Columns) Gt(query SubQuery) field.Expr { - if len(cs) == 0 { - return field.EmptyExpr() - } - return field.CompareSubQuery(field.GtOp, cs[0], query.underlyingDB()) -} - -// Gte ... -func (cs Columns) Gte(query SubQuery) field.Expr { - if len(cs) == 0 { - return field.EmptyExpr() - } - return field.CompareSubQuery(field.GteOp, cs[0], query.underlyingDB()) -} - -// Lt ... -func (cs Columns) Lt(query SubQuery) field.Expr { - if len(cs) == 0 { - return field.EmptyExpr() - } - return field.CompareSubQuery(field.LtOp, cs[0], query.underlyingDB()) -} - -// Lte ... -func (cs Columns) Lte(query SubQuery) field.Expr { - if len(cs) == 0 { - return field.EmptyExpr() - } - return field.CompareSubQuery(field.LteOp, cs[0], query.underlyingDB()) -} diff --git a/toolkit/gormgen/do_options.go b/toolkit/gormgen/do_options.go deleted file mode 100644 index 4ca7f955..00000000 --- a/toolkit/gormgen/do_options.go +++ /dev/null @@ -1,23 +0,0 @@ -package gormgen - -// DOOption gorm option interface -type DOOption interface { - Apply(*DOConfig) error - AfterInitialize(*DO) error -} - -type DOConfig struct { -} - -// Apply update config to new config -func (c *DOConfig) Apply(config *DOConfig) error { - if config != c { - *config = *c - } - return nil -} - -// AfterInitialize initialize plugins after db connected -func (c *DOConfig) AfterInitialize(db *DO) error { - return nil -} diff --git a/toolkit/gormgen/do_test.go b/toolkit/gormgen/do_test.go deleted file mode 100644 index f66b9135..00000000 --- a/toolkit/gormgen/do_test.go +++ /dev/null @@ -1,395 +0,0 @@ -package gormgen - -import ( - "reflect" - "strings" - "testing" - - "github.com/wubin1989/datatypes" - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/clause" - "github.com/wubin1989/hints" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" -) - -var ( - createClauses = []string{"INSERT", "VALUES", "ON CONFLICT"} - queryClauses = []string{"SELECT", "FROM", "WHERE", "GROUP BY", "ORDER BY", "LIMIT", "FOR"} - updateClauses = []string{"UPDATE", "SET", "WHERE"} - deleteClauses = []string{"DELETE", "FROM", "WHERE"} -) - -type stmtOpt func(*gorm.Statement) *gorm.Statement - -var ( - // withFROM add FROM clause - withFROM stmtOpt = func(stmt *gorm.Statement) *gorm.Statement { - stmt.AddClause(clause.From{}) - return stmt - } - - // // withSELECT add SELECT clause - // withSELECT stmtOpt = func(stmt *gorm.Statement) *gorm.Statement { - // if _, ok := stmt.Clauses["SELECT"]; !ok { - // stmt.AddClause(clause.Select{Distinct: stmt.Distinct}) - // } - // return stmt - // } -) - -func checkBuildExpr(t *testing.T, e SubQuery, opts []stmtOpt, result string, vars []interface{}) { - stmt := build(e.underlyingDB().Statement, opts...) - - sql := strings.TrimSpace(stmt.SQL.String()) - if sql != result { - t.Errorf("SQL expects %v got %v", result, sql) - } - - if !reflect.DeepEqual(stmt.Vars, vars) { - t.Errorf("Vars expects %+v got %v", vars, stmt.Vars) - } -} - -func build(stmt *gorm.Statement, opts ...stmtOpt) *gorm.Statement { - for _, opt := range opts { - stmt = opt(stmt) - } - - if _, ok := stmt.Clauses["SELECT"]; !ok && len(stmt.Selects) > 0 { - stmt.AddClause(clause.Select{Distinct: stmt.Distinct, Expression: clause.Expr{SQL: strings.Join(stmt.Selects, ",")}}) - } - - findClauses := func() []string { - for _, cs := range [][]string{createClauses, queryClauses, updateClauses, deleteClauses} { - if _, ok := stmt.Clauses[cs[0]]; ok { - return cs - } - } - return queryClauses - } - - stmt.Build(findClauses()...) - return stmt -} - -func TestDO_methods(t *testing.T) { - testcases := []struct { - Expr SubQuery - Opts []stmtOpt - ExpectedVars []interface{} - Result string - }{ - { - Expr: u.Select(), - Result: "SELECT *", - }, - { - Expr: u.Select(u.ID, u.Name), - Result: "SELECT `id`,`name`", - }, - { - Expr: u.Distinct(u.Name), - Result: "SELECT DISTINCT `name`", - }, - { - Expr: teacher.Distinct(teacher.ID, teacher.Name), - Result: "SELECT DISTINCT `teacher`.`id`,`teacher`.`name`", - }, - { - Expr: teacher.Select(teacher.ID, teacher.Name).Distinct(), - Result: "SELECT DISTINCT `teacher`.`id`,`teacher`.`name`", - }, - { - Expr: teacher.Distinct().Select(teacher.ID, teacher.Name), - Result: "SELECT DISTINCT `teacher`.`id`,`teacher`.`name`", - }, - { - Expr: teacher.Select(teacher.Name.As("n")).Distinct(), - Result: "SELECT DISTINCT `teacher`.`name` AS `n`", - }, - { - Expr: teacher.Select(field.ALL), - Result: "SELECT *", - }, - { - Expr: teacher.Select(field.ALL.Count()), - Result: "SELECT COUNT(*)", - }, - { - Expr: teacher.Select(field.ALL.Distinct().Count()), - Result: "SELECT COUNT(DISTINCT *)", - }, - { - Expr: teacher.Select(teacher.ALL), - Result: "SELECT `teacher`.*", - }, - { - Expr: teacher.Select(teacher.ALL.Count()), - Result: "SELECT COUNT(`teacher`.*)", - }, - { - Expr: teacher.Select(teacher.ALL.Distinct().Count()), - Result: "SELECT COUNT(DISTINCT `teacher`.*)", - }, - { - Expr: teacher.Select(teacher.ID.As("i"), teacher.Name.As("n")).Distinct(), - Result: "SELECT DISTINCT `teacher`.`id` AS `i`,`teacher`.`name` AS `n`", - }, - { - Expr: u.Where(u.ID.Eq(10)), - ExpectedVars: []interface{}{uint(10)}, - Result: "WHERE `id` = ?", - }, - { - Expr: u.Where(u.Name.Eq("tom"), u.Age.Gt(18)), - ExpectedVars: []interface{}{"tom", 18}, - Result: "WHERE `name` = ? AND `age` > ?", - }, - { - Expr: u.Order(u.ID), - Result: "ORDER BY `id`", - }, - { - Expr: u.Order(u.ID.Desc()), - Result: "ORDER BY `id` DESC", - }, - { - Expr: u.Order(u.ID.Desc(), u.Age), - Result: "ORDER BY `id` DESC,`age`", - }, - { - Expr: u.Order(u.ID.Desc()).Order(u.Age), - Result: "ORDER BY `id` DESC,`age`", - }, - { - Expr: u.Clauses(hints.New("hint")).Select(), - Result: "SELECT /*+ hint */ *", - }, - { - Expr: u.Clauses(hints.Comment("select", "hint")).Select(), - Result: "SELECT /* hint */ *", - }, - { - Expr: u.Clauses(hints.CommentBefore("select", "hint")).Select(), - Result: "/* hint */ SELECT *", - }, - { - Expr: u.Clauses(hints.CommentAfter("select", "hint")).Select(), - Result: "SELECT * /* hint */", - }, - { - Expr: u.Clauses(hints.CommentAfter("where", "hint")).Select().Where(u.ID.Gt(0)), - ExpectedVars: []interface{}{uint(0)}, - Result: "SELECT * WHERE `id` > ? /* hint */", - }, - { - Expr: u.Clauses(hints.UseIndex("user_name")).Select(), - Opts: []stmtOpt{withFROM}, - Result: "SELECT * FROM `users_info` USE INDEX (`user_name`)", - }, - { - Expr: u.Clauses(hints.ForceIndex("user_name", "user_id").ForJoin()).Select(), - Opts: []stmtOpt{withFROM}, - Result: "SELECT * FROM `users_info` FORCE INDEX FOR JOIN (`user_name`,`user_id`)", - }, - { - Expr: u.Clauses( - hints.ForceIndex("user_name", "user_id").ForJoin(), - hints.IgnoreIndex("user_name").ForGroupBy(), - ).Select(), - Opts: []stmtOpt{withFROM}, - Result: "SELECT * FROM `users_info` FORCE INDEX FOR JOIN (`user_name`,`user_id`) IGNORE INDEX FOR GROUP BY (`user_name`)", - }, - // ======================== where conditions ======================== - { - Expr: u.Where(u.Where(u.ID.Neq(0)), u.Where(u.Age.Gt(18))), - ExpectedVars: []interface{}{uint(0), 18}, - Result: "WHERE `id` <> ? AND `age` > ?", - }, - { - Expr: u.Where(u.Age.Lte(18)).Or(u.Where(u.Name.Eq("tom"))), - ExpectedVars: []interface{}{18, "tom"}, - Result: "WHERE `age` <= ? OR `name` = ?", - }, - { - Expr: u.Where(u.Age.Lte(18)).Or(u.Name.Eq("tom"), u.Famous.Is(true)), - ExpectedVars: []interface{}{18, "tom", true}, - Result: "WHERE `age` <= ? OR (`name` = ? AND `famous` = ?)", - }, - { - Expr: u.Where(u.Columns(u.ID, u.Age).In(field.Values([][]int{{1, 18}, {2, 19}}))), - ExpectedVars: []interface{}{1, 18, 2, 19}, - Result: "WHERE (`id`, `age`) IN ((?,?),(?,?))", - }, - { - Expr: u.Where(u.Columns(u.ID, u.Age).NotIn(field.Values([][]int{{1, 18}, {2, 19}}))), - ExpectedVars: []interface{}{1, 18, 2, 19}, - Result: "WHERE NOT (`id`, `age`) IN ((?,?),(?,?))", - }, - { - Expr: u.Where(u.Columns(u.ID, u.Name).In(field.Values([][]interface{}{{1, "modi"}, {2, "tom"}}))), - ExpectedVars: []interface{}{1, "modi", 2, "tom"}, - Result: "WHERE (`id`, `name`) IN ((?,?),(?,?))", - }, - { - Expr: u.Where(u.Where(u.Name.Eq("tom"), u.Famous.Is(true))).Or(u.Age.Lte(18)), - ExpectedVars: []interface{}{"tom", true, 18}, - Result: "WHERE (`name` = ? AND `famous` = ?) OR `age` <= ?", - }, - { - Expr: u.Where(u.Name.Eq("tom")).Where(u.Where(u.Famous.Is(true)).Or(u.Age.Lte(18))), - ExpectedVars: []interface{}{"tom", true, 18}, - Result: "WHERE `name` = ? AND (`famous` = ? OR `age` <= ?)", - }, - { - Expr: u.Where(u.Name.Eq("tom"), field.Or(u.Famous.Is(true), u.Age.Lte(18))), - ExpectedVars: []interface{}{"tom", true, 18}, - Result: "WHERE `name` = ? AND (`famous` = ? OR `age` <= ?)", - }, - { - Expr: u.Where(Cond(datatypes.JSONQuery("attributes").HasKey("role", "name"))...), - ExpectedVars: []interface{}{"$.role.name"}, - Result: "WHERE JSON_EXTRACT(`attributes`,?) IS NOT NULL", - }, - { - Expr: u.Where( - u.Where(u.ID.Neq(0)).Where(u.Score.Gt(89.9)), - u.Where(u.Age.Gt(18)).Where(u.Address.Eq("New York")), - ), - ExpectedVars: []interface{}{uint(0), 89.9, 18, "New York"}, - Result: "WHERE (`id` <> ? AND `score` > ?) AND (`age` > ? AND `address` = ?)", - }, - { - Expr: u.Where( - u.Where(u.Age.Gt(18)).Where(u.Where(u.Famous.Is(true)).Or(u.Score.Gte(100.0))), - ).Or( - u.Where(u.Age.Lte(18)).Where(u.Name.Eq("tom")), - ), - ExpectedVars: []interface{}{18, true, 100.0, 18, "tom"}, - Result: "WHERE (`age` > ? AND (`famous` = ? OR `score` >= ?)) OR (`age` <= ? AND `name` = ?)", - }, - { - Expr: u.Select(u.ID, u.Name).Where(u.Age.Gt(18), u.Score.Gte(100)), - ExpectedVars: []interface{}{18, 100.0}, - Result: "SELECT `id`,`name` WHERE `age` > ? AND `score` >= ?", - }, - { - Expr: u.Select().Where(Cond(datatypes.JSONQuery("attributes").HasKey("role"))...), - Opts: []stmtOpt{withFROM}, - ExpectedVars: []interface{}{"$.role"}, - Result: "SELECT * FROM `users_info` WHERE JSON_EXTRACT(`attributes`,?) IS NOT NULL", - }, - // ======================== subquery ======================== - { - Expr: u.Select().Where(u.Columns(u.ID).Eq(u.Select(u.ID.Max()))), - Result: "SELECT * WHERE `id` = (SELECT MAX(`id`) FROM `users_info`)", - }, - { - Expr: u.Select().Where( - u.Columns(u.ID).Eq( - u.Select(u.ID).Where( - u.Columns(u.Name).Eq( - student.Select(student.Name).Where(student.ID.Eq(1)), - ), - ), - )), - ExpectedVars: []interface{}{int64(1)}, - Result: "SELECT * WHERE `id` = (SELECT `id` FROM `users_info` WHERE `name` = (SELECT `student`.`name` FROM `student` WHERE `student`.`id` = ?))", - }, - { - Expr: u.Select().Where(u.Columns(u.ID).Neq(u.Select(u.ID.Max()))), - Result: "SELECT * WHERE `id` <> (SELECT MAX(`id`) FROM `users_info`)", - }, - { - Expr: u.Select(u.ID).Where(u.Columns(u.Score.Mul(2)).Lte(u.Select(u.Score.Avg()))), - ExpectedVars: []interface{}{2.0}, - Result: "SELECT `id` WHERE `score`*? <= (SELECT AVG(`score`) FROM `users_info`)", - }, - { - Expr: u.Select(u.ID).Where(u.Columns(u.Score).Gt(u.Select(u.Score.Avg()))), - Result: "SELECT `id` WHERE `score` > (SELECT AVG(`score`) FROM `users_info`)", - }, - { - Expr: u.Select(u.ID, u.Name).Where(u.Columns(u.Score).Lte(u.Select(u.Score.Avg()).Where(u.Age.Gte(18)))), - ExpectedVars: []interface{}{18}, - Result: "SELECT `id`,`name` WHERE `score` <= (SELECT AVG(`score`) FROM `users_info` WHERE `age` >= ?)", - }, - { - Expr: u.Select(u.ID).Where(u.Columns(u.Score).In(u.Select(u.Score).Where(u.Age.Gte(18)))), - ExpectedVars: []interface{}{18}, - Result: "SELECT `id` WHERE `score` IN (SELECT `score` FROM `users_info` WHERE `age` >= ?)", - }, - { - Expr: u.Select(u.ID).Where(u.Columns(u.ID, u.Age).In(u.Select(u.ID, u.Age).Where(u.Score.Eq(100)))), - ExpectedVars: []interface{}{100.0}, - Result: "SELECT `id` WHERE (`id`,`age`) IN (SELECT `id`,`age` FROM `users_info` WHERE `score` = ?)", - }, - { - Expr: u.Select(u.Age.Avg().As("avgage")).Group(u.Name).Having(u.Columns(u.Age.Avg()).Gt(u.Select(u.Age.Avg()).Where(u.Name.Like("name%")))), - Opts: []stmtOpt{withFROM}, - ExpectedVars: []interface{}{"name%"}, - Result: "SELECT AVG(`age`) AS `avgage` FROM `users_info` GROUP BY `name` HAVING AVG(`age`) > (SELECT AVG(`age`) FROM `users_info` WHERE `name` LIKE ?)", - }, - { - Expr: student.Select().LeftJoin(teacher, teacher.ID.EqCol(student.Instructor)).Group(student.ID), - Result: "SELECT * FROM `student` LEFT JOIN `teacher` ON `teacher`.`id` = `student`.`instructor` GROUP BY `student`.`id`", - }, - // ======================== from subquery ======================== - { - Expr: Table(u.Select(u.ID, u.Name).Where(u.Age.Gt(18))).Select(), - Opts: []stmtOpt{withFROM}, - ExpectedVars: []interface{}{18}, - Result: "SELECT * FROM (SELECT `id`,`name` FROM `users_info` WHERE `age` > ?)", - }, - { - Expr: Table(u.Select(u.ID).Where(u.Age.Gt(18)), u.Select(u.ID).Where(u.Score.Gte(100))).Select(), - Opts: []stmtOpt{withFROM}, - ExpectedVars: []interface{}{18, 100.0}, - Result: "SELECT * FROM (SELECT `id` FROM `users_info` WHERE `age` > ?), (SELECT `id` FROM `users_info` WHERE `score` >= ?)", - }, - { - Expr: Table(u.Select().Where(u.Age.Gt(18)), u.Where(u.Score.Gte(100))).Select(), - Opts: []stmtOpt{withFROM}, - ExpectedVars: []interface{}{18, 100.0}, - Result: "SELECT * FROM (SELECT * FROM `users_info` WHERE `age` > ?), (SELECT * FROM `users_info` WHERE `score` >= ?)", - }, - { - Expr: Table(u.Select().Where(u.Age.Gt(18)).As("a"), u.Where(u.Score.Gte(100)).As("b")).Select(), - Opts: []stmtOpt{withFROM}, - ExpectedVars: []interface{}{18, 100.0}, - Result: "SELECT * FROM (SELECT * FROM `users_info` WHERE `age` > ?) AS `a`, (SELECT * FROM `users_info` WHERE `score` >= ?) AS `b`", - }, - - // ======================== join subquery ======================== - { - Expr: student.Join(teacher, student.Instructor.EqCol(teacher.ID)).Select(), - Result: "SELECT * FROM `student` INNER JOIN `teacher` ON `student`.`instructor` = `teacher`.`id`", - }, - { - Expr: student.LeftJoin(teacher, student.Instructor.EqCol(teacher.ID)).Where(teacher.ID.Gt(0)).Select(student.Name, teacher.Name), - Result: "SELECT `student`.`name`,`teacher`.`name` FROM `student` LEFT JOIN `teacher` ON `student`.`instructor` = `teacher`.`id` WHERE `teacher`.`id` > ?", - ExpectedVars: []interface{}{int64(0)}, - }, - { - Expr: student.RightJoin(teacher, student.Instructor.EqCol(teacher.ID), student.ID.Eq(666)).Select(), - Result: "SELECT * FROM `student` RIGHT JOIN `teacher` ON `student`.`instructor` = `teacher`.`id` AND `student`.`id` = ?", - ExpectedVars: []interface{}{int64(666)}, - }, - { - Expr: student.Join(teacher, student.Instructor.EqCol(teacher.ID)).LeftJoin(teacher, student.ID.Gt(100)).Select(student.ID, student.Name, teacher.Name.As("teacher_name")), - Result: "SELECT `student`.`id`,`student`.`name`,`teacher`.`name` AS `teacher_name` FROM `student` INNER JOIN `teacher` ON `student`.`instructor` = `teacher`.`id` LEFT JOIN `teacher` ON `student`.`id` > ?", - ExpectedVars: []interface{}{int64(100)}, - }, - } - - // _ = u.Update(u.Age, u.Age.Add(1)) - // _ = u.Update(u.Age, gorm.Expr("age+1")) - // _ = u.UpdateSimple(u.Age.Add(1)) - - // _ = u.Find(u.ID.In(1, 2, 3)) - - for _, testcase := range testcases { - checkBuildExpr(t, testcase.Expr, testcase.Opts, testcase.Result, testcase.ExpectedVars) - } -} diff --git a/toolkit/gormgen/errors.go b/toolkit/gormgen/errors.go deleted file mode 100644 index a3164ec6..00000000 --- a/toolkit/gormgen/errors.go +++ /dev/null @@ -1,8 +0,0 @@ -package gormgen - -import "errors" - -var ( - // ErrEmptyCondition empty condition - ErrEmptyCondition = errors.New("empty condition") -) diff --git a/toolkit/gormgen/field/association.go b/toolkit/gormgen/field/association.go deleted file mode 100644 index 04850d40..00000000 --- a/toolkit/gormgen/field/association.go +++ /dev/null @@ -1,255 +0,0 @@ -package field - -import ( - "fmt" - "strings" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/clause" - "github.com/wubin1989/gorm/schema" -) - -// RelationshipType table relationship -type RelationshipType schema.RelationshipType - -const ( - // HasOne a has one association sets up a one-to-one connection with another model. Reference https://github.com/wubin1989/docs/has_one.html - HasOne RelationshipType = RelationshipType(schema.HasOne) // HasOneRel has one relationship - // HasMany a has many association sets up a one-to-many connection with another model. Reference https://github.com/wubin1989/docs/has_many.html - HasMany RelationshipType = RelationshipType(schema.HasMany) // HasManyRel has many relationships - // BelongsTo A belongs to association sets up a one-to-one connection with another model. Reference https://github.com/wubin1989/docs/belongs_to.html - BelongsTo RelationshipType = RelationshipType(schema.BelongsTo) // BelongsToRel belongs to relationship - // Many2Many Many to Many add a join table between two models. Reference https://github.com/wubin1989/docs/many2many.html - Many2Many RelationshipType = RelationshipType(schema.Many2Many) // Many2ManyRel many to many relationship -) - -type relationScope func(*gorm.DB) *gorm.DB - -var ( - // RelationFieldUnscoped relation fild unscoped - RelationFieldUnscoped relationScope = func(tx *gorm.DB) *gorm.DB { - return tx.Unscoped() - } -) - -var ns = schema.NamingStrategy{} - -// RelationField interface for relation field -type RelationField interface { - Name() string - Path() string - // Field return expr for Select - // Field() return "" field name in struct - // Field("RelateField") return ".RelateField" for Select - // Field("RelateField", "RelateRelateField") return ".RelateField.RelateRelateField" for Select - // ex: - // Select(u.CreditCards.Field()) equals to GORM: Select("CreditCards") - // Select(u.CreditCards.Field("Bank")) equals to GORM: Select("CreditCards.Bank") - // Select(u.CreditCards.Field("Bank","Owner")) equals to GORM: Select("CreditCards.Bank.Owner") - Field(fields ...string) Expr - - On(conds ...Expr) RelationField - Select(conds ...Expr) RelationField - Order(columns ...Expr) RelationField - Clauses(hints ...clause.Expression) RelationField - Scopes(funcs ...relationScope) RelationField - Offset(offset int) RelationField - Limit(limit int) RelationField - - GetConds() []Expr - GetSelects() []Expr - GetOrderCol() []Expr - GetClauses() []clause.Expression - GetScopes() []relationScope - GetPage() (offset, limit int) -} - -// Relation relation meta info -type Relation struct { - relationship RelationshipType - - fieldName string - fieldType string - fieldPath string - fieldModel interface{} // store relaiton model - - childRelations []Relation - - conds []Expr - selects []Expr - order []Expr - clauses []clause.Expression - scopes []relationScope - limit, offset int -} - -// Name relation field' name -func (r Relation) Name() string { return r.fieldName } - -// Path relation field's path -func (r Relation) Path() string { return r.fieldPath } - -// Type relation field's type -func (r Relation) Type() string { return r.fieldType } - -// Model relation field's model -func (r Relation) Model() interface{} { return r.fieldModel } - -// Relationship relationship between field and table struct -func (r Relation) Relationship() RelationshipType { return r.relationship } - -// RelationshipName relationship's name -func (r Relation) RelationshipName() string { return ns.SchemaName(string(r.relationship)) } - -// ChildRelations return child relations -func (r Relation) ChildRelations() []Relation { return r.childRelations } - -// Field build field -func (r Relation) Field(fields ...string) Expr { - if len(fields) > 0 { - return NewString("", r.fieldName+"."+strings.Join(fields, ".")).appendBuildOpts(WithoutQuote) - } - return NewString("", r.fieldName).appendBuildOpts(WithoutQuote) -} - -// AppendChildRelation append child relationship -func (r *Relation) AppendChildRelation(relations ...Relation) { - r.childRelations = append(r.childRelations, wrapPath(r.fieldPath, relations)...) -} - -// On relation condition -func (r Relation) On(conds ...Expr) RelationField { - r.conds = append(r.conds, conds...) - return &r -} - -// Select relation select columns -func (r Relation) Select(columns ...Expr) RelationField { - r.selects = append(r.selects, columns...) - return &r -} - -// Order relation order columns -func (r Relation) Order(columns ...Expr) RelationField { - r.order = append(r.order, columns...) - return &r -} - -// Clauses set relation clauses -func (r Relation) Clauses(hints ...clause.Expression) RelationField { - r.clauses = append(r.clauses, hints...) - return &r -} - -// Scopes set scopes func -func (r Relation) Scopes(funcs ...relationScope) RelationField { - r.scopes = append(r.scopes, funcs...) - return &r -} - -// Offset set relation offset -func (r Relation) Offset(offset int) RelationField { - r.offset = offset - return &r -} - -// Limit set relation limit -func (r Relation) Limit(limit int) RelationField { - r.limit = limit - return &r -} - -// GetConds get query conditions -func (r *Relation) GetConds() []Expr { return r.conds } - -// GetSelects get select columns -func (r *Relation) GetSelects() []Expr { return r.selects } - -// GetOrderCol get order columns -func (r *Relation) GetOrderCol() []Expr { return r.order } - -// GetClauses get clauses -func (r *Relation) GetClauses() []clause.Expression { return r.clauses } - -// GetScopes get scope functions -func (r *Relation) GetScopes() []relationScope { return r.scopes } // nolint - -// GetPage get offset and limit -func (r *Relation) GetPage() (offset, limit int) { return r.offset, r.limit } - -// StructField return struct field code -func (r *Relation) StructField() (fieldStr string) { - for _, relation := range r.childRelations { - fieldStr += relation.fieldName + " struct {\nfield.RelationField\n" + relation.StructField() + "}\n" - } - return fieldStr -} - -// StructFieldInit return field initialize code -func (r *Relation) StructFieldInit() string { - initStr := fmt.Sprintf("RelationField: field.NewRelation(%q, %q),\n", r.fieldPath, r.fieldType) - for _, relation := range r.childRelations { - initStr += relation.fieldName + ": struct {\nfield.RelationField\n" + strings.TrimSpace(relation.StructField()) + "}" - initStr += "{\n" + relation.StructFieldInit() + "},\n" - } - return initStr -} - -func wrapPath(root string, rs []Relation) []Relation { - result := make([]Relation, len(rs)) - for i, r := range rs { - r.fieldPath = root + "." + r.fieldPath - r.childRelations = wrapPath(root, r.childRelations) - result[i] = r - } - return result -} - -var defaultRelationshipPrefix = map[RelationshipType]string{ - // HasOne: "", - // BelongsTo: "", - HasMany: "[]", - Many2Many: "[]", -} - -// RelateConfig config for relationship -type RelateConfig struct { - RelatePointer bool - RelateSlice bool - RelateSlicePointer bool - - JSONTag string - GORMTag GormTag - Tag Tag - OverwriteTag Tag -} - -// RelateFieldPrefix return generated relation field's type -func (c *RelateConfig) RelateFieldPrefix(relationshipType RelationshipType) string { - switch { - case c.RelatePointer: - return "*" - case c.RelateSlice: - return "[]" - case c.RelateSlicePointer: - return "[]*" - default: - return defaultRelationshipPrefix[relationshipType] - } -} -func (c *RelateConfig) GetTag(fieldName string) Tag { - if c == nil { - return Tag{} - } - if c.OverwriteTag != nil { - return c.OverwriteTag - } - if c.Tag == nil { - c.Tag = Tag{} - } - if c.JSONTag == "" { - c.JSONTag = ns.ColumnName("", fieldName) - } - c.Tag.Set(TagKeyJson, c.JSONTag) - return c.Tag -} diff --git a/toolkit/gormgen/field/asterisk.go b/toolkit/gormgen/field/asterisk.go deleted file mode 100644 index f176e11a..00000000 --- a/toolkit/gormgen/field/asterisk.go +++ /dev/null @@ -1,56 +0,0 @@ -package field - -import ( - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/clause" -) - -// Asterisk a type of xxx.* -type Asterisk struct{ asteriskExpr } - -// Count count -func (a Asterisk) Count() Asterisk { - var expr *clause.Expr - switch { - case a.e != nil: - expr = &clause.Expr{ - SQL: "COUNT(?)", - Vars: []interface{}{a.e}, - } - case a.col.Table == "": - expr = &clause.Expr{SQL: "COUNT(*)"} - default: - expr = &clause.Expr{ - SQL: "COUNT(?.*)", - Vars: []interface{}{clause.Table{Name: a.col.Table}}, - } - } - return Asterisk{asteriskExpr{expr: a.setE(expr)}} -} - -// Distinct distinct -func (a Asterisk) Distinct() Asterisk { - var expr *clause.Expr - if a.col.Table == "" { - expr = &clause.Expr{SQL: "DISTINCT *"} - } else { - expr = &clause.Expr{ - SQL: "DISTINCT ?.*", - Vars: []interface{}{clause.Table{Name: a.col.Table}}, - } - } - return Asterisk{asteriskExpr{expr: a.setE(expr)}} -} - -type asteriskExpr struct{ expr } - -func (e asteriskExpr) BuildWithArgs(*gorm.Statement) (query sql, args []interface{}) { - // if e.expr has no expression it must be directly calling for "*" or "xxx.*" - if e.e != nil { - return "?", []interface{}{e.e} - } - if e.col.Table == "" { - return "*", nil - } - return "?.*", []interface{}{clause.Table{Name: e.col.Table}} -} diff --git a/toolkit/gormgen/field/bool.go b/toolkit/gormgen/field/bool.go deleted file mode 100644 index 8fd1206b..00000000 --- a/toolkit/gormgen/field/bool.go +++ /dev/null @@ -1,54 +0,0 @@ -package field - -// Bool boolean type field -type Bool Field - -// Not ... -func (field Bool) Not() Bool { - return Bool{field.not()} -} - -// Is ... -func (field Bool) Is(value bool) Expr { - return field.is(value) -} - -// And boolean and -func (field Bool) And(value bool) Expr { - return Bool{field.and(value)} -} - -// Or boolean or -func (field Bool) Or(value bool) Expr { - return Bool{field.or(value)} -} - -// Xor ... -func (field Bool) Xor(value bool) Expr { - return Bool{field.xor(value)} -} - -// BitXor ... -func (field Bool) BitXor(value bool) Expr { - return Bool{field.bitXor(value)} -} - -// BitAnd ... -func (field Bool) BitAnd(value bool) Expr { - return Bool{field.bitAnd(value)} -} - -// BitOr ... -func (field Bool) BitOr(value bool) Expr { - return Bool{field.bitOr(value)} -} - -// Value ... -func (field Bool) Value(value bool) AssignExpr { - return field.value(value) -} - -// Zero ... -func (field Bool) Zero() AssignExpr { - return field.value(false) -} diff --git a/toolkit/gormgen/field/doc.go b/toolkit/gormgen/field/doc.go deleted file mode 100644 index ecaff1fb..00000000 --- a/toolkit/gormgen/field/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package field implement all type field and method -package field diff --git a/toolkit/gormgen/field/example_test.go b/toolkit/gormgen/field/example_test.go deleted file mode 100644 index 75733ffa..00000000 --- a/toolkit/gormgen/field/example_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package field_test - -import ( - "fmt" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" -) - -func ExampleFunc() { - expr := field.Func.UnixTimestamp() - - sql, vars := field.BuildToString(expr) - fmt.Println(sql, vars) - - sql, vars = field.BuildToString(expr.Mul(100)) - fmt.Println(sql, vars) - - // Output: - // UNIX_TIMESTAMP() [] - // (UNIX_TIMESTAMP())*? [100] -} diff --git a/toolkit/gormgen/field/export.go b/toolkit/gormgen/field/export.go deleted file mode 100644 index 541cf6c2..00000000 --- a/toolkit/gormgen/field/export.go +++ /dev/null @@ -1,333 +0,0 @@ -package field - -import ( - "fmt" - "strings" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/clause" -) - -var ( - // Star a symbol of "*" - Star = NewAsterisk("") - // ALL same with Star - ALL = Star -) - -// Option field option -type Option func(clause.Column) clause.Column - -var ( - banColumnRaw Option = func(col clause.Column) clause.Column { - col.Raw = false - return col - } -) - -// ======================== generic field ======================= - -// NewField create new field -func NewField(table, column string, opts ...Option) Field { - return Field{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewSerializer create new field2 -func NewSerializer(table, column string, opts ...Option) Serializer { - return Serializer{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewAsterisk create new * field -func NewAsterisk(table string, opts ...Option) Asterisk { - return Asterisk{asteriskExpr: asteriskExpr{expr{col: toColumn(table, "*", opts...)}}} -} - -// ======================== integer ======================= - -// NewInt create new Int -func NewInt(table, column string, opts ...Option) Int { - return Int{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewInt8 create new Int8 -func NewInt8(table, column string, opts ...Option) Int8 { - return Int8{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewInt16 ... -func NewInt16(table, column string, opts ...Option) Int16 { - return Int16{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewInt32 ... -func NewInt32(table, column string, opts ...Option) Int32 { - return Int32{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewInt64 ... -func NewInt64(table, column string, opts ...Option) Int64 { - return Int64{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewUint ... -func NewUint(table, column string, opts ...Option) Uint { - return Uint{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewUint8 ... -func NewUint8(table, column string, opts ...Option) Uint8 { - return Uint8{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewUint16 ... -func NewUint16(table, column string, opts ...Option) Uint16 { - return Uint16{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewUint32 ... -func NewUint32(table, column string, opts ...Option) Uint32 { - return Uint32{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewUint64 ... -func NewUint64(table, column string, opts ...Option) Uint64 { - return Uint64{expr: expr{col: toColumn(table, column, opts...)}} -} - -// ======================== float ======================= - -// NewFloat32 ... -func NewFloat32(table, column string, opts ...Option) Float32 { - return Float32{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewFloat64 ... -func NewFloat64(table, column string, opts ...Option) Float64 { - return Float64{expr: expr{col: toColumn(table, column, opts...)}} -} - -// ======================== string ======================= - -// NewString ... -func NewString(table, column string, opts ...Option) String { - return String{expr: expr{col: toColumn(table, column, opts...)}} -} - -// NewBytes ... -func NewBytes(table, column string, opts ...Option) Bytes { - return Bytes{expr: expr{col: toColumn(table, column, opts...)}} -} - -// ======================== bool ======================= - -// NewBool ... -func NewBool(table, column string, opts ...Option) Bool { - return Bool{expr: expr{col: toColumn(table, column, opts...)}} -} - -// ======================== time ======================= - -// NewTime ... -func NewTime(table, column string, opts ...Option) Time { - return Time{expr: expr{col: toColumn(table, column, opts...)}} -} - -func toColumn(table, column string, opts ...Option) clause.Column { - col := clause.Column{Table: table, Name: column} - for _, opt := range opts { - col = opt(col) - } - return banColumnRaw(col) -} - -// ======================== boolean operate ======================== - -// Or return or condition -func Or(exprs ...Expr) Expr { - return &expr{e: clause.Or(toExpression(exprs...)...)} -} - -// And return and condition -func And(exprs ...Expr) Expr { - return &expr{e: clause.And(toExpression(exprs...)...)} -} - -// Not return not condition -func Not(exprs ...Expr) Expr { - return &expr{e: clause.Not(toExpression(exprs...)...)} -} - -func toExpression(conds ...Expr) []clause.Expression { - exprs := make([]clause.Expression, len(conds)) - for i, cond := range conds { - exprs[i] = cond.expression() - } - return exprs -} - -// ======================== subquery method ======================== - -// ContainsSubQuery return contains subquery -// when len(columns) == 1, equal to columns[0] IN (subquery) -// when len(columns) > 1, equal to (columns[0], columns[1], ...) IN (subquery) -func ContainsSubQuery(columns []Expr, subQuery *gorm.DB) Expr { - switch len(columns) { - case 0: - return expr{e: clause.Expr{}} - case 1: - return expr{e: clause.Expr{ - SQL: "? IN (?)", - Vars: []interface{}{columns[0].RawExpr(), subQuery}, - }} - default: // len(columns) > 0 - placeholders := make([]string, len(columns)) - cols := make([]interface{}, len(columns)) - for i, c := range columns { - placeholders[i], cols[i] = "?", c.RawExpr() - } - return expr{e: clause.Expr{ - SQL: fmt.Sprintf("(%s) IN (?)", strings.Join(placeholders, ",")), - Vars: append(cols, subQuery), - }} - } -} - -// AssignSubQuery assign with subquery -func AssignSubQuery(columns []Expr, subQuery *gorm.DB) AssignExpr { - cols := make([]string, len(columns)) - for i, c := range columns { - cols[i] = string(c.BuildColumn(subQuery.Statement)) - } - - name := cols[0] - if len(cols) > 1 { - name = "(" + strings.Join(cols, ",") + ")" - } - - return expr{e: clause.Set{{ - Column: clause.Column{Name: name, Raw: true}, - Value: gorm.Expr("(?)", subQuery), - }}} -} - -// CompareOperator compare operator -type CompareOperator string - -const ( - // EqOp = - EqOp CompareOperator = " = " - // NeqOp <> - NeqOp CompareOperator = " <> " - // GtOp > - GtOp CompareOperator = " > " - // GteOp >= - GteOp CompareOperator = " >= " - // LtOp < - LtOp CompareOperator = " < " - // LteOp <= - LteOp CompareOperator = " <= " - // ExistsOp EXISTS - ExistsOp CompareOperator = "EXISTS " -) - -// CompareSubQuery compare with sub query -func CompareSubQuery(op CompareOperator, column Expr, subQuery *gorm.DB) Expr { - if op == ExistsOp { - return expr{e: clause.Expr{ - SQL: fmt.Sprint(op, "(?)"), - Vars: []interface{}{subQuery}, - }} - } - return expr{e: clause.Expr{ - SQL: fmt.Sprint("?", op, "(?)"), - Vars: []interface{}{column.RawExpr(), subQuery}, - }} -} - -// Value ... -type Value interface { - expr() clause.Expr - - // implement Condition - BeCond() interface{} - CondError() error -} - -type val clause.Expr - -func (v val) expr() clause.Expr { return clause.Expr(v) } -func (v val) BeCond() interface{} { return v } -func (val) CondError() error { return nil } - -// Values convert value to expression which implement Value -func Values(value interface{}) Value { - return val(clause.Expr{ - SQL: "?", - Vars: []interface{}{value}, - WithoutParentheses: true, - }) -} - -// ContainsValue return expression which compare with value -func ContainsValue(columns []Expr, value Value) Expr { - switch len(columns) { - case 0: - return expr{e: clause.Expr{}} - case 1: - return expr{e: clause.Expr{ - SQL: "? IN (?)", - Vars: []interface{}{columns[0].RawExpr(), value.expr()}, - }} - default: // len(columns) > 0 - vars := make([]string, len(columns)) - queryCols := make([]interface{}, len(columns)) - for i, c := range columns { - vars[i], queryCols[i] = "?", c.RawExpr() - } - return expr{e: clause.Expr{ - SQL: fmt.Sprintf("(%s) IN (?)", strings.Join(vars, ", ")), - Vars: append(queryCols, value.expr()), - }} - } -} - -// EmptyExpr return a empty expression -func EmptyExpr() Expr { return expr{e: clause.Expr{}} } - -// AssociationFields all association -var AssociationFields Expr = NewString("", clause.Associations).appendBuildOpts(WithoutQuote) - -// Associations ... -var Associations RelationField = NewRelation(clause.Associations, "") - -// NewRelation return a new Relation for association -func NewRelation(fieldName string, fieldType string, relations ...Relation) *Relation { - return &Relation{ - fieldName: fieldName, - fieldPath: fieldName, - fieldType: fieldType, - childRelations: wrapPath(fieldName, relations), - } -} - -// NewRelationWithType return a Relation with specified field type -func NewRelationWithType(relationship RelationshipType, fieldName string, fieldType string, relations ...Relation) *Relation { - return &Relation{ - relationship: relationship, - fieldName: fieldName, - fieldType: fieldType, - fieldPath: fieldName, - childRelations: wrapPath(fieldName, relations), - } -} - -// NewRelationWithModel return a Relation with specified model struct -func NewRelationWithModel(relationship RelationshipType, fieldName string, fieldType string, fieldModel interface{}, relations ...Relation) *Relation { - return &Relation{ - relationship: relationship, - fieldName: fieldName, - fieldType: fieldType, - fieldPath: fieldName, - fieldModel: fieldModel, - } -} diff --git a/toolkit/gormgen/field/export_test.go b/toolkit/gormgen/field/export_test.go deleted file mode 100644 index 06254a8d..00000000 --- a/toolkit/gormgen/field/export_test.go +++ /dev/null @@ -1,582 +0,0 @@ -package field_test - -import ( - "database/sql/driver" - "fmt" - "strings" - "testing" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" -) - -var _ field.ScanValuer = new(password) - -type password string - -func (p *password) Scan(src interface{}) error { - *p = password(fmt.Sprintf("this is password {%q}", src)) - return nil -} -func (p password) Value() (driver.Value, error) { - return strings.TrimPrefix(strings.TrimSuffix(string(p), "}"), "this is password {"), nil -} - -func TestExpr_Build(t *testing.T) { - timeData, _ := time.Parse("2006-01-02 15:04:05", "2021-06-29 15:11:49") - const p = password("i am password") - - testcases := []struct { - Expr field.Expr - ExpectedVars []interface{} - Result string - }{ - // ======================== generic ======================== - { - Expr: field.NewField("user", "password").Eq(p), - ExpectedVars: []interface{}{p}, - Result: "`user`.`password` = ?", - }, - { - Expr: field.NewField("", "id").EqCol(field.NewField("", "new_id")), - Result: "`id` = `new_id`", - }, - { - Expr: field.NewField("", "id").NeqCol(field.NewField("", "new_id")), - Result: "`id` <> `new_id`", - }, - { - Expr: field.NewField("", "id").LtCol(field.NewField("", "new_id")), - Result: "`id` < `new_id`", - }, - { - Expr: field.NewField("", "id").LteCol(field.NewField("", "new_id")), - Result: "`id` <= `new_id`", - }, - { - Expr: field.NewField("", "id").GtCol(field.NewField("", "new_id")), - Result: "`id` > `new_id`", - }, - { - Expr: field.NewField("", "id").GteCol(field.NewField("", "new_id")), - Result: "`id` >= `new_id`", - }, - { - Expr: field.NewField("", "id").EqCol(field.NewField("", "new_id").Avg()), - Result: "`id` = AVG(`new_id`)", - }, - { - Expr: field.NewField("", "id").EqCol(field.NewField("", "new_id").WithTable("tableB")), - Result: "`id` = `tableB`.`new_id`", - }, - { - Expr: field.NewField("", "id").EqCol(field.NewField("", "new_id").WithTable("tableB")), - Result: "`id` = `tableB`.`new_id`", - }, - { - Expr: field.NewField("", "id").NeqCol(field.NewField("", "new_id").WithTable("tableB")), - Result: "`id` <> `tableB`.`new_id`", - }, - { - Expr: field.NewField("", "id").IsNull(), - Result: "`id` IS NULL", - }, - { - Expr: field.NewField("", "id").IsNotNull(), - Result: "`id` IS NOT NULL", - }, - { - Expr: field.NewField("", "id").GroupConcat(), - Result: "GROUP_CONCAT(`id`)", - }, - { - Expr: field.Func.UnixTimestamp(), - Result: "UNIX_TIMESTAMP()", - }, - { - Expr: field.Func.UnixTimestamp("2005-03-27 03:00:00").Mul(99), - Result: "(UNIX_TIMESTAMP(?))*?", - ExpectedVars: []interface{}{"2005-03-27 03:00:00", uint64(99)}, - }, - { - Expr: field.NewInt("t1", "id").AddCol(field.NewInt("t2", "num")), - Result: "`t1`.`id` + `t2`.`num`", - }, - { - Expr: field.NewInt("t1", "id").AddCol(field.NewInt("t1", "num")).SubCol(field.NewInt("t1", "age")), - Result: "`t1`.`id` + `t1`.`num` - `t1`.`age`", - }, - { - Expr: field.NewInt("t1", "id").AddCol(field.NewInt("t1", "num")).SubCol(field.NewInt("t1", "age")).MulCol(field.NewInt("t1", "age")).DivCol(field.NewInt("t1", "base")), - Result: "((`t1`.`id` + `t1`.`num` - `t1`.`age`) * (`t1`.`age`)) / (`t1`.`base`)", - }, - { - Expr: field.NewInt("t1", "id").AddCol(field.NewInt("t2", "num").Add(1)), - Result: "`t1`.`id` + `t2`.`num`+?", - ExpectedVars: []interface{}{int(1)}, - }, - { - Expr: field.NewInt("t1", "id").EqCol(field.NewInt("t1", "id").AddCol(field.NewInt("t2", "num").Add(1))), - Result: "`t1`.`id` = `t1`.`id` + `t2`.`num`+?", - ExpectedVars: []interface{}{int(1)}, - }, - { - Expr: field.NewInt("t1", "a").AddCol(field.NewInt("t2", "b").Add(1)).(field.Field).GtCol(field.NewInt("t", "c")), - Result: "`t1`.`a` + `t2`.`b`+? > `t`.`c`", - ExpectedVars: []interface{}{int(1)}, - }, - { - Expr: field.ALL.Count(), - Result: "COUNT(*)", - }, - { - Expr: field.ALL.Distinct().Count(), - Result: "COUNT(DISTINCT *)", - }, - { - Expr: field.NewAsterisk("user").Count(), - Result: "COUNT(`user`.*)", - }, - { - Expr: field.NewAsterisk("user").Distinct().Count(), - Result: "COUNT(DISTINCT `user`.*)", - }, - // ======================== integer ======================== - { - Expr: field.NewUint("", "id"), - Result: "`id`", - }, - { - Expr: field.NewUint("user", "id").Sum().Gt(100), - ExpectedVars: []interface{}{uint(100)}, - Result: "SUM(`user`.`id`) > ?", - }, - { - Expr: field.NewUint("", "i`d"), - Result: "`i``d`", - }, - { - Expr: field.NewUint("", "id").Avg(), - Result: "AVG(`id`)", - }, - { - Expr: field.NewUint("", "id").Desc(), - Result: "`id` DESC", - }, - { - Expr: field.NewUint("", "id").As("number"), - Result: "`id` AS `number`", - }, - { - Expr: field.NewUint("", "id").Avg().As("number"), - Result: "AVG(`id`) AS `number`", - }, - { - Expr: field.NewUint("", "id").Eq(10), - ExpectedVars: []interface{}{uint(10)}, - Result: "`id` = ?", - }, - { - Expr: field.NewUint("", "id").Neq(10), - ExpectedVars: []interface{}{uint(10)}, - Result: "`id` <> ?", - }, - { - Expr: field.NewUint("", "id").Gt(1), - ExpectedVars: []interface{}{uint(1)}, - Result: "`id` > ?", - }, - { - Expr: field.NewUint("", "id").Gte(1), - ExpectedVars: []interface{}{uint(1)}, - Result: "`id` >= ?", - }, - { - Expr: field.NewUint("", "id").Lt(1), - ExpectedVars: []interface{}{uint(1)}, - Result: "`id` < ?", - }, - { - Expr: field.NewUint("", "id").Lte(1), - ExpectedVars: []interface{}{uint(1)}, - Result: "`id` <= ?", - }, - { - Expr: field.NewUint("", "id").Mod(7), - ExpectedVars: []interface{}{uint(7)}, - Result: "`id`%?", - }, - { - Expr: field.And(field.NewUint("", "id").Gt(1), field.NewUint("", "id").Lt(10)), - ExpectedVars: []interface{}{uint(1), uint(10)}, - Result: "(`id` > ? AND `id` < ?)", - }, - { - Expr: field.Or(field.NewUint("", "id").Lt(4), field.NewUint("", "id").Gt(6)), - ExpectedVars: []interface{}{uint(4), uint(6)}, - Result: "(`id` < ? OR `id` > ?)", - }, - { - Expr: field.NewUint("", "id").In(1, 2, 3), - ExpectedVars: []interface{}{uint(1), uint(2), uint(3)}, - Result: "`id` IN (?,?,?)", - }, - { - Expr: field.NewUint("", "id").NotIn(1, 2, 3), - ExpectedVars: []interface{}{uint(1), uint(2), uint(3)}, - Result: "`id` NOT IN (?,?,?)", - }, - { - Expr: field.NewUint("", "id").Between(1, 10), - ExpectedVars: []interface{}{uint(1), uint(10)}, - Result: "`id` BETWEEN ? AND ?", - }, - { - Expr: field.NewUint("", "id").Count(), - Result: "COUNT(`id`)", - }, - { - Expr: field.NewUint("", "id").Count().As("UserID"), - Result: "COUNT(`id`) AS `UserID`", - }, - { - Expr: field.NewUint("", "id").Distinct(), - Result: "DISTINCT `id`", - }, - { - Expr: field.NewUint("", "id").Distinct().Count(), - Result: "COUNT(DISTINCT `id`)", - }, - { - Expr: field.NewUint("", "id").Distinct().Count().As("UserID"), - Result: "COUNT(DISTINCT `id`) AS `UserID`", - }, - { - Expr: field.NewInt("", "age").RightShift(3), - ExpectedVars: []interface{}{3}, - Result: "`age`>>?", - }, - { - Expr: field.NewInt("", "age").LeftShift(3), - ExpectedVars: []interface{}{3}, - Result: "`age`< ?", - }, - { - Expr: field.NewString("", "name").Like("%%tom%%"), - ExpectedVars: []interface{}{"%%tom%%"}, - Result: "`name` LIKE ?", - }, - { - Expr: field.NewString("", "name").NotLike("%%tom%%"), - ExpectedVars: []interface{}{"%%tom%%"}, - Result: "`name` NOT LIKE ?", - }, - { - Expr: field.NewString("", "name").Regexp(".*"), - ExpectedVars: []interface{}{".*"}, - Result: "`name` REGEXP ?", - }, - { - Expr: field.NewString("", "name").NotRegxp(".*"), - ExpectedVars: []interface{}{".*"}, - Result: "NOT `name` REGEXP ?", - }, - { - Expr: field.NewString("", "address").FindInSetWith("sh"), - ExpectedVars: []interface{}{"sh"}, - Result: "FIND_IN_SET(?,`address`)", - }, - { - Expr: field.NewString("", "address").FindInSet("sh"), - ExpectedVars: []interface{}{"sh"}, - Result: "FIND_IN_SET(`address`,?)", - }, - { - Expr: field.NewString("", "address").Replace("address", "path"), - ExpectedVars: []interface{}{"address", "path"}, - Result: "REPLACE(`address`,?,?)", - }, - { - Expr: field.NewString("", "address").Concat("[", "]"), - ExpectedVars: []interface{}{"[", "]"}, - Result: "CONCAT(?,`address`,?)", - }, - { - Expr: field.NewString("", "address").Concat("", "_"), - ExpectedVars: []interface{}{"_"}, - Result: "CONCAT(`address`,?)", - }, - { - Expr: field.NewString("", "address").Replace("address", "path").Concat("[", "]"), - ExpectedVars: []interface{}{"[", "address", "path", "]"}, - Result: "CONCAT(?,REPLACE(`address`,?,?),?)", - }, - // ======================== time ======================== - { - Expr: field.NewTime("", "creatAt").Eq(timeData), - ExpectedVars: []interface{}{timeData}, - Result: "`creatAt` = ?", - }, - { - Expr: field.NewTime("", "creatAt").Gt(timeData), - ExpectedVars: []interface{}{timeData}, - Result: "`creatAt` > ?", - }, - { - Expr: field.NewTime("", "creatAt").Gte(timeData), - ExpectedVars: []interface{}{timeData}, - Result: "`creatAt` >= ?", - }, - { - Expr: field.NewTime("", "creatAt").Lt(timeData), - ExpectedVars: []interface{}{timeData}, - Result: "`creatAt` < ?", - }, - { - Expr: field.NewTime("", "creatAt").Lte(timeData), - ExpectedVars: []interface{}{timeData}, - Result: "`creatAt` <= ?", - }, - { - Expr: field.NewTime("", "creatAt").Between(timeData, timeData.Add(24*time.Hour)), - ExpectedVars: []interface{}{timeData, timeData.Add(24 * time.Hour)}, - Result: "`creatAt` BETWEEN ? AND ?", - }, - { - Expr: field.NewTime("", "creatAt").Add(24 * time.Hour), - ExpectedVars: []interface{}{time.Duration(24 * time.Hour).Microseconds()}, - Result: "DATE_ADD(`creatAt`, INTERVAL ? MICROSECOND)", - }, - { - Expr: field.NewTime("", "creatAt").Sub(24 * time.Hour), - ExpectedVars: []interface{}{time.Duration(24 * time.Hour).Microseconds()}, - Result: "DATE_SUB(`creatAt`, INTERVAL ? MICROSECOND)", - }, - { - Expr: field.NewTime("", "updateAt").DateFormat("%W %M %Y"), - ExpectedVars: []interface{}{"%W %M %Y"}, - Result: "DATE_FORMAT(`updateAt`,?)", - }, - // ======================== bool ======================== - { - Expr: field.NewBool("", "male").Not(), - Result: "NOT `male`", - }, - { - Expr: field.NewBool("", "male").Is(true), - ExpectedVars: []interface{}{true}, - Result: "`male` = ?", - }, - { - Expr: field.NewBool("", "male").And(true), - ExpectedVars: []interface{}{true}, - Result: "`male` AND ?", - }, - { - Expr: field.NewBool("", "male").Or(true), - ExpectedVars: []interface{}{true}, - Result: "`male` OR ?", - }, - } - - for _, testcase := range testcases { - field.CheckBuildExpr(t, testcase.Expr, testcase.Result, testcase.ExpectedVars) - } -} - -func TestExpr_BuildColumn(t *testing.T) { - stmt := field.GetStatement() - id := field.NewUint("user", "id") - expectColumnStr := "`id`" - expectColumnStrWithTable := "`user`.`id`" - expectColumnStrWithoutQuote := "id" - expectColumnStrWithTableWithoutQuote := "user.id" - - if colStr := id.BuildColumn(stmt).String(); colStr != expectColumnStr { - t.Errorf("id.BuildColumn(stmt).String() got: %q, except: %q", colStr, expectColumnStr) - } - if colStr := id.BuildColumn(stmt, field.WithTable).String(); colStr != expectColumnStrWithTable { - t.Errorf("id.BuildColumn(stmt, field.WithTable).String() got: %q, except: %q", colStr, expectColumnStrWithTable) - } - if colStr := id.BuildColumn(stmt, field.WithoutQuote).String(); colStr != expectColumnStrWithoutQuote { - t.Errorf("id.BuildColumn(stmt, field.WithoutQuote).String() got: %q, except: %q", colStr, expectColumnStrWithoutQuote) - } - if colStr := id.BuildColumn(stmt, field.WithTable, field.WithoutQuote).String(); colStr != expectColumnStrWithTableWithoutQuote { - t.Errorf("id.BuildColumn(stmt, field.WithTable, field.WithoutQuote).String() got: %q, except: %q", colStr, expectColumnStrWithTableWithoutQuote) - } - - expectStarColumnStr := "*" - if colStr := field.Star.BuildColumn(stmt).String(); colStr != expectStarColumnStr { - t.Errorf("field.Star.BuildColumn(stmt).String() got: %q, except: %q", colStr, expectStarColumnStr) - } - - allField := field.NewString("user", "*") - expectStarColumnStrWithTable := "`user`.*" - if colStr := allField.BuildColumn(stmt, field.WithTable).String(); colStr != expectStarColumnStrWithTable { - t.Errorf("allField.BuildColumn(stmt, field.WithTable).String() got: %q, except: %q", colStr, expectStarColumnStrWithTable) - } -} - -func BenchmarkExpr_Count(b *testing.B) { - id := field.NewUint("", "id") - for i := 0; i < b.N; i++ { - n := id.Count() - _ = n - } -} - -func TestRelation_StructField(t *testing.T) { - var testdatas = []struct { - relation *field.Relation - expectedValue string - }{ - { - relation: field.NewRelation( - "CreditCards", "model.CreditCard", - *field.NewRelation("Owner", "model.Owner"), - *field.NewRelation("Bank", "model.Bank", - *field.NewRelation("Manager", "model.Bank"), - *field.NewRelation("City", "model.City", - *field.NewRelation("State", "model.Bank"), - ), - ), - ), - expectedValue: "Owner struct {\nfield.RelationField\n}\nBank struct {\nfield.RelationField\nManager struct {\nfield.RelationField\n}\nCity struct {\nfield.RelationField\nState struct {\nfield.RelationField\n}\n}\n}\n", - }, - } - - for _, testdata := range testdatas { - if result := testdata.relation.StructField(); result != testdata.expectedValue { - t.Errorf("StructField fail: except %q, got %q", testdata.expectedValue, result) - } - } -} - -func TestRelation_StructFieldInit(t *testing.T) { - var testdatas = []struct { - relation *field.Relation - expectedValue string - }{ - { - relation: field.NewRelation( - "CreditCards", "model.CreditCard", - *field.NewRelation("Owner", "model.Owner"), - *field.NewRelation("Bank", "model.Bank", - *field.NewRelation("Manager", "model.Manager"), - *field.NewRelation("City", "model.City", - *field.NewRelation("State", "model.State"), - ), - ), - ), - expectedValue: "RelationField: field.NewRelation(\"CreditCards\", \"model.CreditCard\"),\nOwner: struct {\nfield.RelationField\n}{\nRelationField: field.NewRelation(\"CreditCards.Owner\", \"model.Owner\"),\n},\nBank: struct {\nfield.RelationField\nManager struct {\nfield.RelationField\n}\nCity struct {\nfield.RelationField\nState struct {\nfield.RelationField\n}\n}}{\nRelationField: field.NewRelation(\"CreditCards.Bank\", \"model.Bank\"),\nManager: struct {\nfield.RelationField\n}{\nRelationField: field.NewRelation(\"CreditCards.Bank.Manager\", \"model.Manager\"),\n},\nCity: struct {\nfield.RelationField\nState struct {\nfield.RelationField\n}}{\nRelationField: field.NewRelation(\"CreditCards.Bank.City\", \"model.City\"),\nState: struct {\nfield.RelationField\n}{\nRelationField: field.NewRelation(\"CreditCards.Bank.City.State\", \"model.State\"),\n},\n},\n},\n", - }, - } - - for _, testdata := range testdatas { - if result := testdata.relation.StructFieldInit(); result != testdata.expectedValue { - t.Errorf("StructField fail: except %q, got %q", testdata.expectedValue, result) - } - } -} - -func expectedStruct() { // nolint - _ = struct { - field.RelationField - Owner struct { - field.RelationField - } - Bank struct { - field.RelationField - Manager struct { - field.RelationField - } - City struct { - field.RelationField - State struct { - field.RelationField - } - } - } - }{ - RelationField: field.NewRelation("CreditCards", "model.CreditCard"), - Owner: struct { - field.RelationField - }{ - RelationField: field.NewRelation("CreditCards.Owner", "model.Owner"), - }, - Bank: struct { - field.RelationField - Manager struct { - field.RelationField - } - City struct { - field.RelationField - State struct { - field.RelationField - } - } - }{ - RelationField: field.NewRelation("CreditCards.Bank", "model.Bank"), - Manager: struct { - field.RelationField - }{ - RelationField: field.NewRelation("CreditCards.Bank.Manager", "model.Manager"), - }, - City: struct { - field.RelationField - State struct { - field.RelationField - } - }{ - RelationField: field.NewRelation("CreditCards.Bank.City", "model.City"), - State: struct { - field.RelationField - }{ - RelationField: field.NewRelation("CreditCards.Bank.City.State", "model.State"), - }, - }, - }, - } -} diff --git a/toolkit/gormgen/field/expr.go b/toolkit/gormgen/field/expr.go deleted file mode 100644 index c0d63bef..00000000 --- a/toolkit/gormgen/field/expr.go +++ /dev/null @@ -1,408 +0,0 @@ -package field - -import ( - "fmt" - "strings" - "time" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/clause" -) - -var _ Expr = new(Field) - -// AssignExpr assign expression -type AssignExpr interface { - Expr - - AssignExpr() expression -} - -// Expr a query expression about field -type Expr interface { - // Clause Expression interface - Build(clause.Builder) - - As(alias string) Expr - ColumnName() sql - BuildColumn(*gorm.Statement, ...BuildOpt) sql - BuildWithArgs(*gorm.Statement) (query sql, args []interface{}) - RawExpr() expression - - // col operate expression - AddCol(col Expr) Expr - SubCol(col Expr) Expr - MulCol(col Expr) Expr - DivCol(col Expr) Expr - ConcatCol(cols ...Expr) Expr - - // implement Condition - BeCond() interface{} - CondError() error - - expression() clause.Expression -} - -// OrderExpr order expression -// used in Order() -type OrderExpr interface { - Expr - Desc() Expr -} - -type expression interface{} - -type sql string - -func (e sql) String() string { return string(e) } - -type expr struct { - col clause.Column - - e clause.Expression - buildOpts []BuildOpt -} - -func (e expr) BeCond() interface{} { return e.expression() } -func (expr) CondError() error { return nil } - -func (e expr) AssignExpr() expression { - return e.expression() -} - -func (e expr) expression() clause.Expression { - if e.e == nil { - return clause.NamedExpr{SQL: "?", Vars: []interface{}{e.col}} - } - return e.e -} - -func (e expr) ColumnName() sql { return sql(e.col.Name) } - -// BuildOpt build option -type BuildOpt uint - -const ( - // WithTable build column with table - WithTable BuildOpt = iota - - // WithAll build column with table and alias - WithAll - - // WithoutQuote build column without quote - WithoutQuote -) - -func (e expr) BuildColumn(stmt *gorm.Statement, opts ...BuildOpt) sql { - col := clause.Column{Name: e.col.Name} - for _, opt := range append(e.buildOpts, opts...) { - switch opt { - case WithTable: - col.Table = e.col.Table - case WithAll: - col.Table = e.col.Table - col.Alias = e.col.Alias - case WithoutQuote: - col.Raw = true - } - } - if col.Name == "*" { - if col.Table != "" { - return sql(stmt.Quote(col.Table)) + ".*" - } - return "*" - } - return sql(stmt.Quote(col)) -} - -func (e expr) Build(builder clause.Builder) { - if e.e == nil { - if stmt, ok := builder.(*gorm.Statement); ok { - builder.WriteString(string(e.BuildColumn(stmt, WithAll))) - return - } - } - - e.e.Build(builder) -} - -func (e expr) BuildWithArgs(stmt *gorm.Statement) (sql, []interface{}) { - if e.e == nil { - return sql(e.BuildColumn(stmt, WithAll)), nil - } - newStmt := &gorm.Statement{DB: stmt.DB, Table: stmt.Table, Schema: stmt.Schema} - e.e.Build(newStmt) - return sql(newStmt.SQL.String()), newStmt.Vars -} - -func (e expr) RawExpr() expression { - if e.e == nil { - return e.col - } - return e.e -} - -func (e expr) setE(expression clause.Expression) expr { - e.e = expression - return e -} - -func (e expr) appendBuildOpts(opts ...BuildOpt) expr { - e.buildOpts = append(e.buildOpts, opts...) - return e -} - -// ======================== basic function ======================== -func (e expr) WithTable(table string) Expr { - e.col.Table = table - return e -} - -func (e expr) IsNull() Expr { - return e.setE(clause.Expr{SQL: "? IS NULL", Vars: []interface{}{e.RawExpr()}}) -} - -func (e expr) IsNotNull() Expr { - return e.setE(clause.Expr{SQL: "? IS NOT NULL", Vars: []interface{}{e.RawExpr()}}) -} - -func (e expr) Count() Int { - return Int{e.setE(clause.Expr{SQL: "COUNT(?)", Vars: []interface{}{e.RawExpr()}})} -} - -func (e expr) Distinct() Int { - return Int{e.setE(clause.Expr{SQL: "DISTINCT ?", Vars: []interface{}{e.RawExpr()}})} -} - -func (e expr) Length() Int { - return Int{e.setE(clause.Expr{SQL: "LENGTH(?)", Vars: []interface{}{e.RawExpr()}})} -} - -func (e expr) Max() Float64 { - return Float64{e.setE(clause.Expr{SQL: "MAX(?)", Vars: []interface{}{e.RawExpr()}})} -} - -func (e expr) Min() Float64 { - return Float64{e.setE(clause.Expr{SQL: "MIN(?)", Vars: []interface{}{e.RawExpr()}})} -} - -func (e expr) Avg() Float64 { - return Float64{e.setE(clause.Expr{SQL: "AVG(?)", Vars: []interface{}{e.RawExpr()}})} -} - -func (e expr) Null() AssignExpr { - return e.setE(clause.Eq{Column: e.col.Name, Value: nil}) -} - -func (e expr) GroupConcat() Expr { - return e.setE(clause.Expr{SQL: "GROUP_CONCAT(?)", Vars: []interface{}{e.RawExpr()}}) -} - -// ======================== comparison between columns ======================== -func (e expr) EqCol(col Expr) Expr { - return e.setE(clause.Expr{SQL: "? = ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}}) -} - -func (e expr) NeqCol(col Expr) Expr { - return e.setE(clause.Expr{SQL: "? <> ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}}) -} - -func (e expr) GtCol(col Expr) Expr { - return e.setE(clause.Expr{SQL: "? > ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}}) -} - -func (e expr) GteCol(col Expr) Expr { - return e.setE(clause.Expr{SQL: "? >= ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}}) -} - -func (e expr) LtCol(col Expr) Expr { - return e.setE(clause.Expr{SQL: "? < ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}}) -} - -func (e expr) LteCol(col Expr) Expr { - return e.setE(clause.Expr{SQL: "? <= ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}}) -} - -func (e expr) SetCol(col Expr) AssignExpr { - return e.setE(clause.Eq{Column: e.col.Name, Value: col.RawExpr()}) -} - -// ======================== operate columns ======================== -func (e expr) AddCol(col Expr) Expr { - return Field{e.setE(clause.Expr{SQL: "? + ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})} -} - -func (e expr) SubCol(col Expr) Expr { - return Field{e.setE(clause.Expr{SQL: "? - ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})} -} - -func (e expr) MulCol(col Expr) Expr { - return Field{e.setE(clause.Expr{SQL: "(?) * (?)", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})} -} - -func (e expr) DivCol(col Expr) Expr { - return Field{e.setE(clause.Expr{SQL: "(?) / (?)", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})} -} - -func (e expr) ConcatCol(cols ...Expr) Expr { - placeholders := []string{"?"} - vars := []interface{}{e.RawExpr()} - for _, col := range cols { - placeholders = append(placeholders, "?") - vars = append(vars, col.RawExpr()) - } - return Field{e.setE(clause.Expr{ - SQL: fmt.Sprintf("Concat(%s)", strings.Join(placeholders, ",")), - Vars: vars, - })} -} - -// ======================== keyword ======================== -func (e expr) As(alias string) Expr { - if e.e != nil { - return e.setE(clause.Expr{SQL: "? AS ?", Vars: []interface{}{e.e, clause.Column{Name: alias}}}) - } - e.col.Alias = alias - return e -} - -func (e expr) Desc() Expr { - return e.setE(clause.Expr{SQL: "? DESC", Vars: []interface{}{e.RawExpr()}}) -} - -// ======================== general experssion ======================== -func (e expr) value(value interface{}) AssignExpr { - return e.setE(clause.Eq{Column: e.col.Name, Value: value}) -} - -func (e expr) between(values []interface{}) expr { - return e.setE(clause.Expr{SQL: "? BETWEEN ? AND ?", Vars: append([]interface{}{e.RawExpr()}, values...)}) -} - -func (e expr) add(value interface{}) expr { - switch v := value.(type) { - case time.Duration: - return e.setE(clause.Expr{SQL: "DATE_ADD(?, INTERVAL ? MICROSECOND)", Vars: []interface{}{e.RawExpr(), v.Microseconds()}}) - default: - return e.setE(clause.Expr{SQL: "?+?", Vars: []interface{}{e.RawExpr(), value}}) - } -} - -func (e expr) sub(value interface{}) expr { - switch v := value.(type) { - case time.Duration: - return e.setE(clause.Expr{SQL: "DATE_SUB(?, INTERVAL ? MICROSECOND)", Vars: []interface{}{e.RawExpr(), v.Microseconds()}}) - default: - return e.setE(clause.Expr{SQL: "?-?", Vars: []interface{}{e.RawExpr(), value}}) - } -} - -func (e expr) mul(value interface{}) expr { - if e.isPure() { - return e.setE(clause.Expr{SQL: "?*?", Vars: []interface{}{e.col, value}}) - } - return e.setE(clause.Expr{SQL: "(?)*?", Vars: []interface{}{e.e, value}}) -} - -func (e expr) div(value interface{}) expr { - if e.isPure() { - return e.setE(clause.Expr{SQL: "?/?", Vars: []interface{}{e.col, value}}) - } - return e.setE(clause.Expr{SQL: "(?)/?", Vars: []interface{}{e.e, value}}) -} - -func (e expr) mod(value interface{}) expr { - if e.isPure() { - return e.setE(clause.Expr{SQL: "?%?", Vars: []interface{}{e.col, value}}) - } - return e.setE(clause.Expr{SQL: "(?)%?", Vars: []interface{}{e.e, value}}) -} - -func (e expr) floorDiv(value interface{}) expr { - if e.isPure() { - return e.setE(clause.Expr{SQL: "? DIV ?", Vars: []interface{}{e.col, value}}) - } - return e.setE(clause.Expr{SQL: "(?) DIV ?", Vars: []interface{}{e.e, value}}) -} - -func (e expr) floor() expr { - return e.setE(clause.Expr{SQL: "FLOOR(?)", Vars: []interface{}{e.RawExpr()}}) -} - -func (e expr) rightShift(value interface{}) expr { - if e.isPure() { - return e.setE(clause.Expr{SQL: "?>>?", Vars: []interface{}{e.col, value}}) - } - return e.setE(clause.Expr{SQL: "(?)>>?", Vars: []interface{}{e.e, value}}) -} - -func (e expr) leftShift(value interface{}) expr { - if e.isPure() { - return e.setE(clause.Expr{SQL: "?< 0 { - return Uint64{expr{e: clause.Expr{SQL: "UNIX_TIMESTAMP(?)", Vars: []interface{}{date[0]}}}} - } - return Uint64{expr{e: clause.Expr{SQL: "UNIX_TIMESTAMP()"}}} -} - -// FromUnixTime FROM_UNIXTIME(unix_timestamp[,format]) -func (f *function) FromUnixTime(date uint64, format string) String { - if strings.TrimSpace(format) != "" { - return String{expr{e: clause.Expr{SQL: "FROM_UNIXTIME(?, ?)", Vars: []interface{}{date, format}}}} - } - return String{expr{e: clause.Expr{SQL: "FROM_UNIXTIME(?)", Vars: []interface{}{date}}}} -} diff --git a/toolkit/gormgen/field/int.go b/toolkit/gormgen/field/int.go deleted file mode 100644 index 1beb76f9..00000000 --- a/toolkit/gormgen/field/int.go +++ /dev/null @@ -1,1515 +0,0 @@ -package field - -import ( - "github.com/wubin1989/gorm/clause" -) - -// Int int type field -type Int Field - -// Eq equal to -func (field Int) Eq(value int) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Int) Neq(value int) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Int) Gt(value int) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Int) Gte(value int) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Int) Lt(value int) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Int) Lte(value int) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Int) In(values ...int) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Int) NotIn(values ...int) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Int) Between(left int, right int) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Int) NotBetween(left int, right int) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Int) Like(value int) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Int) NotLike(value int) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Int) Add(value int) Int { - return Int{field.add(value)} -} - -// Sub ... -func (field Int) Sub(value int) Int { - return Int{field.sub(value)} -} - -// Mul ... -func (field Int) Mul(value int) Int { - return Int{field.mul(value)} -} - -// Div ... -func (field Int) Div(value int) Int { - return Int{field.div(value)} -} - -// Mod ... -func (field Int) Mod(value int) Int { - return Int{field.mod(value)} -} - -// FloorDiv ... -func (field Int) FloorDiv(value int) Int { - return Int{field.floorDiv(value)} -} - -// RightShift ... -func (field Int) RightShift(value int) Int { - return Int{field.rightShift(value)} -} - -// LeftShift ... -func (field Int) LeftShift(value int) Int { - return Int{field.leftShift(value)} -} - -// BitXor ... -func (field Int) BitXor(value int) Int { - return Int{field.bitXor(value)} -} - -// BitAnd ... -func (field Int) BitAnd(value int) Int { - return Int{field.bitAnd(value)} -} - -// BitOr ... -func (field Int) BitOr(value int) Int { - return Int{field.bitOr(value)} -} - -// BitFlip ... -func (field Int) BitFlip() Int { - return Int{field.bitFlip()} -} - -// Value set value -func (field Int) Value(value int) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Int) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Int) Sum() Int { - return Int{field.sum()} -} - -// IfNull ... -func (field Int) IfNull(value int) Expr { - return field.ifNull(value) -} - -func (field Int) toSlice(values ...int) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Int8 int8 type field -type Int8 Int - -// Eq equal to -func (field Int8) Eq(value int8) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Int8) Neq(value int8) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Int8) Gt(value int8) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Int8) Gte(value int8) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Int8) Lt(value int8) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Int8) Lte(value int8) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Int8) In(values ...int8) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Int8) NotIn(values ...int8) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Int8) Between(left int8, right int8) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Int8) NotBetween(left int8, right int8) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Int8) Like(value int8) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Int8) NotLike(value int8) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Int8) Add(value int8) Int8 { - return Int8{field.add(value)} -} - -// Sub ... -func (field Int8) Sub(value int8) Int8 { - return Int8{field.sub(value)} -} - -// Mul ... -func (field Int8) Mul(value int8) Int8 { - return Int8{field.mul(value)} -} - -// Div ... -func (field Int8) Div(value int8) Int8 { - return Int8{field.div(value)} -} - -// Mod ... -func (field Int8) Mod(value int8) Int8 { - return Int8{field.mod(value)} -} - -// FloorDiv ... -func (field Int8) FloorDiv(value int8) Int8 { - return Int8{field.floorDiv(value)} -} - -// RightShift ... -func (field Int8) RightShift(value int8) Int8 { - return Int8{field.rightShift(value)} -} - -// LeftShift ... -func (field Int8) LeftShift(value int8) Int8 { - return Int8{field.leftShift(value)} -} - -// BitXor ... -func (field Int8) BitXor(value int8) Int8 { - return Int8{field.bitXor(value)} -} - -// BitAnd ... -func (field Int8) BitAnd(value int8) Int8 { - return Int8{field.bitAnd(value)} -} - -// BitOr ... -func (field Int8) BitOr(value int8) Int8 { - return Int8{field.bitOr(value)} -} - -// BitFlip ... -func (field Int8) BitFlip() Int8 { - return Int8{field.bitFlip()} -} - -// Value set value -func (field Int8) Value(value int8) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Int8) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Int8) Sum() Int8 { - return Int8{field.sum()} -} - -// IfNull ... -func (field Int8) IfNull(value int8) Expr { - return field.ifNull(value) -} - -func (field Int8) toSlice(values ...int8) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Int16 int16 type field -type Int16 Int - -// Eq equal to -func (field Int16) Eq(value int16) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Int16) Neq(value int16) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Int16) Gt(value int16) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Int16) Gte(value int16) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Int16) Lt(value int16) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Int16) Lte(value int16) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Int16) In(values ...int16) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Int16) NotIn(values ...int16) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Int16) Between(left int16, right int16) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Int16) NotBetween(left int16, right int16) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Int16) Like(value int16) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Int16) NotLike(value int16) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Int16) Add(value int16) Int16 { - return Int16{field.add(value)} -} - -// Sub ... -func (field Int16) Sub(value int16) Int16 { - return Int16{field.sub(value)} -} - -// Mul ... -func (field Int16) Mul(value int16) Int16 { - return Int16{field.mul(value)} -} - -// Div ... -func (field Int16) Div(value int16) Int16 { - return Int16{field.div(value)} -} - -// Mod ... -func (field Int16) Mod(value int16) Int16 { - return Int16{field.mod(value)} -} - -// FloorDiv ... -func (field Int16) FloorDiv(value int16) Int16 { - return Int16{field.floorDiv(value)} -} - -// RightShift ... -func (field Int16) RightShift(value int16) Int16 { - return Int16{field.rightShift(value)} -} - -// LeftShift ... -func (field Int16) LeftShift(value int16) Int16 { - return Int16{field.leftShift(value)} -} - -// BitXor ... -func (field Int16) BitXor(value int16) Int16 { - return Int16{field.bitXor(value)} -} - -// BitAnd ... -func (field Int16) BitAnd(value int16) Int16 { - return Int16{field.bitAnd(value)} -} - -// BitOr ... -func (field Int16) BitOr(value int16) Int16 { - return Int16{field.bitOr(value)} -} - -// BitFlip ... -func (field Int16) BitFlip() Int16 { - return Int16{field.bitFlip()} -} - -// Value set value -func (field Int16) Value(value int16) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Int16) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Int16) Sum() Int16 { - return Int16{field.sum()} -} - -// IfNull ... -func (field Int16) IfNull(value int16) Expr { - return field.ifNull(value) -} - -func (field Int16) toSlice(values ...int16) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Int32 int32 type field -type Int32 Int - -// Eq equal to -func (field Int32) Eq(value int32) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Int32) Neq(value int32) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Int32) Gt(value int32) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Int32) Gte(value int32) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Int32) Lt(value int32) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Int32) Lte(value int32) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Int32) In(values ...int32) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Int32) NotIn(values ...int32) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Int32) Between(left int32, right int32) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Int32) NotBetween(left int32, right int32) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Int32) Like(value int32) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Int32) NotLike(value int32) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Int32) Add(value int32) Int32 { - return Int32{field.add(value)} -} - -// Sub ... -func (field Int32) Sub(value int32) Int32 { - return Int32{field.sub(value)} -} - -// Mul ... -func (field Int32) Mul(value int32) Int32 { - return Int32{field.mul(value)} -} - -// Div ... -func (field Int32) Div(value int32) Int32 { - return Int32{field.div(value)} -} - -// Mod ... -func (field Int32) Mod(value int32) Int32 { - return Int32{field.mod(value)} -} - -// FloorDiv ... -func (field Int32) FloorDiv(value int32) Int32 { - return Int32{field.floorDiv(value)} -} - -// RightShift ... -func (field Int32) RightShift(value int32) Int32 { - return Int32{field.rightShift(value)} -} - -// LeftShift ... -func (field Int32) LeftShift(value int32) Int32 { - return Int32{field.leftShift(value)} -} - -// BitXor ... -func (field Int32) BitXor(value int32) Int32 { - return Int32{field.bitXor(value)} -} - -// BitAnd ... -func (field Int32) BitAnd(value int32) Int32 { - return Int32{field.bitAnd(value)} -} - -// BitOr ... -func (field Int32) BitOr(value int32) Int32 { - return Int32{field.bitOr(value)} -} - -// BitFlip ... -func (field Int32) BitFlip() Int32 { - return Int32{field.bitFlip()} -} - -// Value set value -func (field Int32) Value(value int32) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Int32) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Int32) Sum() Int32 { - return Int32{field.sum()} -} - -// IfNull ... -func (field Int32) IfNull(value int32) Expr { - return field.ifNull(value) -} - -func (field Int32) toSlice(values ...int32) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Int64 int64 type field -type Int64 Int - -// Eq equal to -func (field Int64) Eq(value int64) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Int64) Neq(value int64) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Int64) Gt(value int64) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Int64) Gte(value int64) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Int64) Lt(value int64) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Int64) Lte(value int64) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Int64) In(values ...int64) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Int64) NotIn(values ...int64) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Int64) Between(left int64, right int64) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Int64) NotBetween(left int64, right int64) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Int64) Like(value int64) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Int64) NotLike(value int64) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Int64) Add(value int64) Int64 { - return Int64{field.add(value)} -} - -// Sub ... -func (field Int64) Sub(value int64) Int64 { - return Int64{field.sub(value)} -} - -// Mul ... -func (field Int64) Mul(value int64) Int64 { - return Int64{field.mul(value)} -} - -// Div ... -func (field Int64) Div(value int64) Int64 { - return Int64{field.div(value)} -} - -// Mod ... -func (field Int64) Mod(value int64) Int64 { - return Int64{field.mod(value)} -} - -// FloorDiv ... -func (field Int64) FloorDiv(value int64) Int64 { - return Int64{field.floorDiv(value)} -} - -// RightShift ... -func (field Int64) RightShift(value int64) Int64 { - return Int64{field.rightShift(value)} -} - -// LeftShift ... -func (field Int64) LeftShift(value int64) Int64 { - return Int64{field.leftShift(value)} -} - -// BitXor ... -func (field Int64) BitXor(value int64) Int64 { - return Int64{field.bitXor(value)} -} - -// BitAnd ... -func (field Int64) BitAnd(value int64) Int64 { - return Int64{field.bitAnd(value)} -} - -// BitOr ... -func (field Int64) BitOr(value int64) Int64 { - return Int64{field.bitOr(value)} -} - -// BitFlip ... -func (field Int64) BitFlip() Int64 { - return Int64{field.bitFlip()} -} - -// Value set value -func (field Int64) Value(value int64) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Int64) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Int64) Sum() Int64 { - return Int64{field.sum()} -} - -// IfNull ... -func (field Int64) IfNull(value int64) Expr { - return field.ifNull(value) -} - -func (field Int64) toSlice(values ...int64) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Uint uint type field -type Uint Int - -// Eq equal to -func (field Uint) Eq(value uint) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Uint) Neq(value uint) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Uint) Gt(value uint) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Uint) Gte(value uint) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Uint) Lt(value uint) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Uint) Lte(value uint) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Uint) In(values ...uint) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Uint) NotIn(values ...uint) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Uint) Between(left uint, right uint) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Uint) NotBetween(left uint, right uint) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Uint) Like(value uint) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Uint) NotLike(value uint) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Uint) Add(value uint) Uint { - return Uint{field.add(value)} -} - -// Sub ... -func (field Uint) Sub(value uint) Uint { - return Uint{field.sub(value)} -} - -// Mul ... -func (field Uint) Mul(value uint) Uint { - return Uint{field.mul(value)} -} - -// Div ... -func (field Uint) Div(value uint) Uint { - return Uint{field.mul(value)} -} - -// Mod ... -func (field Uint) Mod(value uint) Uint { - return Uint{field.mod(value)} -} - -// FloorDiv ... -func (field Uint) FloorDiv(value uint) Uint { - return Uint{field.floorDiv(value)} -} - -// RightShift ... -func (field Uint) RightShift(value uint) Uint { - return Uint{field.rightShift(value)} -} - -// LeftShift ... -func (field Uint) LeftShift(value uint) Uint { - return Uint{field.leftShift(value)} -} - -// BitXor ... -func (field Uint) BitXor(value uint) Uint { - return Uint{field.bitXor(value)} -} - -// BitAnd ... -func (field Uint) BitAnd(value uint) Uint { - return Uint{field.bitAnd(value)} -} - -// BitOr ... -func (field Uint) BitOr(value uint) Uint { - return Uint{field.bitOr(value)} -} - -// BitFlip ... -func (field Uint) BitFlip() Uint { - return Uint{field.bitFlip()} -} - -// Value set value -func (field Uint) Value(value uint) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Uint) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Uint) Sum() Uint { - return Uint{field.sum()} -} - -// IfNull ... -func (field Uint) IfNull(value uint) Expr { - return field.ifNull(value) -} - -func (field Uint) toSlice(values ...uint) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Uint8 uint8 type field -type Uint8 Int - -// Eq equal to -func (field Uint8) Eq(value uint8) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Uint8) Neq(value uint8) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Uint8) Gt(value uint8) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Uint8) Gte(value uint8) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Uint8) Lt(value uint8) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Uint8) Lte(value uint8) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Uint8) In(values ...uint8) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Uint8) NotIn(values ...uint8) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Uint8) Between(left uint8, right uint8) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Uint8) NotBetween(left uint8, right uint8) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Uint8) Like(value uint8) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Uint8) NotLike(value uint8) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Uint8) Add(value uint8) Uint8 { - return Uint8{field.add(value)} -} - -// Sub ... -func (field Uint8) Sub(value uint8) Uint8 { - return Uint8{field.sub(value)} -} - -// Mul ... -func (field Uint8) Mul(value uint8) Uint8 { - return Uint8{field.mul(value)} -} - -// Div ... -func (field Uint8) Div(value uint8) Uint8 { - return Uint8{field.mul(value)} -} - -// Mod ... -func (field Uint8) Mod(value uint8) Uint8 { - return Uint8{field.mod(value)} -} - -// FloorDiv ... -func (field Uint8) FloorDiv(value uint8) Uint8 { - return Uint8{field.floorDiv(value)} -} - -// RightShift ... -func (field Uint8) RightShift(value uint8) Uint8 { - return Uint8{field.rightShift(value)} -} - -// LeftShift ... -func (field Uint8) LeftShift(value uint8) Uint8 { - return Uint8{field.leftShift(value)} -} - -// BitXor ... -func (field Uint8) BitXor(value uint8) Uint8 { - return Uint8{field.bitXor(value)} -} - -// BitAnd ... -func (field Uint8) BitAnd(value uint8) Uint8 { - return Uint8{field.bitAnd(value)} -} - -// BitOr ... -func (field Uint8) BitOr(value uint8) Uint8 { - return Uint8{field.bitOr(value)} -} - -// BitFlip ... -func (field Uint8) BitFlip() Uint8 { - return Uint8{field.bitFlip()} -} - -// Value set value -func (field Uint8) Value(value uint8) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Uint8) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Uint8) Sum() Uint8 { - return Uint8{field.sum()} -} - -// IfNull ... -func (field Uint8) IfNull(value uint8) Expr { - return field.ifNull(value) -} - -func (field Uint8) toSlice(values ...uint8) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Uint16 uint16 type field -type Uint16 Int - -// Eq equal to -func (field Uint16) Eq(value uint16) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Uint16) Neq(value uint16) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Uint16) Gt(value uint16) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Uint16) Gte(value uint16) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Uint16) Lt(value uint16) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Uint16) Lte(value uint16) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Uint16) In(values ...uint16) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Uint16) NotIn(values ...uint16) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Uint16) Between(left uint16, right uint16) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Uint16) NotBetween(left uint16, right uint16) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Uint16) Like(value uint16) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Uint16) NotLike(value uint16) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Uint16) Add(value uint16) Uint16 { - return Uint16{field.add(value)} -} - -// Sub ... -func (field Uint16) Sub(value uint16) Uint16 { - return Uint16{field.sub(value)} -} - -// Mul ... -func (field Uint16) Mul(value uint16) Uint16 { - return Uint16{field.mul(value)} -} - -// Div ... -func (field Uint16) Div(value uint16) Uint16 { - return Uint16{field.mul(value)} -} - -// Mod ... -func (field Uint16) Mod(value uint16) Uint16 { - return Uint16{field.mod(value)} -} - -// FloorDiv ... -func (field Uint16) FloorDiv(value uint16) Uint16 { - return Uint16{field.floorDiv(value)} -} - -// RightShift ... -func (field Uint16) RightShift(value uint16) Uint16 { - return Uint16{field.rightShift(value)} -} - -// LeftShift ... -func (field Uint16) LeftShift(value uint16) Uint16 { - return Uint16{field.leftShift(value)} -} - -// BitXor ... -func (field Uint16) BitXor(value uint16) Uint16 { - return Uint16{field.bitXor(value)} -} - -// BitAnd ... -func (field Uint16) BitAnd(value uint16) Uint16 { - return Uint16{field.bitAnd(value)} -} - -// BitOr ... -func (field Uint16) BitOr(value uint16) Uint16 { - return Uint16{field.bitOr(value)} -} - -// BitFlip ... -func (field Uint16) BitFlip() Uint16 { - return Uint16{field.bitFlip()} -} - -// Value set value -func (field Uint16) Value(value uint16) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Uint16) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Uint16) Sum() Uint16 { - return Uint16{field.sum()} -} - -// IfNull ... -func (field Uint16) IfNull(value uint16) Expr { - return field.ifNull(value) -} - -func (field Uint16) toSlice(values ...uint16) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Uint32 uint32 type field -type Uint32 Int - -// Eq equal to -func (field Uint32) Eq(value uint32) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Uint32) Neq(value uint32) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Uint32) Gt(value uint32) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Uint32) Gte(value uint32) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Uint32) Lt(value uint32) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Uint32) Lte(value uint32) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Uint32) In(values ...uint32) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Uint32) NotIn(values ...uint32) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Uint32) Between(left uint32, right uint32) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Uint32) NotBetween(left uint32, right uint32) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Uint32) Like(value uint32) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Uint32) NotLike(value uint32) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Uint32) Add(value uint32) Uint32 { - return Uint32{field.add(value)} -} - -// Sub ... -func (field Uint32) Sub(value uint32) Uint32 { - return Uint32{field.sub(value)} -} - -// Mul ... -func (field Uint32) Mul(value uint32) Uint32 { - return Uint32{field.mul(value)} -} - -// Div ... -func (field Uint32) Div(value uint32) Uint32 { - return Uint32{field.mul(value)} -} - -// Mod ... -func (field Uint32) Mod(value uint32) Uint32 { - return Uint32{field.mod(value)} -} - -// FloorDiv ... -func (field Uint32) FloorDiv(value uint32) Uint32 { - return Uint32{field.floorDiv(value)} -} - -// RightShift ... -func (field Uint32) RightShift(value uint32) Uint32 { - return Uint32{field.rightShift(value)} -} - -// LeftShift ... -func (field Uint32) LeftShift(value uint32) Uint32 { - return Uint32{field.leftShift(value)} -} - -// BitXor ... -func (field Uint32) BitXor(value uint32) Uint32 { - return Uint32{field.bitXor(value)} -} - -// BitAnd ... -func (field Uint32) BitAnd(value uint32) Uint32 { - return Uint32{field.bitAnd(value)} -} - -// BitOr ... -func (field Uint32) BitOr(value uint32) Uint32 { - return Uint32{field.bitOr(value)} -} - -// BitFlip ... -func (field Uint32) BitFlip() Uint32 { - return Uint32{field.bitFlip()} -} - -// Value set value -func (field Uint32) Value(value uint32) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Uint32) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Uint32) Sum() Uint32 { - return Uint32{field.sum()} -} - -// IfNull ... -func (field Uint32) IfNull(value uint32) Expr { - return field.ifNull(value) -} - -func (field Uint32) toSlice(values ...uint32) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Uint64 uint64 type field -type Uint64 Int - -// Eq equal to -func (field Uint64) Eq(value uint64) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Uint64) Neq(value uint64) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Uint64) Gt(value uint64) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Uint64) Gte(value uint64) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Uint64) Lt(value uint64) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Uint64) Lte(value uint64) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// In ... -func (field Uint64) In(values ...uint64) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Uint64) NotIn(values ...uint64) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Between ... -func (field Uint64) Between(left uint64, right uint64) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Uint64) NotBetween(left uint64, right uint64) Expr { - return Not(field.Between(left, right)) -} - -// Like ... -func (field Uint64) Like(value uint64) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Uint64) NotLike(value uint64) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Add ... -func (field Uint64) Add(value uint64) Uint64 { - return Uint64{field.add(value)} -} - -// Sub ... -func (field Uint64) Sub(value uint64) Uint64 { - return Uint64{field.sub(value)} -} - -// Mul ... -func (field Uint64) Mul(value uint64) Uint64 { - return Uint64{field.mul(value)} -} - -// Div ... -func (field Uint64) Div(value uint64) Uint64 { - return Uint64{field.mul(value)} -} - -// Mod ... -func (field Uint64) Mod(value uint64) Uint64 { - return Uint64{field.mod(value)} -} - -// FloorDiv ... -func (field Uint64) FloorDiv(value uint64) Uint64 { - return Uint64{field.floorDiv(value)} -} - -// RightShift ... -func (field Uint64) RightShift(value uint64) Uint64 { - return Uint64{field.rightShift(value)} -} - -// LeftShift ... -func (field Uint64) LeftShift(value uint64) Uint64 { - return Uint64{field.leftShift(value)} -} - -// BitXor ... -func (field Uint64) BitXor(value uint64) Uint64 { - return Uint64{field.bitXor(value)} -} - -// BitAnd ... -func (field Uint64) BitAnd(value uint64) Uint64 { - return Uint64{field.bitAnd(value)} -} - -// BitOr ... -func (field Uint64) BitOr(value uint64) Uint64 { - return Uint64{field.bitOr(value)} -} - -// BitFlip ... -func (field Uint64) BitFlip() Uint64 { - return Uint64{field.bitFlip()} -} - -// Value set value -func (field Uint64) Value(value uint64) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Uint64) Zero() AssignExpr { - return field.value(0) -} - -// Sum ... -func (field Uint64) Sum() Uint64 { - return Uint64{field.sum()} -} - -// IfNull ... -func (field Uint64) IfNull(value uint64) Expr { - return field.ifNull(value) -} - -func (field Uint64) toSlice(values ...uint64) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} diff --git a/toolkit/gormgen/field/serializer.go b/toolkit/gormgen/field/serializer.go deleted file mode 100644 index f0900003..00000000 --- a/toolkit/gormgen/field/serializer.go +++ /dev/null @@ -1,91 +0,0 @@ -package field - -import ( - "context" - "reflect" - - "github.com/wubin1989/gorm/clause" - "github.com/wubin1989/gorm/schema" - - "github.com/wubin1989/gorm" -) - -type ValuerType struct { - Column string - Value schema.SerializerValuerInterface - FucName string -} - -func (v ValuerType) GormValue(ctx context.Context, db *gorm.DB) (expr clause.Expr) { - stmt := db.Statement.Schema - field := stmt.LookUpField(v.Column) - newValue, err := v.Value.Value(context.WithValue(ctx, "func_name", v.FucName), field, reflect.ValueOf(v.Value), v.Value) - db.AddError(err) - return clause.Expr{SQL: "?", Vars: []interface{}{newValue}} -} - -// Field2 a standard field struct -type Serializer struct{ expr } - -// Eq judge equal -func (field Serializer) Eq(value schema.SerializerValuerInterface) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Eq"}}} -} - -// Neq judge not equal -func (field Serializer) Neq(value schema.SerializerValuerInterface) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Neq"}}} -} - -// In ... -func (field Serializer) In(values ...schema.SerializerValuerInterface) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// Gt ... -func (field Serializer) Gt(value schema.SerializerValuerInterface) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Gt"}}} -} - -// Gte ... -func (field Serializer) Gte(value schema.SerializerValuerInterface) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Gte"}}} -} - -// Lt ... -func (field Serializer) Lt(value schema.SerializerValuerInterface) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Lt"}}} -} - -// Lte ... -func (field Serializer) Lte(value schema.SerializerValuerInterface) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Lte"}}} -} - -// Like ... -func (field Serializer) Like(value schema.SerializerValuerInterface) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Like"}}} -} - -// Value ... -func (field Serializer) Value(value schema.SerializerValuerInterface) AssignExpr { - return field.value(ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "Value"}) -} - -// Sum ... -func (field Serializer) Sum() Field { - return Field{field.sum()} -} - -// IfNull ... -func (field Serializer) IfNull(value schema.SerializerValuerInterface) Expr { - return field.ifNull(ValuerType{Column: field.ColumnName().String(), Value: value, FucName: "IfNull"}) -} - -func (field Serializer) toSlice(values ...schema.SerializerValuerInterface) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = ValuerType{Column: field.ColumnName().String(), Value: v, FucName: "In"} - } - return slice -} diff --git a/toolkit/gormgen/field/string.go b/toolkit/gormgen/field/string.go deleted file mode 100644 index 2cfe5d9e..00000000 --- a/toolkit/gormgen/field/string.go +++ /dev/null @@ -1,256 +0,0 @@ -package field - -import ( - "fmt" - - "github.com/wubin1989/gorm/clause" -) - -// String string type field -type String Field - -// Eq equal to -func (field String) Eq(value string) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field String) Neq(value string) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field String) Gt(value string) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field String) Gte(value string) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field String) Lt(value string) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field String) Lte(value string) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// Between ... -func (field String) Between(left string, right string) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field String) NotBetween(left string, right string) Expr { - return Not(field.Between(left, right)) -} - -// In ... -func (field String) In(values ...string) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values)}} -} - -// NotIn ... -func (field String) NotIn(values ...string) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Like ... -func (field String) Like(value string) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field String) NotLike(value string) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Regexp ... -func (field String) Regexp(value string) Expr { - return field.regexp(value) -} - -// NotRegxp ... -func (field String) NotRegxp(value string) Expr { - return expr{e: clause.Not(field.Regexp(value).expression())} -} - -// Value ... -func (field String) Value(value string) AssignExpr { - return field.value(value) -} - -// Zero ... -func (field String) Zero() AssignExpr { - return field.value("") -} - -// IfNull ... -func (field String) IfNull(value string) Expr { - return field.ifNull(value) -} - -// FindInSet equal to FIND_IN_SET(field_name, input_string_list) -func (field String) FindInSet(targetList string) Expr { - return expr{e: clause.Expr{SQL: "FIND_IN_SET(?,?)", Vars: []interface{}{field.RawExpr(), targetList}}} -} - -// FindInSetWith equal to FIND_IN_SET(input_string, field_name) -func (field String) FindInSetWith(target string) Expr { - return expr{e: clause.Expr{SQL: "FIND_IN_SET(?,?)", Vars: []interface{}{target, field.RawExpr()}}} -} - -// Replace ... -func (field String) Replace(from, to string) String { - return String{expr{e: clause.Expr{SQL: "REPLACE(?,?,?)", Vars: []interface{}{field.RawExpr(), from, to}}}} -} - -// Concat ... -func (field String) Concat(before, after string) String { - switch { - case before != "" && after != "": - return String{expr{e: clause.Expr{SQL: "CONCAT(?,?,?)", Vars: []interface{}{before, field.RawExpr(), after}}}} - case before != "": - return String{expr{e: clause.Expr{SQL: "CONCAT(?,?)", Vars: []interface{}{before, field.RawExpr()}}}} - case after != "": - return String{expr{e: clause.Expr{SQL: "CONCAT(?,?)", Vars: []interface{}{field.RawExpr(), after}}}} - default: - return field - } -} - -// SubstringIndex SUBSTRING_INDEX -// https://dev.mysql.com/doc/refman/8.0/en/functions.html#function_substring-index -func (field String) SubstringIndex(delim string, count int) String { - return String{expr{e: clause.Expr{ - SQL: fmt.Sprintf("SUBSTRING_INDEX(?,%q,%d)", delim, count), - Vars: []interface{}{field.RawExpr()}, - }}} -} - -func (field String) toSlice(values []string) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} - -// Bytes []byte type field -type Bytes String - -// Eq equal to -func (field Bytes) Eq(value []byte) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Bytes) Neq(value []byte) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Bytes) Gt(value []byte) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Bytes) Gte(value []byte) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Bytes) Lt(value []byte) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Bytes) Lte(value []byte) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// Between ... -func (field Bytes) Between(left []byte, right []byte) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Bytes) NotBetween(left []byte, right []byte) Expr { - return Not(field.Between(left, right)) -} - -// In ... -func (field Bytes) In(values ...[]byte) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values)}} -} - -// NotIn ... -func (field Bytes) NotIn(values ...[]byte) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Like ... -func (field Bytes) Like(value string) Expr { - return expr{e: clause.Like{Column: field.RawExpr(), Value: value}} -} - -// NotLike ... -func (field Bytes) NotLike(value string) Expr { - return expr{e: clause.Not(field.Like(value).expression())} -} - -// Regexp ... -func (field Bytes) Regexp(value string) Expr { - return field.regexp(value) -} - -// NotRegxp ... -func (field Bytes) NotRegxp(value string) Expr { - return Not(field.Regexp(value)) -} - -// Value ... -func (field Bytes) Value(value []byte) AssignExpr { - return field.value(value) -} - -// Zero ... -func (field Bytes) Zero() AssignExpr { - return field.value([]byte{}) -} - -// IfNull ... -func (field Bytes) IfNull(value []byte) Expr { - return field.ifNull(value) -} - -// FindInSet FIND_IN_SET(field_name, input_string_list) -func (field Bytes) FindInSet(targetList string) Expr { - return expr{e: clause.Expr{SQL: "FIND_IN_SET(?,?)", Vars: []interface{}{field.RawExpr(), targetList}}} -} - -// FindInSetWith FIND_IN_SET(input_string, field_name) -func (field Bytes) FindInSetWith(target string) Expr { - return expr{e: clause.Expr{SQL: "FIND_IN_SET(?,?)", Vars: []interface{}{target, field.RawExpr()}}} -} - -// SubstringIndex SUBSTRING_INDEX -// https://dev.mysql.com/doc/refman/8.0/en/functions.html#function_substring-index -func (field Bytes) SubstringIndex(delim string, count int) Bytes { - return Bytes{expr{e: clause.Expr{ - SQL: fmt.Sprintf("SUBSTRING_INDEX(?,%q,%d)", delim, count), - Vars: []interface{}{field.RawExpr()}, - }}} -} - -func (field Bytes) toSlice(values [][]byte) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} diff --git a/toolkit/gormgen/field/tag.go b/toolkit/gormgen/field/tag.go deleted file mode 100644 index 0a1a3e45..00000000 --- a/toolkit/gormgen/field/tag.go +++ /dev/null @@ -1,159 +0,0 @@ -package field - -import ( - "sort" - "strings" -) - -const ( - TagKeyGorm = "gorm" - TagKeyJson = "json" - - //gorm tag - TagKeyGormColumn = "column" - TagKeyGormType = "type" - TagKeyGormPrimaryKey = "primaryKey" - TagKeyGormAutoIncrement = "autoIncrement" - TagKeyGormNotNull = "not null" - TagKeyGormUniqueIndex = "uniqueIndex" - TagKeyGormIndex = "index" - TagKeyGormDefault = "default" - TagKeyGormComment = "comment" -) - -var ( - tagKeyPriorities = map[string]int16{ - TagKeyGorm: 100, - TagKeyJson: 99, - - TagKeyGormColumn: 10, - TagKeyGormType: 9, - TagKeyGormPrimaryKey: 8, - TagKeyGormAutoIncrement: 7, - TagKeyGormNotNull: 6, - TagKeyGormUniqueIndex: 5, - TagKeyGormIndex: 4, - TagKeyGormDefault: 3, - TagKeyGormComment: 0, - } -) - -type TagBuilder interface { - Build() string -} - -type Tag map[string]string - -func (tag Tag) Set(key, value string) Tag { - tag[key] = value - return tag -} - -func (tag Tag) Remove(key string) Tag { - delete(tag, key) - return tag -} - -func (tag Tag) Build() string { - if tag == nil || len(tag) == 0 { - return "" - } - - tags := make([]string, 0, len(tag)) - for _, k := range tagKeys(tag) { - v := tag[k] - if k == "" || v == "" { - continue - } - tags = append(tags, k+":\""+v+"\"") - } - return strings.Join(tags, " ") -} - -type GormTag map[string][]string - -func (tag GormTag) Append(key string, values ...string) GormTag { - if _, ok := tag[key]; ok { - tag[key] = append(tag[key], values...) - } else { - tag[key] = values - } - return tag -} - -func (tag GormTag) Set(key string, values ...string) GormTag { - tag[key] = values - return tag -} - -func (tag GormTag) Remove(key string) GormTag { - delete(tag, key) - return tag -} - -func (tag GormTag) Build() string { - if tag == nil || len(tag) == 0 { - return "" - } - tags := make([]string, 0, len(tag)) - for _, k := range gormKeys(tag) { - vs := tag[k] - if len(vs) == 0 && k == "" { - continue - } - if len(vs) == 0 { - tags = append(tags, k) - continue - } - for _, v := range vs { - if k == "" && v == "" { - continue - } - tv := make([]string, 0, 2) - if k != "" { - tv = append(tv, k) - } - if v != "" { - tv = append(tv, v) - } - tags = append(tags, strings.Join(tv, ":")) - } - } - - return strings.Join(tags, ";") -} - -func tagKeys(tag Tag) []string { - keys := make([]string, 0, len(tag)) - if len(tag) == 0 { - return keys - } - for k, _ := range tag { - keys = append(keys, k) - } - return keySort(keys) -} - -func gormKeys(tag GormTag) []string { - keys := make([]string, 0, len(tag)) - if len(tag) == 0 { - return keys - } - for k, _ := range tag { - keys = append(keys, k) - } - return keySort(keys) -} - -func keySort(keys []string) []string { - if len(keys) == 0 { - return keys - } - sort.Slice(keys, func(i, j int) bool { - if tagKeyPriorities[keys[i]] == tagKeyPriorities[keys[j]] { - return keys[i] <= keys[j] - } - return tagKeyPriorities[keys[i]] > tagKeyPriorities[keys[j]] - }) - return keys -} diff --git a/toolkit/gormgen/field/time.go b/toolkit/gormgen/field/time.go deleted file mode 100644 index 06062cc0..00000000 --- a/toolkit/gormgen/field/time.go +++ /dev/null @@ -1,198 +0,0 @@ -package field - -import ( - "fmt" - "time" - - "github.com/wubin1989/gorm/clause" -) - -// Time time type field -type Time Field - -// Eq equal to -func (field Time) Eq(value time.Time) Expr { - return expr{e: clause.Eq{Column: field.RawExpr(), Value: value}} -} - -// Neq not equal to -func (field Time) Neq(value time.Time) Expr { - return expr{e: clause.Neq{Column: field.RawExpr(), Value: value}} -} - -// Gt greater than -func (field Time) Gt(value time.Time) Expr { - return expr{e: clause.Gt{Column: field.RawExpr(), Value: value}} -} - -// Gte greater or equal to -func (field Time) Gte(value time.Time) Expr { - return expr{e: clause.Gte{Column: field.RawExpr(), Value: value}} -} - -// Lt less than -func (field Time) Lt(value time.Time) Expr { - return expr{e: clause.Lt{Column: field.RawExpr(), Value: value}} -} - -// Lte less or equal to -func (field Time) Lte(value time.Time) Expr { - return expr{e: clause.Lte{Column: field.RawExpr(), Value: value}} -} - -// Between ... -func (field Time) Between(left time.Time, right time.Time) Expr { - return field.between([]interface{}{left, right}) -} - -// NotBetween ... -func (field Time) NotBetween(left time.Time, right time.Time) Expr { - return Not(field.Between(left, right)) -} - -// In ... -func (field Time) In(values ...time.Time) Expr { - return expr{e: clause.IN{Column: field.RawExpr(), Values: field.toSlice(values...)}} -} - -// NotIn ... -func (field Time) NotIn(values ...time.Time) Expr { - return expr{e: clause.Not(field.In(values...).expression())} -} - -// Add ... -func (field Time) Add(value time.Duration) Time { - return Time{field.add(value)} -} - -// Sub ... -func (field Time) Sub(value time.Duration) Time { - return Time{field.sub(value)} -} - -// Date convert to data, equal to "DATE(time_expr)" -func (field Time) Date() Time { - return Time{expr{e: clause.Expr{SQL: "DATE(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// DateDiff equal to DATADIFF(self, value) -func (field Time) DateDiff(value time.Time) Int { - return Int{expr{e: clause.Expr{SQL: "DATEDIFF(?,?)", Vars: []interface{}{field.RawExpr(), value}}}} -} - -// DateFormat equal to DATE_FORMAT(self, value) -func (field Time) DateFormat(value string) String { - return String{expr{e: clause.Expr{SQL: "DATE_FORMAT(?,?)", Vars: []interface{}{field.RawExpr(), value}}}} -} - -// Now return result of NOW() -func (field Time) Now() Time { - return Time{expr{e: clause.Expr{SQL: "NOW()"}}} -} - -// CurDate return result of CURDATE() -func (field Time) CurDate() Time { - return Time{expr{e: clause.Expr{SQL: "CURDATE()"}}} -} - -// CurTime return result of CURTIME() -func (field Time) CurTime() Time { - return Time{expr{e: clause.Expr{SQL: "CURTIME()"}}} -} - -// DayName equal to DAYNAME(self) -func (field Time) DayName() String { - return String{expr{e: clause.Expr{SQL: "DAYNAME(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// MonthName equal to MONTHNAME(self) -func (field Time) MonthName() String { - return String{expr{e: clause.Expr{SQL: "MONTHNAME(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -func (field Time) Year() Int { - return Int{expr{e: clause.Expr{SQL: "YEAR(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// Month equal to MONTH(self) -func (field Time) Month() Int { - return Int{expr{e: clause.Expr{SQL: "MONTH(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// Day equal to DAY(self) -func (field Time) Day() Int { - return Int{expr{e: clause.Expr{SQL: "DAY(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// Hour equal to HOUR(self) -func (field Time) Hour() Int { - return Int{expr{e: clause.Expr{SQL: "HOUR(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// Minute equal to MINUTE(self) -func (field Time) Minute() Int { - return Int{expr{e: clause.Expr{SQL: "MINUTE(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// Second equal to SECOND(self) -func (field Time) Second() Int { - return Int{expr{e: clause.Expr{SQL: "SECOND(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// MicroSecond equal to MICROSECOND(self) -func (field Time) MicroSecond() Int { - return Int{expr{e: clause.Expr{SQL: "MICROSECOND(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// DayOfWeek equal to DAYOFWEEK(self) -func (field Time) DayOfWeek() Int { - return Int{expr{e: clause.Expr{SQL: "DAYOFWEEK(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// DayOfMonth equal to DAYOFMONTH(self) -func (field Time) DayOfMonth() Int { - return Int{expr{e: clause.Expr{SQL: "DAYOFMONTH(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// DayOfYear equal to DAYOFYEAR(self) -func (field Time) DayOfYear() Int { - return Int{expr{e: clause.Expr{SQL: "DAYOFYEAR(?)", Vars: []interface{}{field.RawExpr()}}}} -} - -// FromDays equal to FROM_DAYS(self) -func (field Time) FromDays(value int) Time { - return Time{expr{e: clause.Expr{SQL: fmt.Sprintf("FROM_DAYS(%d)", value)}}} -} - -// FromUnixtime equal to FROM_UNIXTIME(self) -func (field Time) FromUnixtime(value int) Time { - return Time{expr{e: clause.Expr{SQL: fmt.Sprintf("FROM_UNIXTIME(%d)", value)}}} -} - -// Value set value -func (field Time) Value(value time.Time) AssignExpr { - return field.value(value) -} - -// Zero set zero value -func (field Time) Zero() AssignExpr { - return field.value(time.Time{}) -} - -// Sum calc sum -func (field Time) Sum() Time { - return Time{field.sum()} -} - -// IfNull ... -func (field Time) IfNull(value time.Time) Expr { - return field.ifNull(value) -} - -func (field Time) toSlice(values ...time.Time) []interface{} { - slice := make([]interface{}, len(values)) - for i, v := range values { - slice[i] = v - } - return slice -} diff --git a/toolkit/gormgen/field_options.go b/toolkit/gormgen/field_options.go deleted file mode 100644 index c4454090..00000000 --- a/toolkit/gormgen/field_options.go +++ /dev/null @@ -1,272 +0,0 @@ -package gormgen - -import ( - "reflect" - "regexp" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/generate" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" - "github.com/wubin1989/gorm/schema" -) - -// ModelOpt field option -type ModelOpt = model.Option - -var ns = schema.NamingStrategy{} - -var ( - // FieldNew add new field (any type your want) - FieldNew = func(fieldName, fieldType string, fieldTag field.Tag) model.CreateFieldOpt { - return func(*model.Field) *model.Field { - return &model.Field{ - Name: fieldName, - Type: fieldType, - Tag: fieldTag, - } - } - } - // FieldIgnore ignore some columns by name - FieldIgnore = func(columnNames ...string) model.FilterFieldOpt { - return func(m *model.Field) *model.Field { - for _, name := range columnNames { - if m.ColumnName == name { - return nil - } - } - return m - } - } - // FieldIgnoreReg ignore some columns by RegExp - FieldIgnoreReg = func(columnNameRegs ...string) model.FilterFieldOpt { - regs := make([]regexp.Regexp, len(columnNameRegs)) - for i, reg := range columnNameRegs { - regs[i] = *regexp.MustCompile(reg) - } - return func(m *model.Field) *model.Field { - for _, reg := range regs { - if reg.MatchString(m.ColumnName) { - return nil - } - } - return m - } - } - // FieldRename specify field name in generated struct - FieldRename = func(columnName string, newName string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if m.ColumnName == columnName { - m.Name = newName - } - return m - } - } - // FieldComment specify field comment in generated struct - FieldComment = func(columnName string, comment string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if m.ColumnName == columnName { - m.ColumnComment = comment - m.MultilineComment = strings.Contains(comment, "\n") - } - return m - } - } - // FieldType specify field type in generated struct - FieldType = func(columnName string, newType string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if m.ColumnName == columnName { - m.Type = newType - } - return m - } - } - // FieldTypeReg specify field type in generated struct by RegExp - FieldTypeReg = func(columnNameReg string, newType string) model.ModifyFieldOpt { - reg := regexp.MustCompile(columnNameReg) - return func(m *model.Field) *model.Field { - if reg.MatchString(m.ColumnName) { - m.Type = newType - } - return m - } - } - // FieldGenType specify field gen type in generated dao - FieldGenType = func(columnName string, newType string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if m.ColumnName == columnName { - m.CustomGenType = newType - } - return m - } - } - // FieldGenTypeReg specify field gen type in generated dao by RegExp - FieldGenTypeReg = func(columnNameReg string, newType string) model.ModifyFieldOpt { - reg := regexp.MustCompile(columnNameReg) - return func(m *model.Field) *model.Field { - if reg.MatchString(m.ColumnName) { - m.CustomGenType = newType - } - return m - } - } - // FieldTag specify GORM tag and JSON tag - FieldTag = func(columnName string, tagFunc func(tag field.Tag) field.Tag) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if m.ColumnName == columnName { - m.Tag = tagFunc(m.Tag) - } - return m - } - } - // FieldJSONTag specify JSON tag - FieldJSONTag = func(columnName string, jsonTag string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if m.ColumnName == columnName { - m.Tag.Set(field.TagKeyJson, jsonTag) - } - return m - } - } - // FieldJSONTagWithNS specify JSON tag with name strategy - FieldJSONTagWithNS = func(schemaName func(columnName string) (tagContent string)) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if schemaName != nil { - m.Tag.Set(field.TagKeyJson, schemaName(m.ColumnName)) - - } - return m - } - } - // FieldGORMTag specify GORM tag - FieldGORMTag = func(columnName string, gormTag func(tag field.GormTag) field.GormTag) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if columnName == "" { - m.GORMTag = gormTag(m.GORMTag) - return m - } - if m.ColumnName == columnName { - m.GORMTag = gormTag(m.GORMTag) - } - return m - } - } - // FieldGORMTagReg specify GORM tag by RegExp - FieldGORMTagReg = func(columnNameReg string, gormTag func(tag field.GormTag) field.GormTag) model.ModifyFieldOpt { - reg := regexp.MustCompile(columnNameReg) - return func(m *model.Field) *model.Field { - if reg.MatchString(m.ColumnName) { - m.GORMTag = gormTag(m.GORMTag) - } - return m - } - } - // FieldNewTag add new tag - FieldNewTag = func(columnName string, newTag field.Tag) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if m.ColumnName == columnName { - for k, v := range newTag { - m.Tag.Set(k, v) - } - } - return m - } - } - // FieldNewTagWithNS add new tag with name strategy - FieldNewTagWithNS = func(tagName string, schemaName func(columnName string) string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - if schemaName == nil { - schemaName = func(name string) string { return name } - } - m.Tag.Set(tagName, schemaName(m.ColumnName)) - return m - } - } - // FieldTrimPrefix trim column name's prefix - FieldTrimPrefix = func(prefix string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - m.Name = strings.TrimPrefix(m.Name, prefix) - return m - } - } - // FieldTrimSuffix trim column name's suffix - FieldTrimSuffix = func(suffix string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - m.Name = strings.TrimSuffix(m.Name, suffix) - return m - } - } - // FieldAddPrefix add prefix to struct's memeber name - FieldAddPrefix = func(prefix string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - m.Name = prefix + m.Name - return m - } - } - // FieldAddSuffix add suffix to struct's memeber name - FieldAddSuffix = func(suffix string) model.ModifyFieldOpt { - return func(m *model.Field) *model.Field { - m.Name += suffix - return m - } - } - // FieldRelate relate to table in database - FieldRelate = func(relationship field.RelationshipType, fieldName string, table *generate.QueryStructMeta, config *field.RelateConfig) model.CreateFieldOpt { - if config == nil { - config = &field.RelateConfig{} - } - - return func(*model.Field) *model.Field { - return &model.Field{ - Name: fieldName, - Type: config.RelateFieldPrefix(relationship) + table.StructInfo.Type, - Tag: config.GetTag(fieldName), - GORMTag: config.GORMTag, - Relation: field.NewRelationWithType( - relationship, fieldName, table.StructInfo.Package+"."+table.StructInfo.Type, - table.Relations()...), - } - } - } - // FieldRelateModel relate to exist table model - FieldRelateModel = func(relationship field.RelationshipType, fieldName string, relModel interface{}, config *field.RelateConfig) model.CreateFieldOpt { - st := reflect.TypeOf(relModel) - if st.Kind() == reflect.Ptr { - st = st.Elem() - } - fieldType := st.String() - - if config == nil { - config = &field.RelateConfig{} - } - - return func(*model.Field) *model.Field { - return &model.Field{ - Name: fieldName, - Type: config.RelateFieldPrefix(relationship) + fieldType, - GORMTag: config.GORMTag, - Tag: config.GetTag(fieldName), - Relation: field.NewRelationWithModel(relationship, fieldName, fieldType, relModel), - } - } - } - - // WithMethod add custom method for table model - WithMethod = func(methods ...interface{}) model.AddMethodOpt { - return func() []interface{} { return methods } - } -) - -var ( - DefaultMethodTableWithNamer = (&defaultModel{}).TableName -) - -type defaultModel struct { -} - -func (*defaultModel) TableName(namer schema.Namer) string { - if namer == nil { - return "@@table" - } - return namer.TableName("@@table") -} diff --git a/toolkit/gormgen/generator.go b/toolkit/gormgen/generator.go deleted file mode 100644 index 4dd440f5..00000000 --- a/toolkit/gormgen/generator.go +++ /dev/null @@ -1,961 +0,0 @@ -package gormgen - -import ( - "bytes" - "context" - "database/sql" - "fmt" - "github.com/unionj-cloud/go-doudou/v2/toolkit/fileutils" - "io" - "io/ioutil" - "log" - "os" - "path/filepath" - "runtime" - "strconv" - "strings" - "text/template" - - "github.com/iancoleman/strcase" - "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - v3 "github.com/unionj-cloud/go-doudou/v2/toolkit/protobuf/v3" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/schema" - "golang.org/x/tools/go/packages" - "golang.org/x/tools/imports" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/helper" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/generate" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/parser" - tmpl "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/template" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/utils/pools" -) - -// T generic type -type T interface{} - -// M map[string]interface{} -type M map[string]interface{} - -// SQLResult sql.result -type SQLResult sql.Result - -// SQLRow sql.Row -type SQLRow sql.Row - -// SQLRows sql.Rows -type SQLRows sql.Rows - -// RowsAffected execute affected raws -type RowsAffected int64 - -var concurrent = runtime.NumCPU() - -func init() { runtime.GOMAXPROCS(runtime.NumCPU()) } - -// NewGenerator create a new generator -func NewGenerator(cfg Config) *Generator { - if err := cfg.Revise(); err != nil { - panic(fmt.Errorf("create generator fail: %w", err)) - } - - return &Generator{ - Config: cfg, - Data: make(map[string]*genInfo), - models: make(map[string]*generate.QueryStructMeta), - } -} - -// genInfo info about generated code -type genInfo struct { - *generate.QueryStructMeta - Interfaces []*generate.InterfaceMethod -} - -func (i *genInfo) appendMethods(methods []*generate.InterfaceMethod) { - for _, newMethod := range methods { - if i.methodInGenInfo(newMethod) { - continue - } - i.Interfaces = append(i.Interfaces, newMethod) - } -} - -func (i *genInfo) methodInGenInfo(m *generate.InterfaceMethod) bool { - for _, method := range i.Interfaces { - if method.IsRepeatFromSameInterface(m) { - return true - } - } - return false -} - -// Generator code generator -type Generator struct { - Config - - Data map[string]*genInfo //gen query data - models map[string]*generate.QueryStructMeta //gen model data -} - -// UseDB set db connection -func (g *Generator) UseDB(db *gorm.DB) { - if db != nil { - g.db = db - } -} - -/* -** The feature of mapping table from database server to Golang struct -** Provided by @qqxhb - */ - -// GenerateModel catch table info from db, return a BaseStruct -func (g *Generator) GenerateModel(tableName string, opts ...ModelOpt) *generate.QueryStructMeta { - return g.GenerateModelAs(tableName, g.db.Config.NamingStrategy.SchemaName(tableName), opts...) -} - -// GenerateModelAs catch table info from db, return a BaseStruct -func (g *Generator) GenerateModelAs(tableName string, modelName string, opts ...ModelOpt) *generate.QueryStructMeta { - meta, err := generate.GetQueryStructMeta(g.db, g.genModelConfig(tableName, modelName, opts)) - if err != nil { - g.db.Logger.Error(context.Background(), "generate struct from table fail: %s", err) - panic("generate struct fail") - } - if meta == nil { - g.info(fmt.Sprintf("ignore table <%s>", tableName)) - return nil - } - g.models[meta.ModelStructName] = meta - - g.info(fmt.Sprintf("got %d columns from table <%s>", len(meta.Fields), meta.TableName)) - return meta -} - -// GenerateAllTable generate all tables in db -func (g *Generator) GenerateAllTable(opts ...ModelOpt) (tableModels []interface{}) { - tableList, err := g.db.Migrator().GetTables() - if err != nil { - panic(fmt.Errorf("get all tables fail: %w", err)) - } - - g.info(fmt.Sprintf("find %d table from db: %s", len(tableList), tableList)) - - tableModels = make([]interface{}, len(tableList)) - for i, tableName := range tableList { - tableModels[i] = g.GenerateModel(tableName, opts...) - } - return tableModels -} - -// GenerateFilteredTables generate all tables filterd by glob syntax in db -func (g *Generator) GenerateFilteredTables(opts ...ModelOpt) (tableModels []interface{}) { - tableList, err := g.db.Migrator().GetTables() - if err != nil { - panic(fmt.Errorf("get all tables fail: %w", err)) - } - filteredTables := make([]string, 0) - for _, item := range tableList { - match := false - if g.FilterTableGlob != nil && g.FilterTableGlob.Match(item) { - match = true - } - if g.ExcludeTableGlob != nil && g.ExcludeTableGlob.Match(item) { - match = false - } - if match { - filteredTables = append(filteredTables, item) - } - } - tableList = filteredTables - g.info(fmt.Sprintf("find %d table from db: %s", len(tableList), tableList)) - - tableModels = make([]interface{}, len(tableList)) - for i, tableName := range tableList { - tableModels[i] = g.GenerateModel(tableName, opts...) - } - return tableModels -} - -// GenerateModelFrom generate model from object -func (g *Generator) GenerateModelFrom(obj helper.Object) *generate.QueryStructMeta { - s, err := generate.GetQueryStructMetaFromObject(obj, g.genModelObjConfig()) - if err != nil { - panic(fmt.Errorf("generate struct from object fail: %w", err)) - } - g.models[s.ModelStructName] = s - - g.info(fmt.Sprintf("parse object %s", obj.StructName())) - return s -} - -func (g *Generator) genModelConfig(tableName string, modelName string, modelOpts []ModelOpt) *model.Config { - if modelOpts == nil { - modelOpts = g.modelOpts - } else { - modelOpts = append(modelOpts, g.modelOpts...) - } - return &model.Config{ - ModelPkg: g.Config.ModelPkgPath, - TablePrefix: g.getTablePrefix(), - TableName: tableName, - ModelName: modelName, - ImportPkgPaths: g.importPkgPaths, - ModelOpts: modelOpts, - NameStrategy: model.NameStrategy{ - SchemaNameOpts: g.dbNameOpts, - TableNameNS: g.tableNameNS, - ModelNameNS: g.modelNameNS, - FileNameNS: g.fileNameNS, - }, - FieldConfig: model.FieldConfig{ - DataTypeMap: g.dataTypeMap, - - FieldSignable: g.FieldSignable, - FieldNullable: g.FieldNullable, - FieldCoverable: g.FieldCoverable, - FieldWithIndexTag: g.FieldWithIndexTag, - FieldWithTypeTag: g.FieldWithTypeTag, - - FieldJSONTagNS: g.fieldJSONTagNS, - }, - } -} - -func (g *Generator) getTablePrefix() string { - if ns, ok := g.db.NamingStrategy.(schema.NamingStrategy); ok { - return ns.TablePrefix - } - return "" -} - -func (g *Generator) genModelObjConfig() *model.Config { - return &model.Config{ - ModelPkg: g.Config.ModelPkgPath, - ImportPkgPaths: g.importPkgPaths, - NameStrategy: model.NameStrategy{ - TableNameNS: g.tableNameNS, - ModelNameNS: g.modelNameNS, - FileNameNS: g.fileNameNS, - }, - } -} - -// ApplyBasic specify models which will implement basic .diy_method -func (g *Generator) ApplyBasic(models ...interface{}) { - g.ApplyInterface(func() {}, models...) -} - -// ApplyInterface specifies .diy_method interfaces on structures, implment codes will be generated after calling g.Execute() -// eg: g.ApplyInterface(func(model.Method){}, model.User{}, model.Company{}) -func (g *Generator) ApplyInterface(fc interface{}, models ...interface{}) { - structs, err := generate.ConvertStructs(g.db, models...) - if err != nil { - g.db.Logger.Error(context.Background(), "check struct fail: %v", err) - panic("check struct fail") - } - g.apply(fc, structs) -} - -func (g *Generator) apply(fc interface{}, structs []*generate.QueryStructMeta) { - interfacePaths, err := parser.GetInterfacePath(fc) - if err != nil { - g.db.Logger.Error(context.Background(), "get interface name or file fail: %s", err) - panic("check interface fail") - } - - readInterface := new(parser.InterfaceSet) - err = readInterface.ParseFile(interfacePaths, generate.GetStructNames(structs)) - if err != nil { - g.db.Logger.Error(context.Background(), "parser interface file fail: %s", err) - panic("parser interface file fail") - } - - for _, interfaceStructMeta := range structs { - if g.judgeMode(WithoutContext) { - interfaceStructMeta.ReviseFieldNameFor(model.GormKeywords) - } - interfaceStructMeta.ReviseFieldNameFor(model.DOKeywords) - - genInfo, err := g.pushQueryStructMeta(interfaceStructMeta) - if err != nil { - g.db.Logger.Error(context.Background(), "gen struct fail: %v", err) - panic("gen struct fail") - } - - functions, err := generate.BuildDIYMethod(readInterface, interfaceStructMeta, genInfo.Interfaces) - if err != nil { - g.db.Logger.Error(context.Background(), "check interface fail: %v", err) - panic("check interface fail") - } - genInfo.appendMethods(functions) - } -} - -// Execute generate code to output path -func (g *Generator) Execute() { - g.info("Start generating orm related code.") - - if err := g.generateModelFile(); err != nil { - g.db.Logger.Error(context.Background(), "generate model struct fail: %s", err) - panic("generate model struct fail") - } - - if err := g.generateQueryFile(); err != nil { - g.db.Logger.Error(context.Background(), "generate query code fail: %s", err) - panic("generate query code fail") - } - - g.info("Generate orm related code done.") -} - -// GenerateSvcGo ... -func (g *Generator) GenerateSvcGo() { - g.info("Start generating svc.go.") - - if err := g.generateSvcGo(); err != nil { - g.db.Logger.Error(context.Background(), "generate svc.go fail: %s", err) - return - } - - g.info("Generate code svc.go done.") -} - -// GenerateSvcImplGo ... -func (g *Generator) GenerateSvcImplGo() { - g.info("Start generating svcimpl.go.") - - if err := g.generateSvcImplGo(); err != nil { - g.db.Logger.Error(context.Background(), "generate svcimpl.go fail: %s", err) - panic("generate svcimpl.go fail") - } - - g.info("Generate code svcimpl.go done.") -} - -// GenerateSvcImplGrpc ... -func (g *Generator) GenerateSvcImplGrpc(grpcService v3.Service) { - g.info("Start generating grpc implementation code in svcimpl.go.") - - if err := g.generateSvcImplGrpc(grpcService); err != nil { - g.db.Logger.Error(context.Background(), "generate grpc implementation code in svcimpl.go fail: %s", err) - panic("generate grpc implementation code in svcimpl.go fail") - } - - g.info("Generate grpc implementation code in svcimpl.go done.") -} - -func (g *Generator) filterNewModels(meta astutils.InterfaceMeta) []*generate.QueryStructMeta { - models := make([]*generate.QueryStructMeta, 0, len(g.models)) - for _, data := range g.models { - if data == nil || !data.Generated { - continue - } - targets := []string{ - fmt.Sprintf("PostGen%s", data.ModelStructName), - fmt.Sprintf("GetGen%s", data.ModelStructName), - fmt.Sprintf("PutGen%s", data.ModelStructName), - fmt.Sprintf("DeleteGen%s", data.ModelStructName), - fmt.Sprintf("GetGen%ss", data.ModelStructName), - } - count := 0 - for _, method := range meta.Methods { - if sliceutils.StringContains(targets, method.Name) { - count++ - } - } - if count == 0 { - models = append(models, data) - } - } - return models -} - -func (g *Generator) filterNewModelsGrpc(meta astutils.InterfaceMeta) []*generate.QueryStructMeta { - models := make([]*generate.QueryStructMeta, 0, len(g.models)) - for _, data := range g.models { - if data == nil || !data.Generated { - continue - } - targets := []string{ - fmt.Sprintf("PostGen%sRpc", data.ModelStructName), - fmt.Sprintf("GetGen%sRpc", data.ModelStructName), - fmt.Sprintf("PutGen%sRpc", data.ModelStructName), - fmt.Sprintf("DeleteGen%sRpc", data.ModelStructName), - fmt.Sprintf("GetGen%ssRpc", data.ModelStructName), - } - count := 0 - for _, method := range meta.Methods { - if sliceutils.StringContains(targets, method.Name) { - count++ - } - } - if count == 0 { - models = append(models, data) - } - } - return models -} - -// generateSvcGo generate svc.go code and save to file -func (g *Generator) generateSvcGo() error { - if len(g.models) == 0 { - return nil - } - svcFile := filepath.Join(g.RootDir, "svc.go") - var err error - if _, err = os.Stat(svcFile); err != nil { - return errors.New("svc.go file is not found, maybe the project has not been initialized yet") - } - var interfaceMeta astutils.InterfaceMeta - ic := astutils.BuildInterfaceCollector(svcFile, astutils.ExprString) - if len(ic.Interfaces) > 0 { - interfaceMeta = ic.Interfaces[0] - } - g.info("New content will be append to svc.go file") - var f *os.File - if f, err = os.OpenFile(svcFile, os.O_APPEND, os.ModePerm); err != nil { - return errors.WithStack(err) - } - defer f.Close() - models := g.filterNewModels(interfaceMeta) - var buf bytes.Buffer - for _, model := range models { - if err = render(tmpl.AppendSvc, &buf, model); err != nil { - return errors.WithStack(err) - } - } - var original []byte - if original, err = ioutil.ReadAll(f); err != nil { - return errors.WithStack(err) - } - original = bytes.TrimSpace(original) - last := bytes.LastIndexByte(original, '}') - original = append(original[:last], buf.Bytes()...) - original = append(original, '}') - if err = g.outputWithOpt(svcFile, original, &imports.Options{ - TabWidth: 8, - TabIndent: true, - Comments: true, - Fragment: true, - }); err != nil { - return errors.WithStack(err) - } - return nil -} - -// generateSvcImplGo generate svcimpl.go code and save to file -func (g *Generator) generateSvcImplGo() error { - if len(g.models) == 0 { - return nil - } - svcImplFile := filepath.Join(g.RootDir, "svcimpl.go") - var err error - if _, err = os.Stat(svcImplFile); err != nil { - return errors.New("svcimpl.go file is not found, maybe the project has not been initialized yet") - } - var interfaceMeta astutils.InterfaceMeta - interfaceMeta.Name = strcase.ToCamel(strcase.ToCamel(filepath.Base(g.RootDir))) - sc := astutils.NewStructCollector(astutils.ExprString) - astutils.CollectStructsInFolder(g.RootDir, sc) - interfaceMeta.Methods = sc.Methods[interfaceMeta.Name+"Impl"] - g.info("New content will be append to svcimpl.go file") - var f *os.File - if f, err = os.OpenFile(svcImplFile, os.O_APPEND, os.ModePerm); err != nil { - return errors.WithStack(err) - } - defer f.Close() - models := g.filterNewModelsGrpc(interfaceMeta) - var buf bytes.Buffer - for _, model := range models { - if err = render(tmpl.AppendSvcImpl, &buf, struct { - *generate.QueryStructMeta - InterfaceName string - }{ - QueryStructMeta: model, - InterfaceName: interfaceMeta.Name, - }); err != nil { - return errors.WithStack(err) - } - } - var original []byte - if original, err = ioutil.ReadAll(f); err != nil { - return errors.WithStack(err) - } - original = append(original, buf.Bytes()...) - - confPkg := g.GetPkgPath(filepath.Join(g.RootDir, "config")) - dtoPkg := g.GetPkgPath(filepath.Join(g.RootDir, "dto")) - queryPkg := g.GetPkgPath(g.OutPath) - fileutils.CreateDirectory(filepath.Join(g.RootDir, "transport", "grpc")) - transGrpcPkg := g.GetPkgPath(filepath.Join(g.RootDir, "transport", "grpc")) - - // fix import block - var importBuf bytes.Buffer - if err = render(tmpl.SvcImplImport, &importBuf, struct { - ConfigPackage string - DtoPackage string - ModelPackage string - QueryPackage string - TransportGrpcPackage string - }{ - ConfigPackage: confPkg, - DtoPackage: dtoPkg, - ModelPackage: g.modelPkgPath, - QueryPackage: queryPkg, - TransportGrpcPackage: transGrpcPkg, - }); err != nil { - return errors.WithStack(err) - } - original = astutils.AppendImportStatements(original, importBuf.Bytes()) - - if err = g.outputWithOpt(svcImplFile, original, &imports.Options{ - TabWidth: 8, - TabIndent: true, - Comments: true, - Fragment: true, - }); err != nil { - return errors.WithStack(err) - } - return nil -} - -// info logger -func (g *Generator) info(logInfos ...string) { - for _, l := range logInfos { - g.db.Logger.Info(context.Background(), l) - log.Println(l) - } -} - -// generateQueryFile generate query code and save to file -func (g *Generator) generateQueryFile() (err error) { - if len(g.Data) == 0 { - return nil - } - - if err = os.MkdirAll(g.OutPath, os.ModePerm); err != nil { - return fmt.Errorf("make dir outpath(%s) fail: %s", g.OutPath, err) - } - - errChan := make(chan error) - pool := pools.NewPool(concurrent) - // generate query code for all struct - for _, info := range g.Data { - pool.Wait() - go func(info *genInfo) { - defer pool.Done() - err := g.generateSingleQueryFile(info) - if err != nil { - errChan <- err - } - - if g.WithUnitTest { - err = g.generateQueryUnitTestFile(info) - if err != nil { // do not panic - g.db.Logger.Error(context.Background(), "generate unit test fail: %s", err) - } - } - }(info) - } - select { - case err = <-errChan: - return errors.WithStack(err) - case <-pool.AsyncWaitAll(): - } - - if !g.GenGenGo { - return nil - } - - importPkgs := importList.Add(g.importPkgPaths...).Paths() - - // generate query file - var buf bytes.Buffer - err = render(tmpl.Header, &buf, map[string]interface{}{ - "Package": g.queryPkgName, - "ImportPkgPaths": importPkgs, - }) - if err != nil { - return errors.WithStack(err) - } - - if g.judgeMode(WithDefaultQuery) { - err = render(tmpl.DefaultQuery, &buf, g) - if err != nil { - return errors.WithStack(err) - } - } - err = render(tmpl.QueryMethod, &buf, g) - if err != nil { - return errors.WithStack(err) - } - - err = g.output(g.OutFile, buf.Bytes()) - if err != nil { - return errors.WithStack(err) - } - g.info("generate query file: " + g.OutFile) - - // generate query unit test file - if g.WithUnitTest { - buf.Reset() - - err = render(tmpl.Header, &buf, map[string]interface{}{ - "Package": g.queryPkgName, - "ImportPkgPaths": unitTestImportList.Add(g.importPkgPaths...).Paths(), - }) - if err != nil { - g.db.Logger.Error(context.Background(), "generate query unit test fail: %s", err) - return nil - } - err = render(tmpl.DIYMethodTestBasic, &buf, nil) - if err != nil { - return errors.WithStack(err) - } - err = render(tmpl.QueryMethodTest, &buf, g) - if err != nil { - g.db.Logger.Error(context.Background(), "generate query unit test fail: %s", err) - return nil - } - fileName := strings.TrimSuffix(g.OutFile, ".go") + "_test.go" - err = g.output(fileName, buf.Bytes()) - if err != nil { - g.db.Logger.Error(context.Background(), "generate query unit test fail: %s", err) - return nil - } - g.info("generate unit test file: " + fileName) - } - - return nil -} - -// generateSingleQueryFile generate query code and save to file -func (g *Generator) generateSingleQueryFile(data *genInfo) (err error) { - var buf bytes.Buffer - - structPkgPath := data.StructInfo.PkgPath - if structPkgPath == "" { - structPkgPath = g.modelPkgPath - } - - importPkgs := importList.Add(structPkgPath).Add(getImportPkgPaths(data)...).Paths() - err = render(tmpl.Header, &buf, map[string]interface{}{ - "Package": g.queryPkgName, - "ImportPkgPaths": importPkgs, - }) - if err != nil { - return errors.WithStack(err) - } - data.QueryStructMeta = data.QueryStructMeta.IfaceMode(g.judgeMode(WithQueryInterface)) - - structTmpl := tmpl.TableQueryStructWithContext - if g.judgeMode(WithoutContext) { - structTmpl = tmpl.TableQueryStruct - } - err = render(structTmpl, &buf, data.QueryStructMeta) - if err != nil { - return errors.WithStack(err) - } - - if g.judgeMode(WithQueryInterface) { - err = render(tmpl.TableQueryIface, &buf, data) - if err != nil { - return errors.WithStack(err) - } - } - - for _, method := range data.Interfaces { - err = render(tmpl.DIYMethod, &buf, method) - if err != nil { - return errors.WithStack(err) - } - } - - err = render(tmpl.CRUDMethod, &buf, data.QueryStructMeta) - if err != nil { - return errors.WithStack(err) - } - - defer g.info(fmt.Sprintf("generate query file: %s%s%s.gen.go", g.OutPath, string(os.PathSeparator), data.FileName)) - return g.output(fmt.Sprintf("%s%s%s.gen.go", g.OutPath, string(os.PathSeparator), data.FileName), buf.Bytes()) -} - -// generateQueryUnitTestFile generate unit test file for query -func (g *Generator) generateQueryUnitTestFile(data *genInfo) (err error) { - var buf bytes.Buffer - - structPkgPath := data.StructInfo.PkgPath - if structPkgPath == "" { - structPkgPath = g.modelPkgPath - } - err = render(tmpl.Header, &buf, map[string]interface{}{ - "Package": g.queryPkgName, - "ImportPkgPaths": unitTestImportList.Add(structPkgPath).Add(data.ImportPkgPaths...).Paths(), - }) - if err != nil { - return errors.WithStack(err) - } - - err = render(tmpl.CRUDMethodTest, &buf, data.QueryStructMeta) - if err != nil { - return errors.WithStack(err) - } - - for _, method := range data.Interfaces { - err = render(tmpl.DIYMethodTest, &buf, method) - if err != nil { - return errors.WithStack(err) - } - } - - defer g.info(fmt.Sprintf("generate unit test file: %s%s%s.gen_test.go", g.OutPath, string(os.PathSeparator), data.FileName)) - return g.output(fmt.Sprintf("%s%s%s.gen_test.go", g.OutPath, string(os.PathSeparator), data.FileName), buf.Bytes()) -} - -// generateModelFile generate model structures and save to file -func (g *Generator) generateModelFile() error { - if len(g.models) == 0 { - return nil - } - - modelOutPath, err := g.getModelOutputPath() - if err != nil { - return errors.WithStack(err) - } - - if err = os.MkdirAll(modelOutPath, os.ModePerm); err != nil { - return fmt.Errorf("create model pkg path(%s) fail: %s", modelOutPath, err) - } - - errChan := make(chan error) - pool := pools.NewPool(concurrent) - for _, data := range g.models { - if data == nil || !data.Generated { - continue - } - pool.Wait() - go func(data *generate.QueryStructMeta) { - defer pool.Done() - - var buf bytes.Buffer - funcMap := make(map[string]interface{}) - funcMap["convert"] = func(s string) string { - return s - } - funcMap["contains"] = strings.Contains - t, err := template.New(tmpl.Model).Funcs(funcMap).Parse(tmpl.Model) - if err != nil { - errChan <- err - return - } - err = t.Execute(&buf, struct { - *generate.QueryStructMeta - ConfigPackage string - }{ - QueryStructMeta: data, - ConfigPackage: g.ConfigPackage, - }) - if err != nil { - errChan <- err - return - } - - for _, method := range data.ModelMethods { - err = render(tmpl.ModelMethod, &buf, method) - if err != nil { - errChan <- err - return - } - } - - modelFile := modelOutPath + data.FileName + ".gen.go" - err = g.output(modelFile, buf.Bytes()) - if err != nil { - errChan <- err - return - } - - g.info(fmt.Sprintf("generate model file(table <%s> -> {%s.%s}): %s", data.TableName, data.StructInfo.Package, data.StructInfo.Type, modelFile)) - }(data) - } - select { - case err = <-errChan: - return errors.WithStack(err) - case <-pool.AsyncWaitAll(): - g.fillModelPkgPath(modelOutPath) - } - return nil -} - -func (g *Generator) getModelOutputPath() (outPath string, err error) { - if strings.Contains(g.ModelPkgPath, string(os.PathSeparator)) { - outPath, err = filepath.Abs(g.ModelPkgPath) - if err != nil { - return "", fmt.Errorf("cannot parse model pkg path: %w", err) - } - } else { - outPath = filepath.Join(filepath.Dir(g.OutPath), g.ModelPkgPath) - } - return outPath + string(os.PathSeparator), nil -} - -func (g *Generator) fillModelPkgPath(filePath string) { - pkgs, err := packages.Load(&packages.Config{ - Mode: packages.NeedName, - Dir: filePath, - }) - if err != nil { - g.db.Logger.Warn(context.Background(), "parse model pkg path fail: %s", err) - return - } - if len(pkgs) == 0 { - g.db.Logger.Warn(context.Background(), "parse model pkg path fail: got 0 packages") - return - } - g.Config.modelPkgPath = pkgs[0].PkgPath -} - -// output format and output -func (g *Generator) output(fileName string, content []byte) error { - return g.outputWithOpt(fileName, content, nil) -} - -// output format and output -func (g *Generator) outputWithOpt(fileName string, content []byte, opt *imports.Options) error { - result, err := imports.Process(fileName, content, opt) - if err != nil { - lines := strings.Split(string(content), "\n") - errLine, _ := strconv.Atoi(strings.Split(err.Error(), ":")[1]) - startLine, endLine := errLine-5, errLine+5 - fmt.Println("Format fail:", errLine, err) - if startLine < 0 { - startLine = 0 - } - if endLine > len(lines)-1 { - endLine = len(lines) - 1 - } - for i := startLine; i <= endLine; i++ { - fmt.Println(i, lines[i]) - } - return fmt.Errorf("cannot format file: %w", err) - } - return ioutil.WriteFile(fileName, result, 0640) -} - -func (g *Generator) pushQueryStructMeta(meta *generate.QueryStructMeta) (*genInfo, error) { - structName := meta.ModelStructName - if g.Data[structName] == nil { - g.Data[structName] = &genInfo{QueryStructMeta: meta} - } - if g.Data[structName].Source != meta.Source { - return nil, fmt.Errorf("cannot generate struct with the same name from different source:%s.%s and %s.%s", - meta.StructInfo.Package, meta.ModelStructName, g.Data[structName].StructInfo.Package, g.Data[structName].ModelStructName) - } - return g.Data[structName], nil -} - -func render(tmpl string, wr io.Writer, data interface{}) error { - t, err := template.New(tmpl).Parse(tmpl) - if err != nil { - return errors.WithStack(err) - } - return t.Execute(wr, data) -} - -func getImportPkgPaths(data *genInfo) []string { - importPathMap := make(map[string]struct{}) - for _, path := range data.ImportPkgPaths { - importPathMap[path] = struct{}{} - } - // imports.Process (called in Generator.output) will guess missing imports, and will be - // much faster if import path is already specified. So add all imports from DIY interface package. - for _, method := range data.Interfaces { - for _, param := range method.Params { - importPathMap[param.PkgPath] = struct{}{} - } - } - importPkgPaths := make([]string, 0, len(importPathMap)) - for importPath := range importPathMap { - importPkgPaths = append(importPkgPaths, importPath) - } - return importPkgPaths -} - -func (g *Generator) GetPkgPath(filePath string) string { - pkgs, err := packages.Load(&packages.Config{ - Mode: packages.NeedName, - Dir: filePath, - }) - if err != nil { - g.db.Logger.Warn(context.Background(), "parse pkg path fail: %s", err) - return "" - } - if len(pkgs) == 0 { - g.db.Logger.Warn(context.Background(), "parse pkg path fail: got 0 packages") - return "" - } - return pkgs[0].PkgPath -} - -func (g *Generator) generateSvcImplGrpc(grpcService v3.Service) error { - if len(g.models) == 0 { - return nil - } - svcImplFile := filepath.Join(g.RootDir, "svcimpl.go") - _, err := os.Stat(svcImplFile) - if err != nil { - return errors.WithStack(err) - } - var interfaceMeta astutils.InterfaceMeta - interfaceMeta.Name = strcase.ToCamel(strcase.ToCamel(filepath.Base(g.RootDir))) - sc := astutils.NewStructCollector(astutils.ExprString) - astutils.CollectStructsInFolder(g.RootDir, sc) - interfaceMeta.Methods = sc.Methods[interfaceMeta.Name+"Impl"] - g.info("New content will be append to svcimpl.go file") - models := g.filterNewModelsGrpc(interfaceMeta) - var buf bytes.Buffer - for _, model := range models { - if err = render(tmpl.AppendSvcImplGrpc, &buf, struct { - *generate.QueryStructMeta - InterfaceName string - }{ - QueryStructMeta: model, - InterfaceName: interfaceMeta.Name, - }); err != nil { - return errors.WithStack(err) - } - } - var original []byte - if original, err = ioutil.ReadFile(svcImplFile); err != nil { - return errors.WithStack(err) - } - original = append(original, buf.Bytes()...) - - transGrpcPkg := g.GetPkgPath(filepath.Join(g.RootDir, "transport", "grpc")) - - // fix import block - var importBuf bytes.Buffer - if err = render(tmpl.SvcImplImportGrpc, &importBuf, struct { - TransportGrpcPackage string - }{ - TransportGrpcPackage: transGrpcPkg, - }); err != nil { - return errors.WithStack(err) - } - original = astutils.AppendImportStatements(original, importBuf.Bytes()) - original = astutils.GrpcRelatedModify(original, interfaceMeta.Name, grpcService.Name) - if err = g.outputWithOpt(svcImplFile, original, &imports.Options{ - TabWidth: 8, - TabIndent: true, - Comments: true, - Fragment: true, - }); err != nil { - return errors.WithStack(err) - } - return nil -} diff --git a/toolkit/gormgen/generator_test.go b/toolkit/gormgen/generator_test.go deleted file mode 100644 index a86a94e4..00000000 --- a/toolkit/gormgen/generator_test.go +++ /dev/null @@ -1,312 +0,0 @@ -package gormgen - -import ( - "context" - "testing" - "time" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/callbacks" - "github.com/wubin1989/gorm/clause" - "github.com/wubin1989/gorm/schema" - "github.com/wubin1989/gorm/utils/tests" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" -) - -func TestConfig(t *testing.T) { - _ = &Config{ - db: nil, - - OutPath: "path", - OutFile: "", - - ModelPkgPath: "models", - - queryPkgName: "query", - } -} - -// test data -type mysqlDialectors struct{ tests.DummyDialector } - -func (mysqlDialectors) Name() string { - return "mysql" -} - -var db, _ = gorm.Open(mysqlDialectors{}, nil) - -func init() { - db = db.Debug() - - callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ - UpdateClauses: []string{"UPDATE", "SET", "WHERE", "ORDER BY", "LIMIT"}, - DeleteClauses: []string{"DELETE", "FROM", "WHERE", "ORDER BY", "LIMIT"}, - }) -} - -// User user data struct -type User struct { - ID uint `gorm:"primary_key"` - Name string - Age int - Score float64 - Address string - Famous bool - RegisterAt time.Time -} - -func (User) TableName() string { - return "users_info" -} - -// StudentRaw student data struct -type StudentRaw struct { - ID int64 `gorm:"primary_key"` - Name string - Age int - Instructor int64 //åŊžåļˆ -} - -func (StudentRaw) TableName() string { - return "student" -} - -// Teacher teacher data struct -type TeacherRaw struct { - ID int64 `gorm:"primary_key"` - Name string -} - -func (TeacherRaw) TableName() string { - return "teacher" -} - -type user struct { - userDo - - ALL field.Asterisk - ID field.Uint - Name field.String - Age field.Int - Score field.Float64 - Address field.String - Famous field.Bool - RegisterAt field.Time -} - -type userDo struct{ DO } - -func (u userDo) Debug() *userDo { - u.DO = *u.DO.Debug().(*DO) - return &u -} - -func (u userDo) WithContext(ctx context.Context) *userDo { - u.DO = *u.DO.WithContext(ctx).(*DO) - return &u -} - -func (u userDo) Clauses(conds ...clause.Expression) *userDo { - u.DO = *u.DO.Clauses(conds...).(*DO) - return &u -} - -func (u userDo) Not(conds ...Condition) *userDo { - u.DO = *u.DO.Not(conds...).(*DO) - return &u -} - -func (u userDo) Or(conds ...Condition) *userDo { - u.DO = *u.DO.Or(conds...).(*DO) - return &u -} - -func (u userDo) Select(conds ...field.Expr) *userDo { - u.DO = *u.DO.Select(conds...).(*DO) - return &u -} - -func (u userDo) Where(conds ...Condition) *userDo { - u.DO = *u.DO.Where(conds...).(*DO) - return &u -} - -func (u userDo) Order(conds ...field.Expr) *userDo { - u.DO = *u.DO.Order(conds...).(*DO) - return &u -} - -func (u userDo) Distinct(cols ...field.Expr) *userDo { - u.DO = *u.DO.Distinct(cols...).(*DO) - return &u -} - -func (u userDo) Omit(cols ...field.Expr) *userDo { - u.DO = *u.DO.Omit(cols...).(*DO) - return &u -} - -func (u userDo) Join(table schema.Tabler, on ...field.Expr) *userDo { - u.DO = *u.DO.Join(table, on...).(*DO) - return &u -} - -func (u userDo) LeftJoin(table schema.Tabler, on ...field.Expr) *userDo { - u.DO = *u.DO.LeftJoin(table, on...).(*DO) - return &u -} - -func (u userDo) RightJoin(table schema.Tabler, on ...field.Expr) *userDo { - u.DO = *u.DO.RightJoin(table, on...).(*DO) - return &u -} - -func (u userDo) Group(col field.Expr) *userDo { - u.DO = *u.DO.Group(col).(*DO) - return &u -} - -func (u userDo) Having(conds ...Condition) *userDo { - u.DO = *u.DO.Having(conds...).(*DO) - return &u -} - -func (u userDo) Limit(limit int) *userDo { - u.DO = *u.DO.Limit(limit).(*DO) - return &u -} - -func (u userDo) Offset(offset int) *userDo { - u.DO = *u.DO.Offset(offset).(*DO) - return &u -} - -func (u userDo) Scopes(funcs ...func(Dao) Dao) *userDo { - u.DO = *u.DO.Scopes(funcs...).(*DO) - return &u -} - -func (u userDo) Unscoped() *userDo { - u.DO = *u.DO.Unscoped().(*DO) - return &u -} - -func (u userDo) Create(values ...*user) error { - if len(values) == 0 { - return nil - } - return u.DO.Create(values) -} - -func (u userDo) CreateInBatches(values []*user, batchSize int) error { - return u.DO.CreateInBatches(values, batchSize) -} - -func (u userDo) Save(values ...*user) error { - if len(values) == 0 { - return nil - } - return u.DO.Save(values) -} - -func (u userDo) First() (*user, error) { - if result, err := u.DO.First(); err != nil { - return nil, err - } else { - return result.(*user), nil - } -} - -func (u userDo) Take() (*user, error) { - if result, err := u.DO.Take(); err != nil { - return nil, err - } else { - return result.(*user), nil - } -} - -func (u userDo) Last() (*user, error) { - if result, err := u.DO.Last(); err != nil { - return nil, err - } else { - return result.(*user), nil - } -} - -func (u userDo) Find() ([]*user, error) { - result, err := u.DO.Find() - return result.([]*user), err -} - -func (u userDo) FindInBatches(result []*user, batchSize int, fc func(tx Dao, batch int) error) error { - return u.DO.FindInBatches(&result, batchSize, fc) -} - -func (u userDo) FindByPage(offset int, limit int) (result []*user, count int64, err error) { - count, err = u.Count() - if err != nil { - return - } - - result, err = u.Offset(offset).Limit(limit).Find() - return -} - -var u = func() *user { - u := user{ - ALL: field.NewAsterisk(""), - ID: field.NewUint("", "id"), - Name: field.NewString("", "name"), - Age: field.NewInt("", "age"), - Score: field.NewFloat64("", "score"), - Address: field.NewString("", "address"), - Famous: field.NewBool("", "famous"), - RegisterAt: field.NewTime("", "register_at"), - } - u.UseDB(db.Session(&gorm.Session{Context: context.Background(), DryRun: true})) - u.UseModel(User{}) - return &u -}() - -type Student struct { - DO - - ALL field.Asterisk - ID field.Int64 - Name field.String - Age field.Int - Instructor field.Int64 -} - -var student = func() *Student { - s := Student{ - ALL: field.NewAsterisk("student"), - ID: field.NewInt64("student", "id"), - Name: field.NewString("student", "name"), - Age: field.NewInt("student", "age"), - Instructor: field.NewInt64("student", "instructor"), - } - s.UseDB(db.Session(&gorm.Session{Context: context.Background(), DryRun: true})) - s.UseModel(StudentRaw{}) - return &s -}() - -type Teacher struct { - DO - - ALL field.Asterisk - ID field.Int64 - Name field.String -} - -var teacher = func() Teacher { - t := Teacher{ - ALL: field.NewAsterisk("teacher"), - ID: field.NewInt64("teacher", "id"), - Name: field.NewString("teacher", "name"), - } - t.UseDB(db.Session(&gorm.Session{Context: context.Background(), DryRun: true})) - t.UseModel(TeacherRaw{}) - return t -}() diff --git a/toolkit/gormgen/helper/clause.go b/toolkit/gormgen/helper/clause.go deleted file mode 100644 index 2a603158..00000000 --- a/toolkit/gormgen/helper/clause.go +++ /dev/null @@ -1,177 +0,0 @@ -package helper - -import ( - "strings" - - "github.com/wubin1989/gorm/clause" -) - -// Cond ... -type Cond struct { - Cond bool - Result string -} - -// IfClause if clause -func IfClause(conds []Cond) string { - judge := func(c Cond) string { - if c.Cond { - return c.Result - } - return "" - } - - clauses := make([]string, len(conds)) - for i, cond := range conds { - clauses[i] = strings.Trim(judge(cond), " ") - } - return " " + strings.Join(clauses, " ") -} - -// WhereClause where clause -func WhereClause(conds []string) string { - return joinClause(conds, "WHERE", whereValue, " ") -} - -// SetClause set clause -func SetClause(conds []string) string { - return joinClause(conds, "SET", setValue, ",") -} - -func joinClause(conds []string, keyword string, deal func(string) string, sep string) string { - clauses := make([]string, len(conds)) - for i, clause := range conds { - clauses[i] = deal(clause) - } - - sql := trimAll(strings.Join(clauses, sep)) - if sql != "" { - sql = " " + keyword + " " + sql - } - return sql -} - -func trimAll(input string) string { - return trimRight(trimLeft(input)) -} - -func trimLeft(input string) string { - input = strings.TrimSpace(input) - lowercase := strings.ToLower(input) - switch { - case strings.HasPrefix(lowercase, "and "): - return input[4:] - case strings.HasPrefix(lowercase, "or "): - return input[3:] - case strings.HasPrefix(lowercase, "xor "): - return input[4:] - case strings.HasPrefix(lowercase, ","): - return input[1:] - default: - return input - } -} -func trimRight(input string) string { - input = strings.TrimSpace(input) - lowercase := strings.ToLower(input) - switch { - case strings.HasSuffix(lowercase, " and"): - return input[:len(input)-3] - case strings.HasSuffix(lowercase, " or"): - return input[:len(input)-2] - case strings.HasSuffix(lowercase, " xor"): - return input[:len(input)-3] - case strings.HasSuffix(lowercase, ","): - return input[:len(input)-1] - default: - return input - } -} - -// whereValue append a new condition with prefix "AND" -func whereValue(value string) string { - value = strings.Trim(value, " ") - lowercase := strings.ToLower(value) - switch { - case lowercase == "": - return "" - case strings.HasPrefix(lowercase, "and "): - return value - case strings.HasPrefix(lowercase, "or "): - return value - case strings.HasPrefix(lowercase, "xor "): - return value - default: - return "AND " + value - } -} - -func setValue(value string) string { - return strings.Trim(value, ", ") -} - -// JoinWhereBuilder join where builder -func JoinWhereBuilder(src *strings.Builder, whereValue strings.Builder) { - value := trimAll(whereValue.String()) - if value != "" { - src.WriteString("WHERE ") - src.WriteString(value) - src.WriteString(" ") - } -} - -// JoinSetBuilder join set builder -func JoinSetBuilder(src *strings.Builder, setValue strings.Builder) { - value := trimAll(setValue.String()) - if value != "" { - src.WriteString("SET ") - src.WriteString(value) - src.WriteString(" ") - } -} - -// JoinTrimAllBuilder join trim builder will trim and,or,xor, `,` -func JoinTrimAllBuilder(src *strings.Builder, setValue strings.Builder) { - src.WriteString(trimAll(setValue.String())) - src.WriteString(" ") -} - -// JoinTblExpr join clause with table expression(sub query...) -type JoinTblExpr struct { - clause.Join - TableExpr clause.Expression -} - -// NewJoinTblExpr create new join table expr -func NewJoinTblExpr(join clause.Join, tbExpr clause.Expression) JoinTblExpr { - return JoinTblExpr{Join: join, TableExpr: tbExpr} -} - -// Build ... -func (join JoinTblExpr) Build(builder clause.Builder) { - if builder == nil { - return - } - if join.Type != "" { - _, _ = builder.WriteString(string(join.Type)) - _ = builder.WriteByte(' ') - } - _, _ = builder.WriteString("JOIN ") - if join.TableExpr != nil { - join.TableExpr.Build(builder) - } - - if len(join.ON.Exprs) > 0 { - _, _ = builder.WriteString(" ON ") - join.ON.Build(builder) - } else if len(join.Using) > 0 { - _, _ = builder.WriteString(" USING (") - for idx, c := range join.Using { - if idx > 0 { - _ = builder.WriteByte(',') - } - builder.WriteQuoted(c) - } - _ = builder.WriteByte(')') - } -} diff --git a/toolkit/gormgen/helper/object.go b/toolkit/gormgen/helper/object.go deleted file mode 100644 index dbe0d703..00000000 --- a/toolkit/gormgen/helper/object.go +++ /dev/null @@ -1,60 +0,0 @@ -package helper - -import ( - "errors" - "fmt" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" -) - -// Object an object interface -type Object interface { - // TableName return table name - TableName() string - // StructName return struct name - StructName() string - // FileName return field name - FileName() string - // ImportPkgPaths return need import package path - ImportPkgPaths() []string - - // Fields return field array - Fields() []Field -} - -// Field a field interface -type Field interface { - // Name return field name - Name() string - // Type return field type - Type() string - - // ColumnName return column name - ColumnName() string - // GORMTag return gorm tag - GORMTag() string - // JSONTag return json tag - JSONTag() string - // Tag return field tag - Tag() field.Tag - - // Comment return comment - Comment() string -} - -// CheckObject check ojbect -func CheckObject(obj Object) error { - if obj.StructName() == "" { - return errors.New("Object's StructName() cannot be empty") - } - - for _, field := range obj.Fields() { - switch "" { - case field.Name(): - return fmt.Errorf("Object %s's Field.Name() cannot be empty", obj.StructName()) - case field.Type(): - return fmt.Errorf("Object %s's Field.Type() cannot be empty", obj.StructName()) - } - } - return nil -} diff --git a/toolkit/gormgen/import.go b/toolkit/gormgen/import.go deleted file mode 100644 index cf6ac7a4..00000000 --- a/toolkit/gormgen/import.go +++ /dev/null @@ -1,67 +0,0 @@ -package gormgen - -import "strings" - -var ( - importList = new(importPkgS).Add( - "context", - "database/sql", - "strings", - "", - "github.com/wubin1989/gorm", - "github.com/wubin1989/gorm/schema", - "github.com/wubin1989/gorm/clause", - "", - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen", - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field", - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/helper", - "", - "github.com/wubin1989/dbresolver", - ) - unitTestImportList = new(importPkgS).Add( - "context", - "fmt", - "strconv", - "testing", - "", - "github.com/wubin1989/sqlite", - "github.com/wubin1989/gorm", - ) -) - -type importPkgS struct { - paths []string -} - -func (ip importPkgS) Add(paths ...string) *importPkgS { - purePaths := make([]string, 0, len(paths)+1) - for _, p := range paths { - p = strings.TrimSpace(p) - if p == "" { - purePaths = append(purePaths, p) - continue - } - - if p[len(p)-1] != '"' { - p = `"` + p + `"` - } - - var exists bool - for _, existsP := range ip.paths { - if p == existsP { - exists = true - break - } - } - if !exists { - purePaths = append(purePaths, p) - } - } - purePaths = append(purePaths, "") - - ip.paths = append(ip.paths, purePaths...) - - return &ip -} - -func (ip importPkgS) Paths() []string { return ip.paths } diff --git a/toolkit/gormgen/interface.go b/toolkit/gormgen/interface.go deleted file mode 100644 index 9dff6d1b..00000000 --- a/toolkit/gormgen/interface.go +++ /dev/null @@ -1,90 +0,0 @@ -package gormgen - -import ( - "database/sql" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/clause" - "github.com/wubin1989/gorm/schema" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" -) - -type ( - // Condition query condition - // field.Expr and subquery are expect value - Condition interface { - BeCond() interface{} - CondError() error - } -) - -var ( - _ Condition = (field.Expr)(nil) - _ Condition = (field.Value)(nil) - _ Condition = (SubQuery)(nil) - _ Condition = (Dao)(nil) -) - -// SubQuery sub query interface -type SubQuery interface { - underlyingDB() *gorm.DB - underlyingDO() *DO - - Condition -} - -// Dao CRUD methods -type Dao interface { - SubQuery - schema.Tabler - As(alias string) Dao - - Not(conds ...Condition) Dao - Or(conds ...Condition) Dao - - Select(columns ...field.Expr) Dao - Where(conds ...Condition) Dao - Order(columns ...field.Expr) Dao - Distinct(columns ...field.Expr) Dao - Omit(columns ...field.Expr) Dao - Join(table schema.Tabler, conds ...field.Expr) Dao - LeftJoin(table schema.Tabler, conds ...field.Expr) Dao - RightJoin(table schema.Tabler, conds ...field.Expr) Dao - Group(columns ...field.Expr) Dao - Having(conds ...Condition) Dao - Limit(limit int) Dao - Offset(offset int) Dao - Scopes(funcs ...func(Dao) Dao) Dao - Unscoped() Dao - Attrs(attrs ...field.AssignExpr) Dao - Assign(attrs ...field.AssignExpr) Dao - Joins(field field.RelationField) Dao - Preload(field field.RelationField) Dao - Clauses(conds ...clause.Expression) Dao - - Create(value interface{}) error - CreateInBatches(value interface{}, batchSize int) error - Save(value interface{}) error - First() (result interface{}, err error) - Take() (result interface{}, err error) - Last() (result interface{}, err error) - Find() (results interface{}, err error) - FindInBatches(dest interface{}, batchSize int, fc func(tx Dao, batch int) error) error - FirstOrInit() (result interface{}, err error) - FirstOrCreate() (result interface{}, err error) - Update(column field.Expr, value interface{}) (info ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info ResultInfo, err error) - Updates(values interface{}) (info ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info ResultInfo, err error) - UpdateColumns(values interface{}) (info ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info ResultInfo, err error) - Delete(...interface{}) (info ResultInfo, err error) - Count() (int64, error) - Row() *sql.Row - Rows() (*sql.Rows, error) - Scan(dest interface{}) error - Fetch(dest interface{}) error - Pluck(column field.Expr, dest interface{}) error - ScanRows(rows *sql.Rows, dest interface{}) error -} diff --git a/toolkit/gormgen/internal/generate/clause.go b/toolkit/gormgen/internal/generate/clause.go deleted file mode 100644 index fae615c4..00000000 --- a/toolkit/gormgen/internal/generate/clause.go +++ /dev/null @@ -1,179 +0,0 @@ -package generate - -import ( - "fmt" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" -) - -// Clause a symbol of clause, it can be sql condition clause, if clause, where clause, set clause and else clause -type Clause interface { - String() string - Create() string -} - -var ( - _ Clause = new(SQLClause) - _ Clause = new(IfClause) - _ Clause = new(ElseClause) - _ Clause = new(WhereClause) - _ Clause = new(SetClause) -) - -type clause struct { - VarName string - Type model.Status -} - -// SQLClause sql condition clause -type SQLClause struct { - clause - Value []string -} - -func (s SQLClause) String() string { - sqlString := strings.Join(s.Value, "+") - // trim left space - if strings.HasPrefix(sqlString, "\"") { - sqlString = `"` + strings.TrimLeft(sqlString, `" `) - } - // make sure right has only one space - if !strings.HasSuffix(sqlString, ` "`) { - sqlString += `+" "` - } - // Remove redundant connection symbols - return strings.ReplaceAll(sqlString, `"+"`, "") -} - -// Create create clause -func (s SQLClause) Create() string { - return fmt.Sprintf("%s.WriteString(%s)", s.VarName, s.String()) -} - -// Finish finish clause -func (s SQLClause) Finish() string { - return fmt.Sprintf("%s.WriteString(%s)", s.VarName, s.String()) -} - -// IfClause if clause -type IfClause struct { - clause - Value []Clause - slice section -} - -func (i IfClause) String() string { - return i.slice.Value -} - -// Create create clause -func (i IfClause) Create() string { - return fmt.Sprintf("%s {", i.String()) -} - -// Finish finish clause -func (i IfClause) Finish() string { - return "}" -} - -// ElseClause else clause -type ElseClause struct { - IfClause -} - -func (e ElseClause) String() (res string) { - return e.slice.Value -} - -// Create create clause -func (e ElseClause) Create() string { - return fmt.Sprintf("} %s {", e.String()) -} - -// Finish finish clause -func (e ElseClause) Finish() string { - return "" -} - -// WhereClause where clause -type WhereClause struct { - clause - Value []Clause -} - -func (w WhereClause) String() string { - return fmt.Sprintf("helper.WhereTrim(%s.String())", w.VarName) -} - -// Create create clause -func (w WhereClause) Create() string { - return fmt.Sprintf("var %s strings.Builder", w.VarName) -} - -// Finish finish clause -func (w WhereClause) Finish(name string) string { - return fmt.Sprintf("helper.JoinWhereBuilder(&%s,%s)", name, w.VarName) -} - -// SetClause set clause -type SetClause struct { - clause - Value []Clause -} - -func (s SetClause) String() string { - return fmt.Sprintf("helper.SetTrim(%s.String())", s.VarName) -} - -// Create create clause -func (s SetClause) Create() string { - return fmt.Sprintf("var %s strings.Builder", s.VarName) -} - -// Finish finish clause -func (s SetClause) Finish(name string) string { - return fmt.Sprintf("helper.JoinSetBuilder(&%s,%s)", name, s.VarName) -} - -// TrimClause set clause -type TrimClause struct { - clause - Value []Clause -} - -func (s TrimClause) String() string { - return fmt.Sprintf("helper.TrimALL(%s.String())", s.VarName) -} - -// Create create trim clause -func (s TrimClause) Create() string { - return fmt.Sprintf("var %s strings.Builder", s.VarName) -} - -// Finish finish trim clause -func (s TrimClause) Finish(name string) string { - return fmt.Sprintf("helper.JoinTrimAllBuilder(&%s,%s)", name, s.VarName) -} - -// ForClause set clause -type ForClause struct { - clause - Value []Clause - ForRange ForRange - forSlice section -} - -func (f ForClause) String() string { - return f.forSlice.Value + "{" -} - -// Create create clause -func (f ForClause) Create() string { - return f.String() -} - -// Finish finish clause -func (f ForClause) Finish() string { - return "}" -} diff --git a/toolkit/gormgen/internal/generate/clause_test.go b/toolkit/gormgen/internal/generate/clause_test.go deleted file mode 100644 index 2addeb65..00000000 --- a/toolkit/gormgen/internal/generate/clause_test.go +++ /dev/null @@ -1,182 +0,0 @@ -package generate - -import ( - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/parser" -) - -func checkBuildExpr(t *testing.T, SQL string, splitResult, generateResult []string, i *InterfaceMethod) { - i.SQLString = SQL - err := i.sqlStateCheckAndSplit() - if err != nil { - t.Errorf("err:%s\n", err) - } - - if len(i.Section.members) != len(splitResult) { - t.Errorf("SQL length exp:%v got:%v", len(generateResult), len(i.Section.members)) - } - for index := range splitResult { - if splitResult[index] != i.Section.members[index].Value { - t.Errorf("SQL expects \nexp:%v \ngot:%v", splitResult[index], i.Section.members[index].Value) - } - } - _, err = i.Section.BuildSQL() - if err != nil { - t.Errorf("err:%s", err) - } - - if len(i.Section.Tmpls) != len(generateResult) { - t.Errorf("SQL length exp:%v got:%v", len(i.Section.Tmpls), len(generateResult)) - } - for index := range generateResult { - if generateResult[index] != i.Section.Tmpls[index] { - t.Errorf("SQL expects \nexp:%v \ngot:%v", generateResult[index], i.Section.Tmpls[index]) - } - } - -} -func TestClause(t *testing.T) { - - testcases := []struct { - SQL string - SplitResult []string - GenerateResult []string - }{ - { - SQL: "select * from @@table", - SplitResult: []string{ - "\"select * from \"", - "\"users\"", - }, - GenerateResult: []string{ - "generateSQL.WriteString(\"select * from users \")", - }, - }, - { - SQL: "select * from @@table {{where}} id>@id{{end}}", - SplitResult: []string{ - "\"select * from \"", - "\"users\"", - "where", - "\" id>\"", - "id", - "end", - }, - GenerateResult: []string{ - "generateSQL.WriteString(\"select * from users \")", - "var whereSQL0 strings.Builder", - "params = append(params,id)", - "whereSQL0.WriteString(\"id>? \")", - "helper.JoinWhereBuilder(&generateSQL,whereSQL0)", - }, - }, - { - SQL: "select * from @@table {{where}}{{if id > 0}} id>@id{{end}}{{end}}", - SplitResult: []string{ - "\"select * from \"", - "\"users\"", - "where", - "if id > 0", - "\" id>\"", - "id", - "end", - "end", - }, - GenerateResult: []string{ - "generateSQL.WriteString(\"select * from users \")", - "var whereSQL0 strings.Builder", - "if id > 0 {", - "params = append(params,id)", - "whereSQL0.WriteString(\"id>? \")", - "}", - "helper.JoinWhereBuilder(&generateSQL,whereSQL0)", - }, - }, - { - SQL: "update @@table {{set}}{{if name != \"\"}}name=@name{{end}},{{if id>0}}id=@id{{end}}{{end}} where id=@id", - SplitResult: []string{ - "\"update \"", - "\"users\"", - "set", - "if name != \"\"", - "\"name=\"", - "name", - "end", - "\",\"", - "if id>0", - "\"id=\"", - "id", - "end", - "end", - "\" where id=\"", - "id", - }, - GenerateResult: []string{ - "generateSQL.WriteString(\"update users \")", - "var setSQL0 strings.Builder", - "if name != \"\" {", - "params = append(params,name)", - "setSQL0.WriteString(\"name=? \")", - "}", - "setSQL0.WriteString(\", \")", - "if id>0 {", - "params = append(params,id)", - "setSQL0.WriteString(\"id=? \")", - "}", - "helper.JoinSetBuilder(&generateSQL,setSQL0)", - "params = append(params,id)", - "generateSQL.WriteString(\"where id=? \")", - }, - }, - { - SQL: "select * from @@table {{where}} {{for _, name := range names}}name=@name{{end}}{{end}}", - SplitResult: []string{ - "\"select * from \"", - "\"users\"", - "where", - "for _, name := range names", - "\"name=\"", - "name", - "end", - "end", - }, - GenerateResult: []string{ - "generateSQL.WriteString(\"select * from users \")", - "var whereSQL0 strings.Builder", - "for _, name := range names{", - "params = append(params,name)", - "whereSQL0.WriteString(\"name=? \")", - "}", - "helper.JoinWhereBuilder(&generateSQL,whereSQL0)", - }, - }, - } - inface := m() - for _, testcase := range testcases { - checkBuildExpr(t, testcase.SQL, testcase.SplitResult, testcase.GenerateResult, inface) - } -} - -var m = func() *InterfaceMethod { - var m = new(InterfaceMethod) - m.Table = "users" - m.Params = []parser.Param{ - { - Type: "int", - Name: "id", - }, - { - Type: "string", - Name: "name", - }, - { - Type: "string", - Name: "names", - IsArray: true, - }, - } - - return m - -} diff --git a/toolkit/gormgen/internal/generate/export.go b/toolkit/gormgen/internal/generate/export.go deleted file mode 100644 index c9aefea3..00000000 --- a/toolkit/gormgen/internal/generate/export.go +++ /dev/null @@ -1,249 +0,0 @@ -package generate - -import ( - "context" - "fmt" - "github.com/golang/protobuf/protoc-gen-go/generator" - "reflect" - "strings" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/schema" - "github.com/wubin1989/gorm/utils/tests" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/helper" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/parser" -) - -// GetQueryStructMeta generate db model by table name -func GetQueryStructMeta(db *gorm.DB, conf *model.Config) (*QueryStructMeta, error) { - if _, ok := db.Config.Dialector.(tests.DummyDialector); ok { - return nil, fmt.Errorf("UseDB() is necessary to generate model struct [%s] from database table [%s]", conf.ModelName, conf.TableName) - } - - conf = conf.Preprocess() - tableName, structName, fileName := conf.GetNames() - if tableName == "" { - return nil, nil - } - if err := checkStructName(structName); err != nil { - return nil, fmt.Errorf("model name %q is invalid: %w", structName, err) - } - - columns, err := getTableColumns(db, conf.GetSchemaName(db), tableName, conf.FieldWithIndexTag) - if err != nil { - return nil, err - } - - fields := getFields(db, conf, columns) - priKeyType := "string" - pbPrimaryProp := "Id" - for _, field := range fields { - if field.PriKey { - priKeyType = field.Type - pbPrimaryProp = generator.CamelCase(field.ColumnName) - break - } - } - - return (&QueryStructMeta{ - db: db, - Source: model.Table, - Generated: true, - FileName: fileName, - TableName: tableName, - ModelStructName: structName, - QueryStructName: uncaptialize(structName), - S: strings.ToLower(structName[0:1]), - StructInfo: parser.Param{Type: structName, Package: conf.ModelPkg}, - ImportPkgPaths: conf.ImportPkgPaths, - Fields: fields, - PriKeyType: priKeyType, - PbPrimaryProp: pbPrimaryProp, - }).addMethodFromAddMethodOpt(conf.GetModelMethods()...), nil -} - -// GetQueryStructMetaFromObject generate base struct from object -func GetQueryStructMetaFromObject(obj helper.Object, conf *model.Config) (*QueryStructMeta, error) { - err := helper.CheckObject(obj) - if err != nil { - return nil, err - } - - conf = conf.Preprocess() - - tableName := obj.TableName() - if conf.TableNameNS != nil { - tableName = conf.TableNameNS(tableName) - } - - structName := obj.StructName() - if conf.ModelNameNS != nil { - structName = conf.ModelNameNS(structName) - } - - fileName := obj.FileName() - if fileName == "" { - fileName = tableName - } - if fileName == "" { - fileName = structName - } - if conf.FileNameNS != nil { - fileName = conf.FileNameNS(fileName) - } else { - fileName = schema.NamingStrategy{SingularTable: true}.TableName(fileName) - } - - fields := make([]*model.Field, 0, 16) - for _, fl := range obj.Fields() { - tag := fl.Tag() - if tag == nil { - tag = field.Tag{} - } - if gt := fl.GORMTag(); gt != "" { - tag.Set(field.TagKeyGorm, gt) - } - if jt := fl.JSONTag(); jt != "" { - tag.Set(field.TagKeyJson, jt) - } - - fields = append(fields, &model.Field{ - Name: fl.Name(), - Type: fl.Type(), - ColumnName: fl.ColumnName(), - Tag: tag, - ColumnComment: fl.Comment(), - MultilineComment: strings.Contains(fl.Comment(), "\n"), - }) - } - - return &QueryStructMeta{ - Source: model.Object, - Generated: true, - FileName: fileName, - TableName: tableName, - ModelStructName: structName, - QueryStructName: uncaptialize(structName), - S: strings.ToLower(structName[0:1]), - StructInfo: parser.Param{Type: structName, Package: conf.ModelPkg}, - ImportPkgPaths: append(conf.ImportPkgPaths, obj.ImportPkgPaths()...), - Fields: fields, - }, nil -} - -// ConvertStructs convert to base structures -func ConvertStructs(db *gorm.DB, structs ...interface{}) (metas []*QueryStructMeta, err error) { - for _, st := range structs { - if isNil(st) { - continue - } - if base, ok := st.(*QueryStructMeta); ok { - metas = append(metas, base) - continue - } - if !isStructType(reflect.ValueOf(st)) { - return nil, fmt.Errorf("%s is not a struct", reflect.TypeOf(st).String()) - } - - structType := reflect.TypeOf(st) - name := getStructName(structType.String()) - newStructName := name - if st, ok := st.(interface{ GenInternalDoName() string }); ok { - newStructName = st.GenInternalDoName() - } - - meta := &QueryStructMeta{ - S: getPureName(name), - ModelStructName: name, - QueryStructName: uncaptialize(newStructName), - StructInfo: parser.Param{PkgPath: structType.PkgPath(), Type: name, Package: getPackageName(structType.String())}, - Source: model.Struct, - db: db, - } - if err := meta.parseStruct(st); err != nil { - return nil, fmt.Errorf("transform struct [%s.%s] error:%s", meta.StructInfo.Package, name, err) - } - if err := meta.check(); err != nil { - db.Logger.Warn(context.Background(), err.Error()) - continue - } - - metas = append(metas, meta) - } - return -} - -func isNil(i interface{}) bool { - if i == nil { - return true - } - - // if v is not ptr, return false(i is not nil) - // if v is ptr, return v.IsNil() - v := reflect.ValueOf(i) - return v.Kind() == reflect.Ptr && v.IsNil() -} - -// BuildDIYMethod check the legitimacy of interfaces -func BuildDIYMethod(f *parser.InterfaceSet, s *QueryStructMeta, data []*InterfaceMethod) (checkResults []*InterfaceMethod, err error) { - for _, interfaceInfo := range f.Interfaces { - if interfaceInfo.MatchStruct(s.ModelStructName) { - for _, method := range interfaceInfo.Methods { - t := &InterfaceMethod{ - S: s.S, - TargetStruct: s.QueryStructName, - OriginStruct: s.StructInfo, - MethodName: method.MethodName, - Params: method.Params, - Doc: method.Doc, - Table: s.TableName, - InterfaceName: interfaceInfo.Name, - Package: getPackageName(interfaceInfo.Package), - } - if err = t.checkMethod(data, s); err != nil { - return nil, err - } - if err = t.checkParams(method.Params); err != nil { - return - } - if err = t.checkResult(method.Result); err != nil { - return - } - if err = t.checkSQL(); err != nil { - return - } - _, err = t.Section.BuildSQL() - if err != nil { - err = fmt.Errorf("sql [%s] build err:%w", t.SQLString, err) - return - } - checkResults = append(checkResults, t) - } - } - } - return -} - -// ParseStructRelationShip parse struct's relationship -// No one should use it directly in project -func ParseStructRelationShip(relationship *schema.Relationships) []field.Relation { - cache := make(map[string]bool) - return append(append(append(append( - make([]field.Relation, 0, 4), - pullRelationShip(cache, relationship.HasOne)...), - pullRelationShip(cache, relationship.HasMany)...), - pullRelationShip(cache, relationship.BelongsTo)...), - pullRelationShip(cache, relationship.Many2Many)..., - ) -} - -// GetStructNames get struct names from base structs -func GetStructNames(bases []*QueryStructMeta) (names []string) { - for _, base := range bases { - names = append(names, base.ModelStructName) - } - return names -} diff --git a/toolkit/gormgen/internal/generate/generate.go b/toolkit/gormgen/internal/generate/generate.go deleted file mode 100644 index 22f03d2f..00000000 --- a/toolkit/gormgen/internal/generate/generate.go +++ /dev/null @@ -1,91 +0,0 @@ -package generate - -import ( - "fmt" - "regexp" - "strings" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/schema" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" -) - -/* -** The feature of mapping table from database server to Golang struct -** Provided by @qqxhb - */ - -func getFields(db *gorm.DB, conf *model.Config, columns []*model.Column) (fields []*model.Field) { - for _, col := range columns { - col.SetDataTypeMap(conf.DataTypeMap) - col.WithNS(conf.FieldJSONTagNS) - - m := col.ToField(conf.FieldNullable, conf.FieldCoverable, conf.FieldSignable) - - if filterField(m, conf.FilterOpts) == nil { - continue - } - if _, ok := col.ColumnType.ColumnType(); ok && !conf.FieldWithTypeTag { // remove type tag if FieldWithTypeTag == false - m.GORMTag.Remove("type") - } - - m = modifyField(m, conf.ModifyOpts) - if ns, ok := db.NamingStrategy.(schema.NamingStrategy); ok { - ns.SingularTable = true - m.Name = ns.SchemaName(ns.TablePrefix + m.Name) - } else if db.NamingStrategy != nil { - m.Name = db.NamingStrategy.SchemaName(m.Name) - } - - fields = append(fields, m) - } - for _, create := range conf.CreateOpts { - m := create.Operator()(nil) - if m.Relation != nil { - if m.Relation.Model() != nil { - stmt := gorm.Statement{DB: db} - _ = stmt.Parse(m.Relation.Model()) - if stmt.Schema != nil { - m.Relation.AppendChildRelation(ParseStructRelationShip(&stmt.Schema.Relationships)...) - } - } - m.Type = strings.ReplaceAll(m.Type, conf.ModelPkg+".", "") // remove modelPkg in field's Type, avoid import error - } - - fields = append(fields, m) - } - return fields -} - -func filterField(m *model.Field, opts []model.FieldOption) *model.Field { - for _, opt := range opts { - if opt.Operator()(m) == nil { - return nil - } - } - return m -} - -func modifyField(m *model.Field, opts []model.FieldOption) *model.Field { - for _, opt := range opts { - m = opt.Operator()(m) - } - return m -} - -// get mysql db' name -var modelNameReg = regexp.MustCompile(`^\w+$`) - -func checkStructName(name string) error { - if name == "" { - return nil - } - if !modelNameReg.MatchString(name) { - return fmt.Errorf("model name cannot contains invalid character") - } - if name[0] < 'A' || name[0] > 'Z' { - return fmt.Errorf("model name must be initial capital") - } - return nil -} diff --git a/toolkit/gormgen/internal/generate/interface.go b/toolkit/gormgen/internal/generate/interface.go deleted file mode 100644 index af22b5cc..00000000 --- a/toolkit/gormgen/internal/generate/interface.go +++ /dev/null @@ -1,494 +0,0 @@ -package generate - -import ( - "fmt" - "strconv" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/parser" -) - -// InterfaceMethod interface's method -type InterfaceMethod struct { // feature will replace InterfaceMethod to parser.Method - Doc string // comment - S string // First letter of - OriginStruct parser.Param // origin struct name - TargetStruct string // generated query struct bane - MethodName string // generated function name - Params []parser.Param // function input params - Result []parser.Param // function output params - ResultData parser.Param // output data - Section *Section // Parse split SQL into sections - SQLParams []parser.Param // variable in sql need function input - SQLString string // SQL - GormOption string // gorm execute method Find or Exec or Take - Table string // specified by user. if empty, generate it with gorm - InterfaceName string // origin interface name - Package string // interface package name - HasForParams bool // -} - -// FuncSign function signature -func (m *InterfaceMethod) FuncSign() string { - return fmt.Sprintf("%s(%s) (%s)", m.MethodName, m.GetParamInTmpl(), m.GetResultParamInTmpl()) -} - -// HasSQLData has variable or for params will creat params map -func (m *InterfaceMethod) HasSQLData() bool { - return len(m.SQLParams) > 0 || m.HasForParams -} - -// HasGotPoint parameter has pointer or not -func (m *InterfaceMethod) HasGotPoint() bool { - return !m.HasNeedNewResult() -} - -// HasNeedNewResult need pointer or not -func (m *InterfaceMethod) HasNeedNewResult() bool { - return !m.ResultData.IsArray && ((m.ResultData.IsNull() && m.ResultData.IsTime()) || m.ResultData.IsMap()) -} - -// GormRunMethodName return single data use Take() return array use Find -func (m *InterfaceMethod) GormRunMethodName() string { - if m.ResultData.IsArray { - return "Find" - } - return "Take" -} - -// ReturnSQLResult return sql result -func (m *InterfaceMethod) ReturnSQLResult() bool { - for _, res := range m.Result { - if res.IsSQLResult() { - return true - } - } - return false -} - -// ReturnSQLRow return sql result -func (m *InterfaceMethod) ReturnSQLRow() bool { - for _, res := range m.Result { - if res.IsSQLRow() { - return true - } - } - return false -} - -// ReturnSQLRows return sql result -func (m *InterfaceMethod) ReturnSQLRows() bool { - for _, res := range m.Result { - if res.IsSQLRows() { - return true - } - } - return false -} - -// ReturnNothing not return error and rowAffected -func (m *InterfaceMethod) ReturnNothing() bool { - for _, res := range m.Result { - if res.IsError() || res.Name == "rowsAffected" { - return false - } - } - return true -} - -// ReturnRowsAffected return rows affected -func (m *InterfaceMethod) ReturnRowsAffected() bool { - for _, res := range m.Result { - if res.Name == "rowsAffected" { - return true - } - } - return false -} - -// ReturnError return error -func (m *InterfaceMethod) ReturnError() bool { - for _, res := range m.Result { - if res.IsError() { - return true - } - } - return false -} - -// IsRepeatFromDifferentInterface check different interface has same mame method -func (m *InterfaceMethod) IsRepeatFromDifferentInterface(newMethod *InterfaceMethod) bool { - return m.MethodName == newMethod.MethodName && m.InterfaceName != newMethod.InterfaceName && m.TargetStruct == newMethod.TargetStruct -} - -// IsRepeatFromSameInterface check different interface has same mame method -func (m *InterfaceMethod) IsRepeatFromSameInterface(newMethod *InterfaceMethod) bool { - return m.MethodName == newMethod.MethodName && m.InterfaceName == newMethod.InterfaceName && m.TargetStruct == newMethod.TargetStruct -} - -// GetParamInTmpl return param list -func (m *InterfaceMethod) GetParamInTmpl() string { - return paramToString(m.Params) -} - -// GetResultParamInTmpl return result list -func (m *InterfaceMethod) GetResultParamInTmpl() string { - return paramToString(m.Result) -} - -// SQLParamName sql param map key, -func (m *InterfaceMethod) SQLParamName(param string) string { - return strings.Replace(param, ".", "", -1) -} - -// paramToString param list to string used in tmpl -func paramToString(params []parser.Param) string { - var res []string - for _, param := range params { - res = append(res, param.TmplString()) - } - return strings.Join(res, ",") -} - -// DocComment return comment sql add "//" every line -func (m *InterfaceMethod) DocComment() string { - return strings.Replace(strings.Replace(strings.TrimSpace(m.Doc), "\n", "\n// ", -1), "// ", "// ", -1) -} - -// checkParams check all parameters -func (m *InterfaceMethod) checkMethod(methods []*InterfaceMethod, s *QueryStructMeta) (err error) { - if model.GormKeywords.FullMatch(m.MethodName) { - return fmt.Errorf("can not use keyword as method name:%s", m.MethodName) - } - // TODO check methods Always empty? - for _, method := range methods { - if m.IsRepeatFromDifferentInterface(method) { - return fmt.Errorf("can not generate method with the same name from different interface:[%s.%s] and [%s.%s]", - m.InterfaceName, m.MethodName, method.InterfaceName, method.MethodName) - } - } - for _, f := range s.Fields { - if f.Name == m.MethodName { - return fmt.Errorf("can not generate method same name with struct field:[%s.%s] and [%s.%s]", - m.InterfaceName, m.MethodName, s.ModelStructName, f.Name) - } - } - - return nil -} - -// checkParams check all parameters -func (m *InterfaceMethod) checkParams(params []parser.Param) (err error) { - paramList := make([]parser.Param, len(params)) - for i, param := range params { - switch { - case param.Package == "UNDEFINED": - param.Package = m.Package - case param.IsError() || param.IsNull(): - return fmt.Errorf("type error on interface [%s] param: [%s]", m.InterfaceName, param.Name) - case param.IsGenM(): - param.Type = "map[string]interface{}" - param.Package = "" - case param.IsGenT(): - param.Type = m.OriginStruct.Type - param.Package = m.OriginStruct.Package - } - paramList[i] = param - } - m.Params = paramList - return -} - -// checkResult check all parameters and replace gen.T by target structure. Parameters must be one of int/string/struct/map -func (m *InterfaceMethod) checkResult(result []parser.Param) (err error) { - resList := make([]parser.Param, len(result)) - var hasError bool - for i, param := range result { - if param.Package == "UNDEFINED" { - param.Package = m.Package - } - if param.IsGenM() { - param.Type = "map[string]interface{}" - param.Package = "" - } - switch { - case param.InMainPkg(): - return fmt.Errorf("query method cannot return struct of main package in [%s.%s]", m.InterfaceName, m.MethodName) - case param.IsError(): - if hasError { - return fmt.Errorf("query method cannot return more than 1 error value in [%s.%s]", m.InterfaceName, m.MethodName) - } - param.SetName("err") - hasError = true - case param.Eq(m.OriginStruct) || param.IsGenT(): - if !m.ResultData.IsNull() { - return fmt.Errorf("query method cannot return more than 1 data value in [%s.%s]", m.InterfaceName, m.MethodName) - } - param.SetName("result") - param.Type = m.OriginStruct.Type - param.Package = m.OriginStruct.Package - m.ResultData = param - case param.IsInterface(): - return fmt.Errorf("query method can not return interface in [%s.%s]", m.InterfaceName, m.MethodName) - case param.IsGenRowsAffected(): - param.Type = "int64" - param.Package = "" - param.SetName("rowsAffected") - m.GormOption = "Exec" - case param.IsSQLResult(): - param.Type = "Result" - param.Package = "sql" - param.SetName("result") - m.GormOption = "Statement.ConnPool.ExecContext" - case param.IsSQLRow(): - param.Type = "Row" - param.Package = "sql" - param.SetName("row") - m.GormOption = "Raw" - param.IsPointer = true - case param.IsSQLRows(): - param.Type = "Rows" - param.Package = "sql" - param.SetName("rows") - m.GormOption = "Raw" - param.IsPointer = true - default: - if !m.ResultData.IsNull() { - return fmt.Errorf("query method cannot return more than 1 data value in [%s.%s]", m.InterfaceName, m.MethodName) - } - if param.Package == "" && !(param.IsBaseType() || param.IsMap() || param.IsTime()) { - param.Package = m.Package - } - param.SetName("result") - m.ResultData = param - } - resList[i] = param - } - m.Result = resList - return -} - -// checkSQL get sql from comment and check it -func (m *InterfaceMethod) checkSQL() (err error) { - m.SQLString = m.parseDocString() - if err = m.sqlStateCheckAndSplit(); err != nil { - err = fmt.Errorf("interface %s member method %s check sql err:%w", m.InterfaceName, m.MethodName, err) - } - return -} - -func (m *InterfaceMethod) parseDocString() string { - docString := strings.TrimSpace(m.getSQLDocString()) - switch { - case strings.HasPrefix(strings.ToLower(docString), "sql("): - docString = docString[4 : len(docString)-1] - m.GormOption = "Raw" - if m.ResultData.IsNull() { - m.GormOption = "Exec" - } - case strings.HasPrefix(strings.ToLower(docString), "where("): - docString = docString[6 : len(docString)-1] - m.GormOption = "Where" - default: - m.GormOption = "Raw" - if m.ResultData.IsNull() { - m.GormOption = "Exec" - } - } - - // if wrapped by ", trim it - if strings.HasPrefix(docString, `"`) && strings.HasSuffix(docString, `"`) { - docString = docString[1 : len(docString)-1] - } - return docString -} - -func (m *InterfaceMethod) getSQLDocString() string { - docString := strings.TrimSpace(m.Doc) - /* - // methodName descriptive message - // (this blank line is needed) - // sql - */ - if index := strings.Index(docString, "\n\n"); index != -1 { - if strings.Contains(docString[index+2:], m.MethodName) { - docString = docString[:index] - } else { - docString = docString[index+2:] - } - } - /* //methodName sql */ - docString = strings.TrimPrefix(docString, m.MethodName) - // TODO: using sql key word to split comment - return docString -} - -// sqlStateCheckAndSplit check sql with an adeterministic finite automaton -func (m *InterfaceMethod) sqlStateCheckAndSplit() error { - sqlString := m.SQLString - m.Section = NewSection() - var buf model.SQLBuffer - for i := 0; !strOutRange(i, sqlString); i++ { - b := sqlString[i] - switch b { - case '"': - _ = buf.WriteByte(sqlString[i]) - for i++; ; i++ { - if strOutRange(i, sqlString) { - return fmt.Errorf("incomplete SQL:%s", sqlString) - } - _ = buf.WriteByte(sqlString[i]) - if sqlString[i] == '"' && sqlString[i-1] != '\\' { - break - } - } - case '\'': - _ = buf.WriteByte(sqlString[i]) - for i++; ; i++ { - if strOutRange(i, sqlString) { - return fmt.Errorf("incomplete SQL:%s", sqlString) - } - _ = buf.WriteByte(sqlString[i]) - if sqlString[i] == '\'' && sqlString[i-1] != '\\' { - break - } - } - case '\\': - if sqlString[i+1] == '@' { - i++ - buf.WriteSQL(sqlString[i]) - continue - } - buf.WriteSQL(b) - case '{', '@': - if sqlClause := buf.Dump(); strings.TrimSpace(sqlClause) != "" { - m.Section.members = append(m.Section.members, section{ - Type: model.SQL, - Value: strconv.Quote(sqlClause), - }) - } - - if strOutRange(i+1, sqlString) { - return fmt.Errorf("incomplete SQL:%s", sqlString) - } - if b == '{' && sqlString[i+1] == '{' { - for i += 2; ; i++ { - if strOutRange(i, sqlString) { - return fmt.Errorf("incomplete SQL:%s", sqlString) - } - if sqlString[i] == '"' { - _ = buf.WriteByte(sqlString[i]) - for i++; ; i++ { - if strOutRange(i, sqlString) { - return fmt.Errorf("incomplete SQL:%s", sqlString) - } - _ = buf.WriteByte(sqlString[i]) - if sqlString[i] == '"' && sqlString[i-1] != '\\' { - break - } - } - i++ - } - - if strOutRange(i+1, sqlString) { - return fmt.Errorf("incomplete SQL:%s", sqlString) - } - if sqlString[i] == '}' && sqlString[i+1] == '}' { - i++ - sqlClause := buf.Dump() - part, err := m.Section.checkTemplate(sqlClause) - if err != nil { - return fmt.Errorf("sql [%s] dynamic template %s err:%w", sqlString, sqlClause, err) - } - m.Section.members = append(m.Section.members, part) - break - } - buf.WriteSQL(sqlString[i]) - } - } - if b == '@' { - i++ - status := model.DATA - if sqlString[i] == '@' { - i++ - status = model.VARIABLE - } - for ; ; i++ { - if strOutRange(i, sqlString) || isEnd(sqlString[i]) { - varString := buf.Dump() - params, err := m.Section.checkSQLVar(varString, status, m) - if err != nil { - return fmt.Errorf("sql [%s] varable %s err:%s", sqlString, varString, err) - } - m.Section.members = append(m.Section.members, params) - i-- - break - } - buf.WriteSQL(sqlString[i]) - } - } - default: - buf.WriteSQL(b) - } - } - if sqlClause := buf.Dump(); strings.TrimSpace(sqlClause) != "" { - m.Section.members = append(m.Section.members, section{ - Type: model.SQL, - Value: strconv.Quote(sqlClause), - }) - } - - return nil -} - -// checkSQLVarByParams return external parameters, table name -func (m *InterfaceMethod) checkSQLVarByParams(param string, status model.Status) (result section, err error) { - for _, p := range m.Params { - structName := strings.Split(param, ".")[0] - if p.Name == structName { - if p.Name != param { - p = parser.Param{ - Name: param, - Type: "string", - } - } - switch status { - case model.DATA: - if !m.isParamExist(param) { - m.SQLParams = append(m.SQLParams, p) - } - case model.VARIABLE: - if p.Type != "string" || p.IsArray { - err = fmt.Errorf("variable name must be string :%s type is %s", param, p.TypeName()) - return - } - param = fmt.Sprintf("%s.Quote(%s)", m.S, param) - } - result = section{ - Type: status, - Value: param, - } - return - } - } - if param == "table" { - result = section{ - Type: model.SQL, - Value: strconv.Quote(m.Table), - } - return - } - - return result, fmt.Errorf("unknow variable param:%s", param) -} - -// isParamExist check param duplicate -func (m *InterfaceMethod) isParamExist(paramName string) bool { - for _, param := range m.SQLParams { - if param.Name == paramName { - return true - } - } - return false -} diff --git a/toolkit/gormgen/internal/generate/query.go b/toolkit/gormgen/internal/generate/query.go deleted file mode 100644 index f8d340dd..00000000 --- a/toolkit/gormgen/internal/generate/query.go +++ /dev/null @@ -1,241 +0,0 @@ -package generate - -import ( - "context" - "fmt" - "reflect" - "strings" - - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/schema" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/parser" -) - -type FieldParser interface { - GetFieldGenType(f *schema.Field) string -} - -type dummyFieldParser struct{} - -func (dummyFieldParser) GetFieldGenType(*schema.Field) string { return "" } - -// QueryStructMeta struct info in generated code -type QueryStructMeta struct { - db *gorm.DB - - Generated bool // whether to generate db model - FileName string // generated file name - S string // the first letter(lower case)of simple Name (receiver) - QueryStructName string // internal query struct name - ModelStructName string // origin/model struct name - TableName string // table name in db server - StructInfo parser.Param - Fields []*model.Field - Source model.SourceCode - ImportPkgPaths []string - ModelMethods []*parser.Method // user custom method bind to db base struct - interfaceMode bool - PriKeyType string - PbPrimaryProp string -} - -// parseStruct get all elements of struct with gorm's Parse, ignore unexported elements -func (b *QueryStructMeta) parseStruct(st interface{}) error { - stmt := gorm.Statement{DB: b.db} - - err := stmt.Parse(st) - if err != nil { - return err - } - b.TableName = stmt.Table - b.FileName = strings.ToLower(stmt.Table) - - var fp FieldParser = dummyFieldParser{} - if fps, ok := st.(FieldParser); ok && fps != nil { - fp = fps - } - for _, f := range stmt.Schema.Fields { - b.appendOrUpdateField(&model.Field{ - Name: f.Name, - Type: b.getFieldRealType(f.FieldType), - ColumnName: f.DBName, - CustomGenType: fp.GetFieldGenType(f), - }) - } - for _, r := range ParseStructRelationShip(&stmt.Schema.Relationships) { - r := r - b.appendOrUpdateField(&model.Field{Relation: &r}) - } - return nil -} - -// getFieldRealType get basic type of field -func (b *QueryStructMeta) getFieldRealType(f reflect.Type) string { - serializerInterface := reflect.TypeOf((*schema.SerializerInterface)(nil)).Elem() - if f.Implements(serializerInterface) || reflect.New(f).Type().Implements(serializerInterface) { - return "serializer" - } - scanValuer := reflect.TypeOf((*field.ScanValuer)(nil)).Elem() - if f.Implements(scanValuer) || reflect.New(f).Type().Implements(scanValuer) { - return "field" - } - - if f.Kind() == reflect.Ptr { - f = f.Elem() - } - if f.String() == "time.Time" { - return "time.Time" - } - if f.String() == "[]uint8" || f.String() == "json.RawMessage" { - return "bytes" - } - return f.Kind().String() -} - -// ReviseFieldName revise field name -func (b *QueryStructMeta) ReviseFieldName() { - b.ReviseFieldNameFor(model.GormKeywords) -} - -// ReviseFieldNameFor revise field name for keywords -func (b *QueryStructMeta) ReviseFieldNameFor(keywords model.KeyWord) { - for _, m := range b.Fields { - m.EscapeKeywordFor(keywords) - } -} - -// check field if in BaseStruct update else append -func (b *QueryStructMeta) appendOrUpdateField(f *model.Field) { - if f.IsRelation() { - b.appendField(f) - } - if f.ColumnName == "" { - return - } - for i, m := range b.Fields { - if m.Name == f.Name { - b.Fields[i] = f - return - } - } - b.appendField(f) -} - -func (b *QueryStructMeta) appendField(f *model.Field) { b.Fields = append(b.Fields, f) } - -// HasField check if BaseStruct has fields -func (b *QueryStructMeta) HasField() bool { return len(b.Fields) > 0 } - -// check if struct is exportable and if struct in main package and if field's type is regular -func (b *QueryStructMeta) check() (err error) { - if b.StructInfo.InMainPkg() { - return fmt.Errorf("can't generated data object for struct in main package, ignore:%s", b.ModelStructName) - } - if !isCapitalize(b.ModelStructName) { - return fmt.Errorf("can't generated data object for non-exportable struct, ignore:%s", b.QueryStructName) - } - return nil -} - -// Relations related field -func (b *QueryStructMeta) Relations() (result []field.Relation) { - for _, f := range b.Fields { - if f.IsRelation() { - result = append(result, *f.Relation) - } - } - return result -} - -// StructComment struct comment -func (b *QueryStructMeta) StructComment() string { - if b.TableName != "" { - return fmt.Sprintf(`mapped from table <%s>`, b.TableName) - } - return `mapped from object` -} - -// ReviseDIYMethod check diy method duplication name -func (b *QueryStructMeta) ReviseDIYMethod() error { - var duplicateMethodName []string - //var tableName *parser.Method - methods := make([]*parser.Method, 0, len(b.ModelMethods)) - methodMap := make(map[string]bool, len(b.ModelMethods)) - for _, method := range b.ModelMethods { - if methodMap[method.MethodName] { - duplicateMethodName = append(duplicateMethodName, method.MethodName) - continue - } - method.Receiver.Package = "" - method.Receiver.Type = b.ModelStructName - methods = append(methods, method) - methodMap[method.MethodName] = true - } - b.ModelMethods = methods - - if len(duplicateMethodName) > 0 { - return fmt.Errorf("can't generate struct with duplicated method, please check method name: %s", strings.Join(duplicateMethodName, ",")) - } - return nil -} - -func (b *QueryStructMeta) addMethodFromAddMethodOpt(methods ...interface{}) *QueryStructMeta { - for _, method := range methods { - modelMethods, err := parser.GetModelMethod(method, 5) - if err != nil { - panic("add diy method err:" + err.Error()) - } - b.ModelMethods = append(b.ModelMethods, modelMethods.Methods...) - } - - err := b.ReviseDIYMethod() - if err != nil { - b.db.Logger.Warn(context.Background(), err.Error()) - } - return b -} - -// IfaceMode object mode -func (b QueryStructMeta) IfaceMode(on bool) *QueryStructMeta { - b.interfaceMode = on - return &b -} - -// ReturnObject return object in generated code -func (b *QueryStructMeta) ReturnObject() string { - if b.interfaceMode { - return fmt.Sprint("I", b.ModelStructName, "Do") - } - return fmt.Sprint("*", b.QueryStructName, "Do") -} - -func isStructType(data reflect.Value) bool { - return data.Kind() == reflect.Struct || - (data.Kind() == reflect.Ptr && data.Elem().Kind() == reflect.Struct) -} - -func pullRelationShip(cache map[string]bool, relationships []*schema.Relationship) []field.Relation { - if len(relationships) == 0 { - return nil - } - result := make([]field.Relation, len(relationships)) - for i, relationship := range relationships { - var childRelations []field.Relation - varType := strings.TrimLeft(relationship.Field.FieldType.String(), "[]*") - if !cache[varType] { - cache[varType] = true - childRelations = pullRelationShip(cache, append(append(append(append( - make([]*schema.Relationship, 0, 4), - relationship.FieldSchema.Relationships.BelongsTo...), - relationship.FieldSchema.Relationships.HasOne...), - relationship.FieldSchema.Relationships.HasMany...), - relationship.FieldSchema.Relationships.Many2Many...), - ) - } - result[i] = *field.NewRelationWithType(field.RelationshipType(relationship.Type), relationship.Name, varType, childRelations...) - } - return result -} diff --git a/toolkit/gormgen/internal/generate/section.go b/toolkit/gormgen/internal/generate/section.go deleted file mode 100644 index 408dcdbf..00000000 --- a/toolkit/gormgen/internal/generate/section.go +++ /dev/null @@ -1,700 +0,0 @@ -package generate - -import ( - "fmt" - "strconv" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" -) - -// NewSection create and initialize Sections -func NewSection() *Section { - return &Section{ - ClauseTotal: map[model.Status]int{ - model.WHERE: 0, - model.SET: 0, - }, - } -} - -// Section split sql into chunks -type Section struct { - members []section - Tmpls []string - currentIndex int - ClauseTotal map[model.Status]int - forValue []ForRange -} - -// next return next section and increase index by 1 -func (s *Section) next() section { - if s.currentIndex < len(s.members)-1 { - s.currentIndex++ - return s.members[s.currentIndex] - } - return section{Type: model.END} -} - -// SubIndex take index one step back -func (s *Section) SubIndex() { - s.currentIndex-- -} - -// HasMore is has more section -func (s *Section) HasMore() bool { - return s.currentIndex < len(s.members)-1 -} - -// IsNull whether section is empty -func (s *Section) IsNull() bool { - return len(s.members) == 0 -} - -// current return current section -func (s *Section) current() section { - return s.members[s.currentIndex] -} - -func (s *Section) appendTmpl(value string) { - s.Tmpls = append(s.Tmpls, value) -} - -func (s *Section) hasSameName(value string) bool { - for _, p := range s.members { - if p.Type == model.FOR && p.ForRange.value == value { - return true - } - } - return false -} - -// BuildSQL sql sections and append to tmpl, return a Clause array -func (s *Section) BuildSQL() ([]Clause, error) { - if s.IsNull() { - return nil, fmt.Errorf("sql is null") - } - name := "generateSQL" - res := make([]Clause, 0, len(s.members)) - for { - c := s.current() - switch c.Type { - case model.SQL, model.DATA, model.VARIABLE: - sqlClause := s.parseSQL(name) - res = append(res, sqlClause) - s.appendTmpl(sqlClause.Finish()) - case model.IF: - ifClause, err := s.parseIF(name) - if err != nil { - return nil, err - } - res = append(res, ifClause) - s.appendTmpl(ifClause.Finish()) - case model.WHERE: - whereClause, err := s.parseWhere() - if err != nil { - return nil, err - } - res = append(res, whereClause) - s.appendTmpl(whereClause.Finish(name)) - case model.SET: - setClause, err := s.parseSet() - if err != nil { - return nil, err - } - res = append(res, setClause) - s.appendTmpl(setClause.Finish(name)) - case model.TRIM: - trimClause, err := s.parseTrim() - if err != nil { - return nil, err - } - res = append(res, trimClause) - s.appendTmpl(trimClause.Finish(name)) - case model.FOR: - forClause, err := s.parseFor(name) - _, _ = forClause, err - if err != nil { - return nil, err - } - res = append(res, forClause) - s.appendTmpl(forClause.Finish()) - case model.END: - default: - return nil, fmt.Errorf("unknow clause:%s", c.Value) - } - if !s.HasMore() { - break - } - c = s.next() - } - return res, nil -} - -// parseIF parse if clause -func (s *Section) parseIF(name string) (res IfClause, err error) { - c := s.current() - res.slice = c - - s.appendTmpl(res.Create()) - if !s.HasMore() { - return - } - c = s.next() - for { - switch c.Type { - case model.SQL, model.DATA, model.VARIABLE: - sqlClause := s.parseSQL(name) - res.Value = append(res.Value, sqlClause) - s.appendTmpl(sqlClause.Finish()) - case model.IF: - var ifClause IfClause - ifClause, err = s.parseIF(name) - if err != nil { - return - } - res.Value = append(res.Value, ifClause) - s.appendTmpl(ifClause.Finish()) - case model.WHERE: - var whereClause WhereClause - whereClause, err = s.parseWhere() - if err != nil { - return - } - res.Value = append(res.Value, whereClause) - s.appendTmpl(whereClause.Finish(name)) - case model.SET: - var setClause SetClause - setClause, err = s.parseSet() - if err != nil { - return - } - res.Value = append(res.Value, setClause) - s.appendTmpl(setClause.Finish(name)) - case model.ELSE: - var elseClause ElseClause - elseClause, err = s.parseElSE(name) - if err != nil { - return - } - res.Value = append(res.Value, elseClause) - case model.FOR: - var forClause ForClause - forClause, err = s.parseFor(name) - if err != nil { - return - } - res.Value = append(res.Value, forClause) - s.appendTmpl(res.Finish()) - case model.TRIM: - var trimClause TrimClause - trimClause, err = s.parseTrim() - if err != nil { - return - } - res.Value = append(res.Value, trimClause) - s.appendTmpl(trimClause.Finish(name)) - case model.END: - return - default: - err = fmt.Errorf("unknow clause : %s", c.Value) - return - } - if !s.HasMore() { - break - } - c = s.next() - } - if c.isEnd() { - err = fmt.Errorf("incomplete SQL,if not end") - } - return -} - -// parseElSE parse else clause, the clause' type must be one of if, where, set, SQL condition -func (s *Section) parseElSE(name string) (res ElseClause, err error) { - res.slice = s.current() - s.appendTmpl(res.Create()) - - if !s.HasMore() { - return - } - c := s.next() - for { - switch c.Type { - case model.SQL, model.DATA, model.VARIABLE: - sqlClause := s.parseSQL(name) - res.Value = append(res.Value, sqlClause) - s.appendTmpl(sqlClause.Create()) - case model.IF: - var ifClause IfClause - ifClause, err = s.parseIF(name) - if err != nil { - return - } - res.Value = append(res.Value, ifClause) - s.appendTmpl(ifClause.Finish()) - case model.WHERE: - var whereClause WhereClause - whereClause, err = s.parseWhere() - if err != nil { - return - } - res.Value = append(res.Value, whereClause) - s.appendTmpl(whereClause.Finish(name)) - case model.SET: - var setClause SetClause - setClause, err = s.parseSet() - if err != nil { - return - } - res.Value = append(res.Value, setClause) - s.appendTmpl(setClause.Finish(name)) - case model.ELSE: - var elseClause ElseClause - elseClause, err = s.parseElSE(name) - if err != nil { - return - } - res.Value = append(res.Value, elseClause) - case model.FOR: - var forClause ForClause - forClause, err = s.parseFor(name) - if err != nil { - return - } - res.Value = append(res.Value, forClause) - s.appendTmpl(forClause.Finish()) - case model.TRIM: - var trimClause TrimClause - trimClause, err = s.parseTrim() - if err != nil { - return - } - res.Value = append(res.Value, trimClause) - s.appendTmpl(trimClause.Finish(name)) - default: - s.SubIndex() - return - } - if !s.HasMore() { - break - } - c = s.next() - } - return -} - -// parseWhere parse where clause, the clause' type must be one of if, SQL condition -func (s *Section) parseWhere() (res WhereClause, err error) { - c := s.current() - res.VarName = s.GetName(c.Type) - s.appendTmpl(res.Create()) - res.Type = c.Type - - if !s.HasMore() { - return - } - c = s.next() - for { - switch c.Type { - case model.SQL, model.DATA, model.VARIABLE: - sqlClause := s.parseSQL(res.VarName) - res.Value = append(res.Value, sqlClause) - s.appendTmpl(sqlClause.Finish()) - case model.IF: - var ifClause IfClause - ifClause, err = s.parseIF(res.VarName) - if err != nil { - return - } - res.Value = append(res.Value, ifClause) - s.appendTmpl(ifClause.Finish()) - case model.FOR: - var forClause ForClause - forClause, err = s.parseFor(res.VarName) - if err != nil { - return - } - res.Value = append(res.Value, forClause) - s.appendTmpl(forClause.Finish()) - case model.WHERE: - var whereClause WhereClause - whereClause, err = s.parseWhere() - if err != nil { - return - } - res.Value = append(res.Value, whereClause) - s.appendTmpl(whereClause.Finish(res.VarName)) - case model.TRIM: - var trimClause TrimClause - trimClause, err = s.parseTrim() - if err != nil { - return - } - res.Value = append(res.Value, trimClause) - s.appendTmpl(trimClause.Finish(res.VarName)) - case model.END: - return - default: - err = fmt.Errorf("unknow clause : %s", c.Value) - return - } - if !s.HasMore() { - break - } - c = s.next() - } - if c.isEnd() { - return - } - err = fmt.Errorf("incomplete SQL,where not end") - return -} - -// parseSet parse set clause, the clause' type must be one of if, SQL condition -func (s *Section) parseSet() (res SetClause, err error) { - c := s.current() - res.VarName = s.GetName(c.Type) - s.appendTmpl(res.Create()) - if !s.HasMore() { - return - } - c = s.next() - - res.Type = c.Type - for { - switch c.Type { - case model.SQL, model.DATA, model.VARIABLE: - sqlClause := s.parseSQL(res.VarName) - res.Value = append(res.Value, sqlClause) - s.appendTmpl(sqlClause.Finish()) - case model.IF: - var ifClause IfClause - ifClause, err = s.parseIF(res.VarName) - if err != nil { - return - } - res.Value = append(res.Value, ifClause) - s.appendTmpl(ifClause.Finish()) - case model.FOR: - var forClause ForClause - forClause, err = s.parseFor(res.VarName) - if err != nil { - return - } - res.Value = append(res.Value, forClause) - s.appendTmpl(forClause.Finish()) - case model.WHERE: - var whereClause WhereClause - whereClause, err = s.parseWhere() - if err != nil { - return - } - res.Value = append(res.Value, whereClause) - s.appendTmpl(whereClause.Finish(res.VarName)) - case model.TRIM: - var trimClause TrimClause - trimClause, err = s.parseTrim() - if err != nil { - return - } - res.Value = append(res.Value, trimClause) - s.appendTmpl(trimClause.Finish(res.VarName)) - case model.END: - return - default: - err = fmt.Errorf("unknow clause : %s", c.Value) - return - } - if !s.HasMore() { - break - } - c = s.next() - } - if c.isEnd() { - err = fmt.Errorf("incomplete SQL,set not end") - } - return -} - -// parseTrim parse set clause, the clause' type must be one of if, SQL condition -func (s *Section) parseTrim() (res TrimClause, err error) { - c := s.current() - res.VarName = s.GetName(c.Type) - s.appendTmpl(res.Create()) - if !s.HasMore() { - return - } - c = s.next() - - res.Type = c.Type - for { - switch c.Type { - case model.SQL, model.DATA, model.VARIABLE: - sqlClause := s.parseSQL(res.VarName) - res.Value = append(res.Value, sqlClause) - s.appendTmpl(sqlClause.Finish()) - case model.IF: - var ifClause IfClause - ifClause, err = s.parseIF(res.VarName) - if err != nil { - return - } - res.Value = append(res.Value, ifClause) - s.appendTmpl(ifClause.Finish()) - case model.FOR: - var forClause ForClause - forClause, err = s.parseFor(res.VarName) - if err != nil { - return - } - res.Value = append(res.Value, forClause) - s.appendTmpl(forClause.Finish()) - case model.WHERE: - var whereClause WhereClause - whereClause, err = s.parseWhere() - if err != nil { - return - } - res.Value = append(res.Value, whereClause) - s.appendTmpl(whereClause.Finish(res.VarName)) - case model.END: - return - default: - err = fmt.Errorf("unknow clause : %s", c.Value) - return - } - if !s.HasMore() { - break - } - c = s.next() - } - if c.isEnd() { - err = fmt.Errorf("incomplete SQL,set not end") - } - return -} - -func (s *Section) parseFor(name string) (res ForClause, err error) { - c := s.current() - res.forSlice = c - s.appendTmpl(res.Create()) - s.forValue = append(s.forValue, res.forSlice.ForRange) - - if !s.HasMore() { - return - } - c = s.next() - for { - switch c.Type { - case model.SQL, model.DATA, model.VARIABLE: - strClause := s.parseSQL(name) - res.Value = append(res.Value, strClause) - s.appendTmpl(fmt.Sprintf("%s.WriteString(%s)", name, strClause.String())) - case model.IF: - var ifClause IfClause - ifClause, err = s.parseIF(name) - if err != nil { - return - } - res.Value = append(res.Value, ifClause) - s.appendTmpl(ifClause.Finish()) - case model.FOR: - var forClause ForClause - forClause, err = s.parseFor(name) - if err != nil { - return - } - res.Value = append(res.Value, forClause) - s.appendTmpl(forClause.Finish()) - case model.TRIM: - var trimClause TrimClause - trimClause, err = s.parseTrim() - if err != nil { - return - } - res.Value = append(res.Value, trimClause) - s.appendTmpl(trimClause.Finish(name)) - case model.END: - s.forValue = s.forValue[:len(s.forValue)-1] - return - default: - err = fmt.Errorf("unknow clause : %s", c.Value) - return - } - if !s.HasMore() { - break - } - c = s.next() - } - if c.isEnd() { - err = fmt.Errorf("incomplete SQL,set not end") - } - return -} - -// parseSQL parse sql condition, the clause' type must be one of SQL condition, VARIABLE, Data -func (s *Section) parseSQL(name string) (res SQLClause) { - res.VarName = name - res.Type = model.SQL - for { - c := s.current() - switch c.Type { - case model.SQL: - res.Value = append(res.Value, c.Value) - case model.VARIABLE: - res.Value = append(res.Value, c.Value) - case model.DATA: - s.appendTmpl(fmt.Sprintf("params = append(params,%s)", c.Value)) - res.Value = append(res.Value, "\"?\"") - default: - s.SubIndex() - return - } - if !s.HasMore() { - return - } - c = s.next() - } -} - -// checkSQLVar check sql variable by for loops value and external params -func (s *Section) checkSQLVar(param string, status model.Status, method *InterfaceMethod) (result section, err error) { - if status == model.VARIABLE && param == "table" { - result = section{ - Type: model.SQL, - Value: strconv.Quote(method.Table), - } - return - } - if status == model.DATA { - method.HasForParams = true - } - if status == model.VARIABLE { - param = fmt.Sprintf("%s.Quote(%s)", method.S, param) - } - result = section{ - Type: status, - Value: param, - } - return -} - -// GetName ... -func (s *Section) GetName(status model.Status) string { - switch status { - case model.WHERE: - defer func() { s.ClauseTotal[model.WHERE]++ }() - return fmt.Sprintf("whereSQL%d", s.ClauseTotal[model.WHERE]) - case model.SET: - defer func() { s.ClauseTotal[model.SET]++ }() - return fmt.Sprintf("setSQL%d", s.ClauseTotal[model.SET]) - case model.TRIM: - defer func() { s.ClauseTotal[model.TRIM]++ }() - return fmt.Sprintf("trimSQL%d", s.ClauseTotal[model.TRIM]) - default: - return "generateSQL" - } -} - -// checkTemplate check sql template's syntax (if/else/where/set/for) -func (s *Section) checkTemplate(tmpl string) (part section, err error) { - part.Value = tmpl - part.SQLSlice = s - part.splitTemplate() - - err = part.checkTemplate() - - return -} - -type section struct { - Type model.Status - Value string - ForRange ForRange - SQLSlice *Section - splitList []string -} - -func (s *section) isEnd() bool { - return s.Type == model.END -} - -func (s *section) String() string { - if s.Type == model.FOR { - return s.ForRange.String() - } - return s.Value -} - -func (s *section) splitTemplate() { - s.splitList = strings.FieldsFunc(strings.TrimSpace(s.Value), func(r rune) bool { - return r == ':' || r == ' ' || r == '=' || r == ',' - }) -} - -func (s *section) checkTemplate() error { - if len(s.splitList) == 0 { - return fmt.Errorf("template is null") - } - if model.GenKeywords.Contain(s.Value) { - return fmt.Errorf("template can not use gen keywords") - } - - err := s.sectionType(s.splitList[0]) - if err != nil { - return err - } - - if s.Type == model.FOR { - if len(s.splitList) != 5 { - return fmt.Errorf("for range syntax error: %s", s.Value) - } - if s.SQLSlice.hasSameName(s.splitList[2]) { - return fmt.Errorf("cannot use the same value name in different for loops") - } - s.ForRange.index = s.splitList[1] - s.ForRange.value = s.splitList[2] - s.ForRange.rangeList = s.splitList[4] - } - return nil -} - -func (s *section) sectionType(str string) error { - switch str { - case "if": - s.Type = model.IF - case "else": - s.Type = model.ELSE - case "for": - s.Type = model.FOR - case "where": - s.Type = model.WHERE - case "set": - s.Type = model.SET - case "end": - s.Type = model.END - case "trim": - s.Type = model.TRIM - default: - return fmt.Errorf("unknown syntax: %s", str) - } - return nil -} - -func (s *section) SQLParamName() string { - return strings.Replace(s.Value, ".", "", -1) -} - -// ForRange for range clause for diy method -type ForRange struct { - index string - value string - suffix string - rangeList string -} - -func (f *ForRange) String() string { - return fmt.Sprintf("for %s, %s := range %s", f.index, f.value, f.rangeList) -} diff --git a/toolkit/gormgen/internal/generate/table.go b/toolkit/gormgen/internal/generate/table.go deleted file mode 100644 index 2e9bee37..00000000 --- a/toolkit/gormgen/internal/generate/table.go +++ /dev/null @@ -1,70 +0,0 @@ -package generate - -import ( - "context" - "errors" - - "github.com/wubin1989/gorm" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/model" -) - -// ITableInfo table info interface -type ITableInfo interface { - GetTableColumns(schemaName string, tableName string) (result []*model.Column, err error) - - GetTableIndex(schemaName string, tableName string) (indexes []gorm.Index, err error) -} - -func getTableInfo(db *gorm.DB) ITableInfo { - return &tableInfo{db} -} - -func getTableColumns(db *gorm.DB, schemaName string, tableName string, indexTag bool) (result []*model.Column, err error) { - if db == nil { - return nil, errors.New("gorm db is nil") - } - - mt := getTableInfo(db) - result, err = mt.GetTableColumns(schemaName, tableName) - if err != nil { - return nil, err - } - if !indexTag || len(result) == 0 { - return result, nil - } - - index, err := mt.GetTableIndex(schemaName, tableName) - if err != nil { //ignore find index err - db.Logger.Warn(context.Background(), "GetTableIndex for %s,err=%s", tableName, err.Error()) - return result, nil - } - if len(index) == 0 { - return result, nil - } - - im := model.GroupByColumn(index) - for _, c := range result { - c.Indexes = im[c.Name()] - } - return result, nil -} - -type tableInfo struct{ *gorm.DB } - -// GetTableColumns struct -func (t *tableInfo) GetTableColumns(schemaName string, tableName string) (result []*model.Column, err error) { - types, err := t.Migrator().ColumnTypes(tableName) - if err != nil { - return nil, err - } - for _, column := range types { - result = append(result, &model.Column{ColumnType: column, TableName: tableName, UseScanType: t.Dialector.Name() != "mysql" && t.Dialector.Name() != "sqlite"}) - } - return result, nil -} - -// GetTableIndex index -func (t *tableInfo) GetTableIndex(schemaName string, tableName string) (indexes []gorm.Index, err error) { - return t.Migrator().GetIndexes(tableName) -} diff --git a/toolkit/gormgen/internal/generate/test.go b/toolkit/gormgen/internal/generate/test.go deleted file mode 100644 index 0152a675..00000000 --- a/toolkit/gormgen/internal/generate/test.go +++ /dev/null @@ -1,54 +0,0 @@ -package generate - -import ( - "fmt" - "strconv" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/internal/parser" -) - -// GetTestParamInTmpl return param list -func (m *InterfaceMethod) GetTestParamInTmpl() string { - return testParamToString(m.Params) -} - -// GetTestResultParamInTmpl return result list -func (m *InterfaceMethod) GetTestResultParamInTmpl() string { - var res []string - for i := range m.Result { - tmplString := fmt.Sprintf("res%d", i+1) - res = append(res, tmplString) - } - return strings.Join(res, ",") -} - -// testParamToString param list to string used in tmpl -func testParamToString(params []parser.Param) string { - var res []string - for i, param := range params { - // TODO manage array and pointer - typ := param.Type - if param.Package != "" { - typ = param.Package + "." + typ - } - if param.IsArray { - typ = "[]" + typ - } - if param.IsPointer { - typ = "*" + typ - } - res = append(res, fmt.Sprintf("tt.Input.Args[%d].(%s)", i, typ)) - } - return strings.Join(res, ",") -} - -// GetAssertInTmpl assert in diy test -func (m *InterfaceMethod) GetAssertInTmpl() string { - var res []string - for i := range m.Result { - tmplString := fmt.Sprintf("assert(t, %v, res%d, tt.Expectation.Ret[%d])", strconv.Quote(m.MethodName), i+1, i) - res = append(res, tmplString) - } - return strings.Join(res, "\n") -} diff --git a/toolkit/gormgen/internal/generate/utils.go b/toolkit/gormgen/internal/generate/utils.go deleted file mode 100644 index 8832d43e..00000000 --- a/toolkit/gormgen/internal/generate/utils.go +++ /dev/null @@ -1,61 +0,0 @@ -package generate - -import ( - "strings" -) - -func isCapitalize(s string) bool { - if len(s) < 1 { - return false - } - b := s[0] - if b >= 'A' && b <= 'Z' { - return true - } - return false -} - -func isEnd(b byte) bool { - switch { - case b >= 'a' && b <= 'z': - return false - case b >= 'A' && b <= 'Z': - return false - case b >= '0' && b <= '9': - return false - case b == '-' || b == '_' || b == '.': - return false - default: - return true - } -} - -func getPackageName(fullName string) string { - return strings.Split(delPointerSym(fullName), ".")[0] -} - -func strOutRange(index int, str string) bool { - return index >= len(str) -} - -func delPointerSym(name string) string { - return strings.TrimLeft(name, "*") -} - -func getPureName(s string) string { - return string(strings.ToLower(delPointerSym(s))[0]) -} - -// not need capitalize -func getStructName(t string) string { - list := strings.Split(t, ".") - return list[len(list)-1] -} - -func uncaptialize(s string) string { - if s == "" { - return "" - } - - return strings.ToLower(s[:1]) + s[1:] -} diff --git a/toolkit/gormgen/internal/model/base.go b/toolkit/gormgen/internal/model/base.go deleted file mode 100644 index 72bc43b4..00000000 --- a/toolkit/gormgen/internal/model/base.go +++ /dev/null @@ -1,267 +0,0 @@ -package model - -import ( - "bytes" - "github.com/sirupsen/logrus" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" -) - -const ( - // DefaultModelPkg ... - DefaultModelPkg = "model" - // DefaultDtoPkg ... - DefaultDtoPkg = "dto" -) - -// Status sql status -type Status int - -const ( - // UNKNOWN ... - UNKNOWN Status = iota - // SQL ... - SQL - // DATA ... - DATA - // VARIABLE ... - VARIABLE - // IF ... - IF - // ELSE ... - ELSE - // WHERE ... - WHERE - // SET ... - SET - // FOR ... - FOR - // END ... - END - // TRIM ... - TRIM -) - -// SourceCode source code -type SourceCode int - -const ( - // Struct ... - Struct SourceCode = iota - // Table ... - Table - // Object ... - Object -) - -// GormKeywords ... -var GormKeywords = KeyWord{ - words: []string{ - "UnderlyingDB", "UseDB", "UseModel", "UseTable", "Quote", "Debug", "TableName", "WithContext", - "As", "Not", "Or", "Build", "Columns", "Hints", - "Distinct", "Omit", - "Select", "Where", "Order", "Group", "Having", "Limit", "Offset", - "Join", "LeftJoin", "RightJoin", - "Save", "Create", "CreateInBatches", - "Update", "Updates", "UpdateColumn", "UpdateColumns", - "Find", "FindInBatches", "First", "Take", "Last", "Pluck", "Count", - "Scan", "ScanRows", "Row", "Rows", - "Delete", "Unscoped", - "Scopes", - }, -} - -// DOKeywords ... -var DOKeywords = KeyWord{ - words: []string{ - "Alias", "TableName", "WithContext", - }, -} - -// GenKeywords ... -var GenKeywords = KeyWord{ - words: []string{ - "generateSQL", "whereClause", "setClause", - }, -} - -// KeyWord ... -type KeyWord struct { - words []string -} - -// FullMatch full match -func (g *KeyWord) FullMatch(word string) bool { - for _, item := range g.words { - if word == item { - return true - } - } - return false -} - -// Contain contain -func (g *KeyWord) Contain(text string) bool { - for _, item := range g.words { - if strings.Contains(text, item) { - return true - } - } - return false -} - -var ( - defaultDataType = "string" - dataType dataTypeMap = map[string]dataTypeMapping{ - "numeric": func(string) string { return "int32" }, - "integer": func(string) string { return "int32" }, - "int": func(string) string { return "int32" }, - "smallint": func(string) string { return "int32" }, - "mediumint": func(string) string { return "int32" }, - "bigint": func(string) string { return "int64" }, - "float": func(string) string { return "float32" }, - "real": func(string) string { return "float64" }, - "double": func(string) string { return "float64" }, - "decimal": func(string) string { return "float64" }, - "char": func(string) string { return "string" }, - "varchar": func(string) string { return "string" }, - "tinytext": func(string) string { return "string" }, - "mediumtext": func(string) string { return "string" }, - "longtext": func(string) string { return "string" }, - "bytea": func(string) string { return "[]byte" }, - "binary": func(string) string { return "[]byte" }, - "varbinary": func(string) string { return "[]byte" }, - "tinyblob": func(string) string { return "[]byte" }, - "blob": func(string) string { return "[]byte" }, - "mediumblob": func(string) string { return "[]byte" }, - "longblob": func(string) string { return "[]byte" }, - "text": func(string) string { return "string" }, - "json": func(string) string { return "string" }, - "enum": func(string) string { return "string" }, - "time": func(string) string { return "time.Time" }, - "date": func(string) string { return "time.Time" }, - "datetime": func(string) string { return "time.Time" }, - "timestamp": func(string) string { return "time.Time" }, - "year": func(string) string { return "int32" }, - "bit": func(string) string { return "[]uint8" }, - "boolean": func(string) string { return "bool" }, - "tinyint": func(detailType string) string { - if strings.HasPrefix(strings.TrimSpace(detailType), "tinyint(1)") { - return "bool" - } - return "int32" - }, - } -) - -type dataTypeMapping func(detailType string) (finalType string) - -type dataTypeMap map[string]dataTypeMapping - -func (m dataTypeMap) Get(dataType, detailType string) string { - if convert, ok := m[strings.ToLower(dataType)]; ok { - return convert(detailType) - } - d := detailType - if strings.Contains(detailType, " ") { - d = detailType[:strings.Index(detailType, " ")] - } - if convert, ok := m[strings.ToLower(d)]; ok { - return convert(detailType) - } - logrus.Info(dataType+" ===> ", detailType) - return defaultDataType -} - -// Field user input structures -type Field struct { - Name string - Type string - ColumnName string - ColumnComment string - MultilineComment bool - Tag field.Tag - GORMTag field.GormTag - CustomGenType string - Relation *field.Relation - PriKey bool -} - -// Tags ... -func (m *Field) Tags() string { - if _, ok := m.Tag[field.TagKeyGorm]; ok { - return m.Tag.Build() - } - - if gormTag := strings.TrimSpace(m.GORMTag.Build()); gormTag != "" { - m.Tag.Set(field.TagKeyGorm, gormTag) - } - return m.Tag.Build() -} - -// IsRelation ... -func (m *Field) IsRelation() bool { return m.Relation != nil } - -// GenType ... -func (m *Field) GenType() string { - if m.IsRelation() { - return m.Type - } - if m.CustomGenType != "" { - return m.CustomGenType - } - typ := strings.TrimLeft(m.Type, "*") - switch typ { - case "string", "bytes": - return strings.Title(typ) - case "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64": - return strings.Title(typ) - case "float64", "float32": - return strings.Title(typ) - case "bool": - return strings.Title(typ) - case "time.Time": - return "Time" - case "json.RawMessage", "[]byte": - return "Bytes" - case "serializer": - return "Serializer" - default: - return "Field" - } -} - -// EscapeKeyword escape keyword -func (m *Field) EscapeKeyword() *Field { - return m.EscapeKeywordFor(GormKeywords) -} - -// EscapeKeywordFor escape for specified keyword -func (m *Field) EscapeKeywordFor(keywords KeyWord) *Field { - if keywords.FullMatch(m.Name) { - m.Name += "_" - } - return m -} - -// SQLBuffer sql buffer -type SQLBuffer struct{ bytes.Buffer } - -// WriteSQL ... -func (s *SQLBuffer) WriteSQL(b byte) { - switch b { - case '\n', '\t', ' ': - if s.Len() == 0 || s.Bytes()[s.Len()-1] != ' ' { - _ = s.WriteByte(' ') - } - default: - _ = s.WriteByte(b) - } -} - -// Dump ... -func (s *SQLBuffer) Dump() string { - defer s.Reset() - return s.String() -} diff --git a/toolkit/gormgen/internal/model/config.go b/toolkit/gormgen/internal/model/config.go deleted file mode 100644 index a65be1de..00000000 --- a/toolkit/gormgen/internal/model/config.go +++ /dev/null @@ -1,115 +0,0 @@ -package model - -import ( - "path/filepath" - "strings" - - "github.com/wubin1989/gorm" -) - -// Config model configuration -type Config struct { - ModelPkg string - TablePrefix string - TableName string - ModelName string - - ImportPkgPaths []string - ModelOpts []Option - - NameStrategy - FieldConfig - MethodConfig -} - -// NameStrategy name strategy -type NameStrategy struct { - SchemaNameOpts []SchemaNameOpt - - TableNameNS func(tableName string) string - ModelNameNS func(tableName string) string - FileNameNS func(tableName string) string -} - -// FieldConfig field configuration -type FieldConfig struct { - DataTypeMap map[string]func(columnType gorm.ColumnType) (dataType string) - - FieldNullable bool // generate pointer when field is nullable - FieldCoverable bool // generate pointer when field has default value - FieldSignable bool // detect integer field's unsigned type, adjust generated data type - FieldWithIndexTag bool // generate with gorm index tag - FieldWithTypeTag bool // generate with gorm column type tag - - FieldJSONTagNS func(columnName string, columnType string) string - - ModifyOpts []FieldOption - FilterOpts []FieldOption - CreateOpts []FieldOption -} - -// MethodConfig method configuration -type MethodConfig struct { - MethodOpts []MethodOption -} - -// Preprocess revise invalid field -func (cfg *Config) Preprocess() *Config { - if cfg.ModelPkg == "" { - cfg.ModelPkg = DefaultModelPkg - } - cfg.ModelPkg = filepath.Base(cfg.ModelPkg) - - cfg.ModifyOpts, cfg.FilterOpts, cfg.CreateOpts, cfg.MethodOpts = sortOptions(cfg.ModelOpts) - - return cfg -} - -// GetNames get names -func (cfg *Config) GetNames() (tableName, structName, fileName string) { - tableName, structName = cfg.TableName, cfg.ModelName - - if cfg.ModelNameNS != nil { - structName = cfg.ModelNameNS(tableName) - } - - if cfg.TableNameNS != nil { - tableName = cfg.TableNameNS(tableName) - } - if !strings.HasPrefix(tableName, cfg.TablePrefix) { - tableName = cfg.TablePrefix + tableName - } - - fileName = strings.ToLower(tableName) - if cfg.FileNameNS != nil { - fileName = cfg.FileNameNS(cfg.TableName) - } - - return -} - -// GetModelMethods get diy method from option -func (cfg *Config) GetModelMethods() (methods []interface{}) { - if cfg == nil { - return - } - - for _, opt := range cfg.MethodOpts { - methods = append(methods, opt.Methods()...) - } - return -} - -// GetSchemaName get schema name -func (cfg *Config) GetSchemaName(db *gorm.DB) string { - if cfg == nil { - return "" - } - - for _, opt := range cfg.SchemaNameOpts { - if name := opt(db); name != "" { - return name - } - } - return "" -} diff --git a/toolkit/gormgen/internal/model/options.go b/toolkit/gormgen/internal/model/options.go deleted file mode 100644 index 466b1e50..00000000 --- a/toolkit/gormgen/internal/model/options.go +++ /dev/null @@ -1,89 +0,0 @@ -package model - -import ( - "github.com/wubin1989/gorm" -) - -// SchemaNameOpt schema name option -type SchemaNameOpt func(*gorm.DB) string - -var defaultSchemaNameOpt = SchemaNameOpt(func(db *gorm.DB) string { return db.Migrator().CurrentDatabase() }) - -// Option field option -type Option interface{ OptionType() string } - -const fieldType = "field" - -// FieldOption ... -type FieldOption interface { - Option - Operator() func(*Field) *Field -} - -const methodType = "method" - -// MethodOption ... -type MethodOption interface { - Option - Methods() (methods []interface{}) -} - -var ( - _ Option = ModifyFieldOpt(nil) - _ Option = FilterFieldOpt(nil) - _ Option = CreateFieldOpt(nil) - - _ Option = AddMethodOpt(nil) -) - -// ModifyFieldOpt modify field option -type ModifyFieldOpt func(*Field) *Field - -// OptionType implement for interface Option -func (ModifyFieldOpt) OptionType() string { return fieldType } - -// Operator implement for FieldOpt -func (o ModifyFieldOpt) Operator() func(*Field) *Field { return o } - -// FilterFieldOpt filter field option -type FilterFieldOpt ModifyFieldOpt - -// OptionType implement for interface Option -func (FilterFieldOpt) OptionType() string { return fieldType } - -// Operator implement for FieldOpt -func (o FilterFieldOpt) Operator() func(*Field) *Field { return o } - -// CreateFieldOpt create field option -type CreateFieldOpt ModifyFieldOpt - -// OptionType implement for interface Option -func (CreateFieldOpt) OptionType() string { return fieldType } - -// Operator implement for FieldOpt -func (o CreateFieldOpt) Operator() func(*Field) *Field { return o } - -// AddMethodOpt diy method option -type AddMethodOpt func() (methods []interface{}) - -// OptionType implement for interface Option -func (AddMethodOpt) OptionType() string { return methodType } - -// Methods ... -func (o AddMethodOpt) Methods() []interface{} { return o() } - -func sortOptions(opts []Option) (modifyOpts []FieldOption, filterOpts []FieldOption, createOpts []FieldOption, methodOpt []MethodOption) { - for _, opt := range opts { - switch opt := opt.(type) { - case ModifyFieldOpt: - modifyOpts = append(modifyOpts, opt) - case FilterFieldOpt: - filterOpts = append(filterOpts, opt) - case CreateFieldOpt: - createOpts = append(createOpts, opt) - case AddMethodOpt: - methodOpt = append(methodOpt, opt) - } - } - return -} diff --git a/toolkit/gormgen/internal/model/tbl_column.go b/toolkit/gormgen/internal/model/tbl_column.go deleted file mode 100644 index a2aec330..00000000 --- a/toolkit/gormgen/internal/model/tbl_column.go +++ /dev/null @@ -1,166 +0,0 @@ -package model - -import ( - "fmt" - "reflect" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen/field" - "github.com/wubin1989/gorm" -) - -// Column table column's info -type Column struct { - gorm.ColumnType - TableName string `gorm:"column:TABLE_NAME"` - Indexes []*Index `gorm:"-"` - UseScanType bool `gorm:"-"` - dataTypeMap map[string]func(columnType gorm.ColumnType) (dataType string) `gorm:"-"` - jsonTagNS func(columnName string, columnType string) string `gorm:"-"` -} - -// SetDataTypeMap set data type map -func (c *Column) SetDataTypeMap(m map[string]func(columnType gorm.ColumnType) (dataType string)) { - c.dataTypeMap = m -} - -// GetDataType get data type -func (c *Column) GetDataType() (fieldtype string) { - if mapping, ok := c.dataTypeMap[c.DatabaseTypeName()]; ok { - return mapping(c.ColumnType) - } - if c.UseScanType && c.ScanType() != nil { - return c.ScanType().String() - } - return dataType.Get(c.DatabaseTypeName(), c.columnType()) -} - -// WithNS with name strategy -func (c *Column) WithNS(jsonTagNS func(columnName string, columnType string) string) { - c.jsonTagNS = jsonTagNS - if c.jsonTagNS == nil { - c.jsonTagNS = func(n string, _ string) string { return n } - } -} - -// ToField convert to field -func (c *Column) ToField(nullable, coverable, signable bool) *Field { - fieldType := c.GetDataType() - if signable && strings.Contains(c.columnType(), "unsigned") && strings.HasPrefix(fieldType, "int") { - fieldType = "u" + fieldType - } - switch { - case c.Name() == "deleted_at" && fieldType == "time.Time": - fieldType = "gorm.DeletedAt" - case coverable && c.needDefaultTag(c.defaultTagValue()): - fieldType = "*" + fieldType - case nullable: - if n, ok := c.Nullable(); ok && n { - fieldType = "*" + fieldType - } - } - - var comment string - if c, ok := c.Comment(); ok { - comment = c - } - - isPriKey, ok := c.PrimaryKey() - - return &Field{ - Name: c.Name(), - Type: fieldType, - ColumnName: c.Name(), - MultilineComment: c.multilineComment(), - GORMTag: c.buildGormTag(), - Tag: map[string]string{field.TagKeyJson: c.jsonTagNS(c.Name(), fieldType)}, - ColumnComment: comment, - PriKey: ok && isPriKey, - } -} - -func (c *Column) multilineComment() bool { - cm, ok := c.Comment() - return ok && strings.Contains(cm, "\n") -} - -func (c *Column) buildGormTag() field.GormTag { - tag := field.GormTag{ - field.TagKeyGormColumn: []string{c.Name()}, - field.TagKeyGormType: []string{c.columnType()}, - } - isPriKey, ok := c.PrimaryKey() - isValidPriKey := ok && isPriKey - if isValidPriKey { - tag.Set(field.TagKeyGormPrimaryKey, "") - if at, ok := c.AutoIncrement(); ok { - tag.Set(field.TagKeyGormAutoIncrement, fmt.Sprintf("%t", at)) - } - } else if n, ok := c.Nullable(); ok && !n { - tag.Set(field.TagKeyGormNotNull, "") - } - - for _, idx := range c.Indexes { - if idx == nil { - continue - } - if pk, _ := idx.PrimaryKey(); pk { //ignore PrimaryKey - continue - } - if uniq, _ := idx.Unique(); uniq { - tag.Append(field.TagKeyGormUniqueIndex, fmt.Sprintf("%s,priority:%d", idx.Name(), idx.Priority)) - } else { - tag.Append(field.TagKeyGormIndex, fmt.Sprintf("%s,priority:%d", idx.Name(), idx.Priority)) - } - } - - if dtValue := c.defaultTagValue(); c.needDefaultTag(dtValue) { // cannot set default tag for primary key - tag.Set(field.TagKeyGormDefault, dtValue) - } - if comment, ok := c.Comment(); ok && comment != "" { - if c.multilineComment() { - comment = strings.ReplaceAll(comment, "\n", "\\n") - } - tag.Set(field.TagKeyGormComment, comment) - } - return tag -} - -// needDefaultTag check if default tag needed -func (c *Column) needDefaultTag(defaultTagValue string) bool { - if defaultTagValue == "" { - return false - } - if c.ScanType() != nil { - switch c.ScanType().Kind() { - case reflect.Bool: - return defaultTagValue != "false" - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - return defaultTagValue != "0" - case reflect.String: - return defaultTagValue != "" - case reflect.Struct: - return strings.Trim(defaultTagValue, "'0:- ") != "" - } - } - return c.Name() != "created_at" && c.Name() != "updated_at" -} - -// defaultTagValue return gorm default tag's value -func (c *Column) defaultTagValue() string { - value, ok := c.DefaultValue() - if !ok { - return "" - } - if value != "" && strings.TrimSpace(value) == "" { - return "'" + value + "'" - } - return value -} - -func (c *Column) columnType() (v string) { - if cl, ok := c.ColumnType.ColumnType(); ok { - return cl - } - return c.DatabaseTypeName() -} diff --git a/toolkit/gormgen/internal/model/tbl_index.go b/toolkit/gormgen/internal/model/tbl_index.go deleted file mode 100644 index 36c6644c..00000000 --- a/toolkit/gormgen/internal/model/tbl_index.go +++ /dev/null @@ -1,30 +0,0 @@ -package model - -import "github.com/wubin1989/gorm" - -// Index table index info -type Index struct { - gorm.Index - Priority int32 `gorm:"column:SEQ_IN_INDEX"` -} - -// GroupByColumn group columns -func GroupByColumn(indexList []gorm.Index) map[string][]*Index { - columnIndexMap := make(map[string][]*Index, len(indexList)) - if len(indexList) == 0 { - return columnIndexMap - } - - for _, idx := range indexList { - if idx == nil { - continue - } - for i, col := range idx.Columns() { - columnIndexMap[col] = append(columnIndexMap[col], &Index{ - Index: idx, - Priority: int32(i + 1), - }) - } - } - return columnIndexMap -} diff --git a/toolkit/gormgen/internal/parser/export.go b/toolkit/gormgen/internal/parser/export.go deleted file mode 100644 index 4753484a..00000000 --- a/toolkit/gormgen/internal/parser/export.go +++ /dev/null @@ -1,122 +0,0 @@ -package parser - -import ( - "fmt" - "go/build" - "os" - "path/filepath" - "reflect" - "runtime" - "strings" -) - -// InterfacePath interface path -type InterfacePath struct { - Name string - FullName string - Files []string - Package string -} - -// GetInterfacePath get interface's directory path and all files it contains -func GetInterfacePath(v interface{}) (paths []*InterfacePath, err error) { - value := reflect.ValueOf(v) - if value.Kind() != reflect.Func { - err = fmt.Errorf("model param is not function:%s", value.String()) - return - } - - for i := 0; i < value.Type().NumIn(); i++ { - var path InterfacePath - arg := value.Type().In(i) - path.FullName = arg.String() - - // keep the last model - for _, n := range strings.Split(arg.String(), ".") { - path.Name = n - } - - ctx := build.Default - var p *build.Package - - if strings.Split(arg.String(), ".")[0] == "main" { - _, file, _, _ := runtime.Caller(3) - p, err = ctx.ImportDir(filepath.Dir(file), build.ImportComment) - } else { - p, err = ctx.Import(arg.PkgPath(), "", build.ImportComment) - } - - if err != nil { - return - } - - for _, file := range p.GoFiles { - goFile := fmt.Sprintf("%s/%s", p.Dir, file) - if fileExists(goFile) { - path.Files = append(path.Files, goFile) - } - } - - if len(path.Files) == 0 { - err = fmt.Errorf("interface file not found:%s", value.String()) - return - } - - paths = append(paths, &path) - } - - return -} - -func fileExists(path string) bool { - _, err := os.Stat(path) - return err == nil -} - -// GetModelMethod get diy methods -func GetModelMethod(v interface{}, skip int) (method *DIYMethods, err error) { - method = new(DIYMethods) - - // get diy method info by input value, must input a function or a struct - value := reflect.ValueOf(v) - switch value.Kind() { - case reflect.Func: - fullPath := runtime.FuncForPC(value.Pointer()).Name() - err = method.parserPath(fullPath) - if err != nil { - return nil, err - } - case reflect.Struct: - method.pkgPath = value.Type().PkgPath() - method.BaseStructType = value.Type().Name() - default: - return nil, fmt.Errorf("method param must be a function or struct") - } - - var p *build.Package - - // if struct in main file - ctx := build.Default - if method.pkgPath == "main" { - _, file, _, _ := runtime.Caller(skip) - p, err = ctx.ImportDir(filepath.Dir(file), build.ImportComment) - } else { - p, err = ctx.Import(method.pkgPath, "", build.ImportComment) - } - if err != nil { - return nil, fmt.Errorf("diy method dir not found:%s.%s %w", method.pkgPath, method.MethodName, err) - } - - for _, file := range p.GoFiles { - goFile := p.Dir + "/" + file - if fileExists(goFile) { - method.pkgFiles = append(method.pkgFiles, goFile) - } - } - if len(method.pkgFiles) == 0 { - return nil, fmt.Errorf("diy method file not found:%s.%s", method.pkgPath, method.MethodName) - } - - // read files got methods - return method, method.LoadMethods() -} diff --git a/toolkit/gormgen/internal/parser/method.go b/toolkit/gormgen/internal/parser/method.go deleted file mode 100644 index 0d37f0cc..00000000 --- a/toolkit/gormgen/internal/parser/method.go +++ /dev/null @@ -1,135 +0,0 @@ -package parser - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "io/ioutil" - "strings" -) - -// Method Apply to query struct and base struct custom method -type Method struct { - Receiver Param - MethodName string - Doc string - Params []Param - Result []Param - Body string -} - -// FuncSign function signature -func (m Method) FuncSign() string { - return fmt.Sprintf("%s(%s) (%s)", m.MethodName, m.GetParamInTmpl(), m.GetResultParamInTmpl()) -} - -// GetBaseStructTmpl return method bind info string -func (m *Method) GetBaseStructTmpl() string { - return m.Receiver.TmplString() -} - -// GetParamInTmpl return param list -func (m *Method) GetParamInTmpl() string { - return paramToString(m.Params) -} - -// GetResultParamInTmpl return result list -func (m *Method) GetResultParamInTmpl() string { - return paramToString(m.Result) -} - -// paramToString param list to string used in tmpl -func paramToString(params []Param) string { - res := make([]string, len(params)) - for i, param := range params { - res[i] = param.TmplString() - } - return strings.Join(res, ",") -} - -// DocComment return comment sql add "//" every line -func (m *Method) DocComment() string { - return strings.Replace(strings.TrimSpace(m.Doc), "\n", "\n//", -1) -} - -// DIYMethods user Custom methods bind to db base struct -type DIYMethods struct { - BaseStructType string - MethodName string - pkgPath string - currentFile string - pkgFiles []string - Methods []*Method -} - -func (m *DIYMethods) parserPath(path string) error { - pathList := strings.Split(path, ".") - if len(pathList) < 3 { - return fmt.Errorf("parser diy method error") - } - - m.pkgPath = strings.Join(pathList[:len(pathList)-2], ".") - methodName := pathList[len(pathList)-1] - m.MethodName = methodName[:len(methodName)-3] - - structName := pathList[len(pathList)-2] - m.BaseStructType = strings.Trim(structName, "()*") - return nil -} - -// Visit ast visit function -func (m *DIYMethods) Visit(n ast.Node) (w ast.Visitor) { - switch t := n.(type) { - case *ast.FuncDecl: - // check base struct and method name is expect - structMeta := getParamList(t.Recv) - if len(structMeta) != 1 { - return - } - if structMeta[0].Type != m.BaseStructType { - return - } - // if m.MethodName is null will generate all methods - if m.MethodName != "" && m.MethodName != t.Name.Name { - return - } - - // use ast read bind start package is UNDEFINED ,set it null string - structMeta[0].Package = "" - m.Methods = append(m.Methods, &Method{ - Receiver: structMeta[0], - MethodName: t.Name.String(), - Doc: t.Doc.Text(), - Body: getBody(m.currentFile, int(t.Body.Pos()), int(t.Body.End())), - Params: getParamList(t.Type.Params), - Result: getParamList(t.Type.Results), - }) - } - - return m -} - -// read old file get method body -func getBody(fileName string, start, end int) string { - f1, err := ioutil.ReadFile(fileName) - if err != nil { - return "{}" - } - - return string(f1[start-1 : end-1]) -} - -// LoadMethods ast read file get diy method -func (m *DIYMethods) LoadMethods() error { - for _, filename := range m.pkgFiles { - f, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.ParseComments) - if err != nil { - return fmt.Errorf("can't parse file %q: %s", filename, err) - } - m.currentFile = filename - ast.Walk(m, f) - } - - return nil -} diff --git a/toolkit/gormgen/internal/parser/parser.go b/toolkit/gormgen/internal/parser/parser.go deleted file mode 100644 index aec2d6f4..00000000 --- a/toolkit/gormgen/internal/parser/parser.go +++ /dev/null @@ -1,323 +0,0 @@ -package parser - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "log" - "path" - "path/filepath" - "strconv" - "strings" -) - -// InterfaceSet ... -type InterfaceSet struct { - Interfaces []InterfaceInfo - imports map[string]string // package name -> quoted "package path" -} - -// InterfaceInfo ... -type InterfaceInfo struct { - Name string - Doc string - Methods []*Method - Package string - ApplyStruct []string -} - -// MatchStruct ... -func (i *InterfaceInfo) MatchStruct(name string) bool { - for _, s := range i.ApplyStruct { - if s == name { - return true - } - } - return false -} - -// ParseFile get interface's info from source file -func (i *InterfaceSet) ParseFile(paths []*InterfacePath, structNames []string) error { - for _, path := range paths { - for _, file := range path.Files { - absFilePath, err := filepath.Abs(file) - if err != nil { - return fmt.Errorf("file not found: %s", file) - } - - err = i.getInterfaceFromFile(absFilePath, path.Name, path.FullName, structNames) - if err != nil { - return fmt.Errorf("can't get interface from %s:%s", path.FullName, err) - } - } - } - return nil -} - -// Visit ast visit function -func (i *InterfaceSet) Visit(n ast.Node) (w ast.Visitor) { - switch n := n.(type) { - case *ast.ImportSpec: - importName, _ := strconv.Unquote(n.Path.Value) - importName = path.Base(importName) - if n.Name != nil { - name := n.Name.Name - // ignore dummy imports - // TODO: full support for dot imports requires type checking the whole package - if name == "_" || name == "." { - return i - } - importName = name - } - i.imports[importName] = n.Path.Value - case *ast.TypeSpec: - if data, ok := n.Type.(*ast.InterfaceType); ok { - r := InterfaceInfo{ - Methods: []*Method{}, - } - methods := data.Methods.List - r.Name = n.Name.Name - r.Doc = n.Doc.Text() - - for _, m := range methods { - for _, name := range m.Names { - method := &Method{ - MethodName: name.Name, - Doc: m.Doc.Text(), - Params: getParamList(m.Type.(*ast.FuncType).Params), - Result: getParamList(m.Type.(*ast.FuncType).Results), - } - fixParamPackagePath(i.imports, method.Params) - r.Methods = append(r.Methods, method) - } - } - i.Interfaces = append(i.Interfaces, r) - } - } - return i -} - -// getInterfaceFromFile get interfaces -// get all interfaces from file and compare with specified name -func (i *InterfaceSet) getInterfaceFromFile(filename string, name, Package string, structNames []string) error { - fileset := token.NewFileSet() - f, err := parser.ParseFile(fileset, filename, nil, parser.ParseComments) - if err != nil { - return fmt.Errorf("can't parse file %q: %s", filename, err) - } - - astResult := &InterfaceSet{imports: make(map[string]string)} - ast.Walk(astResult, f) - - for _, info := range astResult.Interfaces { - if name == info.Name { - info.Package = Package - info.ApplyStruct = structNames - i.Interfaces = append(i.Interfaces, info) - } - } - - return nil -} - -// Param parameters in method -type Param struct { // (user model.User) - PkgPath string // package's path: internal/model - Package string // package's name: model - Name string // param's name: user - Type string // param's type: User - IsArray bool // is array or not - IsPointer bool // is pointer or not -} - -// Eq if param equal to another -func (p *Param) Eq(q Param) bool { - return p.Package == q.Package && p.Type == q.Type -} - -// IsError ... -func (p *Param) IsError() bool { - return p.Type == "error" -} - -// IsGenM ... -func (p *Param) IsGenM() bool { - return p.Package == "gen" && p.Type == "M" -} - -// IsGenRowsAffected ... -func (p *Param) IsGenRowsAffected() bool { - return p.Package == "gen" && p.Type == "RowsAffected" -} - -// IsMap ... -func (p *Param) IsMap() bool { - return strings.HasPrefix(p.Type, "map[") -} - -// IsGenT ... -func (p *Param) IsGenT() bool { - return p.Package == "gen" && p.Type == "T" -} - -// IsInterface ... -func (p *Param) IsInterface() bool { - return p.Type == "interface{}" -} - -// IsNull ... -func (p *Param) IsNull() bool { - return p.Package == "" && p.Type == "" && p.Name == "" -} - -// InMainPkg ... -func (p *Param) InMainPkg() bool { - return p.Package == "main" -} - -// IsTime ... -func (p *Param) IsTime() bool { - return p.Package == "time" && p.Type == "Time" -} - -// IsSQLResult ... -func (p *Param) IsSQLResult() bool { - return (p.Package == "sql" && p.Type == "Result") || (p.Package == "gen" && p.Type == "SQLResult") -} - -// IsSQLRow ... -func (p *Param) IsSQLRow() bool { - return (p.Package == "sql" && p.Type == "Row") || (p.Package == "gen" && p.Type == "SQLRow") -} - -// IsSQLRows ... -func (p *Param) IsSQLRows() bool { - return (p.Package == "sql" && p.Type == "Rows") || (p.Package == "gen" && p.Type == "SQLRows") -} - -// SetName ... -func (p *Param) SetName(name string) { - p.Name = name -} - -// TypeName ... -func (p *Param) TypeName() string { - if p.IsArray { - return "[]" + p.Type - } - return p.Type -} - -// TmplString param to string in tmpl -func (p *Param) TmplString() string { - var res strings.Builder - if p.Name != "" { - res.WriteString(p.Name) - res.WriteString(" ") - } - - if p.IsArray { - res.WriteString("[]") - } - if p.IsPointer { - res.WriteString("*") - } - if p.Package != "" { - res.WriteString(p.Package) - res.WriteString(".") - } - res.WriteString(p.Type) - return res.String() -} - -// IsBaseType judge whether the param type is basic type -func (p *Param) IsBaseType() bool { - switch p.Type { - case "string", "byte": - return true - case "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64": - return true - case "float64", "float32": - return true - case "bool": - return true - case "time.Time": - return true - default: - return false - } -} - -func (p *Param) astGetParamType(param *ast.Field) { - switch v := param.Type.(type) { - case *ast.Ident: - p.Type = v.Name - if v.Obj != nil { - p.Package = "UNDEFINED" // set a placeholder - } - case *ast.SelectorExpr: - p.astGetEltType(v) - case *ast.ArrayType: - p.astGetEltType(v.Elt) - p.IsArray = true - case *ast.Ellipsis: - p.astGetEltType(v.Elt) - p.IsArray = true - case *ast.MapType: - p.astGetMapType(v) - case *ast.InterfaceType: - p.Type = "interface{}" - case *ast.StarExpr: - p.IsPointer = true - p.astGetEltType(v.X) - default: - log.Fatalf("unknow param type: %+v", v) - } -} - -func (p *Param) astGetEltType(expr ast.Expr) { - switch v := expr.(type) { - case *ast.Ident: - p.Type = v.Name - if v.Obj != nil { - p.Package = "UNDEFINED" - } - case *ast.SelectorExpr: - p.Type = v.Sel.Name - p.astGetPackageName(v.X) - case *ast.MapType: - p.astGetMapType(v) - case *ast.StarExpr: - p.IsPointer = true - p.astGetEltType(v.X) - case *ast.InterfaceType: - p.Type = "interface{}" - case *ast.ArrayType: - p.astGetEltType(v.Elt) - p.Type = "[]" + p.Type - default: - log.Fatalf("unknow param type: %+v", v) - } -} - -func (p *Param) astGetPackageName(expr ast.Expr) { - switch v := expr.(type) { - case *ast.Ident: - p.Package = v.Name - } -} - -func (p *Param) astGetMapType(expr *ast.MapType) { - p.Type = fmt.Sprintf("map[%s]%s", astGetType(expr.Key), astGetType(expr.Value)) -} - -func astGetType(expr ast.Expr) string { - switch v := expr.(type) { - case *ast.Ident: - return v.Name - case *ast.InterfaceType: - return "interface{}" - } - return "" -} diff --git a/toolkit/gormgen/internal/parser/utils.go b/toolkit/gormgen/internal/parser/utils.go deleted file mode 100644 index 297c46ee..00000000 --- a/toolkit/gormgen/internal/parser/utils.go +++ /dev/null @@ -1,39 +0,0 @@ -package parser - -import "go/ast" - -func getParamList(fields *ast.FieldList) []Param { - if fields == nil { - return nil - } - var pars []Param - if len(fields.List) < 1 { - return nil - } - for _, field := range fields.List { - if field.Names == nil { - par := Param{} - par.astGetParamType(field) - pars = append(pars, par) - continue - } - - for _, name := range field.Names { - par := Param{ - Name: name.Name, - } - par.astGetParamType(field) - pars = append(pars, par) - continue - } - } - return pars -} - -func fixParamPackagePath(imports map[string]string, params []Param) { - for i := range params { - if importPath, exist := imports[params[i].Package]; exist { - params[i].PkgPath = importPath - } - } -} diff --git a/toolkit/gormgen/internal/template/appendsvc.go b/toolkit/gormgen/internal/template/appendsvc.go deleted file mode 100644 index 83fac09a..00000000 --- a/toolkit/gormgen/internal/template/appendsvc.go +++ /dev/null @@ -1,24 +0,0 @@ -package template - -const AppendSvc = ` -// PostGen{{.ModelStructName}} {{.StructComment}} -` + NotEditMarkForGDDShort + ` -PostGen{{.ModelStructName}}(ctx context.Context, body model.{{.ModelStructName}}) (model.{{.ModelStructName}}, error) - -// GetGen{{.ModelStructName}} {{.StructComment}} -` + NotEditMarkForGDDShort + ` -GetGen{{.ModelStructName}}(ctx context.Context, body model.{{.ModelStructName}}) (model.{{.ModelStructName}}, error) - -// PutGen{{.ModelStructName}} {{.StructComment}} -` + NotEditMarkForGDDShort + ` -PutGen{{.ModelStructName}}(ctx context.Context, body model.{{.ModelStructName}}) error - -// DeleteGen{{.ModelStructName}} {{.StructComment}} -` + NotEditMarkForGDDShort + ` -DeleteGen{{.ModelStructName}}(ctx context.Context, body model.{{.ModelStructName}}) error - -// GetGen{{.ModelStructName}}s {{.StructComment}} -` + NotEditMarkForGDDShort + ` -GetGen{{.ModelStructName}}s(ctx context.Context, parameter dto.Parameter) (data dto.Page, err error) - -` diff --git a/toolkit/gormgen/internal/template/appendsvcimpl.go b/toolkit/gormgen/internal/template/appendsvcimpl.go deleted file mode 100644 index 4f8425e7..00000000 --- a/toolkit/gormgen/internal/template/appendsvcimpl.go +++ /dev/null @@ -1,64 +0,0 @@ -package template - -const AppendSvcImpl = ` -// PostGen{{.ModelStructName}}Rpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) PostGen{{.ModelStructName}}Rpc(ctx context.Context, body *pb.{{.ModelStructName}}) (data *pb.{{.ModelStructName}}, err error) { - var m model.{{.ModelStructName}} - copier.DeepCopy(body, &m) - u := receiver.q.{{.ModelStructName}} - if err = u.WithContext(ctx).Create(&m); err != nil { - return nil, errors.WithStack(err) - } - data = new(pb.{{.ModelStructName}}) - copier.DeepCopy(m, data) - return -} - -// GetGen{{.ModelStructName}}Rpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) GetGen{{.ModelStructName}}Rpc(ctx context.Context, body *pb.{{.ModelStructName}}) (data *pb.{{.ModelStructName}}, err error) { - u := receiver.q.{{.ModelStructName}} - m, err := u.WithContext(ctx).Where(u.ID.Eq(*body.{{.PbPrimaryProp}})).First() - if err != nil { - return nil, errors.WithStack(err) - } - data = new(pb.{{.ModelStructName}}) - copier.DeepCopy(m, data) - return -} - -// PutGen{{.ModelStructName}}Rpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) PutGen{{.ModelStructName}}Rpc(ctx context.Context, body *pb.{{.ModelStructName}}) (*emptypb.Empty, error) { - var m model.{{.ModelStructName}} - copier.DeepCopy(body, &m) - u := receiver.q.{{.ModelStructName}} - _, err := u.WithContext(ctx).Where(u.ID.Eq(*body.{{.PbPrimaryProp}})).Updates(m) - return &emptypb.Empty{}, errors.WithStack(err) -} - -// DeleteGen{{.ModelStructName}}Rpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) DeleteGen{{.ModelStructName}}Rpc(ctx context.Context, body *pb.{{.ModelStructName}}) (*emptypb.Empty, error) { - u := receiver.q.{{.ModelStructName}} - _, err := u.WithContext(ctx).Where(u.ID.Eq(*body.{{.PbPrimaryProp}})).Delete() - return &emptypb.Empty{}, errors.WithStack(err) -} - -// GetGen{{.ModelStructName}}sRpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) GetGen{{.ModelStructName}}sRpc(ctx context.Context, request *pb.Parameter) (data *pb.Page, err error) { - var body dto.Parameter - copier.DeepCopy(request, &body) - resCxt := receiver.pg.With(receiver.q.Db().Model(&model.{{.ModelStructName}}{})).Request(body) - paginated := resCxt.Response(&[]model.{{.ModelStructName}}{}) - if resCxt.Error() != nil { - return nil, errors.WithStack(resCxt.Error()) - } - data = new(pb.Page) - copier.DeepCopy(paginated, data) - return -} - -` diff --git a/toolkit/gormgen/internal/template/appendsvcimplgrpc.go b/toolkit/gormgen/internal/template/appendsvcimplgrpc.go deleted file mode 100644 index 651f51a7..00000000 --- a/toolkit/gormgen/internal/template/appendsvcimplgrpc.go +++ /dev/null @@ -1,91 +0,0 @@ -package template - -const AppendSvcImplGrpc = ` -// PostGen{{.ModelStructName}}Rpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) PostGen{{.ModelStructName}}Rpc(ctx context.Context, request *pb.{{.ModelStructName}}) (*pb.PostGen{{.ModelStructName}}RpcResponse, error) { - var body dto.{{.ModelStructName}} - copier.DeepCopy(request, &body) - data, err := receiver.PostGen{{.ModelStructName}}(ctx, body) - return &pb.PostGen{{.ModelStructName}}RpcResponse{ - Data: data, - }, errors.WithStack(err) -} - -// PostGen{{.ModelStructName}}sRpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) PostGen{{.ModelStructName}}sRpc(ctx context.Context, request *pb.PostGen{{.ModelStructName}}sRpcRequest) (*pb.PostGen{{.ModelStructName}}sRpcResponse, error) { - list := make([]dto.{{.ModelStructName}}, 0, len(request.Body)) - for _, item := range request.Body { - var d dto.{{.ModelStructName}} - copier.DeepCopy(item, &d) - list = append(list, d) - } - data, err := receiver.PostGen{{.ModelStructName}}s(ctx, list) - return &pb.PostGen{{.ModelStructName}}sRpcResponse{ - Data: data, - }, errors.WithStack(err) -} - -// GetGen{{.ModelStructName}}IdRpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) GetGen{{.ModelStructName}}IdRpc(ctx context.Context, request *pb.GetGen{{.ModelStructName}}IdRpcRequest) (*pb.{{.ModelStructName}}, error) { - data, err := receiver.GetGen{{.ModelStructName}}_Id(ctx, request.Id) - if err != nil { - return nil, errors.WithStack(err) - } - var ret pb.{{.ModelStructName}} - copier.DeepCopy(data, &ret) - return &ret, nil -} - -// PutGen{{.ModelStructName}}Rpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) PutGen{{.ModelStructName}}Rpc(ctx context.Context, request *pb.{{.ModelStructName}}) (*emptypb.Empty, error) { - var body dto.{{.ModelStructName}} - copier.DeepCopy(request, &body) - return &emptypb.Empty{}, errors.WithStack(receiver.PutGen{{.ModelStructName}}(ctx, body)) -} - -// DeleteGen{{.ModelStructName}}IdRpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) DeleteGen{{.ModelStructName}}IdRpc(ctx context.Context, request *pb.DeleteGen{{.ModelStructName}}IdRpcRequest) (*emptypb.Empty, error) { - return &emptypb.Empty{}, errors.WithStack(receiver.DeleteGen{{.ModelStructName}}_Id(ctx, request.Id)) -} - -// GetGen{{.ModelStructName}}sRpc {{.StructComment}} -` + NotEditMarkForGDDShort + ` -func (receiver *{{.InterfaceName}}Impl) GetGen{{.ModelStructName}}sRpc(ctx context.Context, request *pb.Parameter) (*pb.Page, error) { - filters := make([]interface{}, 0, len(request.Filters)) - for _, item := range request.Filters { - str := wrappers.StringValue{} - if err := anypb.UnmarshalTo(item, &str, proto.UnmarshalOptions{}); err != nil { - return nil, errors.WithStack(err) - } - filters = append(filters, str.Value) - } - var parameter dto.Parameter - copier.DeepCopy(request, ¶meter) - parameter.Filters = filters - data, err := receiver.GetGen{{.ModelStructName}}s(ctx, parameter) - if err != nil { - return nil, errors.WithStack(err) - } - items := make([]*anypb.Any, 0, len(data.Items)) - for _, item := range data.Items { - d := dto.{{.ModelStructName}}(item.(model.{{.ModelStructName}})) - var msg pb.{{.ModelStructName}} - copier.DeepCopy(d, &msg) - a, err := anypb.New(&msg) - if err != nil { - return nil, errors.WithStack(err) - } - items = append(items, a) - } - var ret pb.Page - copier.DeepCopy(data, &ret) - ret.Items = items - return &ret, nil -} - -` diff --git a/toolkit/gormgen/internal/template/base.go b/toolkit/gormgen/internal/template/base.go deleted file mode 100644 index fa2a06cf..00000000 --- a/toolkit/gormgen/internal/template/base.go +++ /dev/null @@ -1,29 +0,0 @@ -package template - -const NotEditMark = ` -// Code generated by github.com/wubin1989/gen. DO NOT EDIT. -// Code generated by github.com/wubin1989/gen. DO NOT EDIT. -// Code generated by github.com/wubin1989/gen. DO NOT EDIT. -` - -const EditMark = ` -// Code generated by github.com/wubin1989/gen. YOU CAN EDIT. -// Code generated by github.com/wubin1989/gen. YOU CAN EDIT. -// Code generated by github.com/wubin1989/gen. YOU CAN EDIT. -` - -const NotEditMarkForGDDShort = `// Code generated by github.com/wubin1989/gen for go-doudou. DO NOT EDIT.` - -const EditMarkForGDD = ` -// Code generated by github.com/wubin1989/gen for go-doudou. YOU CAN EDIT. -// Code generated by github.com/wubin1989/gen for go-doudou. YOU CAN EDIT. -// Code generated by github.com/wubin1989/gen for go-doudou. YOU CAN EDIT. -` - -const Header = NotEditMark + ` -package {{.Package}} - -import( - {{range .ImportPkgPaths}}{{.}}` + "\n" + `{{end}} -) -` diff --git a/toolkit/gormgen/internal/template/dto.go b/toolkit/gormgen/internal/template/dto.go deleted file mode 100644 index b8b77166..00000000 --- a/toolkit/gormgen/internal/template/dto.go +++ /dev/null @@ -1,30 +0,0 @@ -package template - -// Dto used as a variable because it cannot load template file after packed, params still can pass file -const Dto = EditMark + ` -package dto - -import ( - "encoding/json" - "time" - - "github.com/wubin1989/datatypes" - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/schema" - {{range .ImportPkgPaths}}{{.}} ` + "\n" + `{{end}} -) - -// {{.ModelStructName}} {{.StructComment}} -type {{.ModelStructName}} struct { - {{range .Fields}} - {{if .MultilineComment -}} - /* -{{.ColumnComment}} - */ - {{end -}} - {{.Name}} {{.Type | convert}} ` + "`{{.Tags}}` " + - "{{if not .MultilineComment}}{{if .ColumnComment}}// {{.ColumnComment}}{{end}}{{end}}" + - `{{end}} -} - -` diff --git a/toolkit/gormgen/internal/template/method.go b/toolkit/gormgen/internal/template/method.go deleted file mode 100644 index 4b2ab2a2..00000000 --- a/toolkit/gormgen/internal/template/method.go +++ /dev/null @@ -1,438 +0,0 @@ -package template - -// DIYMethod DIY method -const DIYMethod = ` - -// {{.DocComment }} -func ({{.S}} {{.TargetStruct}}Do){{.FuncSign}}{ - {{if .HasSQLData}}var params []interface{} - - {{end}}var generateSQL strings.Builder - {{range $line:=.Section.Tmpls}}{{$line}} - {{end}} - - {{if .HasNeedNewResult}}result ={{if .ResultData.IsMap}}make{{else}}new{{end}}({{if ne .ResultData.Package ""}}{{.ResultData.Package}}.{{end}}{{.ResultData.Type}}){{end}} - {{if .ReturnSQLResult}}stmt := {{.S}}.UnderlyingDB().Statement - result,{{if .ReturnError}}err{{else}}_{{end}} = stmt.ConnPool.ExecContext(stmt.Context,generateSQL.String(){{if .HasSQLData}},params...{{end}}) // ignore_security_alert - {{else if .ReturnSQLRow}}row = {{.S}}.UnderlyingDB().Raw(generateSQL.String(){{if .HasSQLData}},params...{{end}}).Row() // ignore_security_alert - {{else if .ReturnSQLRows}}rows,{{if .ReturnError}}err{{else}}_{{end}} = {{.S}}.UnderlyingDB().Raw(generateSQL.String(){{if .HasSQLData}},params...{{end}}).Rows() // ignore_security_alert - {{else}}var executeSQL *gorm.DB - executeSQL = {{.S}}.UnderlyingDB().{{.GormOption}}(generateSQL.String(){{if .HasSQLData}},params...{{end}}){{if not .ResultData.IsNull}}.{{.GormRunMethodName}}({{if .HasGotPoint}}&{{end}}{{.ResultData.Name}}){{end}} // ignore_security_alert - {{if .ReturnRowsAffected}}rowsAffected = executeSQL.RowsAffected - {{end}}{{if .ReturnError}}err = executeSQL.Error - {{end}}{{if .ReturnNothing}}_ = executeSQL - {{end}}{{end}} - return -} - -` - -// CRUDMethod CRUD method -const CRUDMethod = ` -func ({{.S}} {{.QueryStructName}}Do) Debug() {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Debug()) -} - -func ({{.S}} {{.QueryStructName}}Do) WithContext(ctx context.Context) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.WithContext(ctx)) -} - -func ({{.S}} {{.QueryStructName}}Do) ReadDB() {{.ReturnObject}} { - return {{.S}}.Clauses(dbresolver.Read) -} - -func ({{.S}} {{.QueryStructName}}Do) WriteDB() {{.ReturnObject}} { - return {{.S}}.Clauses(dbresolver.Write) -} - -func ({{.S}} {{.QueryStructName}}Do) Session(config *gorm.Session) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Session(config)) -} - -func ({{.S}} {{.QueryStructName}}Do) Clauses(conds ...clause.Expression) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Clauses(conds...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Returning(value interface{}, columns ...string) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Returning(value, columns...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Not(conds ...gormgen.Condition) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Not(conds...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Or(conds ...gormgen.Condition) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Or(conds...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Select(conds ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Select(conds...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Where(conds ...gormgen.Condition) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Where(conds...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Exists(subquery interface{UnderlyingDB() *gorm.DB}) {{.ReturnObject}} { - return {{.S}}.Where(field.CompareSubQuery(field.ExistsOp, nil, subquery.UnderlyingDB())) -} - -func ({{.S}} {{.QueryStructName}}Do) Order(conds ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Order(conds...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Distinct(cols ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Distinct(cols...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Omit(cols ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Omit(cols...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Join(table schema.Tabler, on ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Join(table, on...)) -} - -func ({{.S}} {{.QueryStructName}}Do) LeftJoin(table schema.Tabler, on ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.LeftJoin(table, on...)) -} - -func ({{.S}} {{.QueryStructName}}Do) RightJoin(table schema.Tabler, on ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.RightJoin(table, on...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Group(cols ...field.Expr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Group(cols...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Having(conds ...gormgen.Condition) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Having(conds...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Limit(limit int) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Limit(limit)) -} - -func ({{.S}} {{.QueryStructName}}Do) Offset(offset int) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Offset(offset)) -} - -func ({{.S}} {{.QueryStructName}}Do) Scopes(funcs ...func(gormgen.Dao) gormgen.Dao) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Scopes(funcs...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Unscoped() {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Unscoped()) -} - -func ({{.S}} {{.QueryStructName}}Do) Create(values ...*{{.StructInfo.Package}}.{{.StructInfo.Type}}) error { - if len(values) == 0 { - return nil - } - return {{.S}}.DO.Create(values) -} - -func ({{.S}} {{.QueryStructName}}Do) CreateInBatches(values []*{{.StructInfo.Package}}.{{.StructInfo.Type}}, batchSize int) error { - return {{.S}}.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func ({{.S}} {{.QueryStructName}}Do) Save(values ...*{{.StructInfo.Package}}.{{.StructInfo.Type}}) error { - if len(values) == 0 { - return nil - } - return {{.S}}.DO.Save(values) -} - -func ({{.S}} {{.QueryStructName}}Do) First() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) { - if result, err := {{.S}}.DO.First(); err != nil { - return nil, err - } else { - return result.(*{{.StructInfo.Package}}.{{.StructInfo.Type}}), nil - } -} - -func ({{.S}} {{.QueryStructName}}Do) Take() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) { - if result, err := {{.S}}.DO.Take(); err != nil { - return nil, err - } else { - return result.(*{{.StructInfo.Package}}.{{.StructInfo.Type}}), nil - } -} - -func ({{.S}} {{.QueryStructName}}Do) Last() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) { - if result, err := {{.S}}.DO.Last(); err != nil { - return nil, err - } else { - return result.(*{{.StructInfo.Package}}.{{.StructInfo.Type}}), nil - } -} - -func ({{.S}} {{.QueryStructName}}Do) Find() ([]*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) { - result, err := {{.S}}.DO.Find() - return result.([]*{{.StructInfo.Package}}.{{.StructInfo.Type}}), err -} - -func ({{.S}} {{.QueryStructName}}Do) FindInBatch(batchSize int, fc func(tx gormgen.Dao, batch int) error) (results []*{{.StructInfo.Package}}.{{.StructInfo.Type}}, err error) { - buf := make([]*{{.StructInfo.Package}}.{{.StructInfo.Type}}, 0, batchSize) - err = {{.S}}.DO.FindInBatches(&buf, batchSize, func(tx gormgen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func ({{.S}} {{.QueryStructName}}Do) FindInBatches(result *[]*{{.StructInfo.Package}}.{{.StructInfo.Type}}, batchSize int, fc func(tx gormgen.Dao, batch int) error) error { - return {{.S}}.DO.FindInBatches(result, batchSize, fc) -} - -func ({{.S}} {{.QueryStructName}}Do) Attrs(attrs ...field.AssignExpr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Attrs(attrs...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Assign(attrs ...field.AssignExpr) {{.ReturnObject}} { - return {{.S}}.withDO({{.S}}.DO.Assign(attrs...)) -} - -func ({{.S}} {{.QueryStructName}}Do) Joins(fields ...field.RelationField) {{.ReturnObject}} { - for _, _f := range fields { - {{.S}} = *{{.S}}.withDO({{.S}}.DO.Joins(_f)) - } - return &{{.S}} -} - -func ({{.S}} {{.QueryStructName}}Do) Preload(fields ...field.RelationField) {{.ReturnObject}} { - for _, _f := range fields { - {{.S}} = *{{.S}}.withDO({{.S}}.DO.Preload(_f)) - } - return &{{.S}} -} - -func ({{.S}} {{.QueryStructName}}Do) FirstOrInit() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) { - if result, err := {{.S}}.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*{{.StructInfo.Package}}.{{.StructInfo.Type}}), nil - } -} - -func ({{.S}} {{.QueryStructName}}Do) FirstOrCreate() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) { - if result, err := {{.S}}.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*{{.StructInfo.Package}}.{{.StructInfo.Type}}), nil - } -} - -func ({{.S}} {{.QueryStructName}}Do) FindByPage(offset int, limit int) (result []*{{.StructInfo.Package}}.{{.StructInfo.Type}}, count int64, err error) { - result, err = {{.S}}.Offset(offset).Limit(limit).Find() - if err != nil{ - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size+offset) - return - } - - count, err = {{.S}}.Offset(-1).Limit(-1).Count() - return -} - -func ({{.S}} {{.QueryStructName}}Do) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = {{.S}}.Count() - if err != nil { - return - } - - err = {{.S}}.Offset(offset).Limit(limit).Scan(result) - return -} - -func ({{.S}} {{.QueryStructName}}Do) Scan(result interface{}) (err error) { - return {{.S}}.DO.Scan(result) -} - -func ({{.S}} {{.QueryStructName}}Do) Fetch(result interface{}) (err error) { - return {{.S}}.DO.Fetch(result) -} - -func ({{.S}} {{.QueryStructName}}Do) Delete(models ...*{{.StructInfo.Package}}.{{.StructInfo.Type}}) (result gormgen.ResultInfo, err error) { - return {{.S}}.DO.Delete(models) -} - -func ({{.S}} *{{.QueryStructName}}Do) withDO(do gormgen.Dao) (*{{.QueryStructName}}Do) { - {{.S}}.DO = *do.(*gormgen.DO) - return {{.S}} -} - -` - -// CRUDMethodTest CRUD method test -const CRUDMethodTest = ` -func init() { - InitializeDB() - err := db.AutoMigrate(&{{.StructInfo.Package}}.{{.ModelStructName}}{}) - if err != nil{ - fmt.Printf("Error: AutoMigrate(&{{.StructInfo.Package}}.{{.ModelStructName}}{}) fail: %s", err) - } -} - -func Test_{{.QueryStructName}}Query(t *testing.T) { - {{.QueryStructName}} := new{{.ModelStructName}}(db) - {{.QueryStructName}} = *{{.QueryStructName}}.As({{.QueryStructName}}.TableName()) - _do := {{.QueryStructName}}.WithContext(context.Background()).Debug() - - primaryKey := field.NewString({{.QueryStructName}}.TableName(), clause.PrimaryKey) - _, err := _do.Unscoped().Where(primaryKey.IsNotNull()).Delete() - if err != nil { - t.Error("clean table <{{.TableName}}> fail:", err) - return - } - - _, ok := {{.QueryStructName}}.GetFieldByName("") - if ok { - t.Error("GetFieldByName(\"\") from {{.QueryStructName}} success") - } - - err = _do.Create(&{{.StructInfo.Package}}.{{.ModelStructName}}{}) - if err != nil { - t.Error("create item in table <{{.TableName}}> fail:", err) - } - - err = _do.Save(&{{.StructInfo.Package}}.{{.ModelStructName}}{}) - if err != nil { - t.Error("create item in table <{{.TableName}}> fail:", err) - } - - err = _do.CreateInBatches([]*{{.StructInfo.Package}}.{{.ModelStructName}}{ {}, {} }, 10) - if err != nil { - t.Error("create item in table <{{.TableName}}> fail:", err) - } - - _, err = _do.Select({{.QueryStructName}}.ALL).Take() - if err != nil { - t.Error("Take() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.First() - if err != nil { - t.Error("First() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Last() - if err != nil { - t.Error("First() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Where(primaryKey.IsNotNull()).FindInBatch(10, func(tx gormgen.Dao, batch int) error { return nil }) - if err != nil { - t.Error("FindInBatch() on table <{{.TableName}}> fail:", err) - } - - err = _do.Where(primaryKey.IsNotNull()).FindInBatches(&[]*{{.StructInfo.Package}}.{{.ModelStructName}}{}, 10, func(tx gormgen.Dao, batch int) error { return nil }) - if err != nil { - t.Error("FindInBatches() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Select({{.QueryStructName}}.ALL).Where(primaryKey.IsNotNull()).Order(primaryKey.Desc()).Find() - if err != nil { - t.Error("Find() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Distinct(primaryKey).Take() - if err != nil { - t.Error("select Distinct() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Select({{.QueryStructName}}.ALL).Omit(primaryKey).Take() - if err != nil { - t.Error("Omit() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Group(primaryKey).Find() - if err != nil { - t.Error("Group() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Scopes(func(dao gormgen.Dao) gormgen.Dao { return dao.Where(primaryKey.IsNotNull()) }).Find() - if err != nil { - t.Error("Scopes() on table <{{.TableName}}> fail:", err) - } - - _, _, err = _do.FindByPage(0, 1) - if err != nil { - t.Error("FindByPage() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.ScanByPage(&{{.StructInfo.Package}}.{{.ModelStructName}}{}, 0, 1) - if err != nil { - t.Error("ScanByPage() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Attrs(primaryKey).Assign(primaryKey).FirstOrInit() - if err != nil { - t.Error("FirstOrInit() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Attrs(primaryKey).Assign(primaryKey).FirstOrCreate() - if err != nil { - t.Error("FirstOrCreate() on table <{{.TableName}}> fail:", err) - } - - var _a _another - var _aPK = field.NewString(_a.TableName(), clause.PrimaryKey) - - err = _do.Join(&_a, primaryKey.EqCol(_aPK)).Scan(map[string]interface{}{}) - if err != nil { - t.Error("Join() on table <{{.TableName}}> fail:", err) - } - - err = _do.LeftJoin(&_a, primaryKey.EqCol(_aPK)).Scan(map[string]interface{}{}) - if err != nil { - t.Error("LeftJoin() on table <{{.TableName}}> fail:", err) - } - - _, err = _do.Not().Or().Clauses().Take() - if err != nil { - t.Error("Not/Or/Clauses on table <{{.TableName}}> fail:", err) - } -} -` - -// DIYMethodTestBasic DIY method test basic -const DIYMethodTestBasic = ` -type Input struct { - Args []interface{} -} - -type Expectation struct { - Ret []interface{} -} - -type TestCase struct { - Input - Expectation -} - -` - -// DIYMethodTest DIY method test -const DIYMethodTest = ` - -var {{.OriginStruct.Type}}{{.MethodName}}TestCase = []TestCase{} - -func Test_{{.TargetStruct}}_{{.MethodName}}(t *testing.T) { - {{.TargetStruct}} := new{{.OriginStruct.Type}}(db) - do := {{.TargetStruct}}.WithContext(context.Background()).Debug() - - for i, tt := range {{.OriginStruct.Type}}{{.MethodName}}TestCase { - t.Run("{{.MethodName}}_"+strconv.Itoa(i), func(t *testing.T) { - {{.GetTestResultParamInTmpl}} := do.{{.MethodName}}({{.GetTestParamInTmpl}}) - {{.GetAssertInTmpl}} - }) - } -} - -` diff --git a/toolkit/gormgen/internal/template/model.go b/toolkit/gormgen/internal/template/model.go deleted file mode 100644 index f5ad31f8..00000000 --- a/toolkit/gormgen/internal/template/model.go +++ /dev/null @@ -1,53 +0,0 @@ -package template - -// Model used as a variable because it cannot load template file after packed, params still can pass file -const Model = NotEditMark + ` -package {{.StructInfo.Package}} - -import ( - "{{.ConfigPackage}}" - "fmt" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - - "encoding/json" - "time" - - "github.com/wubin1989/datatypes" - "github.com/wubin1989/gorm" - "github.com/wubin1989/gorm/schema" - {{range .ImportPkgPaths}}{{.}} ` + "\n" + `{{end}} -) - -// {{.ModelStructName}} {{.StructComment}} -type {{.ModelStructName}} struct { - {{range .Fields}} - {{if .MultilineComment -}} - /* -{{.ColumnComment}} - */ - {{end -}} - {{.Name}} {{.Type | convert}} ` + "`{{.Tags}}` " + - "{{if not .MultilineComment}}{{if .ColumnComment}}// {{.ColumnComment}}{{end}}{{end}}" + - `{{end}} -} - -// TableName {{.ModelStructName}}'s table name -func (*{{.ModelStructName}}) TableName() string { - {{if .TableName -}}var TableName{{.ModelStructName}} string{{- end}} - - if stringutils.IsNotEmpty(config.G_Config.Db.Name) { - TableName{{.ModelStructName}} = fmt.Sprintf("%s.{{.TableName}}", config.G_Config.Db.Name) - } else { - TableName{{.ModelStructName}} = "{{.TableName}}" - } - - return TableName{{.ModelStructName}} -} -` - -// ModelMethod model struct DIY method -const ModelMethod = ` - -{{if .Doc -}}// {{.DocComment -}}{{end}} -func ({{.GetBaseStructTmpl}}){{.MethodName}}({{.GetParamInTmpl}})({{.GetResultParamInTmpl}}){{.Body}} -` diff --git a/toolkit/gormgen/internal/template/query.go b/toolkit/gormgen/internal/template/query.go deleted file mode 100644 index d554d730..00000000 --- a/toolkit/gormgen/internal/template/query.go +++ /dev/null @@ -1,211 +0,0 @@ -package template - -// DefaultQuery default query -const DefaultQuery = ` -var ( - Q =new(Query) - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}} *{{$d.QueryStructName}} - {{end -}} -) - -func SetDefault(db *gorm.DB, opts ...gormgen.DOOption) { - *Q = *Use(db,opts...) - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}} = &Q.{{$d.ModelStructName}} - {{end -}} -} - -` - -// QueryMethod query method template -const QueryMethod = ` -func Use(db *gorm.DB, opts ...gormgen.DOOption) *Query { - return &Query{ - db: db, - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}}: new{{$d.ModelStructName}}(db,opts...), - {{end -}} - } -} - -type Query struct{ - db *gorm.DB - - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}} {{$d.QueryStructName}} - {{end}} -} - -func (q *Query) Available() bool { return q.db != nil } - -func (q *Query) Clone(db *gorm.DB) *Query { - return &Query{ - db: db, - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}}: q.{{$d.ModelStructName}}.clone(db), - {{end}} - } -} - -func (q *Query) Db() *gorm.DB { - return q.db -} - -func (q *Query) ReadDB() *Query { - return q.ReplaceDB(q.db.Clauses(dbresolver.Read)) -} - -func (q *Query) WriteDB() *Query { - return q.ReplaceDB(q.db.Clauses(dbresolver.Write)) -} - -func (q *Query) ReplaceDB(db *gorm.DB) *Query { - return &Query{ - db: db, - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}}: q.{{$d.ModelStructName}}.replaceDB(db), - {{end}} - } -} - -type queryCtx struct{ - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}} {{$d.ReturnObject}} - {{end}} -} - -func (q *Query) WithContext(ctx context.Context) *queryCtx { - return &queryCtx{ - {{range $name,$d :=.Data -}} - {{$d.ModelStructName}}: q.{{$d.ModelStructName}}.WithContext(ctx), - {{end}} - } -} - -func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error { - return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.Clone(tx)) }, opts...) -} - -func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx { - tx := q.db.Begin(opts...) - return &QueryTx{Query: q.Clone(tx), Error: tx.Error} -} - -type QueryTx struct { - *Query - Error error -} - -func (q *QueryTx) Commit() error { - return q.db.Commit().Error -} - -func (q *QueryTx) Rollback() error { - return q.db.Rollback().Error -} - -func (q *QueryTx) SavePoint(name string) error { - return q.db.SavePoint(name).Error -} - -func (q *QueryTx) RollbackTo(name string) error { - return q.db.RollbackTo(name).Error -} - -` - -// QueryMethodTest query method test template -const QueryMethodTest = ` - -const dbName = "gen_test.db" - -var db *gorm.DB -var once sync.Once - -func init() { - InitializeDB() - db.AutoMigrate(&_another{}) -} - -func InitializeDB() { - once.Do(func() { - var err error - db, err = gorm.Open(sqlite.Open(dbName), &gorm.Config{}) - if err != nil { - panic(fmt.Errorf("open sqlite %q fail: %w", dbName, err)) - } - }) -} - -func assert(t *testing.T, methodName string, res, exp interface{}) { - if !reflect.DeepEqual(res, exp) { - t.Errorf("%v() gotResult = %v, want %v", methodName, res, exp) - } -} - -type _another struct { - ID uint64 ` + "`" + `gorm:"primaryKey"` + "`" + ` -} - -func (*_another) TableName() string { return "another_for_unit_test" } - -func Test_Available(t *testing.T) { - if !Use(db).Available() { - t.Errorf("query.Available() == false") - } -} - -func Test_WithContext(t *testing.T) { - query := Use(db) - if !query.Available() { - t.Errorf("query Use(db) fail: query.Available() == false") - } - - type Content string - var key, value Content = "gen_tag", "unit_test" - qCtx := query.WithContext(context.WithValue(context.Background(), key, value)) - - for _, ctx := range []context.Context{ - {{range $name,$d :=.Data -}} - qCtx.{{$d.ModelStructName}}.UnderlyingDB().Statement.Context, - {{end}} - } { - if v := ctx.Value(key); v != value { - t.Errorf("get value from context fail, expect %q, got %q", value, v) - } - } -} - -func Test_Transaction(t *testing.T) { - query := Use(db) - if !query.Available() { - t.Errorf("query Use(db) fail: query.Available() == false") - } - - err := query.Transaction(func(tx *Query) error { return nil }) - if err != nil { - t.Errorf("query.Transaction execute fail: %s", err) - } - - tx := query.Begin() - - err = tx.SavePoint("point") - if err != nil { - t.Errorf("query tx SavePoint fail: %s", err) - } - err = tx.RollbackTo("point") - if err != nil { - t.Errorf("query tx RollbackTo fail: %s", err) - } - err = tx.Commit() - if err != nil { - t.Errorf("query tx Commit fail: %s", err) - } - - err = query.Begin().Rollback() - if err != nil { - t.Errorf("query tx Rollback fail: %s", err) - } -} -` diff --git a/toolkit/gormgen/internal/template/struct.go b/toolkit/gormgen/internal/template/struct.go deleted file mode 100644 index 215f1165..00000000 --- a/toolkit/gormgen/internal/template/struct.go +++ /dev/null @@ -1,301 +0,0 @@ -package template - -const ( - // TableQueryStruct table query struct - TableQueryStruct = createMethod + ` - type {{.QueryStructName}} struct { - {{.QueryStructName}}Do - ` + fields + ` - } - ` + tableMethod + asMethond + updateFieldMethod + getFieldMethod + getFieldExprByName + fillFieldMapMethod + cloneMethod + replaceMethod + relationship + defineMethodStruct - - // TableQueryStructWithContext table query struct with context - TableQueryStructWithContext = createMethod + ` - type {{.QueryStructName}} struct { - {{.QueryStructName}}Do {{.QueryStructName}}Do - ` + fields + ` - } - ` + tableMethod + asMethond + updateFieldMethod + ` - - func ({{.S}} *{{.QueryStructName}}) WithContext(ctx context.Context) {{.ReturnObject}} { return {{.S}}.{{.QueryStructName}}Do.WithContext(ctx)} - - func ({{.S}} {{.QueryStructName}}) TableName() string { return {{.S}}.{{.QueryStructName}}Do.TableName() } - - func ({{.S}} {{.QueryStructName}}) Alias() string { return {{.S}}.{{.QueryStructName}}Do.Alias() } - - func ({{.S}} {{.QueryStructName}}) Columns(cols ...field.Expr) gormgen.Columns { return {{.S}}.{{.QueryStructName}}Do.Columns(cols...) } - - ` + getFieldMethod + getFieldExprByName + fillFieldMapMethod + cloneMethod + replaceMethod + relationship + defineMethodStruct - - // TableQueryIface table query interface - TableQueryIface = defineDoInterface -) - -const ( - createMethod = ` - func new{{.ModelStructName}}(db *gorm.DB, opts ...gormgen.DOOption) {{.QueryStructName}} { - _{{.QueryStructName}} := {{.QueryStructName}}{} - - _{{.QueryStructName}}.{{.QueryStructName}}Do.UseDB(db,opts...) - _{{.QueryStructName}}.{{.QueryStructName}}Do.UseModel(&{{.StructInfo.Package}}.{{.StructInfo.Type}}{}) - - tableName := _{{.QueryStructName}}.{{.QueryStructName}}Do.TableName() - _{{$.QueryStructName}}.ALL = field.NewAsterisk(tableName) - {{range .Fields -}} - {{if not .IsRelation -}} - {{- if .ColumnName -}}_{{$.QueryStructName}}.{{.Name}} = field.New{{.GenType}}(tableName, "{{.ColumnName}}"){{- end -}} - {{- else -}} - _{{$.QueryStructName}}.{{.Relation.Name}} = {{$.QueryStructName}}{{.Relation.RelationshipName}}{{.Relation.Name}}{ - db: db.Session(&gorm.Session{}), - - {{.Relation.StructFieldInit}} - } - {{end}} - {{end}} - - _{{$.QueryStructName}}.fillFieldMap() - - return _{{.QueryStructName}} - } - ` - fields = ` - ALL field.Asterisk - {{range .Fields -}} - {{if not .IsRelation -}} - {{if .MultilineComment -}} - /* -{{.ColumnComment}} - */ - {{end -}} - {{- if .ColumnName -}}{{.Name}} field.{{.GenType}}{{if not .MultilineComment}}{{if .ColumnComment}}// {{.ColumnComment}}{{end}}{{end}}{{- end -}} - {{- else -}} - {{.Relation.Name}} {{$.QueryStructName}}{{.Relation.RelationshipName}}{{.Relation.Name}} - {{end}} - {{end}} - - fieldMap map[string]field.Expr -` - tableMethod = ` -func ({{.S}} {{.QueryStructName}}) Table(newTableName string) *{{.QueryStructName}} { - {{.S}}.{{.QueryStructName}}Do.UseTable(newTableName) - return {{.S}}.updateTableName(newTableName) -} -` - - asMethond = ` -func ({{.S}} {{.QueryStructName}}) As(alias string) *{{.QueryStructName}} { - {{.S}}.{{.QueryStructName}}Do.DO = *({{.S}}.{{.QueryStructName}}Do.As(alias).(*gormgen.DO)) - return {{.S}}.updateTableName(alias) -} -` - updateFieldMethod = ` -func ({{.S}} *{{.QueryStructName}}) updateTableName(table string) *{{.QueryStructName}} { - {{.S}}.ALL = field.NewAsterisk(table) - {{range .Fields -}} - {{if not .IsRelation -}} - {{- if .ColumnName -}}{{$.S}}.{{.Name}} = field.New{{.GenType}}(table, "{{.ColumnName}}"){{- end -}} - {{end}} - {{end}} - - {{.S}}.fillFieldMap() - - return {{.S}} -} -` - - cloneMethod = ` -func ({{.S}} {{.QueryStructName}}) clone(db *gorm.DB) {{.QueryStructName}} { - {{.S}}.{{.QueryStructName}}Do.ReplaceConnPool(db.Statement.ConnPool) - return {{.S}} -} -` - replaceMethod = ` -func ({{.S}} {{.QueryStructName}}) replaceDB(db *gorm.DB) {{.QueryStructName}} { - {{.S}}.{{.QueryStructName}}Do.ReplaceDB(db) - return {{.S}} -} -` - getFieldMethod = ` -func ({{.S}} *{{.QueryStructName}}) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := {{.S}}.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe,ok := _f.(field.OrderExpr) - return _oe,ok -} -` - getFieldExprByName = ` -func ({{.S}} *{{.QueryStructName}}) GetFieldExprByName(fieldName string) (field.Expr, bool) { - _f, ok := {{.S}}.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - return _f, ok -} -` - relationship = `{{range .Fields}}{{if .IsRelation}}` + - `{{- $relation := .Relation }}{{- $relationship := $relation.RelationshipName}}` + - relationStruct + relationTx + - `{{end}}{{end}}` - defineMethodStruct = `type {{.QueryStructName}}Do struct { gormgen.DO }` - - fillFieldMapMethod = ` -func ({{.S}} *{{.QueryStructName}}) fillFieldMap() { - {{.S}}.fieldMap = make(map[string]field.Expr, {{len .Fields}}) - {{range .Fields -}} - {{if not .IsRelation -}} - {{- if .ColumnName -}}{{$.S}}.fieldMap["{{.ColumnName}}"] = {{$.S}}.{{.Name}}{{- end -}} - {{end}} - {{end -}} -} -` - - defineDoInterface = ` - -type I{{.ModelStructName}}Do interface { - gormgen.SubQuery - Debug() I{{.ModelStructName}}Do - WithContext(ctx context.Context) I{{.ModelStructName}}Do - WithResult(fc func(tx gormgen.Dao)) gormgen.ResultInfo - ReplaceDB(db *gorm.DB) - ReadDB() I{{.ModelStructName}}Do - WriteDB() I{{.ModelStructName}}Do - As(alias string) gormgen.Dao - Session(config *gorm.Session) I{{.ModelStructName}}Do - Columns(cols ...field.Expr) gormgen.Columns - Clauses(conds ...clause.Expression) I{{.ModelStructName}}Do - Not(conds ...gormgen.Condition) I{{.ModelStructName}}Do - Or(conds ...gormgen.Condition) I{{.ModelStructName}}Do - Select(conds ...field.Expr) I{{.ModelStructName}}Do - Where(conds ...gormgen.Condition) I{{.ModelStructName}}Do - Order(conds ...field.Expr) I{{.ModelStructName}}Do - Distinct(cols ...field.Expr) I{{.ModelStructName}}Do - Omit(cols ...field.Expr) I{{.ModelStructName}}Do - Join(table schema.Tabler, on ...field.Expr) I{{.ModelStructName}}Do - LeftJoin(table schema.Tabler, on ...field.Expr) I{{.ModelStructName}}Do - RightJoin(table schema.Tabler, on ...field.Expr) I{{.ModelStructName}}Do - Group(cols ...field.Expr) I{{.ModelStructName}}Do - Having(conds ...gormgen.Condition) I{{.ModelStructName}}Do - Limit(limit int) I{{.ModelStructName}}Do - Offset(offset int) I{{.ModelStructName}}Do - Count() (count int64, err error) - Scopes(funcs ...func(gormgen.Dao) gormgen.Dao) I{{.ModelStructName}}Do - Unscoped() I{{.ModelStructName}}Do - Create(values ...*{{.StructInfo.Package}}.{{.StructInfo.Type}}) error - CreateInBatches(values []*{{.StructInfo.Package}}.{{.StructInfo.Type}}, batchSize int) error - Save(values ...*{{.StructInfo.Package}}.{{.StructInfo.Type}}) error - First() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) - Take() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) - Last() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) - Find() ([]*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) - FindInBatch(batchSize int, fc func(tx gormgen.Dao, batch int) error) (results []*{{.StructInfo.Package}}.{{.StructInfo.Type}}, err error) - FindInBatches(result *[]*{{.StructInfo.Package}}.{{.StructInfo.Type}}, batchSize int, fc func(tx gormgen.Dao, batch int) error) error - Pluck(column field.Expr, dest interface{}) error - Delete(...*{{.StructInfo.Package}}.{{.StructInfo.Type}}) (info gormgen.ResultInfo, err error) - Update(column field.Expr, value interface{}) (info gormgen.ResultInfo, err error) - UpdateSimple(columns ...field.AssignExpr) (info gormgen.ResultInfo, err error) - Updates(value interface{}) (info gormgen.ResultInfo, err error) - UpdateColumn(column field.Expr, value interface{}) (info gormgen.ResultInfo, err error) - UpdateColumnSimple(columns ...field.AssignExpr) (info gormgen.ResultInfo, err error) - UpdateColumns(value interface{}) (info gormgen.ResultInfo, err error) - UpdateFrom(q gormgen.SubQuery) gormgen.Dao - Attrs(attrs ...field.AssignExpr) I{{.ModelStructName}}Do - Assign(attrs ...field.AssignExpr) I{{.ModelStructName}}Do - Joins(fields ...field.RelationField) I{{.ModelStructName}}Do - Preload(fields ...field.RelationField) I{{.ModelStructName}}Do - FirstOrInit() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) - FirstOrCreate() (*{{.StructInfo.Package}}.{{.StructInfo.Type}}, error) - FindByPage(offset int, limit int) (result []*{{.StructInfo.Package}}.{{.StructInfo.Type}}, count int64, err error) - ScanByPage(result interface{}, offset int, limit int) (count int64, err error) - Scan(result interface{}) (err error) - Fetch(result interface{}) (err error) - Returning(value interface{}, columns ...string) I{{.ModelStructName}}Do - UnderlyingDB() *gorm.DB - schema.Tabler - - {{range .Interfaces -}} - {{.FuncSign}} - {{end}} -} -` -) - -const ( - relationStruct = ` -type {{$.QueryStructName}}{{$relationship}}{{$relation.Name}} struct{ - db *gorm.DB - - field.RelationField - - {{$relation.StructField}} -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}) Where(conds ...field.Expr) *{{$.QueryStructName}}{{$relationship}}{{$relation.Name}} { - if len(conds) == 0 { - return &a - } - - exprs := make([]clause.Expression, 0, len(conds)) - for _, cond := range conds { - exprs = append(exprs, cond.BeCond().(clause.Expression)) - } - a.db = a.db.Clauses(clause.Where{Exprs: exprs}) - return &a -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}) WithContext(ctx context.Context) *{{$.QueryStructName}}{{$relationship}}{{$relation.Name}} { - a.db = a.db.WithContext(ctx) - return &a -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}) Session(session *gorm.Session) *{{$.QueryStructName}}{{$relationship}}{{$relation.Name}} { - a.db = a.db.Session(session) - return &a -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}) Model(m *{{$.StructInfo.Package}}.{{$.StructInfo.Type}}) *{{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx { - return &{{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx{a.db.Model(m).Association(a.Name())} -} - -` - relationTx = ` -type {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx struct{ tx *gorm.Association } - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx) Find() (result {{if eq $relationship "HasMany" "ManyToMany"}}[]{{end}}*{{$relation.Type}}, err error) { - return result, a.tx.Find(&result) -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx) Append(values ...*{{$relation.Type}}) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Append(targetValues...) -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx) Replace(values ...*{{$relation.Type}}) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Replace(targetValues...) -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx) Delete(values ...*{{$relation.Type}}) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Delete(targetValues...) -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx) Clear() error { - return a.tx.Clear() -} - -func (a {{$.QueryStructName}}{{$relationship}}{{$relation.Name}}Tx) Count() int64 { - return a.tx.Count() -} -` -) diff --git a/toolkit/gormgen/internal/template/svcimpl.go b/toolkit/gormgen/internal/template/svcimpl.go deleted file mode 100644 index 220b98ff..00000000 --- a/toolkit/gormgen/internal/template/svcimpl.go +++ /dev/null @@ -1,31 +0,0 @@ -package template - -const SvcImpl = EditMarkForGDD + ` -package service - -import () - -var _ {{.InterfaceName}} = (*{{.InterfaceName}}Impl)(nil) - -type {{.InterfaceName}}Impl struct { - conf *config.Config - pg *paginate.Pagination - q *query.Query -} - -func New{{.InterfaceName}}(conf *config.Config) *{{.InterfaceName}}Impl { - pg := paginate.New(&paginate.Config{ - FieldSelectorEnabled: true, - }) - return &{{.InterfaceName}}Impl{ - conf: conf, - pg: pg, - q: query.Q, - } -} - -func (receiver {{.InterfaceName}}Impl) clone(q *query.Query) *{{.InterfaceName}}Impl { - receiver.q = q - return &receiver -} -` diff --git a/toolkit/gormgen/internal/template/svcimplimport.go b/toolkit/gormgen/internal/template/svcimplimport.go deleted file mode 100644 index e4a4c53a..00000000 --- a/toolkit/gormgen/internal/template/svcimplimport.go +++ /dev/null @@ -1,15 +0,0 @@ -package template - -const SvcImplImport = ` - "context" - "github.com/unionj-cloud/go-doudou/v2/toolkit/errorx" - "{{.ConfigPackage}}" - "{{.DtoPackage}}" - "{{.ModelPackage}}" - "{{.QueryPackage}}" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - "github.com/unionj-cloud/go-doudou/v2/framework/database" - paginate "github.com/unionj-cloud/go-doudou/v2/toolkit/pagination/gorm" - "github.com/pkg/errors" - pb "{{.TransportGrpcPackage}}" -` diff --git a/toolkit/gormgen/internal/template/svcimplimportgrpc.go b/toolkit/gormgen/internal/template/svcimplimportgrpc.go deleted file mode 100644 index 9e89ee40..00000000 --- a/toolkit/gormgen/internal/template/svcimplimportgrpc.go +++ /dev/null @@ -1,10 +0,0 @@ -package template - -const SvcImplImportGrpc = ` - "github.com/golang/protobuf/ptypes/wrappers" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/anypb" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - "google.golang.org/protobuf/types/known/emptypb" - pb "{{.TransportGrpcPackage}}" -` diff --git a/toolkit/gormgen/internal/utils/common.go b/toolkit/gormgen/internal/utils/common.go deleted file mode 100644 index d4b585bf..00000000 --- a/toolkit/gormgen/internal/utils/common.go +++ /dev/null @@ -1 +0,0 @@ -package utils diff --git a/toolkit/gormgen/internal/utils/pools/export.go b/toolkit/gormgen/internal/utils/pools/export.go deleted file mode 100644 index fa886635..00000000 --- a/toolkit/gormgen/internal/utils/pools/export.go +++ /dev/null @@ -1,9 +0,0 @@ -// Package pools : goroutine pools -package pools - -// NewPool return a new pool -func NewPool(size int) Pool { - var p pool - p.Init(size) - return &p -} diff --git a/toolkit/gormgen/internal/utils/pools/pool.go b/toolkit/gormgen/internal/utils/pools/pool.go deleted file mode 100644 index a84e489c..00000000 --- a/toolkit/gormgen/internal/utils/pools/pool.go +++ /dev/null @@ -1,73 +0,0 @@ -package pools - -import "sync" - -// Pool goroutine pool -type Pool interface { - // Wait į­‰åū…äŧĪį‰Œ - Wait() - // Done å―’čŋ˜äŧĪį‰Œ - Done() - // Num å―“å‰å‘æ”ūįš„äŧĪį‰ŒäđĶ - Num() int - // Size æ€ŧäŧĪį‰Œæ•° - Size() int - - // WaitAll 同æ­Ĩį­‰åū…äŧĪį‰Œå…ĻéƒĻå―’čŋ˜ - WaitAll() - // AsyncWaitAll åž‚æ­Ĩį­‰åū…äŧĪį‰Œå…ĻéƒĻå―’čŋ˜ - AsyncWaitAll() <-chan struct{} -} - -type pool struct { - pool chan struct{} - - wg sync.WaitGroup -} - -func (p *pool) Init(size int) { - if size >= 0 { - p.pool = make(chan struct{}, size) - } -} - -func (p *pool) Wait() { - if p.pool != nil { - p.wg.Add(1) - p.pool <- struct{}{} - } -} - -func (p *pool) Done() { - if p.pool != nil { - <-p.pool - p.wg.Done() - } -} - -func (p *pool) Num() int { - if p.pool != nil { - return len(p.pool) - } - return 0 -} - -func (p *pool) Size() int { - if p.pool != nil { - return cap(p.pool) - } - return 0 -} - -func (p *pool) WaitAll() { - p.wg.Wait() -} - -func (p *pool) AsyncWaitAll() <-chan struct{} { - sig := make(chan struct{}) - go func() { - p.WaitAll() - sig <- struct{}{} - }() - return sig -} diff --git a/toolkit/gormgen/sec_check.go b/toolkit/gormgen/sec_check.go deleted file mode 100644 index 621cd5e8..00000000 --- a/toolkit/gormgen/sec_check.go +++ /dev/null @@ -1,114 +0,0 @@ -package gormgen - -import ( - "errors" - "fmt" - "strings" - - "github.com/wubin1989/dbresolver" - "github.com/wubin1989/gorm/clause" - "github.com/wubin1989/hints" -) - -func checkConds(conds []clause.Expression) error { - for _, cond := range conds { - if err := CheckClause(cond); err != nil { - return err - } - } - return nil -} - -var banClauses = map[string]bool{ - // "INSERT": true, - "VALUES": true, - // "ON CONFLICT": true, - "SELECT": true, - "FROM": true, - "WHERE": true, - "GROUP BY": true, - "ORDER BY": true, - "LIMIT": true, - // "FOR": true, - "UPDATE": true, - "SET": true, - "DELETE": true, -} - -// CheckClause check security of Expression -func CheckClause(cond clause.Expression) error { - switch cond := cond.(type) { - case hints.Hints, hints.IndexHint, dbresolver.Operation: - return nil - case clause.OnConflict: - return checkOnConflict(cond) - case clause.Locking: - return checkLocking(cond) - case clause.Insert: - return checkInsert(cond) - case clause.Interface: - if banClauses[cond.Name()] { - return fmt.Errorf("clause %s is banned", cond.Name()) - } - return nil - } - return fmt.Errorf("unknown clause %v", cond) -} - -func checkOnConflict(c clause.OnConflict) error { - for _, item := range c.DoUpdates { - switch item.Value.(type) { - case clause.Expr, *clause.Expr: - return errors.New("OnConflict clause assignment with gorm.Expr is banned for security reasons for now") - } - } - return nil -} - -func checkLocking(c clause.Locking) error { - if strength := strings.ToUpper(strings.TrimSpace(c.Strength)); strength != "UPDATE" && strength != "SHARE" { - return errors.New("Locking clause's Strength only allow assignments of UPDATE/SHARE") - } - if c.Table.Raw { - return errors.New("Locking clause's Table cannot be set Raw==true") - } - if options := strings.ToUpper(strings.TrimSpace(c.Options)); options != "" && options != "NOWAIT" && options != "SKIP LOCKED" { - return errors.New("Locking clause's Options only allow assignments of NOWAIT/SKIP LOCKED for now") - } - return nil -} - -// checkInsert check if clause.Insert is safe -// https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html#insert -func checkInsert(c clause.Insert) error { - if c.Table.Raw == true { - return errors.New("Table Raw cannot be true") - } - - if c.Modifier == "" { - return nil - } - - var priority, ignore string - if modifiers := strings.SplitN(strings.ToUpper(strings.TrimSpace(c.Modifier)), " ", 2); len(modifiers) == 2 { - priority, ignore = strings.TrimSpace(modifiers[0]), strings.TrimSpace(modifiers[1]) - } else { - ignore = strings.TrimSpace(modifiers[0]) - } - if priority != "" && !in(priority, "LOW_PRIORITY", "DELAYED", "HIGH_PRIORITY") { - return errors.New("invalid priority value") - } - if ignore != "" && ignore != "IGNORE" { - return errors.New("invalid modifiers value, should be IGNORE") - } - return nil -} - -func in(s string, v ...string) bool { - for _, vv := range v { - if vv == s { - return true - } - } - return false -} diff --git a/toolkit/gormgen/tests/go.sum b/toolkit/gormgen/tests/go.sum deleted file mode 100644 index 4080a7af..00000000 --- a/toolkit/gormgen/tests/go.sum +++ /dev/null @@ -1,2231 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.47.3/go.mod h1:m3LHc5FeQ1Jjee5EEay5e7hQmSk4SuKyMfifNUz8l3g= -github.com/ClickHouse/ch-go v0.48.0/go.mod h1:KBY72ltlOlHelc4Jn4hlReP8Caek8d6RG4ZkoPsWxzc= -github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= -github.com/ClickHouse/clickhouse-go/v2 v2.3.0/go.mod h1:f2kb1LPopJdIyt0Y0vxNk9aiQCyhCmeVcyvOOaPCT4Q= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Jeffail/gabs/v2 v2.6.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.25/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= -github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU= -github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4 v0.0.0-20200124162019-2d7f727a00b7/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/apolloconfig/agollo/v4 v4.1.1-0.20220323095621-60ed86180f24/go.mod h1:SuvTjtg0p4UlSzSbik+ibLRr6oR1xRsfy65QzP3GEAs= -github.com/arl/statsviz v0.5.1/go.mod h1:zDnjgRblGm1Dyd7J5YlbH7gM1/+HRC+SfkhZhQb5AnM= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ascarter/requestid v0.0.0-20170313220838-5b76ab3d4aee/go.mod h1:u7Wtt4WATGGgae9mURNGQQqxAudPKrxfsbSDSGOso+g= -github.com/auxten/postgresql-parser v1.0.1/go.mod h1:Nf27dtv8EU1C+xNkoLD3zEwfgJfDDVi8Zl86gznxPvI= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bradleyfalzon/ghinstallation/v2 v2.0.3/go.mod h1:tlgi+JWCXnKFx/Y4WtnDbZEINo31N5bcvnCoqieefmk= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= -github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.20.0/go.mod h1:JifAceMQ4crZIWYUKrlGcmbN3bqHogVTADMD2ATsbwk= -github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= -github.com/cloudflare/tableflip v1.2.3/go.mod h1:P4gRehmV6Z2bY5ao5ml9Pd8u6kuEnlB37pUFMmv7j2E= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/apd v1.1.1-0.20181017181144-bced77f817b4/go.mod h1:mdGz2CnkJrefFtlLevmE7JpL2zB9tKofya/6w7wWzNA= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.2/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.18/go.mod h1:7IN9MtIzTZH4WPEmD1gNH8bbTQXVX68yd3ZXxSHYCis= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/denisenkom/go-mssqldb v0.12.2/go.mod h1:lnIw1mZukFRZDJYQ0Pb833QS2IaC3l5HkEfra2LJ+sk= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dmarkham/enumer v1.5.5/go.mod h1:qHwULwuCxYFAFM5KCkpF1U/U0BF5sNQKLccvUzKNY2w= -github.com/dmarkham/enumer v1.5.6/go.mod h1:eAawajOQnFBxf0NndBKgbqJImkHytg3eFEngUovqgo8= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= -github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/eko/gocache/lib/v4 v4.1.5/go.mod h1:XaNfCwW8KYW1bRZ/KoHA1TugnnkMz0/gT51NDIu7LSY= -github.com/eko/gocache/lib/v4 v4.1.6-0.20231209210640-002c243623a2/go.mod h1:XaNfCwW8KYW1bRZ/KoHA1TugnnkMz0/gT51NDIu7LSY= -github.com/eko/gocache/store/go_cache/v4 v4.2.1/go.mod h1:rd6tUbaBOdqgi5xT3+OGeU7lQuhVJGTapNWFlZou524= -github.com/eko/gocache/store/redis/v4 v4.2.2-0.20231209210640-002c243623a2/go.mod h1:JoLkNA5yeGNQUwINAM9529cDNQCo88WwiKlO9e/+39I= -github.com/eko/gocache/store/ristretto/v4 v4.2.2-0.20231209210640-002c243623a2/go.mod h1:KyshDyWQqfSVrg2rH06fFQZTj6vG2fxlY7oAW9oxNHY= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getkin/kin-openapi v0.115.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= -github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= -github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= -github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v39 v39.0.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= -github.com/google/go-github/v42 v42.0.0/go.mod h1:jgg/jvyI0YlDOM1/ps6XYh04HNQ3vKf0CVko62/EhRg= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hyperjumptech/jiffy v1.0.0/go.mod h1:iFHHUap4onOTcvqBBU0iF33snPmqz4DSA/KgnBHG7dU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= -github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= -github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.2.2-0.20220404125616-4e959849469a/go.mod h1:ZQuO1Un86Xpe1ShKl08ERTzYhzWq+OvrvotbpeE3XO0= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jeremywohl/flatten v1.0.1/go.mod h1:4AmD/VxjWcI5SRB0n6szE2A6s2fsNHDLO0nAlMHgfLQ= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= -github.com/microsoft/go-mssqldb v0.19.0/go.mod h1:ukJCBnnzLzpVF0qYRT+eg1e+eSwjeQ7IvenUv8QPook= -github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM= -github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/morkid/gocache v1.0.0/go.mod h1:xK+hmoEMjYffIBvjn7DE8WfSd/rF5Kz/G9f20OliMJY= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= -github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= -github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= -github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= -github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= -github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/name v1.0.0/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.16/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg= -github.com/rbretecher/go-postman-collection v0.9.0/go.mod h1:pptkyjdB/sqPycH+CCa1zrA6Wpj2Kc8Nz846qRstVVs= -github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= -github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= -github.com/slok/goresilience v0.2.0/go.mod h1:L6IqqHlxWGTrTyq8WwF8kUY8kOIESZAMWr1xkV0zdZA= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/testcontainers/testcontainers-go v0.11.0/go.mod h1:HztBCODzuA+YpMXGK8amjO8j50jz2gcT0BOzSKUiYIs= -github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb/go.mod h1:ikPs9bRWicNw3S7XpJ8sK/smGwU9WcSVU3dy9qahYBM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/go-tinylfu v0.2.2/go.mod h1:CutYi2Q9puTxfcolkliPq4npPuofg9N9t8JVrjzwa3Q= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/wubin1989/nacos-sdk-go/v2 v2.1.2-0.20221024120645-0288f53fdaa8/go.mod h1:Z30xHaEyVwGKmbXHGM5uuh7pQkV66p/wiC3mGHCyhWQ= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.7/go.mod h1:9qew1gCdDDLu+VwmeG+iFpL+QlpHTo7iubavdVDgCAA= -go.etcd.io/etcd/client/pkg/v3 v3.5.7/go.mod h1:o0Abi1MK86iad3YrWhgUsbGx1pmTS+hrORWc2CamuhY= -go.etcd.io/etcd/client/v3 v3.5.7/go.mod h1:sOWmj9DZUMyAngS7QQwCyAXXAL6WhgTOPLNS/NabQgw= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= -go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= -go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= -golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= -golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220220014-0732a990476f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/datatypes v1.0.7/go.mod h1:l9qkCuy0CdzDEop9HKUdcnC9gHC2sRlaFtHkTzsZRqg= -gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c/go.mod h1:SH2K9R+2RMjuX1CkCONrPwoe9JzVv2hkQvEu4bXGojE= -gorm.io/driver/clickhouse v0.5.0/go.mod h1:cIKAlFw+IVK75g0bDcm0M9qRA4EAgsn23Si+zCXQ1Lc= -gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U= -gorm.io/driver/mysql v1.4.0/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= -gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= -gorm.io/driver/mysql v1.4.4/go.mod h1:BCg8cKI+R0j/rZRQxeKis/forqRwRSYOR8OM3Wo6hOM= -gorm.io/driver/mysql v1.5.1-0.20230509030346-3715c134c25b/go.mod h1:RpAr+f2lUtJUm0e2FAbttXiUKgAqKSUtzI1ulJfz9xU= -gorm.io/driver/postgres v1.3.4/go.mod h1:y0vEuInFKJtijuSGu9e5bs5hzzSzPK+LancpKpvbRBw= -gorm.io/driver/postgres v1.4.1/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw= -gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= -gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= -gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= -gorm.io/driver/sqlite v1.3.1/go.mod h1:wJx0hJspfycZ6myN38x1O/AqLtNS6c5o9TndewFbELg= -gorm.io/driver/sqlite v1.4.1/go.mod h1:AKZZCAoFfOWHF7Nd685Iq8Uywc0i9sWJlzpoE/INzsw= -gorm.io/driver/sqlite v1.4.2/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= -gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCoptX8tQ= -gorm.io/driver/sqlserver v1.4.0/go.mod h1:P8BSbBwkdzXURYx3pWUSEAABRQU0vxbd6xk5+53pg7g= -gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= -gorm.io/driver/sqlserver v1.4.2/go.mod h1:XHwBuB4Tlh7DqO0x7Ema8dmyWsQW7wi38VQOAFkrbXY= -gorm.io/gen v0.3.19/go.mod h1:aWgvoKdG9f8Des4TegSa0N5a+gwhGsFo0JJMaLwokvk= -gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= -gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.23.10/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/gorm v1.25.1-0.20230505075827-e61b98d69677/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= -gorm.io/hints v1.1.1/go.mod h1:zdwzfFqvBWGbpuKiAhLFOSGSpeD3/VsRgkXR9Y7Z3cs= -gorm.io/plugin/dbresolver v1.3.0/go.mod h1:Pr7p5+JFlgDaiM6sOrli5olekJD16YRunMyA2S7ZfKk= -gorm.io/plugin/dbresolver v1.4.0/go.mod h1:w0DKqg02frWKwbBMTQkJ7aVxeKnap2cShQcroOQaq8k= -gorm.io/plugin/prometheus v0.1.0/go.mod h1:5nrc/JrWCUNoDXCY4eOae/FK/J5WjQ0axXuFusCzdTc= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/toolkit/gormgen/tools/gentool/README.ZH_CN.md b/toolkit/gormgen/tools/gentool/README.ZH_CN.md deleted file mode 100644 index 587d4915..00000000 --- a/toolkit/gormgen/tools/gentool/README.ZH_CN.md +++ /dev/null @@ -1,128 +0,0 @@ -# GenTool - -将Genä―œäļšäšŒčŋ›åˆķįš„æ–đ垏čŋ›čĄŒåŪ‰čĢ… - - - -## åŪ‰čĢ… - -```shell - go install github.com/wubin1989/gen/tools/gentool@latest -``` - -## ä―ŋį”Ļæ–đ垏 - -```shell - - gentool -h - - Usage of gentool: - -db string - input mysql or postgres or sqlite or sqlserver. consult[https://github.com/wubin1989/docs/connecting_to_the_database.html] (default "mysql") - -dsn string - consult[https://github.com/wubin1989/docs/connecting_to_the_database.html] - -fieldNullable - generate with pointer when field is nullable - -fieldWithIndexTag - generate field with gorm index tag - -fieldWithTypeTag - generate field with gorm column type tag - -modelPkgName string - generated model code's package name - -outFile string - query code file name, default: gen.go - -outPath string - specify a directory for output (default "./dao/query") - -tables string - enter the required data table or leave it blank - -onlyModel - only generate models (without query file) - -withUnitTest - generate unit test for query code - -fieldSignable - detect integer field's unsigned type, adjust generated data type - -``` - -#### c -default "" -åŊäŧĨ指åŪšé…į―Ū文äŧķgen.ymlįš„č·Ŋåū„。 -į”Ļ配į―Ū文äŧķæĨäŧĢæ›ŋå‘―äŧĪčĄŒã€‚ -å‘―äŧĪ行æ˜Ŋ最éŦ˜äž˜å…ˆįš§ã€‚ - -#### db - -éŧ˜čŪĪ倞mysql - -åŊäŧĨčū“å…Ĩïžš mysql、 postgres、 sqlite 、 sqlserve - -å‚č€ƒïžšhttps://github.com/wubin1989/docs/connecting_to_the_database.html - -#### dsn - -ä― åŊäŧĨä―ŋį”ĻGORM所有įš„čŋžæŽĨ。 - - å‚č€ƒïžšhttps://github.com/wubin1989/docs/connecting_to_the_database.html - -#### fieldNullable - -字æŪĩåŊäļšįĐšæ—ķä―ŋį”Ļ指针į”Ÿæˆ - -#### fieldWithIndexTag - -ä―ŋį”ĻGROMįīĒåž•æ ‡čŪ°į”Ÿæˆå­—æŪĩ - -#### fieldWithTypeTag - -ä―ŋį”Ļgorm列įąŧ型标čŪ°į”Ÿæˆå­—æŪĩ - -#### modelPkgName - -éŧ˜čŪĪ倞æ˜Ŋ数æŪčĄĻ名į§°ã€‚ - - į”Ÿæˆįš„modeläŧĢį įš„包名į§°ã€‚ - -#### outFile - -éŧ˜čŪĪäļšïžšgen.go - -æŸĨčŊĒäŧĢį æ–‡äŧķ名。 - -#### outPath - -éŧ˜čŪĪäļšïžš/dao/query - -指åŪščū“凚į›Ūå―• - -#### tables - -倞äļš : čū“å…Ĩ所需įš„æ•°æŪčĄĻ或将å…ķį•™įĐš - -eg : - -​ --tables="orders" #orders 数æŪčĄĻ - -​ --tables="orders,users" #orders 数æŪčĄĻ和 users数æŪčĄĻ - -​ --tables="" # 数æŪåš“äļ­æ‰€æœ‰įš„æ•°æŪčĄĻ - -埚䚎数æŪčĄĻį”ŸæˆåŊđåš”įš„äŧĢį ã€‚ - -#### withUnitTest - -倞äļš : False / True - -į”Ÿæˆå•å…ƒæĩ‹čŊ•ã€‚ - -#### fieldSignable - -Value : False / True - -埚䚎数æŪčĄĻåŪšäđ‰įš„æ•°æŪįąŧ型į”ŸæˆåŊđåš”įš„æ•°æŪįąŧ型 - - -### ä―ŋį”ĻįĪšäū‹ - -```shell -gentool -dsn "user:pwd@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local" -tables "orders,doctor" -``` \ No newline at end of file diff --git a/toolkit/gormgen/tools/gentool/README.md b/toolkit/gormgen/tools/gentool/README.md deleted file mode 100644 index 1cf70601..00000000 --- a/toolkit/gormgen/tools/gentool/README.md +++ /dev/null @@ -1,123 +0,0 @@ -# GenTool - -Install GEN as a binary tool - -## install - -```shell - go install github.com/wubin1989/gen/tools/gentool@latest -``` - -## usage - -```shell - - gentool -h - - Usage of gentool: - -db string - input mysql|postgres|sqlite|sqlserver|clickhouse. consult[https://github.com/wubin1989/docs/connecting_to_the_database.html] (default "mysql") - -dsn string - consult[https://github.com/wubin1989/docs/connecting_to_the_database.html] - -fieldNullable - generate with pointer when field is nullable - -fieldWithIndexTag - generate field with gorm index tag - -fieldWithTypeTag - generate field with gorm column type tag - -modelPkgName string - generated model code's package name - -outFile string - query code file name, default: gen.go - -outPath string - specify a directory for output (default "./dao/query") - -tables string - enter the required data table or leave it blank - -onlyModel - only generate models (without query file) - -withUnitTest - generate unit test for query code - -fieldSignable - detect integer field's unsigned type, adjust generated data type - -``` -#### c -default "" -Is path for gen.yml -Replace the command line with a configuration file -The command line is the highest priority - - -#### db - -default:mysql - -input mysql or postgres or sqlite or sqlserver. - -consult : https://github.com/wubin1989/docs/connecting_to_the_database.html - -#### dsn - -You can use all gorm's dsn. - - consult : https://github.com/wubin1989/docs/connecting_to_the_database.html - -#### fieldNullable - -generate with pointer when field is nullable - -#### fieldWithIndexTag - -generate field with gorm index tag - -#### fieldWithTypeTag - -generate field with gorm column type tag - -#### modelPkgName - -defalut table name. - - generated model code's package name. - -#### outFile - - query code file name, default: gen.go - -#### outPath - -specify a directory for output (default "./dao/query") - -#### tables - -Value : enter the required data table or leave it blank. - -eg : - -​ --tables="orders" #orders table - -​ --tables="orders,users" #orders table and users table - -​ --tables="" # All data tables in the database. - -Generate some tables code. - -#### withUnitTest - -Value : False / True - -Generate unit test. - -#### fieldSignable - -Value : False / True - -detect integer field's unsigned type, adjust generated data type - - - -### example - -```shell -gentool -dsn "user:pwd@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local" -tables "orders,doctor" -``` \ No newline at end of file diff --git a/toolkit/gormgen/tools/gentool/gen.yml b/toolkit/gormgen/tools/gentool/gen.yml deleted file mode 100644 index 42c8dcfe..00000000 --- a/toolkit/gormgen/tools/gentool/gen.yml +++ /dev/null @@ -1,28 +0,0 @@ -version: "0.1" -database: - # consult[https://github.com/wubin1989/docs/connecting_to_the_database.html]" - dsn : "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" - # input mysql or postgres or sqlite or sqlserver. consult[https://github.com/wubin1989/docs/connecting_to_the_database.html] - db : "mysql" - # enter the required data table or leave it blank.You can input : - # tables : - # - orders - # - users - # - goods - tables : - # specify a directory for output - outPath : "./dao/query" - # query code file name, default: gen.go - outFile : "" - # generate unit test for query code - withUnitTest : false - # generated model code's package name - modelPkgName : "" - # generate with pointer when field is nullable - fieldNullable : false - # generate field with gorm index tag - fieldWithIndexTag : false - # generate field with gorm column type tag - fieldWithTypeTag : false - # detect integer field's unsigned type, adjust generated data type - fieldSignable : false diff --git a/toolkit/gormgen/tools/gentool/gentool.go b/toolkit/gormgen/tools/gentool/gentool.go deleted file mode 100644 index bca36760..00000000 --- a/toolkit/gormgen/tools/gentool/gentool.go +++ /dev/null @@ -1,210 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "log" - "os" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/gormgen" - "github.com/wubin1989/clickhouse" - "github.com/wubin1989/gorm" - "github.com/wubin1989/mysql" - "github.com/wubin1989/postgres" - "github.com/wubin1989/sqlite" - "github.com/wubin1989/sqlserver" - "gopkg.in/yaml.v3" -) - -// DBType database type -type DBType string - -const ( - // dbMySQL Gorm Drivers mysql || postgres || sqlite || sqlserver - dbMySQL DBType = "mysql" - dbPostgres DBType = "postgres" - dbSQLite DBType = "sqlite" - dbSQLServer DBType = "sqlserver" - dbClickHouse DBType = "clickhouse" -) - -// CmdParams is command line parameters -type CmdParams struct { - DSN string `yaml:"dsn"` // consult[https://github.com/wubin1989/docs/connecting_to_the_database.html]" - DB string `yaml:"db"` // input mysql or postgres or sqlite or sqlserver. consult[https://github.com/wubin1989/docs/connecting_to_the_database.html] - Tables []string `yaml:"tables"` // enter the required data table or leave it blank - OnlyModel bool `yaml:"onlyModel"` // only generate model - OutPath string `yaml:"outPath"` // specify a directory for output - OutFile string `yaml:"outFile"` // query code file name, default: gen.go - WithUnitTest bool `yaml:"withUnitTest"` // generate unit test for query code - ModelPkgName string `yaml:"modelPkgName"` // generated model code's package name - FieldNullable bool `yaml:"fieldNullable"` // generate with pointer when field is nullable - FieldWithIndexTag bool `yaml:"fieldWithIndexTag"` // generate field with gorm index tag - FieldWithTypeTag bool `yaml:"fieldWithTypeTag"` // generate field with gorm column type tag - FieldSignable bool `yaml:"fieldSignable"` // detect integer field's unsigned type, adjust generated data type -} - -// YamlConfig is yaml config struct -type YamlConfig struct { - Version string `yaml:"version"` // - Database *CmdParams `yaml:"database"` // -} - -// connectDB choose db type for connection to database -func connectDB(t DBType, dsn string) (*gorm.DB, error) { - if dsn == "" { - return nil, fmt.Errorf("dsn cannot be empty") - } - - switch t { - case dbMySQL: - return gorm.Open(mysql.Open(dsn)) - case dbPostgres: - return gorm.Open(postgres.Open(dsn)) - case dbSQLite: - return gorm.Open(sqlite.Open(dsn)) - case dbSQLServer: - return gorm.Open(sqlserver.Open(dsn)) - case dbClickHouse: - return gorm.Open(clickhouse.Open(dsn)) - default: - return nil, fmt.Errorf("unknow db %q (support mysql || postgres || sqlite || sqlserver for now)", t) - } -} - -// genModels is gorm/gen generated models -func genModels(g *gormgen.Generator, db *gorm.DB, tables []string) (models []interface{}, err error) { - var tablesList []string - if len(tables) == 0 { - // Execute tasks for all tables in the database - tablesList, err = db.Migrator().GetTables() - if err != nil { - return nil, fmt.Errorf("GORM migrator get all tables fail: %w", err) - } - } else { - tablesList = tables - } - - // Execute some data table tasks - models = make([]interface{}, len(tablesList)) - for i, tableName := range tablesList { - models[i] = g.GenerateModel(tableName) - } - return models, nil -} - -// loadConfigFile load config file from path -func loadConfigFile(path string) (*CmdParams, error) { - file, err := os.Open(path) - if err != nil { - return nil, err - } - defer file.Close() // nolint - var yamlConfig YamlConfig - if cmdErr := yaml.NewDecoder(file).Decode(&yamlConfig); cmdErr != nil { - return nil, cmdErr - } - return yamlConfig.Database, nil -} - -// argParse is parser for cmd -func argParse() *CmdParams { - // choose is file or flag - genPath := flag.String("c", "", "is path for gen.yml") - dsn := flag.String("dsn", "", "consult[https://github.com/wubin1989/docs/connecting_to_the_database.html]") - db := flag.String("db", "mysql", "input mysql|postgres|sqlite|sqlserver|clickhouse. consult[https://github.com/wubin1989/docs/connecting_to_the_database.html]") - tableList := flag.String("tables", "", "enter the required data table or leave it blank") - onlyModel := flag.Bool("onlyModel", false, "only generate models (without query file)") - outPath := flag.String("outPath", "./dao/query", "specify a directory for output") - outFile := flag.String("outFile", "", "query code file name, default: gen.go") - withUnitTest := flag.Bool("withUnitTest", false, "generate unit test for query code") - modelPkgName := flag.String("modelPkgName", "", "generated model code's package name") - fieldNullable := flag.Bool("fieldNullable", false, "generate with pointer when field is nullable") - fieldWithIndexTag := flag.Bool("fieldWithIndexTag", false, "generate field with gorm index tag") - fieldWithTypeTag := flag.Bool("fieldWithTypeTag", false, "generate field with gorm column type tag") - fieldSignable := flag.Bool("fieldSignable", false, "detect integer field's unsigned type, adjust generated data type") - flag.Parse() - var cmdParse CmdParams - if *genPath != "" { - if configFileParams, err := loadConfigFile(*genPath); err == nil && configFileParams != nil { - cmdParse = *configFileParams - } else if err != nil { - log.Fatalf("loadConfigFile fail %s", err.Error()) - } - } - // cmd first - if *dsn != "" { - cmdParse.DSN = *dsn - } - if *db != "" { - cmdParse.DB = *db - } - if *tableList != "" { - cmdParse.Tables = strings.Split(*tableList, ",") - } - if *onlyModel { - cmdParse.OnlyModel = true - } - if *outPath != "" { - cmdParse.OutPath = *outPath - } - if *outFile != "" { - cmdParse.OutFile = *outFile - } - if *withUnitTest { - cmdParse.WithUnitTest = *withUnitTest - } - if *modelPkgName != "" { - cmdParse.ModelPkgName = *modelPkgName - } - if *fieldNullable { - cmdParse.FieldNullable = *fieldNullable - } - if *fieldWithIndexTag { - cmdParse.FieldWithIndexTag = *fieldWithIndexTag - } - if *fieldWithTypeTag { - cmdParse.FieldWithTypeTag = *fieldWithTypeTag - } - if *fieldSignable { - cmdParse.FieldSignable = *fieldSignable - } - return &cmdParse -} - -func main() { - // cmdParse - config := argParse() - if config == nil { - log.Fatalln("parse config fail") - } - db, err := connectDB(DBType(config.DB), config.DSN) - if err != nil { - log.Fatalln("connect db server fail:", err) - } - - g := gormgen.NewGenerator(gormgen.Config{ - OutPath: config.OutPath, - OutFile: config.OutFile, - ModelPkgPath: config.ModelPkgName, - WithUnitTest: config.WithUnitTest, - FieldNullable: config.FieldNullable, - FieldWithIndexTag: config.FieldWithIndexTag, - FieldWithTypeTag: config.FieldWithTypeTag, - FieldSignable: config.FieldSignable, - }) - - g.UseDB(db) - - models, err := genModels(g, db, config.Tables) - if err != nil { - log.Fatalln("get tables info fail:", err) - } - - if !config.OnlyModel { - g.ApplyBasic(models...) - } - - g.Execute() -} diff --git a/toolkit/hashutils/hashutils.go b/toolkit/hashutils/hashutils.go deleted file mode 100644 index a023585a..00000000 --- a/toolkit/hashutils/hashutils.go +++ /dev/null @@ -1,56 +0,0 @@ -package hashutils - -import ( - "crypto/sha1" - "encoding/base64" - "encoding/hex" - "fmt" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -// Sha1 return sha1 string -func Sha1(input string) string { - if input == "" { - return "adc83b19e793491b1c6ea0fd8b46cd9f32e592fc" - } - return fmt.Sprintf("%x", sha1.Sum([]byte(input))) -} - -// Secret2Password return password string -func Secret2Password(username, secret string) string { - if stringutils.IsEmpty(secret) { - return Sha1(Sha1(secret) + Sha1(username) + Sha1(secret)) - } - return Sha1(Sha1(secret[:8]) + Sha1(username) + Sha1(secret[8:])) -} - -// Base64 returns base64 string -func Base64(input string) string { - return base64.StdEncoding.EncodeToString([]byte(input)) -} - -// encodeHex is borrowed from https://github.com/google/uuid/blob/44b5fee7c49cf3bcdf723f106b36d56ef13ccc88/uuid.go#L200 -func encodeHex(dst []byte, uuid [16]byte) { - hex.Encode(dst, uuid[:4]) - dst[8] = '-' - hex.Encode(dst[9:13], uuid[4:6]) - dst[13] = '-' - hex.Encode(dst[14:18], uuid[6:8]) - dst[18] = '-' - hex.Encode(dst[19:23], uuid[8:10]) - dst[23] = '-' - hex.Encode(dst[24:], uuid[10:]) -} - -// UUIDByString generates uuid hex string from an arbitrary string -func UUIDByString(input string) string { - sum := sha1.Sum([]byte(input)) - var uuid [16]byte - copy(uuid[:], sum[:]) - uuid[6] = (uuid[6] & 0x0f) | uint8((5&0xf)<<4) - uuid[8] = (uuid[8] & 0x3f) | 0x80 - var buf [36]byte - encodeHex(buf[:], uuid) - return string(buf[:]) -} diff --git a/toolkit/hashutils/hashutils_test.go b/toolkit/hashutils/hashutils_test.go deleted file mode 100644 index 103bf87c..00000000 --- a/toolkit/hashutils/hashutils_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package hashutils - -import "testing" - -func TestBase64(t *testing.T) { - type args struct { - input string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - input: "my secret key", - }, - want: "bXkgc2VjcmV0IGtleQ==", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := Base64(tt.args.input); got != tt.want { - t.Errorf("Base64() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestSecret2Password(t *testing.T) { - type args struct { - username string - secret string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - username: "wubin", - secret: "my secret", - }, - want: "cff23c519b29a0e0c0304ff1a3d795f171b9c919", - }, - { - name: "", - args: args{ - username: "wubin", - secret: "", - }, - want: "f85610573ac9cda1a0e27e27406e9125e0e2403d", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := Secret2Password(tt.args.username, tt.args.secret); got != tt.want { - t.Errorf("Secret2Password() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestUUIDByString(t *testing.T) { - type args struct { - input string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - input: "http://www.qingdao.gov.cn/zwgk/xxgk/fgw/gkml/gwfg/bmgw/", - }, - want: "f64e7a2c-7c3c-574b-8353-e10efee0efc5", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := UUIDByString(tt.args.input); got != tt.want { - t.Errorf("UUIDByString() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/toolkit/imgutils/helper.go b/toolkit/imgutils/helper.go deleted file mode 100644 index 1d94d415..00000000 --- a/toolkit/imgutils/helper.go +++ /dev/null @@ -1,285 +0,0 @@ -package imgutils - -import ( - "container/heap" - "image" - "image/color" - "image/color/palette" - "image/draw" - "sort" -) - -const ( - numDimensions = 3 -) - -func min(x, y int) int { - if x < y { - return x - } - return y -} - -func max(x, y int) int { - if x > y { - return x - } - return y -} - -type point [numDimensions]int - -type block struct { - minCorner, maxCorner point - points []point - // The index is needed by update and is maintained by the heap.Interface methods. - index int // The index of the item in the heap. -} - -func newBlock(p []point) *block { - return &block{ - minCorner: point{0x00, 0x00, 0x00}, - maxCorner: point{0xFF, 0xFF, 0xFF}, - points: p, - } -} - -func (b *block) longestSideIndex() int { - m := b.maxCorner[0] - b.minCorner[0] - maxIndex := 0 - for i := 1; i < numDimensions; i++ { - diff := b.maxCorner[i] - b.minCorner[i] - if diff > m { - m = diff - maxIndex = i - } - } - return maxIndex -} - -func (b *block) longestSideLength() int { - i := b.longestSideIndex() - return b.maxCorner[i] - b.minCorner[i] -} - -func (b *block) shrink() { - for j := 0; j < numDimensions; j++ { - b.minCorner[j] = b.points[0][j] - b.maxCorner[j] = b.points[0][j] - } - for i := 1; i < len(b.points); i++ { - for j := 0; j < numDimensions; j++ { - b.minCorner[j] = min(b.minCorner[j], b.points[i][j]) - b.maxCorner[j] = max(b.maxCorner[j], b.points[i][j]) - } - } -} - -type pointSorter struct { - points []point - by func(p1, p2 *point) bool -} - -func (p *pointSorter) Len() int { - return len(p.points) -} - -func (p *pointSorter) Swap(i, j int) { - p.points[i], p.points[j] = p.points[j], p.points[i] -} - -func (p *pointSorter) Less(i, j int) bool { - return p.by(&p.points[i], &p.points[j]) -} - -// A priorityQueue implements heap.Interface and holds blocks. -type priorityQueue []*block - -func (pq priorityQueue) Len() int { return len(pq) } - -func (pq priorityQueue) Less(i, j int) bool { - return pq[i].longestSideLength() > pq[j].longestSideLength() -} - -func (pq priorityQueue) Swap(i, j int) { - pq[i], pq[j] = pq[j], pq[i] - pq[i].index = i - pq[j].index = j -} - -func (pq *priorityQueue) Push(x interface{}) { - n := len(*pq) - item := x.(*block) - item.index = n - *pq = append(*pq, item) -} - -func (pq *priorityQueue) Pop() interface{} { - old := *pq - n := len(old) - item := old[n-1] - item.index = -1 // for safety - *pq = old[:n-1] - return item -} - -func (pq *priorityQueue) top() interface{} { - n := len(*pq) - if n == 0 { - return nil - } - return (*pq)[n-1] -} - -// clip clips r against each image's bounds (after translating into -// the destination image's co-ordinate space) and shifts the point -// sp by the same amount as the change in r.Min. -func clip(dst draw.Image, r *image.Rectangle, src image.Image, sp *image.Point) { - orig := r.Min - *r = r.Intersect(dst.Bounds()) - *r = r.Intersect(src.Bounds().Add(orig.Sub(*sp))) - dx := r.Min.X - orig.X - dy := r.Min.Y - orig.Y - if dx == 0 && dy == 0 { - return - } - (*sp).X += dx - (*sp).Y += dy -} - -// MedianCutQuantizer constructs a palette with a maximum of -// NumColor colors by iteratively splitting clusters of color -// points mapped on a three-dimensional (RGB) Euclidian space. -// Once the number of clusters is within the specified bounds, -// the resulting color is computed by averaging those within -// each grouping. -type MedianCutQuantizer struct { - NumColor int -} - -func (q *MedianCutQuantizer) medianCut(points []point) color.Palette { - if q.NumColor == 0 { - return color.Palette{} - } - - initialBlock := newBlock(points) - initialBlock.shrink() - pq := &priorityQueue{} - heap.Init(pq) - heap.Push(pq, initialBlock) - - for pq.Len() < q.NumColor && len(pq.top().(*block).points) > 1 { - longestBlock := heap.Pop(pq).(*block) - points := longestBlock.points - li := longestBlock.longestSideIndex() - // TODO: Instead of sorting the entire slice, finding the median using an - // algorithm like introselect would give much better performance. - sort.Sort(&pointSorter{ - points: points, - by: func(p1, p2 *point) bool { return p1[li] < p2[li] }, - }) - median := len(points) / 2 - block1 := newBlock(points[:median]) - block2 := newBlock(points[median:]) - block1.shrink() - block2.shrink() - heap.Push(pq, block1) - heap.Push(pq, block2) - } - - palette := make(color.Palette, q.NumColor) - var n int - for n = 0; pq.Len() > 0; n++ { - block := heap.Pop(pq).(*block) - var sum [numDimensions]int - for i := 0; i < len(block.points); i++ { - for j := 0; j < numDimensions; j++ { - sum[j] += block.points[i][j] - } - } - palette[n] = color.RGBA64{ - R: uint16(sum[0] / len(block.points)), - G: uint16(sum[1] / len(block.points)), - B: uint16(sum[2] / len(block.points)), - A: 0xFFFF, - } - } - // Trim to only the colors present in the image, which - // could be less than NumColor. - return palette[:n] -} - -func (q *MedianCutQuantizer) Quantize(dst *image.Paletted, r image.Rectangle, src image.Image, sp image.Point) { - clip(dst, &r, src, &sp) - if r.Empty() { - return - } - - points := make([]point, r.Dx()*r.Dy()) - colorSet := make(map[uint32]color.Color, q.NumColor) - i := 0 - for y := r.Min.Y; y < r.Max.Y; y++ { - for x := r.Min.X; x < r.Max.X; x++ { - c := src.At(x, y) - r, g, b, _ := c.RGBA() - colorSet[(r>>8)<<16|(g>>8)<<8|b>>8] = c - points[i][0] = int(r) - points[i][1] = int(g) - points[i][2] = int(b) - i++ - } - } - if len(colorSet) <= q.NumColor { - // No need to quantize since the total number of colors - // fits within the palette. - dst.Palette = make(color.Palette, len(colorSet)) - i := 0 - for _, c := range colorSet { - dst.Palette[i] = c - i++ - } - } else { - dst.Palette = q.medianCut(points) - } - - for y := 0; y < r.Dy(); y++ { - for x := 0; x < r.Dx(); x++ { - // TODO: this should be done more efficiently. - dst.Set(sp.X+x, sp.Y+y, src.At(r.Min.X+x, r.Min.Y+y)) - } - } -} - -func inPalette(p color.Palette, c color.Color) int { - ret := -1 - for i, v := range p { - if v == c { - return i - } - } - return ret -} - -func getSubPalette(m image.Image) color.Palette { - p := color.Palette{color.RGBA{0x00, 0x00, 0x00, 0x00}} - p9 := color.Palette(palette.Plan9) - b := m.Bounds() - black := false - for y := b.Min.Y; y < b.Max.Y; y++ { - for x := b.Min.X; x < b.Max.X; x++ { - c := m.At(x, y) - cc := p9.Convert(c) - if cc == p9[0] { - black = true - } - if inPalette(p, cc) == -1 { - p = append(p, cc) - } - } - } - if len(p) < 256 && black == true { - p[0] = color.RGBA{0x00, 0x00, 0x00, 0x00} // transparent - p = append(p, p9[0]) - } - return p -} diff --git a/toolkit/imgutils/imgutils.go b/toolkit/imgutils/imgutils.go deleted file mode 100644 index 99f6b3b2..00000000 --- a/toolkit/imgutils/imgutils.go +++ /dev/null @@ -1,86 +0,0 @@ -package imgutils - -import ( - "bytes" - "fmt" - "image" - "image/draw" - "image/gif" - "image/jpeg" - "image/png" - "io" - "os" - "path/filepath" - - "github.com/nfnt/resize" - "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -func ResizeKeepAspectRatio(input io.Reader, multiplier float64, output string) (string, error) { - by, err := io.ReadAll(input) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - imgConf, imgType, err := image.DecodeConfig(bytes.NewReader(by)) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - switch imgType { - case "jpeg": - img, err := jpeg.Decode(bytes.NewReader(by)) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - m := resize.Resize(uint(float64(imgConf.Width)*multiplier), 0, img, resize.Lanczos3) - if stringutils.IsEmpty(filepath.Ext(output)) { - output += fmt.Sprintf(".%s", imgType) - } - out, err := os.Create(output) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - defer out.Close() - jpeg.Encode(out, m, nil) - case "png": - img, err := png.Decode(bytes.NewReader(by)) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - m := resize.Resize(uint(float64(imgConf.Width)*multiplier), 0, img, resize.Lanczos3) - if stringutils.IsEmpty(filepath.Ext(output)) { - output += fmt.Sprintf(".%s", imgType) - } - out, err := os.Create(output) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - defer out.Close() - png.Encode(out, m) - case "gif": - img, err := gif.DecodeAll(bytes.NewReader(by)) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - if multiplier != 1 { - for i, item := range img.Image { - resized := resize.Resize(uint(float64(imgConf.Width)*multiplier), 0, item, resize.Lanczos3) - rgba64 := resized.(*image.RGBA64) - palettedImage := image.NewPaletted(rgba64.Bounds(), getSubPalette(rgba64)) - draw.Draw(palettedImage, palettedImage.Rect, rgba64, rgba64.Bounds().Min, draw.Src) - img.Image[i] = palettedImage - } - } - if stringutils.IsEmpty(filepath.Ext(output)) { - output += fmt.Sprintf(".%s", imgType) - } - out, err := os.Create(output) - if err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - defer out.Close() - gif.EncodeAll(out, img) - } - return output, nil -} diff --git a/toolkit/imgutils/imgutils_test.go b/toolkit/imgutils/imgutils_test.go deleted file mode 100644 index 31d3b8d5..00000000 --- a/toolkit/imgutils/imgutils_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package imgutils_test - -import ( - "os" - "path/filepath" - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/imgutils" -) - -const testDir = "testdata" - -func TestResizeKeepAspectRatioPng(t *testing.T) { - file, err := os.Open(filepath.Join(testDir, "test.png")) - if err != nil { - panic(err) - } - defer file.Close() - _, err = imgutils.ResizeKeepAspectRatio(file, 0.5, filepath.Join(testDir, "test_result")) - if err != nil { - panic(err) - } -} - -func TestResizeKeepAspectRatioJpeg(t *testing.T) { - file, err := os.Open(filepath.Join(testDir, "test.jpg")) - if err != nil { - panic(err) - } - defer file.Close() - _, err = imgutils.ResizeKeepAspectRatio(file, 0.5, filepath.Join(testDir, "test_result.jpg")) - if err != nil { - panic(err) - } -} - -func TestResizeKeepAspectRatioGif1(t *testing.T) { - file, err := os.Open(filepath.Join(testDir, "rgb.gif")) - if err != nil { - panic(err) - } - defer file.Close() - _, err = imgutils.ResizeKeepAspectRatio(file, 0.5, filepath.Join(testDir, "rgb_result")) - if err != nil { - panic(err) - } -} - -func TestResizeKeepAspectRatioGif2(t *testing.T) { - file, err := os.Open(filepath.Join(testDir, "test.gif")) - if err != nil { - panic(err) - } - defer file.Close() - _, err = imgutils.ResizeKeepAspectRatio(file, 1, filepath.Join(testDir, "test_result")) - if err != nil { - panic(err) - } -} - -func TestResizeKeepAspectRatioGif3(t *testing.T) { - file, err := os.Open(filepath.Join(testDir, "test.gif")) - if err != nil { - panic(err) - } - defer file.Close() - _, err = imgutils.ResizeKeepAspectRatio(file, 0.5, filepath.Join(testDir, "test_result")) - if err != nil { - panic(err) - } -} diff --git a/toolkit/imgutils/testdata/rgb.gif b/toolkit/imgutils/testdata/rgb.gif deleted file mode 100644 index c5f1d3f316d1f422f4cd1ad60a339be053b7e73e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2285 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 Rj#_-Q$mGx6TSr6~tO31|()9oU diff --git a/toolkit/imgutils/testdata/test.gif b/toolkit/imgutils/testdata/test.gif deleted file mode 100644 index 6b74199435b434531cc394e1baa884c8990059d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2673994 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

acPaGSB;3f;xf!|l*yY+^@_tG$Jhze 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%0AHdtMzwVG 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

#UY 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%0A@HG&tJ78=9>aPwgYJpJRJhJ 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

*+lh+MLd0ba4m#bV;Dgne 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

PF)Ny@ni=>($Lf7>XAgk!#9%dP!&PGhMK@q-z(G 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

!r8IeFbVfcr~6X;MNwXgiLH7uk%$>I5w4VE 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�|r%oU&0j$gcop=lAY)H+Q^0f+;sXoTN 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%0D=j%-m2%9 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­ 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 ZU%^1Jh@ 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 z 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

X4&Q=*NZ>G$yFTiNLYyD*%aUs*L#rKa$-+ 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ಿ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

^9CeC*cQ0wUPi3Z}MXG@bJ#8bCxU#FLD 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%0Ak8Xesr$3JRll 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 Z&GgUsKJotmGvEIJ1b@=?{{Y&q|Jlh#-A@1j diff --git a/toolkit/imgutils/testdata/test.png b/toolkit/imgutils/testdata/test.png deleted file mode 100644 index 22eeb378fd7611fb86edcb16d06a3c6d7446876b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68498 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 diff --git a/toolkit/imgutils/testdata/test_result.gif b/toolkit/imgutils/testdata/test_result.gif deleted file mode 100644 index b5269b1eca91acee56fe9aa7b9e0f4f801609aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680621 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

{T_i>scAzL2zAB!aerFzqZQzB7Ns~LM->M ztDgM0U;bl$$;T!L(0fa>&5NS$!(XloSNbm;b*DqrW0R-j&itFE+F_s zqG#!{Fq4S0b77>Xjsk)^Xts`*bNo3a~NV&6U@%lVsbv8 ze^3_a$)ilayj#XqM5uK<-*x2fzqM8`L8TbQ`C#3BqntQN(N8x?w|DOl0@Dv4RX!qd zCFu3;&gY-w5%P!9(2NyyuGCwd7r}?u!Dm7Xq_xjtD>LU`k@Bg(miTF3c z*dPYHC9Az}?J(K*xzGvPC9ymDUypo$Ik7?~@dUpJAfumL(P*N{Z~5vCRw_M7@w_nC z@%{5>7F8}g;_8pxSMF**`YCI$B|(!~eV!Qod0B1td0Cv*@#<@BUz*|-p3-TkA`(O= z;i9A7a)H}{u*JO}TJe!rE}haXEY?q>>T1FVW{}mw-DHfc#73nXcTXt7-pvZH?R`g>{&R#KEr5chodyn@+yz%2vb;e-My=A2;r*Y?T;d z!k_7l$m_n}({{-YNmE9tdT0KdUO1^irS9WSJa49mcZ-9 zSgKe)Kut;taBujh^Ib3}y)ReNH^fP{x7yAjqi0k>@P?IJe z-HUUf%eVBjO+4)G*Tp4EZV?iG3MNU|6Pn)|{@9KxLmznNv9l>3y+>(oQ^>mlkd}gA zIAG(5x`VMYhVh0&I&8stvw)cMgPaD1GpM8L5o>RPM(uV8*Dp+UjMDC-N7d1G9oH1l^`AA_AX`jI*NK>?(x z;y773&Cc^Ds1jsHh=`E2`0gN-?Cx*pPTo2iycg=8a#@}ON=t!wjz&$ez*N(tAx+bl zZ7zZL@fecqu$!y};C>*)6C+lfPafAB!U($73oZT$kA8?UhZ}C^wOfSv)Mq!e`&}LU-IH4MXuE09 zqWEQ6vBo>SKiTL0>iMwY7v{S*_QXqOrrm%Qmw|~*oWn%9u?;tYd)yGr;lH$rc6H`PcsaI z3ha5rcG%P3_PE`zH$cI}n-6MJ#|rdjQaYA;qaU?3S*BchK9KObR(;&-^YiB8-##d` zB_9pAbP6i;|5vK%gxsxCSJL4Bu2j4JKcIH_o!b9ZsW$NC)w$;orM)$E z0C+NA=a7eHvAP{l>2@^uXWEv@quzE8#f35;L>PnH@uSBw6=f=r{$iasPx^j#(37Bm zD=re+rcTp?ta>pJgbiv?BhFFZkwC!(bF#R&dp8^@jRpYVjBvDam~jjXfPObsrmH0f zvFJ?TMCwX@c6zP?2-oC4YCOIIM`*c6s}@*@9KS$9s&%bEjOH|H#ju5n*QFUYQ*Qjr zXf{M!Wv?c!)Mfv#N0jOomCQ}ZoJDQ`dQX=!B zI<2;e45FlYVM4dkxS%?T`_W^3n!YdmdM`7@8i&j4FcU#AP zMuZX2#6PiSM0RU*VqB4(xeRUI;X zS{s0&$E^(@VOSN#);CI41qHwJ9!r>gqSdjkmdkzVtqWsg6b;mWF{-Nm|$)}4~aVxr+ ztGb6{-0X~6DzC4Bm>zbvkdNKjy;-uV@=-^_{V?J zE-j!0+J^!x!)PL2>v)k_OUzH%PPUfG zUD-i&`~i*akN*Q-ODzCxOxzlFP0|?BvH?@#0Rkm>Ur1$ntVOp2;NuCB4};h+Ojh&n z12lA(k+(@kTsXVIV>bzVE=><9pqYro>|CJLw4rs8Bq9SVy`PO{j1-PG(|rh6y7qI( zk#Ef0FGj6FvR*I^HS&UTm8q4+o&$oRNgY#aE&f@Dy?G1EL&g9iNAZYgy4{#Q5a& z#?ui^>9S@&$CYstlCUK))D!iP=^%gSvY8kM8mnOnLvnAn1w9vv!ap8Trsm-nA@B|& zC~rZhA!xXy_%cvIV|zzHkV0Pvc={pkMGlU8-GTVTr&%VJQ01IWCWU7g>dw|B?CJ%>);37N{@~vvfc_C_U4H`iEZG&?6?|OBMC)qvwT!YLM}4%Qe@Shxjz8^z57sr{J{=oZjjKPW`42}T)Gwq5C}Lq-)l-$eSQ2GY%GU%wP{QDG`}(R zpCDZj`F5EJ+XZ<1k&>z6hrt>{!%FkwM#dB>1tQX(z|&!}@oRc+5wsEtl?Ce@+=Wn+ zJ?y`8{JdxwVIA4~^r$5!U@AZ?8f2HCQeY!+pEoo&fVztNxd({iuyfbQH?HWrKnatx z(sM?Wo4eEVancXroVz*nTiAzXbA9qA?qzuY=yFdUbEE{Y+wicjA02%(PJ3>^Xkk)n ziC`Xw7VhXKZBXRqOowvag_@LqT^z5Rdz3gRp|7tIv_*i`5F)$j#}S9^HnNTk+5*!J$7@v3ty z0j9i)11{9P+rLN=CNT4{oo2y6Os)h zBjIz%h_iIRK|@`l5#bFWOhYSIVYDX=u_FPKaEfArb{9Mi!$BHP33aFg?Q38&CQS}- zJ&1smI)YhSpHLy+?)0S;an{@mQztj;pI79*9BLPO+2gMR#daTf4!1vu7SMOxlI0c^R3+`<= zID^Ex3Sb`_sfV~=Vu0ea>)54K%zd6YtzoxpYw3$=AoLqlIv2C8UV@;edq=Ce;*E%%mIDzWp94$_L=d6V-6deVD9>r zE6yYM{9x!rLJeC;4{%glgZxI?t@Q44#*`uHc3pk|36<-a6WLZyL4}^-vqw_^l#~Du zOwbksZMEM3{n?ObDbwR@^&?*^h=S=0tXz?^d`bSVQe@Sj$3q#oN%(zf=UxN089d42ic73n5vpbzDH;DfgWrnX%B8v0Fg*iJQSAf z<7~>l*w=`yZOkm8l%hc0-M+@&0{-KqYD3@>b_B0&meB1d_LzZr)lF+Nyck=@79}G^ zvU5_HXFfGtlpVnrHXXh27W=p-4TDsWVV5lcP%`zPw-%^J44-~ogP%Pqxgz5bBYTdG zs18-|x6IXu#awZ%68(CSVoy90BPLV<$(R=WlrLZiG&%MA1yu-$ezpA@gLybDbe~@w zqYBK?;xJ#8eh-;jtJllbc?b`ZG8P+8y={V*`sw~wi5wFzKv25z{Ba}7lyeyxT61CN z7bb>%$t(&3Bgn(>rO1`K0wbh%B8t4L{@EI3OI>s7J(l;n;F{~{!)p0>!xmK%xR+0I z6Cn-SIq^$qWNF?o$9Q5v@5z+G(LIS5e`Ea3Pr8b;OASBczwB&f`S+U^qbAOqU;PS`xIYEREwivu`Y zDBj)y*$y-vpR8G40<%NF-6Pw+nrb64^$8s&%2%;pGn=Vx3m^!4vafUxBzo zn8#_I8l@@z`HUDBu}+yZim`EGfSA!-ffwlvy1yvhSh>}q-;%5PWE*?b?Sv32U!uw& z;tp0=$2smbSYafVI&m#X!pX$5uVV&L1=lr|vQHTD(3o>kmoPMp!yY!g1_who>eJ3t z*EG#{6pT85Auh&=oemsyQ9f>!d6Y2< zb_r2UtJ(;m{FwyiSYYGd>RJsBOox;{o7FDAB6Fl4yS%e!m?#@rM9>VL9i+jI8bD%p z!dn$aP!MGS6dSuP6RN?3g`BGsSdss}jlC4uv>GRFI#7U(gMU7Mt0E;j7%2wfqEj?L zI~Gf9KJ#Y{^qY?f(+blc$9Lr10)xb$cN^bja)^>g)grz6<$%nt3~TCXxkM8@k3=v( z59>~|ixCU>)&e14cB#JJG2dn1XSO>~?6ed$$86s(2Fm(BModEJCsmg_0Ozq>sG)9x z$yrP+=GH?5M|keIiyyy1CPK{{LzM_*R3&E}Q31u)8&K2_yvJQ2V*_1QZ83vrxLWM=Xn)ZXYO{MZ9yquDACb z!$LX9;k&cOn)4~<0dWqLuQX6C)0HcQeA$eY=G`A-Vx}4iR*k!VnZV40Fu={*1=hIi z4y-Z#Uf0*wV+&xxE-?+YnSB`t_V2JmRE^YH;xOXJ1cca-dQ-><#3E0J3|hN zfT|^oRbfsQ+f(bLu=moNm8`{nnr9Anh<^@;dsE>-FCK>+hQnsS)BFXk5~5t$ycKtQ z0szywa7C`rJPBr>fRQyK$^M$Tih{OsU`!qnZDz!>!lWrr`08;!At{#gcyA0eunVrl zTU5dz%MU|n6CwC0)ttka=(8Y!vzsyphH`|hs4yK0hW%Rg{kL)_cEkWvDU>TLe3ou< zyj!q)95r$&_XT#BPS&9qaXvnLsy}`3ama(wJk7-Nf@szMaYxX4P&7moPso`AXdKIz zf5>l;gj{rR^VlK6O;E6)x%{_TH ztfm>ZRA`U}_C^FobDIW=Vg0L1b>;h8w7vwv%*S%ob3Fm8WfQtz@E7Kj&1F_5hjVgH z7|>?OzQ1^e08&1UD33d60}8rhZdb<04xUTUFt}8R|%d<=udGkii^Atu}X|CRW(l!h$ z->|8NR_O1~1@)x_BEWIEhJNcu9%?{+B9i_zaTSeNO+)t5h+h+NwNyf?1UHHY^}n;j zjiU)O?S^6R3YE`YEdonysL^7}vNZc&@AgsYujzL5I*hnc2C8vkA`39(f?+olJ(vzI zEP|&5Y7!G!Ou{uBypoH|pC;ByV@f1A_b1QIVB8rgyy_YC+FezLnFfPzjphyz!JVqd zg980DKHf(6bGsvV;BWvmBzrf*2Q+Gn+5hET9LDX6`{Jhzi+E73^r*ts8Urr)Qjub_ zTSLBVWRg3+XhW@)SRC1d( zC0xjkFnY$??6cQym1G6aKObmUf@zYkv_9Mx7NhYhMZpV@*I&(9L>wPy0VH}cukTyF zWLbATZIT`9b(6yU=`#(vivK6SEG2@()Lj`o_2*sUcMlSN5CAL&OY{8jN3}*qO6=)3)KFJI_Vg!g~$nsXuMDlJ0!~954h*o_a zRjk+vpaFBTS*Jc)txj}q!uXG}Y0o5OT1e{@pz2+wWxaOpe?e{f|0vb$k79xOHf@*E zCf54P+u)OaX(L&~{KLV&SxP%Tc5o>xMI%fC|Ei1L69-}87j&|jd0Ry3G|_7?Bg z)Eg3Qp!aQ5vWO;?&y2SgTOS$w``fe2FIRfAa{W`PwN3nIuU~4tH7&X{=a-B<`>)2P zSj$9Yh-fWnr3k4TM4o(zwUK|N^1^#D&Hxh~EfA!<#p>0z(+~n;z>@jsZJo?q83e@g zPO~*iIUcUL?~FjZy_X0Cl35xJgr#|a!Z)7{P>E*y6dfTlL|93FZnEV`lM0NBRO-n# z4Of3p`F5v*KsRE!dQ&q1zt`2X82jso5xXI#`A`YNQJR4zw!B@OQ&7sK(D)~O{^@Kr z-_XHuHsGc8)$54UQs~+{s>FE1$gZxtPbV5WRz}9>s2ld#i(1*Z+%WZ4r(YyMt3Zz; z-!^14vWIb^9U3vY`2o{0InfCE_3+H3|A3s^liYk{0y>n;?1d}Vgh!mOkDz8YV?QJEs(Zz_|sQhy_6 z?yj)KjyDziVtYpV`21$_9U%obDUP0!Rfjouvrm3F&EKQ~wY(x1<|wlJM%eNDKG zV3s?T^ z^E5?@%p1kh@2WOaTSVQ46L)@0eLJ(~I3;N+1xDpx6D|Px8=>xI5ANA2jPO;xR13qH zThY2qVCCLkbAGzdBRR*?G>+?+_>6?!QKEEhi zZ;F5am#xPP?h~3%Tq5uS%mEMyp|QwK)1)B9;_oI*3nYUE>ac((|IQZaqRkrAX|~=d zt*>~1Y{&@2)W{wbqCA+5ag!rs)h%BC&TtJ}b)1AW{0BUHcXA&a=8lx=3~Yj-$r-<_ z*pcf&sIMk*HZ>gcGTH!o(!Y$x^{RO<(UO`Y=mCG;D?mXW`064Gn)EM)WM(MuD)Esg zDi+XbQsU>I=kX%l&=(qY27D7c^Y2RNOH4)R@uORNT)Iygzb(y zvOE_TgG8|m{%s=E5MZYzKw>`lsV8Jh>c(GV(Zww!GSeHLq94Q<`G$@>Ak1e&QnsJ* zx@e-MlB)n*9xJ~C25~u=UXZJlO`y|)JcV>>qR^wm>zKJ=ccG^GHz^I@0A{R;Xf-r0 zHWr!=fL!qr0I8~HhD$WFYq!(1_zFoPN6R4Kz{lMk(6e86&?t&Veu^ZzdhaF{KvPQc%fJ&bLHT4Yk#R(HAm&cDV(#Sspqc)V>Jp?LKJK zwlUGP`iLlG4f8;8_4P5Q0_B11cF28}7{rNa4Cj(m$J9dUW4Mvc+(pnWwol0byXTz2 zI``2LA{#wW*Xv-}MIG{UfS=%2uA6tSXL%@^_N$kC@4|;Sc+)y0Og$|+^l8V)KQPh% zb=aI}oAGBqyvUkP3IyF>9RPi*OcX)yS4TDb1n_T$SXtD-MV0Om$&iJuD)vV8~O>rU4~r%t5} zDd2nlXcTLUDgtO11aSa=91RN}OWfO0)eDKqrc(Vcd zqUWcygq81;LB}k{jZINWZhFfm!bLPV&A_DL7G@aRcX0``k789TM|(T)RgWl<4(KI>CvMW@I_Gu0c4@H334 z-vJ(qxUw;^CLVV=)`wEE$tlsK*ZtOE;bKe^N>rWecCXoasu!uKIun$vYAiYDQmVDt zsG{*1Lp#6F-(y{kkn((Kf@)!)KtSSf6_Y~P*S5?9&MH2*0Da@UQ?CvFS#!|c%{J_) ztrR?j)8_7V3sq0z6#*X)+!G}n&+@fL0LiYoh?jRdgR5UFh@{X_pOlb%{6M--`f+E? z@?EzLB}IApUAjFin%Z8SY1+UGi=^LIzXa!m&R(@$%qC>{&TbdRG5~wYvUM-KMS-pi zkSycd?<3Ejn;xVotYp(%0e#CWub;LSmQ5Uc`aN-1!e2)hRSb7{4A}0|XDHF~3Ecq} zixxXwlH4H5-YUdaub*@oysx-!G2lIUjn6%EzqXR?eFp@6lG2TSJO3clBTQpm`~-Fl@+V)7X&UF2MmqtNX~{7TV%mE(=qw_avdHP9fY z6Wl<9->zI)Vo-Ra)Pu{Y6guNJf^K6F+T&g?fy~6vaG&db9e^2_M@+c>Qme5t&51m~ zvYZw6a%>)s17l3VnpZ2T8z6TvZh82!(_)G_uTM-b)_MXFnj{Ll(ekH##JN)X4*kp3 z*Jb|=vUKR6wKo&gA`{(X-B$n8VY_B! z5^&?{26ZKOPv3m?B$_6~*)P}p4BcO`@s(U*m%mb$?==Re7#`~#zZ8}UeI^b_W(zFj z$iTlHv$rlX;Tw*(t4Kzt3Cz;@8~Jhnx(eQE1TK^rNWDztujm5K4-qg$ICH77VQz7d ztj{aJ4?4`2kJSOSXjP3%`uC#v~k2yO9*%YeD;-| zf;A(a11^KovT?>~1r~pKL+@4Aa77cGU_#vfR*jzEqg@Rq6K^gl=YmLsXKpiDpQ??(H%q zEv3!@#WPbieH|{Q}zVoh|b#FIug=pz8N*erjeV=x3wZwD3{dpYoXdq7cP%rrF zWGG>6P07dLG#PP=HWvSma;=NMxVzYvrC%PH7w8uX6jYdQC?HsmPh}1lY27@ZS!;I= z2TP8%knEIlG5={`e@6fQc=M)AfS{!W9{|F0IgeXIRq@Jd!Hu0+W%50#oQ;JoDK>54 z0G?$}zzAgXkbr}NFvS((-H1`zDcy9)e8GRpD%@A?T;-+EH&5#qdxhG*X29!J77U(M zqi!FnP9!lyZ8jY)O2aL=T1Ck9+h8#s$h{pIKjz|JT$KSVW8sWB*qtX9;pv8YvXjoe z_eEmp-Pff~^LS{4q{r{o&)@`deI5Q*Q2_3ip``Uf)wsOKZ5t%RdG6H`fePpNZ4NC^ zEC26*5w#2#`JDFnMl9;q{*UetL~P);UX$O+BLuTa^uEQm{*r?DkV;H&KWt@<=lz#& zs~&kpu2G7qo+$v_9u}b`JbDwl5l;VeJx<>>j6P(2r_6Eg;q&QZ3OhpfSt#?A9=uVF z`IC!!4#F@8GH!?<-0-?Taw%z#(3+*cb6!Z$5;FJT7Tb4;h#x1f%h>0;Vz8@9<%#G1 z%~c!YoJ}`mu5ZNv$f1&}zI;-pG>0{&s-gZTwlRn3-4936;nxASd%`bVm>6JBxQaYs zJ-Ir|Vc^w2F%_5NjwR}V*GM`W<(gsMd4pd0O%>0v$Xqp{IxN_oKk7=tCThMtb9Qoh*WjJ_ceHSkEOyG<u|_pWhfg3Q`Ig@+Erb%;AB=o==-DUkWnhZb zOM1fWRd(&0r6uo7oQR^admMyMZsfDxVt1lgGx{$sE5#2FCjay9;Jfd*9ePI^pYScm z@@a+fw-GFgGv(a~Bv!NaAHQ6jJO#Y#J=f7Td!-@d<0gT!kYB*jnobiawK1JohXJb| z)18lr)4+$fivRS4m59zM{=l67>u@nBzU&t`zjka(q~|)P2Q)IaMgpmDD#v!j9qxbx zPsf~M@tS@!{7id;4tHIpRgFDQ%ESUwf>VYb;7Taoo_+|B<-Hq#6LR@F(<$2T4BzZ5 zR=p{-&Bgtg3aAocA!7m;fWH!hlp6$M|N07aF5nj8*0{C@Ivrn8bF8353xPV*p#*4c z&0D$9F#n~o(0WX;NeBdPTwTFkVk#1>mbI(O+CAm;s!TheNAGcmN^sbjzrTj9aDP^R zs&=MrhN$|G_h0N{;0U(5N3e9N8%ayazNv#U^R~Y(P!X-)=`$yqI*z=R=O%W`a5!19 zz=nnM99f|`Dn7P!?&^2sD{*z5uEQrIp&IhOm@t(tg*uaur0f-1bPz>pCZV}FrWuqI z&2#jgf63U<(`f?r-4^5jB0p!+jb?R{ z5RK)je)l4d117+%D5Ur`{_!U`sY4^@MMua5vkGRf>saARExh{lsTUC6PTIEfzu_JJ z`JM?jF+$+pL%az}&@>ZTUlMQw%^WV3D3XfJM-EPIN+m6;^*DK1p_@3TzrmU9D_G0F z64}1EVWVK87^ESB%3Lr2Yf$#f>qNb)en2#udf=a)|k?E`-$wKVEyR{!aH%qQH3KolZ}hfnNa*!6&>YS!#g} zQ{Y-^Q2i8W%{3S)FYRLiFDkGz4ZzN$n8t6l4_#(Il1*PL6SeDfQ4aZ@<;k`W>y_t= zzi!$R)0h9xB(SPfZQbQ+O?d%@_L;o&W06F_oZ?$(3FJQ;{*Dx^k8{JYc~Mf;G`LC# ztK`Y69e@TGJ8?lpy0fZC1lVj=3@gUcoru;rrzjM=x-R`j|LNfw{a@_N#m+`tdx7wP zVtICRxz>WICt7FQ_N}IC(44ov|_@Zrz6QnOQp)G%NsXq*N8Ifb`Z(7v^tP zd}&>3o+`S<*{6CrsnK7VX#X)nTHd3jqQA2GgVq9Y-}xhPY!Y;-Vc7mvJjM4LDN|e6 z*6WvdxBz(2f@sAk3IT!T0{`ICPAzyf(a>sO)m+azzziWQsx@4Hdf|kl;?H^>Mt5y8 z*b9Ejq%(>TL*I<}dQ5*=qRN;cehV1us<<~Zh5~UH=|yctAVGoz{tP0y%mZAg(4#vE+JoeJ&SM4Icd&3rip1etfQ=3#yR>8 zzCXmrW1yK9Xf3YH*0^1N@#}gSGsr}UIshl6J4%q`4-MGiQ0&Odta_%M%1ZF)_S{Ry z0cz~;vh6z?V{w5UJLT1iQb}HkDN%dcdFFghlC*8ZWk>B2+L$I`ti*b&O|oO}-Y`C4N(Ev*i3@zsv4R$q<#6ry#t;o{k+_t()D3K%5mp zZ|}YzsH#2NQyQUlf?cM22zq6ZSLVDc)$Gsy?Z}&F4G5{G9$wQz#?T5) zCU33-A>?^ygoYs_UI(ojWHy8@jEllr{uBrsF+I8?R*5P4*h% zIUs-gQnQ_ot>HDQjk1NMP+6TNu~UP?jbNU!O)1*d0k#p-+kAJjVkOf6I6ZMJ;>_kh zy*WXdM9Or<^e#S}mi=}N;10eTH#Uvj@x>T}N5y9Bx5IKvh02+;09~J>F~Q1DxELw;CwXpC!IU?LD7tpa^F0mf&wjP2ovwU%p?C^`n4Js9icfSQX3Z40 z{?r6zgjI!Wpo!V}GxHrsK~e@6NZtwC_iJS8x%r?Y+7!N@;dAZBA=PQbNipu1c9>3N z`MZXqWe-GDM2{#=g~)4+_0>ZPoV>lZ&x%dM2_JuKXudQ0p#I!=z#LXuNZ}nlnG(`z z7!}YVVGBbf$$pwK3E+EW6MrrYGg;Xd3CU$=*A`z<^QqE*UKnfANsZ&TAN-#_ZmVkm z`?=c1z21DU?e^LX*g|d054;^PiFFr5_s0zBM_jawvg*EReetS5ml5r%)x}p0AE7UT zWLLe+BWdl?HzQRGYUwoKHZ^>U7xJ-v;2Kqw?cl|69FZ^4yY@caJQi8c%cL6nh6ke# z=vjisF1=4Wt4o7X8a5E6MR(a8c(#$;l+Yb+aZ$V;w$}S{;&{x^;0?U{#ig9{c*^;w zVTwj;+aIV+X~=+jR{*$xH|z7v2~gD?e?VoGO+Gx!U^>5T_SIzpnMxiQVdJ?y(@)J_ zCR*Aumt?xU7H%B$q>D4&IoXZ{)b7kB=Oeg}XxQD-e#7iq$fOQXPs$COYI6y-V?L7< zsd!ptj^Kq!Z(qJ#|L>t_f<^PvGlZV2ZfR#M)8-GoAGD3p(?$y{c1j~xY7>@*mTjj^DThn-q21w?F^z__kb(OeFVE){TJq8 zyQQh|ki~m&qrj9s4gw|{u_ZTiM;kK}9 z*}Q+g&p;Ts`;k{q0%W-J+0kx2PO*ZO5#w@z^cSNQUMyyMMYYc49Apvy0S9fQAJj)* zyHIL(55nm%U^|6eg1O1$;nLO{Iy-#h)TPSUZey$MXBEz|2jrlBp!7nLD&t1jII_lZ zrr1?h_>WztX;C+6U?EDU#Ozef5jEi6g?vE2DX=29+3+mw0{CE$P2G!bu`$-JF8cC5 zzPxtEmY?3@{~~l>5E#)|E4!dg5Us57_m{%|GnvY%tr&r-PZ|yoCATV!0%u)p7km}> z9usKoNQs(s@wVs&#=WDrRR4-7mwSmpQPtoWFFW`REVl zi+A!&y4%I)^6N<+*2R(i;J;5b4DZE_6J^*=le7Ix97(k)pS?C!Hy%?jUw5Y+m0v5b zsxG?2vw= zXN>On9lo>UnZ(z{2e}2xx%POd(<)-=(-`d)^_uP?mg-(tkp*TPtbgexmdh5VK{VWz ztNrG$`eUmnzcdBV;uf#m5F}Bt$IPlnrYThO5eA(UTmQk2z#iN%lFYEG% z&4_1(y?;dg96XR#K7@->xG0vqHn_QM@xE_-jV{Mr3kfTOGI9?gq?-|{?Q|pw$S(Z&jk^~pvQgVxU4kg3?F{qK*;%7K(BIz z%x?JTIB_1ka`{C&%qme#TU~E4$x3D`@UQ(UtG`fj(&a;4&%RFHr73?JIa!L+v*7Yo z8m1xbg~hq9u<_)2LWlGWnDj1jNre%sUhaHK=r7G#ZS_gMRbp^(5RY$Iy`%WqpUH&8 zDe7Q?f%+aD-Wu_y2CO>~%jpW!QL7m{8Ctgqz?t28r$1g%`)u#uhv64^QWFFOEBvDP zzVX)QwT4u%4klbuo153I`LuYTF*skrzqW1@M(&g!MoXdDut7b8pP$5ujx0@OFF-7{ zoQz8tA*h?h#g+lT?X-7-zSqq9_NY%G&u`*K@m&lvmYUk`>`*CgL83&K4- zXnAe6_!$_Rjj4ak_m5>u=4N@48JneAH^HKKb>P6-7yAFz>6EmnrX>7lbkzQ{Poq1@ zama8RDj@G>#ZE5DgR;Jg@*!3%Tb;#LNIPotnXz;2k_cDKI3uvh>BV@fkQ=q%x^ye46bzo?1E(K-yZH3uWR7<<3Gr}ckNx^gDws89b{i%`i zG>kBZa<;V<_h=$oZLtBm?6c$9t&JzkUYQ;iI+y4WT8}0y7+DedCGJOKKEo!tS_G^$ zmPC*1ZH@~WPSU3zDAqWPhPp+M_~8@nN+uG+ixSt7Js#F#ZGdkR5cXqj)c&^L!9}Q_ zR_n|n*2&itTO|j-KVU|Gnwmsrcl2#|F-SwCM-tnKW!Un=tz(%-11eg8=%V=o-w*$) zH;ZDr?GD&oGs#*S7@&mh${8Rwur}?*mcM?Dw9ai#Nr?&{-a>sWLtY6G!nGOs*Tg5l zIv{Ir+-exx_*Jk32w!>UwasAw5ij{lf0+}$*5voP{0wEkFRYZIyIZVZ$IRU)rV$;9 zBRlrSB^`KUoH0flYomS%+WNw@z~lL~t~EKkUsJvwD-yjv()7x>{b+(oTJUiLLSlbi z?7D&%$LwA|$Vuy%P`{H#DRB-l{`#qLM|DRKl^s$fwAM;LyFR?+w5MyZEN3L!SSSyw%?tl#vQot z5t81t?q|XVH7uf}Gib>FxX$`I9i#4v0}6RGjhO_mEEK(d%C! zMqOizE9AI5K!^NMiJYN>_8YsF8z(>}?pz&r@zWLJkrgygF7%@0BTdcf{6{sD@Ax6{ zN7{G%gVzsPbBA!!GFYy&l6i0eYppD+u~pB>wf*D-n<3!TE9cE+SIM`@ivt%v8QR8z z3UYQvCivs;p{3SOUgKf%(c<=o;ivWkbdMvi5(G()u)k~clfl5}&K$dR{5;4O#Fb;M(`3WJlRz)}Od zEsDdE3S|KeDL`&9l`k8VKI19>l+2W$R8jb{p+$n~8o=vrKk^tzT`h^dt#f)|@<-5v2c@T~0%qq6=w>!daS%JzeuGeThB8^en^nYl&SJz4U~k?^&Zzd*gFm zdNKAUFTIo2*_$>Zv>y3c`)ooh>ydK4L8-mPy+J)Mm?7m^T(|coLk2hOt!p}T9%Wg- z%qpMBGX1NQ?gHq4%kr9IpVv5Nx5UBT)B%A1U$C|D{{~xK{y(sl)LSe09|N%hqojd{ z4wh>D|H0Nv{$nNzMiC|-@0%8k)-zK_o8(|?aFLSL^Jh2D9lQ6x2IAOaMmyiP$m0JP zh>dh()r8dl1zR^fA3gtnz*c?B3*i5Pt>wqJ{x8@nHxOSu{rqz7{~CzTyu6P6Utnub z*Q??G3v9i8>D>PxY*pRB67`;6rvSq#0k3+0tOX$inp*Sl!j@qKMMukTQU#sYYfOjo ztDWhA-S~l!&MUpsFK{^Wc!Y^(Ay~(xES?QnVRqwCe#e#xDQmJ+#W1L8!3JP`{JO9! zW$6}&a$^OZxmW#ak(1MW1;Zv01YDkfBaYvO(DGRt#AFuCbhPV(BSxy>Jc#ylT9`@^ zV8-CpMV@v?MOUKIT2qM)hcCB{u+YG&%!$@APe4I+!Nt2WcKS9pTuzQ;rEIFad z^J4sMoZc3r964X4qY_&kp8<7;j|gJwj_=n$p)Y~7gCdy_qS;CVaN)UpT_EDXanlGy zO)8M$z)BNl=^>O(Yf>lt{H*GWPc%87>W6#ffQaBf#&Nh+y^aZ*%1}dE4eZ8N3tO_H7XR!Nc9Zo)aH$Z0mdICpEmA^Lw6TR%J;CU2%TBBf3_32By-Cek9j1 z(@Q0Km;S||(2%9?it9dRV4bKdsI>7y%fn$5 zcLVTHa=IxVqHvo_L)Bg>?_`2T?i7VICMzmt+1=o11>;saH%Z6OQyEeRwX_*)lMQe4 zSn#F#@@ZDo6smFoR8sFwRvFC2tB1?~&1t3(UnQlK0g5TInW8~?rDu^W7Wk-5?_}-> zuZd^ zmMhKhYb_;s@H_mrL=wbonXr8z}de z@=4L$SB0BLZt@+IRX61u>ZPuMkvT3tv6pC~2d+S@xbkrVsfmpY3~~lZ5fL$)^y+m2 z-KoHbQZMQ=j2!=jW7s@NCu6cweJM-XS12WA$EkuRxgeSbT6xhN;$B$d3?%|}=6Tq~ zF`OB4w6U4Mysg9Gl3dBfFf>@WJ|jT!E_oQ@q%W#|61Lz7U!|%r)TJf_k$tWl0h0+> zwN!5F=o_$g5J4&7&4uPwEJfOMp3Z|$O1Tn9d6nee-q|}iwP}oTm_jVvJiAdF)khf7 z*Cu2g&eyYVXmkMg%6C)go7^E^Cz&I;OiT(EN&U2W*uf?#TssY-L%agZk148q`h(9L z9Oe`qK4-Hvbqx5<$@Bd0JI#L{R1rv{ga7qVWl!}f=kgv3G7v&TAdvStNAPx&Ur~GZ zP!O%Xz$)@@QmpLBBLWJjwE`*HyoWJ=W&^c%(+H|OL}eS0Zx-Z97VBdGK_pm@u@y@e z@QG|U(RD(=834taA#nKDqP6(A{Y^kid0C-GC)NSbjDYtKPYwo0+t!KL3hiSe6E!+1 z5zQk^{2Cdrw#MD#$@|u(Co`u?TlTTlscV!U_#2%iltfN!2K3+=5GZToF*t>Qb?z}4Tu`_+~ zWrz)-+m8C|l48ML(04 z!~u%9P?Iet2=_mTiwk#&+cE~Ln9w2#vHkV55--hdG|*hWnR&a`L&X_;TIGu#Qa~C0;Av z6lnQJNEE_M32BlGlUL`uUi8)PHMabI;G?NwybZ#H~?!$PY&4MAEjh?{o&lsv$(b;*A!)Ss9F5-=LHg-E1Om zznZz~dB|9{;NPg%J2w2f`j*LeI|0&r{Og)oOk75S;5y@-U0#KN2ssX0cz5mhH}DXa zdi&$c{8sgRIyQCF;bbz-zYj5+M#C>N-XU)HCO>Wdcx=lw0X}|Vv9D2-97mlqJF5U9 zhkq96)Oo1*_Xu;%W;dZkFJRq)>sxXwo+*ei@HEd&cPxOq&T$3DLGv8b%nqP&a6i_? z_(;I1W7%Ev_J=v>Jq?f`Hn6S-quwN1OCVfVHuJ`21qQ@G6*V7%kaw^OJChKmH<20f zu8U}}O}(;6jhC6bhYonA;_6lNJ<^tv#7u+-#-m)NnM55V@9fMbGy=(a;Nv3&ew&~M z7qU;jN%WPFK$d{UGINrVoF#HgA>@G)BF8`mcdts{J_H0lSF3e{dt&=?C%V$`OEChTN7#zT^-c>6`Fdty>Ty|l*Jtt*X3X+%6uE&>Qv}*`!9X;1 ztI?W$Ic49DI`6&@eTm#-J`9Y$Mr(6zi)Bd2cKBE-nrs{&^~fifi(f4Ra}86)1ODzb zVjEL&9RRzdO62K6CpI$Vjq0w~$pea3jcYiqMU7jR8BAxieD@i44X1EnwalatN%3Ut zrkjG$sfNgrA(3<1COxLFI}?pYad)?&9FcjEI349~*wRD%lZL()PdMyB;XpoK4YTMCvlj(Xg#F2+)z$Sp9NLVuIEzc%1~NB8-k= zfp(8v+=b|GKg-EXwZDaw*x}4<1xh*#F!)i)%yZ$e&?EVNynM>3A~(PEbiz7AG;GPr zA<%akPU0bLKhZ1=GXhqp&|G=35Zyaxy{5Uc4Q$--)31yO8Oor>qUc7iI$ita72?v9 z#gvpBsFoRC%!TxM^@Q<8em|l^Yt*yT%O?U-f93(^ZXCS^-&}X&{EF=nIP=V%n-+O$ zPabdWDggJ%60f63r8edEB{24eo27tKM=R~k+!yKtT-mNY_Ee&t93pW)s(r7>7j_fvDX{wfrdD!`Ize>QMb9a!}^7vH>V zQL9jYhnR+dE}X+OO1zyD-dd!P#621qd!XvA6XR^FTJw>~w6@1t4O_X@7MUBn4=gj} zL^Ec5%v~~__-!U!e27F*6IDPnckYP*?nv!^RzXUG6w8~f#O5N}VrI+pbTd;X6e(`f z{*tXYt?1VyHil5FXkz|;3R}OYL7%;I zU&*B{6~L)K2hqh19!b9`*{i~td?I-Yq%NXalOSzRHQ@gAoMr@&1`uc{S$C}K!UAQ4 zj$EzJaj&G7yQC+hYOCw>0TQ#SA!>{O2Z#)EBHImjj?@&6L$^1strDeJIZJi_?-5kjGE&z)- z7i)LKyp)~7HTRr)f-!QIT5LoGCls8gafR_{9ru#XIPf!fFR`k#w6CMKs^FFSQj0G> ziO6Z)WTGFk(o4+zy8ZBB#on(wdcQw$Ywo&K9kvzyM%b!*IGdyx`wzulg1>!U;@f?B zO<;GkrAx>zD&4O4_^)Q?w^z3 zu4eR1hf%GtGDEBLP0vta|0Nw?R}uLpQ^AwRRFT1&JjL3uFL}09^QzqdE@P7>qBcszDaqK;{x&aW z$lhzO6GRI5aZ@WXz@LCzQQrs|WQc)PsNTv(%qWv6eWqF`?RBWCT(heGh^IoxIP5+~ zOxnuM)rv+eq16ki8UPp|7B36DgK}X_f^RSjGyvp|E0vD^bL%^xb4QDE{d$9{6b9l= zT7DAzd{jT5jMlk>s}zrWb6^i1!N(6#<`JjNo17HMKT{z27{OAJT?1fDM$IA?=WafB z$IC|r3S}d318!3w{cKl{$Cs|N#=}PAu>PI6u?P6nF?=FRF<}h9o=5Pe>H+^!{-zM! zIe0z*X|R--QqZ1>9&3Rg++KfFV-%;4YbuEGn1blyzy_>tRX4@WY*MdpyC#ij`vqY$ z74OjqS!e71e&hXj)`ZrK8=D4pNnuYZu!5^-z*Cqd8)H<^m35;@eH5y?lguQzOTq-X zuq!44M|4$Dzo3EobIw`Jj30KCj7 zAee(U;6mEm7H;#I@#?iW5h4ntu$kNR?^Bd%$o4~&!-hD92?q9RTG304e^<)Rd*x<#0W_-!m4Ekk;Y=2jYhO1&y zc6=hcj3GoGNaHDZ(tvvaPTqI!gcMgx@ce1~@xO5-8thHOdrOq=?MJroAP4L*bm$H- zd?xq_s`VLVjL!Xci*}ATzGSfvSH-eg!k(qE*Ol@hnhffgHqxXikXh!rj>IGp5{Baa zSVE!vq8)<|iIKGu&`Ce^)g;KD4p(btoGqSbZBmtPycsRnu$DWiM@OQnsh_S=?ufyv zl12|Ph?~Z{a$f78@}mLHV;VkMj@z35d|$!y(f4pY3-FfE?+4?P#duAbmFYY3%H^k4 z$E$xnwEshrl|lOh+BkfGb;x!G__TMg#!Tj|2k>rebv74v!E`I8aRR?j=(;5Izr?#@ zTzW97&jOc;@axbMA=^GQaz8Jrs?6VvCK?g0oTem890TdKOIj3OPr<`AU@i;p`?B0u z^gQ{O&(6hlq-`|#g$;Tq5zm%C#%Y8eep7d~>a{uf+A+AF*-*4gt)2-i;XnWjhhv{6 zkC2>h06x4s=-nMHli&d^@+jz{9WC8m<+}DHn#X*rO&Z^983xO~Xi*3N@I7pXb5xyZ zj!Fgrz|Hlf^;QIb;yrV*%;gD~DZ|}0Lz!cs^>V^V=W308`wZxCJ+tF#=hgF7H&@g3 zH}9idQ&u$_2hzEQ@~w%YB8edr@<(v+w8B!y93&2S1C?3V%Rk7OGBgNb0rd- zczGyA1~eRbq}=?Yqxs957Io_RUp`+J=vBnkC${->$ip1)I1_YhhP}p|iHjnzNUl!7 z{?=-vT)zIzNAyo4`s2Y>;x|KZk_qSA9o`!@kwgzW1k59LxUB0}Ge~G7tZXFoXFA9{+u?DudeDPJNjN;^3nLFC&yr| z%=Lm2MnvF%220l_#P3NfL4n4K4d@8>v_Xl~ReBU;UTz@1c`4_w*VYkcFJJ7V%!6O-8@RoASAFQ$st zzYTtkAGvX2mScE?)~vXK>A{Cdeo`RP3n}EoRNk!B#NLC9Lgjv~R0X|NygnQ${7JH^ zmK8Nkpu9rLl|0`p2=!iEHE?`6|Knwqp~EQJ(n);H%f#$g2n$$Bz?f7D>&VN~3iluj zg37h2nG)KXnwCQ4h>Z-dCvazf9)-yo7<{HDrUco$^m~czW@_wAgB(Sk;$w$r)1lRq zC~ZZM{KVsFN*$ZN8+=eZJTDL#pYB7}mn?p3tGpogs+rs-k|L(pgd54UToDa2By5l~ zok3EX-CT*_FDmPn(YK(eJr=++dCGM|b(K@`hGRqy5xDdtT&p=xyWz|Ic0NiIw3Z)~ z;%Ytr6MH>ed2N9v@}%}TBEb&%ZH3B*Bhw+n+j-|oG~I#ZNRQlAq2>|sIX@F~UB;z+ zTgXilx7+DmI;6?TYJp^FUSBALo zDKp&g44z0hh~2cYLs@5Y_vi$n*D5w@-*#O8*$=q)`3|kXyLIX!Q7>`_=Aykfr|%H7 z@x?|}I+@#W)KK11Rbn(r7N1nAJzN+d=w{oQ?6;MT&3O=cOa`PCbXfdsS4>jPMRshr z+(7Jdwv`{btN&NNs=XEfz>(8E3Ejbdn~RH zH8WVrkFG!Ld4(gL#Mp?jV^5+f>?~~(_d5;y(TGjl)C2zyVec8$#QKNr&P*mD2?3H& zq#Ii35~_fJ3B41l2#Ns#0Z{{@qM}X;5I{5(=}JIA?4hWjD4{9Ef{2QW8W0iN7Ry#_ zn>YWn&U)86pUztOm`|C>Gtb=5@49Yl6(=y<@6L(ybEI0DscVj{AbrntYU#CuFI0B4 zUALBhZfXNS!Dw&R%NsO(aK%&tc5Jh57%=0KILN}&SUfWIlwGwpqLf4fcBf1%yM79y z?+T{7Ya~m$)!1hc4Qs#F*&kP)%!K6G@+*OZD>Ptrsq-@f0j%4`+w@1DR5%X*?vd*> zkU*+qJ8%BWZp7HTG{AeZ83f-4u!A;^r`^ZbOlOpOP!JWD4_K^qf16sXgnYRwXrAW2 zYDEJ5ATX`3@G<+=aYu?mrqjHQQP+906iRH0n5MH764 zuHYteSM^{HY4g7WTU;oBYz@9d$sz+Ny;Us)?+8Xx4vcm@k4e zTrfS%1S2xERe`U0K8e(?UbS6=R}c1^DbQx4t2!W~RaBqeWv}_8M+YTZ`Xi{ITruud z9YDwy^YmH$ir1n&tffTx@N*ORJli>HjYN(FIetxdvNbZG6^fs^icApC z6iH}n*;Y=N#VXs=Cv7YX*M^058u%svBPY0W%5{|8rdSGa1CoFQku8hqslOYzi$iwG z*(wYft%@%Q2ux7QQHR&r*xa=l@!<5tTSPU z4IIVhuk>}@c97sM2|3q4_-xg_s6X-Usix8Mhwvf*D@@1hsB?Tj?+PoxUu>cVF)*u` z7)!WKsiJB?8_75vJ?MTcQrzzn`;(#WXs}GSTSOC*nS~m+S=`wV!<)PJoUIclD!y^% z-~#2LYonw*U~*;5#@H*ayXOMmrcpz*#n?_W?^p#hF!ZtiE#Zv%3 z%3$z%MrnQNgZ+-C+7w{C;8k(>wOeCB%B38x{9tg8l||~-P5WO|H~00R?!Wx7D)c^P zdp}q?E>Uooz~V1KM~06t&Q4c6$B#sxLl; zId9l(Hgryl`XzzBK~WTdYUddk*CYZQhPi_xzuE5}rRL(TI`b1eOR~r_~Yn#uX)GIatCs^}eF0a4; z&pR<4D~YPlX*QthTmWcOz?x|Z&IcLittO|4HoOI~jsy8r)V!6pdy~faStAS1!tlAh z_d5=LG{Uk6hKYdk4`tt4b(*HerxrFln``@lh-SVLpg7{K_(ePt@%Mh7gG=UFGykpW zy$hFl;`no`Ilz(VMg=pv`>EGo$!1JI@uv6XP4uT%BSnLs)=H-XqFKl0Cr3N*7?RzdVq>!KF**YlD9f=1Au z-#`Ar#skLm)l>W4cF=bw>#7>%O}#lM;;4ULW5eylV9TM4hu1p2v9ajOk6ubR zF&%{W&RPD9q`Fkem5MwJYyN!xdN6tb88)6sHEua0b{o8Yx4=ldB=f@H0b{cI!Ik(i z{Jzrg-%fqQgb5};2(cxs!CwDtzHytvilHUVyMvYEo*pm|X8L%Q5hE>GuH5#@nG~+0 z2<;h-qBEU_Bm%=|m?6sb#p?b?1}+a=zR}+MwXuXTrBm|0xI+uJ7g+sdst5C2xRR^I zCa~;lZp`k_9)&n5|9YdtMy;#9DV38RR<&u@Iw9R^`i&;!Mvxd@!{m^2`f5yICRP`S z=J6jC_lNTAh{}2{*Zt`v`*G5@cKA1MZFUCmhbTDQSb$;L);qe0Q)FI;Is-mqdH*cH zj6N^d3K`A`sPw)>)7*~m>vJ9@zpMvNEJ)@kSeaZ_hr8y^8vb!qlU)_xxz6=O3Ri>e z=5}t-reWo_FKg?&9Ne%#`M{B5?{SLEL0e_4y9qiKQPN#>575Rk(!C^Imrlxi)Q|TD z3UO+(ej19#6OTfw6zD4=sHXz<*rDkvAb>R#)#Mr7vvz1|pcV(jBw9gi{E z@Xi1?*P00!*@HI(waFGfnx*yu0;@nG`Jpj;Ch;B-OnY>=bw_9eiw7nD;2$=muygO0-!aqf39|YcI1!X&j!3VY#IsNrr zjw!VT0V!Qlv0vw!p1KVLn8-LnxyF{aMv1Wvc8umFt~}A(=7W6mxq=fGw-^!$2RnRf z4!2Re2Bf=vy?V)x4XYx+F$4czM?TKhdD&xZOP2r6!I91nMc^?1xHeWMUj%7D{<(n7 zWIkd5~You4fr`7jW1&o`0%k%??$qATxUQpvqE|4W(@_tK_Ki8xKNwm ze-^lU*Kwkr?mqueWVRRtOnLZV1KeUUuPjWbw6SX`g4oHsbAx<_ z4fkyg!DV4|VOn5EQJhPGtQHO*wzd6G9&&uzG3i?{7Vw(+R^&fER!sza7JQqq+{vdJ z?`5&w-=b7Iro(>wf5}&Q2=JS5ub0UGD?`S{QSMcFFH*QV0Ppj@2ErZj^QvGa%l7{= zflt~&_M3@`^aQzJMe?gEV z?*-P@eREh&yt^$g%j{kz> z>pxhUxq99I!IJQf{!T;-a441(tsPfT#OhWHIZCadnV!ImHnCDNz}!r}_|8nMKY8ux z**4F~=fItge*Rc$vza<*<;#CAvp%F)I-@yCbQ9+}T{CG!$T1?`q>}j;2{oDow}nLf zJCKzAFsO=48di6rhYg7y?!u{SOqFSlhySBNQZ(WCFXc`nCz+~~Dh3bIOHCrYBIT-@ zf|dYFEVP1HGL3}+$3i_F&V_df`kCN>WgYf6Z{@=RP4#u5xh7O2Q-z>)z4S+48#x~V z@S(u`c@@AE-d=9(3*YvaqH~thm3?{yJDFkmh-Z1)xVd0=HRo=G_M5G;-rvihBVS1d z3DLFox8q%wP&PIo=nLf>0P%}BGa(O>ax3vu)x>pNod+7*+Ha^2p9%ycw{;lq=a~yp zq_-!|!yx;kKqfbkUqsZW9-c7KW-(Dd<6z<|jx%7qe*&9((yzu*gR2_Zta@?gDKj@H z0L+$ktD!Tj8HPF0G?UdAyui&O?&{)La}g4e4Jpu3vcHU-fE(O8ZDPXxl_J6S zff?|GdET6Q{aMeQP(~(%6=3du6x83b#?wHWFDG{ftJ{TWQ3_UmJYfdp0pnDd4lJXr ziK-N?8n*J`i2t320?zT+l1tB2%L<;=I5=5ue5j=iluyk)$I7mu-}ntPENn?ZLtW25 zHt-2kfKeX_Zv()HLy89{iYR9);F?Tva3-~EC&lmw8h8AT5u!f9O3IHZRlHYvRO6aifT8`JK8+{}a8P(A^OLNsI|5tK{R z24<=%s?HGKVNIgrxZ7SVX`I#D5VHBI1NsHLW--Kb8>^Osxe=j$_4W&nm`jqKI-9(x zS>mo1X9kCG+LU-cNzn3^qp|qJ)VJ4~S+LAuu7sQ!_4@*s|8C-0 zMgmML-BqUV9u|~tQ`MgrJl^`CSeOtbgs}7w&Jtuv-{_RhOP0(A4d2`J-b*9_A>3xp zIMU6RIfo;Pg+=luWrS1%$Lg6QVn|E(vD2!SAfd?*`;OE#qxHUMP1;Xgc3c00p)(_%%&Om zVa9=0qitcYRFE5^NaV?g6N0BMCp5qX6tq}f?Fg)TaiUV2m#&9LbaZ2N#4R2nE z{Civ1)-Cc5K0Tqn$kh?B{3>uRj-Z2j5J#L)^IyTDsc_5pSNymX&H`{iNAP(HtBnAQ zJt5UobKU2k9XCG>R^4Aceom4Ee z?0Kc|JH;k|k-!}LS;cI8D@QC`4%85&=K<3vQmO?UCH2QEkoqZ(-m!$RYc}aQGbv7^ z=_QYfF$=3t9p<+~_+7dJf7+G}I-u-q*Lb14a$bPl&m-If*`+|wH{PwSfnFt$stNIt z0UxRwBR@a!JP*qE*5P2c&tT?iWP2gSCq{qqLviT~$rFUGw1m^!MXZv>Va6+>;EWnhCxSD2Po>;v!e<_o; z`~?#V#f@`7;g;o&iUOr<9y6t&D(14hD8u|Wj(ho&<%En_H1BZylzf1*^4_dWLGG@$ zeI^btSUi1v>f??JXD_CFnQAltOSbAL4;l3?{N2a56BP!u!m%EF2J+^Hs02vSmnwY4 z=#@gaowOaBzPt{`N1iu=b3zmDd0Zl@~U~PDSIAT7%!Gh&AqiuuEb^j%uw&*noA&5RY1}e ztXsY8{wF?S1|=Eadc3SUNgC(5-u-@r4qcaBhgEAhVxBZ;4{e7Kle&~Qjl6ir(VF7B zNfFxiUTe=X#1s1Z`TrKJFFWaF+xMDyqU-vUF|JI9r+3vj{EPzw%6^Yp>FB7PD-fp|v z%(tzMrm`A?e%zmb-kx;ZdL*d8e1RLWNA_ib&!6e0UH_bWyzinu>h!nlpV+?9$`L(3 zK*#Y%e)L`p`{$)C`;+Pw)I~c`VqU5!cfAQT`C29C#gCeW{g#Dn=<>%G`s|v;m&;a; z-_7Z~d+So%_sC~ttvqAgGF6Z>^2v-!0afTO7gn`96kt1yOUtwmOdMMJ_r7*OyQV%Z z%|N7p>cBfu_Q73g{2QY)kM=KbOUV6^GqgI*qoqI%|9tXk+3S_-NEFaU);3j(AzL`I zg?;>5ZIkqcMLikVy1KbK<+J|H!ql0llR8EQs5&l(C5w3h!$&3 zmng*OgO9jD^QN9d2b$X6ghtdH&+^>0B7P_``qx7`C*ko>77WYJiTq=5cqhY>L2x$K zea6yQ&tG2TsZKD`r5Yw;bBswvm^%JIsNZ#mr~3eb#&Ux1sta>d^eC2{SIV!{+*kAm zmsn&JfsZ7X?0wh0CAN~$Dud4a_Nv#wL6kb}J6U^5nAJloIOQbEe>wX;6yPMOda0@8 z!&}$KuUu~x$PgY`eWxHyG3U%xvyzIOrEw!uPa9$V%Iec$^4=2K#!8%80|>11_8jJ+ zTW=Z#l5-!G7gj=ITs0*~6(ppuCk>>tZ<=oLcNOCwpM6=lhN+3QTOtC-rY|vDZsMsr zfv-t5BD;7;2r<%#kCLTFumT2p(`|+VwyVZe>I%ua@ zv-$4I+$PU~j38poWtCfoeM6?(Sb%(#x2xj}PUbW{U)ytR2See*{;i?rFS8ni@rXYC zp01TkWBFFC2)pJxar>HmDfbmX#f?sO|1EzeLVI6PPtsH}@`d83drlNez~vvB?qVldz!R% zKkQAgDY;y5bKedWFq<_zP(moSWbkoE;gdkDDjn?ulSXR&BVXHnzr-Fz+l+_Xf-K)Bj$MW8d_uXh~ zYNFii>Qg?JF=&rEbLz@Bg0dV10(+mp>U>+{pw|ATK@@x*rkrFJ4BPfqH-s>IguPUu!3`jSfhkQ6vf^yKz-BKEn~i~ zCAA$@IPmL1K{U4sC**o&OK%TIfbxJMe{g)ogB?z+180A+Jaxqg&HJch!~$JGHF~5u zxhX1VnSonBrb&8t%)061fFSdGBY$Po7V9tmr{US9I(cuev$3w}+({y|fP1q)>o4MY zXINsVqHnzSPKx``@ZIyoKrcs?GE>#Cdr*~%^`o|6|5F|}j=3YLNoMpElKHdCFo5nK zPmiq;Q3c#IxFnK<0>?XkjGPk$*39~?zE9PP3kg&m5f}wh`IGOIG2=aEQ40Ghv*cT6 zJGRO1(OCkhS-`2|oe(;WXswhL)n1u-ENQQL526 zTEys~|8<|zkLy$|o88x1@V^ke3X(J76UFHvrs9@z z=EtqaD?~X%yN54%@Nt7=Ug-JrvRP;ww283x-!ydlyOK zw*kj(^@A+M_|bI{(}fT0H>ZBu_iZdHm!D$gIdUv3&8EyiJ^taj;+CVQmQ5YkmtC_& zNdRn`UB$T`WS}?iT+H+L=MqkKNC-ue(=AI{f&%o@0qS>;BgcV<(reO}c^d=TewDaA zxWM>ov6_t)f>~qpkGIdB#?2nzv?VAuc}#-^%P-aLF7!I@@73b*T{R$TU3%%1<$Fl(MW*~2%JfC_ zmpdINN(#y_utFphn9sN#H!i7l|6;ew@2QX@U+O#qaC$BUtKZAlX>7~wzGJ_}vqrCUnZwI**J2|0 z#S=fC=sYSoAg2gq{OWunsRH= zJN(MOPeLyK;mRxp8}ePh9lEeIWP2mfYlTw=b^YG>opmp6Y&Z!MaDS7IRJES? zW2E~xv_5ia>bxf+Z!*aaycazf`()^mA_EIHZh}O480-`1glOgG+h1L!)_3A=1xcry z2LIC-K47gQ@X~~+gDJVJBKmNE!jrSN@%VPMUaJ(}ABS;#{-IjrHNLFW?m8k;pNNi* zd$Q3pygUD4-}L?z$uEV56>hNJ!egNG9-bPH>8g^C8{OH5{%gnW6bOT+_$uFP%ilf@ z+*|3MSb9G3=10{Eoz9ml)CA`Uo+~GVzc$Zg5P*5#TKRdAclrxvs!E5E4qK=_{ZQ{7 zRzi_Bc(AzhI`tTSBL<1292wK56hP!)Qj4CsgFc%8c^~jx^gOZGM8n$-yjwoKoKY8( zbC_tyGbv3l^)BYBDjHmFlvm6Lpa*{H&+n6blo#U`qK|&St(YemIQ%nWt#2SZYM_oB zNv2GG6%#VP)xSPa@g?!3vl`Ak&$vJ7EJLf%=>;6>quTr!hZSsw4 z_;CBNXsXeZN#9{T*Mp7-)oc!RmfRCdo{0Dt&M9w5*X%qWxjL*_ILC>e$Az^cWD`1V z+v|V}BbhTk502@$R2Y%w<>~j6N;b^&w<0^GT940#C)BB^I3~FrG}6?+P1mn@OBxA^ z$*V88eT&64q771_AuwzBch6`(HXup+{w;03yWKK1hF91(S517UYWvC z@dXtn^zxM0pgJ{%4EvK!T(LIX42qC7Rusht|IUEj=kB_T481n=CzcX&l3IQTC3)lw zCpuT5Hb5IGh(RYqYgm0&1~zWsrp9m+D-3t8@FO$6ZRshbCX4;};0*etKsLV^Km#cc173s$#hQkF*(*(;f@Pb^SomuTW0ribEBt zs14l1VaB@(PXR8EQ)Z2t{=0e74K7RY+#HF|kQA^A2GxZr~PUW3xJz{n`;nju; zvoqhHCr7!TxtvDXjrF{G=3J@P%E));lFyv~rP1=j?BcI#Tf|IvDD9%+S(@V6w(Y8C zUu?LbYu@2-wj(cbo$9NOVDn2+XD`K>U*7)kx60Pj{V|ux`5QlsoIYsYt?7yKec!sh z@!UUY-IuqzOHN(8dA3LKZv)5mk-0EuT3-IaMS+-9a=xt&Mw$Ie$qEwO>bvnX(H;MT4&NK=#SIjyo{mrNKb!pE%*Jb%!2h*rj(&97dBOXntWERz*kipH zH~uelxc0t&-0lBA=rH_j+#O9@JJa)lfs>(B-)y5se0HP`G0 z9^edD4%gmTKGTIpPXihR8USFw|9Hs_F%^Ud)PGn#j@pADAV#B!0&oMZ7iJO^S^Dt| zrEJ+K3$>0Nk6Ajf&=?OTV=SevHB*`xfw$$kKqNFG7Kjx;$!P$1xC zrb^>*dGsiaN)!}53ji^SLX2JopwEGorQ$w3oR#vrW^cwEJ->?PCBb<5T7y~^VkQ8k zyHC<>4`g~_>r0x5IK2(d69RJPa0wmMOra-MbyMHbuWFGXqxwW>JUc1k|rY3$tze@?tp_z z+i=!LOx-b~TfzJN>R@dd*Fp$1SR7a%UpmL&t1yAx#4XxUy6Rg$SZ|p+c>AA&73#ys zc2qjRb@WGt8=m-8xv)MpDQ&|_`hF%aj_7`g%tdd&U5m z*g3~8W zr$J78^@*JV?uO}LBwyB@ibS*mud2$p{*ElbR3L)GX@~;J1l9AEP9O+w=zU8hVwupN zs#^dIu)@>C=xSMXWb7hJy3=rnlINg3?Da7!dub3P?cpZ^C*gg9LG*Gk6GN<$z_JMu zau5I!H&D3SqX!Iy6ts4r6f2L_4V0Jk7K#Uiq??w&(BAZh*=UEhwXtbMO3VWLlPplC?62Hpz(OsIAA#DQ9BAV*QeMhlymrV#~5_X zl@~F2noJJnb)U?&O~LABNsijkVZtfn>HvE19t~fJ>bx`=uI-hf3&WS?l=)OM@E2ivXG`Sw>OVdYe$=2zivn9W7>gJt$X*iLtM@#1Xj# z+0BZlfLz5a1hQ`Bs#0t?W_0kRiU_fc3H92WNmr6NCUxB;yo$J)=6ghB2$r3}<Y5A>&`cL912~ zY`PwD0D90pJ4#xzZJ(N*FM9KK6~mykeo_R>8g9~4-ZWl9n8;FgC(z}s6u8!ibZjdqo&)QNN0B0$rPipr_3ww*QU$DStLGhQ}Gk5q?*R zcEQQ@z8;v;JP~QR+PI;Q1SDDRUvDxvL2)VXCkg3zQ}xGaS>~r)1LW$ZUjQta?!>x? z7^P`Fa*685E0~R%H$9v7T_1Tbs(9Y+pA4)RX8n}nrVV`ia9T7Z=h{O{qgGk_FdI@N z%2ow(KbUPUQGyfD`0)wUO5grbCbtz3f*TT9T&ySEJMi{*GE5ilwSC}B{PwwB#c`N) zSPEm*MX_qn&J0DlSfRum1+l5Gax0VTgyjQz{62aMbK~j-6(i%ihvdNh9JvGvIkoj; zp4F>$gq&=ioHc~P2W(Qi=os>~y&V)%@?VaImWB`oJMb*5RqRYP_3FTs%PbI7AivzF zHY!2eunP>=>>jZytHF()^5aQG=!m$CChueUp9Bm7x^{&;a|2+su#OTWO+*hb6%?vc zZlW5Hm7joy%IL-disWrBk))^aYOjr&8)M}rNgUU%FVOgM6{e<73py?;Nb&`btm}#V zG1P^tiQ-j}B#=jW#1WmK+yVabFp-U#9v-GiB92m_UFFa zhR#2{$+mTox1r>M=F(?6(eSgT_R`UP(tB;+?5s?Ezo6QIy%!Zkkm}%5@_|2&foc1L z0LL}+IiLjn%a^lV*%R_4uKq`Vb%c3fA3kEKI|7}MKW-nRc)a|Vu>}Y4zPQv~(ORdK zlHdXF(tIy)>TK;4h3P_RbDjIus9c(h@Jr%nZqXOd}c zo~CCNmin<$Sko|PCRW7H&$mcVzyJ^?U1%zLqHrj652$I)`!a%1UY1-6%Bw^IZ);Kc zlEGRcgzP#NXDq*6U{t~5zJ{gXqoaaHvJ+pc{n!11>BpAozE;F1<{UY!-`7ny|Cl(G zfByl8-k^KJK#}Q;l5V!UX5%N}pjIL=I)Qkkd1n{{0bd=`53~26#0N@X(oLk`lBtr| z?R6!%f1dd4B=Fyr)q~#qi?`_SUq{@&8ta@1V&ZW-P>gE`db2ocpHOd3R{Q8fN*`Rg za|JJ?@6cXrto?%e>@IMaC?5f!y&i&AtWYZ`7M`C>BQ>x> zC1r){6mdl(c3SNEbTe8maW_*GoN^h~U#7uh8T$-~3F-nkYsp@7(WEMhXirO(3*CbT z6ppMjHTglAqI7Iu?!Bi#xZ3{yWc@ONEhR4 z&kkL~Mkg~dHjD9lSO^@y>*=Y|fS;s^)}oTtDz@Kl(DFw4%YCT^Bh@~M+TG?G`4 z%1tXaSxR9~7Espiv{vkTV=)<-1eq-Km=RItne7#!S<)Sb3~Uw_IJC}oUH-1`5hRo0 z3Pcs&flJl-Tpl12nuYGU-U1s}0E(g3c@mUGIm%<+CvPuN@DsO-2y2h~g)HW4#OJG* zy2&d(?GZs&OcqISDm&$&Z4JFWF?fLxOhJG z3lu4KRhFUJ)uiPCtuf_FE9a#qH;xgjed1@sm|dX2QPX!PF8C2Y;IxlEI8rfFx`9-7QiZJeufq|x4D)L; z)Z4L#)nY(02#i4+5plUp5@wK1WTVh+t5hRMIS+{_A+AeV&*W#$`10Z*lTiN@;IJ~2 ztV|EEsUZUh#)X9rp#$-B(t#RZt?}F+8hekW5{ve!HUF~a5*=h(TGJVCEFcOsBj4-9 zoccx9xGe8NLx)fRy?tdClaOr3r1vyc3p#5SzU{xtv#$Qi8hI2=se*|!Ih-Eg_jDaV zlfO`ahgc;_@q$GCBs9&g3efZOZjgD1ZWKizZ2P=iNCf#n3iCXs?eq%kLIYZxK8L%4 zh{^mHxR(TIjYBfNj7Fno$(n5aor5K)sh=mWRgsjwZT=)6-kY^sEuV;-ZlioYm{SQ+ zSeFP=pi-EGkpPQdy~4*_J~yN26wsVV`qV9i9Zjjqm#fUeaYVGNG}a|qf1eP_dgmCk z0vp9vl#>G68xp>w*J`o5`Knt}*jJnYm6q>yWPF!?n~}|>j?Z>v=3f2grPh>dA=oia z(ao*F>yqktm|o!R)x!yz6u1I0 zL5Z;B@ou@#R}4sQ`XJ5vnfh*VZxe%NA?0WlN{sbUC}FSC%(^ob?3XR@sv=_P@1D?| zpvyRPkWJhbbyTO}`rLOMED|PastZOnYr~VRLVHx?AT+n%*CjUmCloH*A2ESXHL{x; z?*f1f3!Y5atMpl!Z; zJen}*@&!%qmiWez%K*w$y@Ql@Vvwv1R=qeoH#{0)75v$osQP~L#7EZM4C zdw&TE=OY0y9NZBpmhb?N&`>&yAcf9I@ZR&XPi4C{33SnF=it6h06+Z6s!0JKENah< zL!QFhXz^`So1O+8=fehAF?+PeQ9qT1M=JIGJc^H!T`Qkn-_V!)b^|$z8M^k?U3;ng zCjv+iN8T$~`F(I_IZ+WYBi@nyM!dCyRjJry%toe*8F0l@3=)`rMs0)G=cL*J41Jjt zpzFn#L1fm%up2D+rxevuJF1oul^c#z|$aZx(?PO+15I$0|R3w97o5+I8QnpEUC;QKk=j`1+Ca>F^^TP#RRZ! z!DOs56E@$bke5l z*~PFueVXJ?4~L>|CPd~Xm|;v;el{n40Rk4mBoW4897PbqED>s>3P_V|c99X0EZAb} z?nnu!EtP$q2g*OJ7o|pM+i&$Do-TYrw@$X(NcN?@{Ny@|mSVBAt-7S6dx?8Het~#T z3_*%=ScD5@E;~!`@-5Ul3hpvM;IKVKi*%-<34j)2m`s=;!kCT|&fRc#dSaNHFS>1y`}Am=js$!Tql`RH9it5FNmbs> zDhktkZ8fXq&+O7&)`Q`rD)V(fj1+x=_9U>OR1dcOhDPK&_pHd4?f+16OM%DD)OCzQKZ0u38j-RN0Y~>GQxZmqU`Qw{vck9C0`uR{RjEgX# z(WUNHxvR7;A7-QmmSAZP?w_$=1h95mK-|KbJ;a2mwxmy!e#7MDu}2+m(r8l86x9t- z*0oLp3c5-s0y-WVCPGfiADY~L^9jFyg$$xhJbYh|APn)2$r*h*SeQ>z2MAkUzWDq6 zaed~sUb~ga(mt1lD)mLbfA;5V(*cDJmiqh=^L9s%{MDCf?v^LceU+}DG-1ydYT`9E z=Ns5)rt1Cg!G)Ru>^^&{glaaqsRVSsJ@rR-meWFQRo6rReyU6_FvmO1R%rVIRFY*+ z7Yfoh6kTYcwk)vZ@$o5OzGEJT1P|*#UE5u*<(}cRWTbS9iYHc;- zO0WT>Vh2)yZA4h8wxLfYUftK*>U=8>|1FFbiV$eDK8PIUD*|9h9m-WL_oa*&MW(gl z6>rcOMVt8aglh)p1mHD`D?B}Ot6r71aA1SBV&vc|PDg~wh-cf{T9_H>r@Pz49h+Su zq_h;fn4q422ZjMY$&B(UZ=<{~9g)56D}t)*VYNnFR8P~|%cJMm{TfijoUhm}q8 zIt-FrgZ3s}z5TDesT^j#ZL*|yXhb@kMKf$4RzVu5W-e@PzDmURBB9FnzjVG{o-cwv zwJTFX^5JLu($21&Wi?O@g{ZtqDjN~{24V+c1L^A)DfMwzt9Cgf+Q#@-;h(eyWq8=bp*12)d$lfqlSs=+1 zRT*O<;HOx+kfTCSF#6u+i8rg{$Z9sxo)sVqoR%1tTi2tm+|cpO?~(~m7^6{cctv%M=K^IH?V#P)>$-w zjgzIZY+^`4KON71Y#BxhsaDoGvT{d4y=r1&vCG2XOv|mHDwr_&-c?E<`LE~7L~*Vejj*C>VSNx4LFxaIDo|*B*x`|Jz1{K~ zRGQNwBOzD8{Xjd1r{kyFs-K8Ll=uBx(t(3a*UcQDVLB#Xtji_U5#Qc$kb zGfleLeewxJURZa@y!s_;BV3 zoJNDda^#}id4`+`6Rq%w-*46CPWiR4{@aChL&O=K-93`xE?i?s!`M<3M>YuTYPLfghl)Iq?m@CT5HufqOsQ$<1gphzC zr30S}?*xW!`3F`G3P2Rq7*k&lUZysW^K>m1b9rG1UaNUZM$nxaym|vo$7lrHn|9Kycm8rfIm!-%0%MX(f4wX2y}eN zLyA&;Fq18RawAuch^$9y=66M^I;Jj7cxGmjzIw@L8rndA6>2qzhUEWELl) zM*8mbmP+YKjb>l=tARS~p*7WMPfz zF7ENI@Qt5E8Ld9gsna_FQ$)9R$IT{`m3rsad*UU0i6J(2m z@gjY6J0W>fgRK6mE*|B7v;fBF&0p`Fk7(-WQyQvwtLnu~5&6ES)-n*(u-;5IqX_!K zVrxh+g&!9bsbu^S*IZMhy<{HCfCmL%3*C}tYid#20a)PqqG9DCYVZB_<0fl81ajRS z+&j;lUF9uK4jbSpZiX!0Mn6DdnD=mv)p3-iBZCTMA{M2^r#V;*SD@8;B6;kpNh!}| zN|hl6T*hrtiG4jH?uudllhMBU{a7fa_{}vs{g+ac$WA^>pqOYa5Op4Z04y6F){iYk zc{o=23pi$CNV%@)L&>pKhq2EVkIFCb0t{dUf~s6=Z@!q1>?~;X^*9DN!703Vwen74 z6g-TQ>*A}ZgX-s8NoP50#9g(~y>5g$JEE85ba6#rLB@zan1aS;6j8Bg(2)WOIV%v0 z=i(BYh1VuKTgQ>h{sP!k;ME|+=vL*$q`N2!IRES{vXt^SCHAC7P~~XUz*Z-Brl4lH zC!YvgmkCsskl<;r)h2^!fj$DZo=RI+Khz(xi2BLK0=^tKBD|vsrz=2l83k(=kRM`5 zp6;{D!uLDn3P#;>?POyB`A&BhAL^=&kmOCu&Ug`Kg`cI z-}ib57ICN=iJfiV!WU2_sQd}1U<679gc|I@hX#Hp16QPn;{p~K0x|m1aCxs3@dW_S zzyiZoZfle0g@~T+Kch9{U4S}JaMioH{OIp8rT?~G>m1BI5mBHaDsm|o7})t|caC)n zk3HbwX1d_DCO1d4{ApVQjxA~_mvD;%e8RGBceC6oC43dcYuCxkZ}kK6=|fKt%3a&K$_jdQ zF1VL|H?1Gnkb_gKy5MfH7T|E8);q`98t?hV?iRsS-JIw5i`UXF)(|08K|n(ll15+q zqzZ0Aif+1u)TJOZfmHV?U~_qKASGzQ99XC;#xVhf1+~ZDihzIbF|rC!O!Z%bIQ50G z2@3$tRxmRo}lT1P?OhQM%&_gv;>4wm& zks^qQp-B-nARw0Qo`e9Qh@q&UsG*988W0f?G!zxFQ3SCeASzJo!Cqowd$6 zFCh6NvvSYjt`u423k=59G;4>2nl}**uh*^^EU^8xk9pp3c4lr_fEg zcZYa4CquEHiLbj`Y|#-+q|%Ubmh$> zvT8yPev74CQf}^9MZJE9R((VX&_4JBS!3_0Cn7%{LU|6GRrHRUy$JR+I6o)AB~Jq+ zrobvWh$Slm?7*XhTLElUUrg=2l`2B?n_k<9gz_1G8@c3rU&td_Q%_|;cANN7qTXs^r9<8aZ zm6x*Qhr`^NeDxQy4#5N`kXPA1y7ooEADfNVuaIpC=1)W$d3VhY*60(|m=Qdb_B=mm zdE!K+{#W?%eXB4Jm+;J!xBMyr#RzD-y?@e?A*UU->{da_$#9cqaD^UGsWy01i?ixk z+*)pft}}juqZ~mqm;{nX0)uZ~+B~k+EnD_;ZOA387cej zm~Sl&_lZhj-V4Q!*RzFoqLKXhD)&z0M1Ky6%_H{+zB{mq!`e6a{)Tvpw2dFhMJW$g zS%}d5VXYHUqxn+UkFe=sCY_c`w%$899NO(K9E9o4RxAza5)buKX1}^P}&I8prdmNTDQV>;6;glUnVh?0?;2m-=7k z1G#qWB8D2`Kv!{tf%tjgn?bQ&C1LgJBQ{JhCIa^ub$C61_f?P6%fh{%j8fYeSDFwv zQ>9R^MhlRT6+aRkEPT-0%2()x+eEm3&)tJx@o*a}2j;->`w+<9B5V@aNZp70VsP2< zUvvPg2$b>lc$wPqK9i_0GiNc=R-`1U1d zyIX<1P~f_)Oo^Mj z0$wO%w)oYx_YF0#Ts2S~`Ag`}obaDUT8eRwG{N_JeDnovM_=^k+zCSwwRte{WS77W zLCS_a5iH-1P{p^KzxQJ5bwYIBpErE;D1bw@>j5CMD)#*R>mU6`xX4_A;7(+j)!?hZ zpaPZ}vPzgJX@*dP4^9FFN8U7|n%2p&c{p|vXVjB6DaxN0?d?y-?6fWSi@VZ;#MaH^ zGxY85&+ha^cSU>EZ#!%wy3M_1lOFAU@|*$-t_P*LG7O(FjkpgYVT-|A{qQoBR<6<` zKgm(9a^Zb1h+`v2+HveCfK37)Rq2X;3l8njOZsD>GC?bpY-3Ng?BCz?)IJQ%X3rEP zt;}p1*=m+*r*rE4A)$<#bMqOQ-MQgupE+5QvyEx)FNF?0D+fCPwg!S0f2a^aT@UW3 zCiDGZfH}SMxWomAQYrMSr=PzWfqEA;AHP2QFY3WgRFvqJI@A*_K4^xva}QE z?Jjtf9RE#TGJ13KzZ4zB;q? zAv12N_34q(@pWf$$@xuGjhFC(2*3@~wT?L*4os?uOe)&13p(FXX_cu8Y2+Qkg0FZpTX6g_C9q zrC;vj&@MOTW_zAb?kw0h^N#JB5xErgHZyp~{tQKj0NVllN+QsEqVxRJ!slHI-*A)5 zB76QWNB^r$f^|}~c6O?~IEP3R)StW460mf^jvw3j?T~xr)|Yc8OOg4Dv+9)0bw;m@ zzr=qmm_b~^&WA0Re!Q%?aZUc)ucsM6@xNImFDoam?!rq2Xu8?@&-FG*oYPkdmQL&; z9oFb8!>u=pj*_=DZ2}V^(~c49hQ#yLUIn*eHrIdKDl3@k)_jfL{8OrPhq@5B&O^ov z=bTyn&6vkKEcg9aQ1bH-0K)B5J%ubIw=2CpNl1VxGWXpXB+T4w(B@IKIDf}IjZJlFS<{l7sN@LWaIz0dk3wl_C zXC3q_G!k4606MDu2$-sMU90tHKTa`y4dc_tYyXO0_PO1%m;_}0%3Oti=Ss8tW@l(= z?Xr%vCkO>PG#WE5-3&cBvTlOGbGy5-9#e7et442oP)5!xLqI z1bZ5fhG(g|$vl+&5O?PHkn8t@`TM}xsq%s#`L10&UhHQM3qtEy9w z#u8(OsmN|U{ns*YvG<^ZMGPow!Y}KI-1r_sEw`A@72#DbMyEs?z1*68xQNfC2E>wE zni;xbZo2L$TE1>sw0iH#m~S9+sV~JgI(~D>4&D0O{((adM!YN>rI>hhJgQhN(^>5I>!7P(v>6q=tvuPCw{UA|a#_`{%UKlM&cX$rM#k}d%^Bd_ zJ7%p0C^bqaJ2tB|pSID-C-}yAtNRQZ%ee`cs=oH&6vBQQ6yBJK_sBNhboum7h9 zd;+l?pMyW|erVJkXUBO^$?^Cb3zriw+@*)rL~cq7ycS7j4|Ikoht7Qf)m=@^Y^Jgm zbpf5q-(m38ASUunDWIPQHU};a7YseEf;zgT7JrQ@>1(`K1$*)F-bqomlWlCPiSWgP zYeL=Fip~ue6qQ`c7nxJ7XmbQOuE55-X~i1qG&@!EDzKVGf+*B$7V^4o6GS)fv^Hf9oRYgNex|3T}(RNM3i=ffpQ`Lshok zLWTI1n-k@4h|(-<+Zv_6T4EF2eHC@b4GF3B`zaAp!-IC$@hL?x^_RyF8wqbyra%re z3&IjW0}`0(%P&?3Mzp(@-WzmY=1+NPj$HlL`IeDssd#*&JE&&<4);I*02{#7C>6-O z7QPyOgQXvB5@6gU?GGWHtU%S@+w%m3JNQ8M$vJ_K`iZ*gMvCdAzr{l|Enr*34W-Bt zJ?ijQw-z|3Ed%g6=N~{!X#*y;S`XjAbNnDF;Qbd=awD0gg-9_rGyr&GeaArM2#|o; zo~v6GS3oOU!&He!Ocg^`*V-jwbSG~0BNR`fAsV?m9Xqu?uU=aIxUKxw~N1vQ+VCORHQ?ab$tV?W& z&RQgzBRZHZXoTuEYos&^?Tu|mErjMARg9Xh{_OPTYs4G=j9EeQXiEXXMidx|=jpMA zqxx~f2pZdjpN0DIHdPn5*UtG&E~!HH*;Km3%c5c^+|hOxsW_W>$Q*I=VHZjd{uJ3< zCA?$u=BOpouc4Jqg59`B*VDY(D{na$80@R6J{~$+rc-*x{XzD6k&Rv|U!9z-h7KI? zp`q$|(hbeVPR}h{K&5e^*7Yul&j47xzm%yq@a}Ye^_Q^h6{~`VvRXd&tb&1cmnt@R z@rHMv$G+3;FQXe56!B^^&8z6z_}sCfN~`Y&)DTFSvP{ulWKyHKcin^8_iTj9HLGVd zv+^R#yH3UX-|v@tuRlt?5q$Avtj8AbpI6I|b}3~a>N$_#N>QZjnEk9|6t`iiz?dsl z+?5^Z{`KdL9nFwKjV&`KDU)h*m2q)DnXn}K-1=|#M%s1Hlc{_7=yPRnBpu3dc$(Aj z<;rPdgGYgK6OzB~cQ16I)dyR#|3!s8?b@AW_J;dirOUCS#nhUUfJquYAR>0xfpcd8 zr^N1mA%kwGvkPH5oRd%z(6{iPgdJagdX-y^r&P;lC8H6@?cBgaZMG+-8<+9G_VG0e z{=P>nzB!B*4iJ>)r78g&zHA>=ejifgZpC=j@%f0}sQ|zIl8G&wH&q(78{FTZYfXE| zpFAvxD01J~j;X#05X}E9t?ocpbv{34etgS?lpoux;thPejD5+6{N~`@pN^DclADK$ zRm~0qSB6xtw}smQ8s9Rmj>t4_JB>dd)lsY({C?ByAp8B;0rPQvy^~Y=t1{McYN3b8 zqr1~*?!6Am+Ic9(ti6WvrJgh<0RN*l)$QJKOem~0uYAznI74zjGFSP)BdiA5z~X66 z$X)&U&A%K!x)s0HWa2+T?>g($DSFKA@vcvYwqjR+ZJezhcTPMAZ}+x(TV_W`Eu2UX zt2{3%T&`HJrEYwgoU~(8;xkE+d?4la?P-4YuV?$;9S3v+Kjq(xnEXX1Y_ExWEBWv` zb+~!(Qq?oca9apru*8-G@0hH69vP(l$)}gBEnX=&@%+d6R*8)L^Zd3w)jVX&uH`+e zLT|t?PLo$^x&=K8J8&PiMqr1MB|se#jht9uHvhj|HVjU%ILC$0S> zkDmC%<2t8P7CUndxB|VeCngH9At=qa-c@T~SjeB*k{XNt(!9sfAPCC5){s6E|15!! z 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

Q$ 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 z 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%0Ah)*UZ0f2!WXSv*V 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


7h8Rpg3Bw?rGSkTRZwp6 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 diff --git a/toolkit/imgutils/testdata/test_result.jpeg b/toolkit/imgutils/testdata/test_result.jpeg deleted file mode 100644 index 8abf4899029b14d7c2355719bd21eae7619ec45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18083 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 diff --git a/toolkit/ip/ip.go b/toolkit/ip/ip.go deleted file mode 100644 index 0c61e943..00000000 --- a/toolkit/ip/ip.go +++ /dev/null @@ -1,13 +0,0 @@ -package ip - -import ( - "net" -) - -// GetOutboundIP return local public net.IP -func GetOutboundIP() net.IP { - conn, _ := net.Dial("udp", "8.8.8.8:80") - defer conn.Close() - localAddr := conn.LocalAddr().(*net.UDPAddr) - return localAddr.IP -} diff --git a/toolkit/ip/ip_test.go b/toolkit/ip/ip_test.go deleted file mode 100644 index fd3a1e09..00000000 --- a/toolkit/ip/ip_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package ip - -import ( - "net" - "testing" -) - -func TestGetOutboundIP(t *testing.T) { - tests := []struct { - name string - want net.IP - }{ - { - name: "", - want: nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := GetOutboundIP(); len(got) == 0 { - t.Errorf("GetOutboundIP() got nothing") - } - }) - } -} diff --git a/toolkit/loadbalance/subset.go b/toolkit/loadbalance/subset.go deleted file mode 100644 index 726694f8..00000000 --- a/toolkit/loadbalance/subset.go +++ /dev/null @@ -1,18 +0,0 @@ -package loadbalance - -import ( - "math" - "math/rand" -) - -func Subset(backends []string, clientId int, subsetSize int) []string { - subsetCount := int(math.Ceil(float64(len(backends)) / float64(subsetSize))) - round := int64(clientId / subsetCount) - rand.Seed(round) - rand.Shuffle(len(backends), func(i, j int) { - backends[i], backends[j] = backends[j], backends[i] - }) - subsetId := clientId % subsetCount - start := subsetId * subsetSize - return backends[start : start+subsetSize] -} diff --git a/toolkit/loadbalance/subset_test.go b/toolkit/loadbalance/subset_test.go deleted file mode 100644 index 42c073ef..00000000 --- a/toolkit/loadbalance/subset_test.go +++ /dev/null @@ -1,115 +0,0 @@ -package loadbalance - -import ( - "github.com/goccy/go-reflect" - "testing" -) - -func TestSubset(t *testing.T) { - type args struct { - backends []string - clientId int - subsetSize int - } - tests := []struct { - name string - args args - want []string - }{ - { - name: "", - args: args{ - backends: []string{ - "192.168.0.0", - "192.168.0.1", - "192.168.0.2", - "192.168.0.3", - "192.168.0.4", - "192.168.0.5", - "192.168.0.6", - "192.168.0.7", - "192.168.0.8", - "192.168.0.9", - "192.168.0.10", - "192.168.0.11", - }, - clientId: 8, - subsetSize: 3, - }, - want: []string{"192.168.0.5", "192.168.0.7", "192.168.0.3"}, - }, - { - name: "", - args: args{ - backends: []string{ - "192.168.0.0", - "192.168.0.1", - "192.168.0.2", - "192.168.0.3", - "192.168.0.4", - "192.168.0.5", - "192.168.0.6", - "192.168.0.7", - "192.168.0.8", - "192.168.0.9", - "192.168.0.10", - "192.168.0.11", - }, - clientId: 9, - subsetSize: 3, - }, - want: []string{"192.168.0.9", "192.168.0.8", "192.168.0.10"}, - }, - { - name: "", - args: args{ - backends: []string{ - "192.168.0.0", - "192.168.0.1", - "192.168.0.2", - "192.168.0.3", - "192.168.0.4", - "192.168.0.5", - "192.168.0.6", - "192.168.0.7", - "192.168.0.8", - "192.168.0.9", - "192.168.0.10", - "192.168.0.11", - }, - clientId: 10, - subsetSize: 3, - }, - want: []string{"192.168.0.6", "192.168.0.4", "192.168.0.1"}, - }, - { - name: "", - args: args{ - backends: []string{ - "192.168.0.0", - "192.168.0.1", - "192.168.0.2", - "192.168.0.3", - "192.168.0.4", - "192.168.0.5", - "192.168.0.6", - "192.168.0.7", - "192.168.0.8", - "192.168.0.9", - "192.168.0.10", - "192.168.0.11", - }, - clientId: 11, - subsetSize: 3, - }, - want: []string{"192.168.0.0", "192.168.0.11", "192.168.0.2"}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := Subset(tt.args.backends, tt.args.clientId, tt.args.subsetSize); !reflect.DeepEqual(got, tt.want) { - t.Errorf("Subset() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/toolkit/maputils/maputils.go b/toolkit/maputils/maputils.go deleted file mode 100644 index 1dfbb353..00000000 --- a/toolkit/maputils/maputils.go +++ /dev/null @@ -1,193 +0,0 @@ -package maputils - -import ( - "github.com/goccy/go-reflect" - "github.com/samber/lo" - "strconv" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" -) - -type ChangeType int - -const ( - ADDED ChangeType = iota - MODIFIED - DELETED -) - -type Change struct { - OldValue interface{} - NewValue interface{} - ChangeType ChangeType -} - -func Diff(new, old map[string]interface{}) map[string]Change { - mp := map[string]bool{} - for k, _ := range old { - mp[k] = true - } - changes := make(map[string]Change) - - if new != nil { - for key, value := range new { - //key state insert or update - //insert - if !mp[key] { - changes[key] = createAddChange(value) - } else { - //update - oldValue := old[key] - if !reflect.DeepEqual(oldValue, value) { - changes[key] = createModifyChange(oldValue, value) - } - } - delete(mp, key) - } - } - - // remove del keys - for key := range mp { - //get old value and del - oldValue := old[key] - changes[key] = createDeletedChange(oldValue) - } - - return changes -} - -func createModifyChange(oldValue interface{}, newValue interface{}) Change { - return Change{ - OldValue: oldValue, - NewValue: newValue, - ChangeType: MODIFIED, - } -} - -func createAddChange(newValue interface{}) Change { - return Change{ - NewValue: newValue, - ChangeType: ADDED, - } -} - -func createDeletedChange(oldValue interface{}) Change { - return Change{ - OldValue: oldValue, - ChangeType: DELETED, - } -} - -var ( - MaxDepth = 32 -) - -// Merge recursively merges the src and dst maps. Key conflicts are resolved by -// preferring src, or recursively descending, if both src and dst are maps. -// borrow code from https://github.com/peterbourgon/mergemap -func Merge(dst, src map[string]interface{}) map[string]interface{} { - return merge(dst, src, 0, false) -} - -func MergeOverwriteSlice(dst, src map[string]interface{}) map[string]interface{} { - return merge(dst, src, 0, true) -} - -// overwrite means overwrite slice value -func merge(dst, src map[string]interface{}, depth int, overwrite bool) map[string]interface{} { - if depth > MaxDepth { - panic("too deep!") - } - for key, srcVal := range src { - if dstVal, ok := dst[key]; ok { - srcMap, srcMapOk := mapify(srcVal) - dstMap, dstMapOk := mapify(dstVal) - if srcMapOk && dstMapOk { - srcVal = merge(dstMap, srcMap, depth+1, overwrite) - goto REWRITE - } - if overwrite { - goto REWRITE - } - srcSlice, srcSliceOk := sliceutils.TakeSliceArg(srcVal) - dstSlice, dstSliceOk := sliceutils.TakeSliceArg(dstVal) - if srcSliceOk && dstSliceOk { - merged := make([]interface{}, 0) - kv := make(map[interface{}]struct{}) - for _, item := range dstSlice { - if !reflect.ValueOf(item).Type().Comparable() { - merged = append(merged, item) - continue - } - if _, exists := kv[item]; !exists { - merged = append(merged, item) - kv[item] = struct{}{} - } - } - for _, item := range srcSlice { - if !reflect.ValueOf(item).Type().Comparable() { - merged = append(merged, item) - continue - } - if _, exists := kv[item]; !exists { - merged = append(merged, item) - kv[item] = struct{}{} - } - } - srcVal = merged - } - } - REWRITE: - dst[key] = srcVal - } - return dst -} - -func mapify(i interface{}) (map[string]interface{}, bool) { - value := reflect.ValueOf(i) - if value.Kind() == reflect.Map { - m := map[string]interface{}{} - for _, k := range value.MapKeys() { - m[k.String()] = value.MapIndex(k).Interface() - } - return m, true - } - return map[string]interface{}{}, false -} - -func ConvertInt642String(data map[string]interface{}) { - lo.ForEach(lo.Entries(data), func(item lo.Entry[string, interface{}], index int) { - if item.Value != nil { - data[item.Key] = convertInt642String(item.Value) - } - }) -} - -func convertInt642String(data interface{}) interface{} { - switch v := data.(type) { - case int64: - return strconv.FormatInt(v, 10) - case *int64: - if v != nil { - return lo.ToPtr(strconv.FormatInt(*v, 10)) - } else { - return (*string)(nil) - } - case []int64: - return lo.Map[int64, string](v, func(item int64, index int) string { - return strconv.FormatInt(item, 10) - }) - case []*int64: - return lo.Map[*int64, *string](v, func(item *int64, index int) *string { - if item != nil { - return lo.ToPtr(strconv.FormatInt(*item, 10)) - } - return (*string)(nil) - }) - case []interface{}: - return lo.Map[interface{}, interface{}](v, func(item interface{}, index int) interface{} { - return convertInt642String(item) - }) - } - return data -} diff --git a/toolkit/maputils/maputils_test.go b/toolkit/maputils/maputils_test.go deleted file mode 100644 index cecce30e..00000000 --- a/toolkit/maputils/maputils_test.go +++ /dev/null @@ -1,265 +0,0 @@ -package maputils_test - -import ( - "bytes" - "encoding/json" - "github.com/goccy/go-reflect" - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/maputils" -) - -func TestDiff(t *testing.T) { - type args struct { - new map[string]interface{} - old map[string]interface{} - } - tests := []struct { - name string - args args - want map[string]maputils.Change - }{ - { - name: "", - args: args{ - new: map[string]interface{}{ - "gdd.port": 6060, - "gdd.read.timeout": "30s", - }, - old: map[string]interface{}{ - "gdd.port": 3000, - "gdd.read.timeout": "30s", - }, - }, - want: map[string]maputils.Change{ - "gdd.port": { - OldValue: 3000, - NewValue: 6060, - ChangeType: maputils.MODIFIED, - }, - }, - }, - { - name: "", - args: args{ - new: map[string]interface{}{ - "gdd.port": 6060, - "gdd.read.timeout": "30s", - }, - old: map[string]interface{}{ - "gdd.port": 6060, - }, - }, - want: map[string]maputils.Change{ - "gdd.read.timeout": { - OldValue: nil, - NewValue: "30s", - ChangeType: maputils.ADDED, - }, - }, - }, - { - name: "", - args: args{ - new: map[string]interface{}{ - "gdd.port": 6060, - }, - old: map[string]interface{}{ - "gdd.port": 6060, - "gdd.read.timeout": "30s", - }, - }, - want: map[string]maputils.Change{ - "gdd.read.timeout": { - OldValue: "30s", - NewValue: nil, - ChangeType: maputils.DELETED, - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := maputils.Diff(tt.args.new, tt.args.old); !reflect.DeepEqual(got, tt.want) { - t.Errorf("Diff() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestMerge(t *testing.T) { - for _, tuple := range []struct { - src string - dst string - expected string - }{ - { - src: `{}`, - dst: `{}`, - expected: `{}`, - }, - { - src: `{"b":2}`, - dst: `{"a":1}`, - expected: `{"a":1,"b":2}`, - }, - { - src: `{"a":0}`, - dst: `{"a":1}`, - expected: `{"a":0}`, - }, - { - src: `{"a":{ "y":2}}`, - dst: `{"a":{"x":1 }}`, - expected: `{"a":{"x":1, "y":2}}`, - }, - { - src: `{"a":{"x":2}}`, - dst: `{"a":{"x":1}}`, - expected: `{"a":{"x":2}}`, - }, - { - src: `{"a":{ "y":7, "z":8}}`, - dst: `{"a":{"x":1, "y":2 }}`, - expected: `{"a":{"x":1, "y":7, "z":8}}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,2]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":"xxx"} }, "a":3 }}`, - expected: `{"1": { "b":1, "2": { "3": {"a":"A", "b":3, "n":[1,2]} }, "a":3 }}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,2]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":[3]} }, "a":3 }}`, - expected: `{"1": { "b":1, "2": { "3": {"a":"A", "b":3, "n":[3,1,2]} }, "a":3 }}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,2]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":[3,1]} }, "a":3 }}`, - expected: `{"1": { "b":1, "2": { "3": {"a":"A", "b":3, "n":[3,1,2]} }, "a":3 }}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,{"c":4,"d":5}]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":[3,1,{"c":2}]} }, "a":3 }}`, - expected: `{"1":{"2":{"3":{"a":"A","b":3,"n":[3,1,{"c":2},{"c":4,"d":5}]}},"a":3,"b":1}}`, - }, - } { - var dst map[string]interface{} - if err := json.Unmarshal([]byte(tuple.dst), &dst); err != nil { - t.Error(err) - continue - } - - var src map[string]interface{} - if err := json.Unmarshal([]byte(tuple.src), &src); err != nil { - t.Error(err) - continue - } - - var expected map[string]interface{} - if err := json.Unmarshal([]byte(tuple.expected), &expected); err != nil { - t.Error(err) - continue - } - - got := maputils.Merge(dst, src) - assert(t, expected, got) - } -} - -func assert(t *testing.T, expected, got map[string]interface{}) { - expectedBuf, err := json.Marshal(expected) - if err != nil { - t.Error(err) - return - } - gotBuf, err := json.Marshal(got) - if err != nil { - t.Error(err) - return - } - if bytes.Compare(expectedBuf, gotBuf) != 0 { - t.Errorf("expected %s, got %s", string(expectedBuf), string(gotBuf)) - return - } -} - -func TestMergeOverwriteSlice(t *testing.T) { - for _, tuple := range []struct { - src string - dst string - expected string - }{ - { - src: `{}`, - dst: `{}`, - expected: `{}`, - }, - { - src: `{"b":2}`, - dst: `{"a":1}`, - expected: `{"a":1,"b":2}`, - }, - { - src: `{"a":0}`, - dst: `{"a":1}`, - expected: `{"a":0}`, - }, - { - src: `{"a":{ "y":2}}`, - dst: `{"a":{"x":1 }}`, - expected: `{"a":{"x":1, "y":2}}`, - }, - { - src: `{"a":{"x":2}}`, - dst: `{"a":{"x":1}}`, - expected: `{"a":{"x":2}}`, - }, - { - src: `{"a":{ "y":7, "z":8}}`, - dst: `{"a":{"x":1, "y":2 }}`, - expected: `{"a":{"x":1, "y":7, "z":8}}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,2]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":"xxx"} }, "a":3 }}`, - expected: `{"1": { "b":1, "2": { "3": {"a":"A", "b":3, "n":[1,2]} }, "a":3 }}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,2]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":[3]} }, "a":3 }}`, - expected: `{"1": { "b":1, "2": { "3": {"a":"A", "b":3, "n":[1,2]} }, "a":3 }}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,2]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":[3,1]} }, "a":3 }}`, - expected: `{"1": { "b":1, "2": { "3": {"a":"A", "b":3, "n":[1,2]} }, "a":3 }}`, - }, - { - src: `{"1": { "b":1, "2": { "3": { "b":3, "n":[1,{"c":4,"d":5}]} } }}`, - dst: `{"1": { "2": { "3": {"a":"A", "n":[3,1,{"c":2}]} }, "a":3 }}`, - expected: `{"1":{"2":{"3":{"a":"A","b":3,"n":[1,{"c":4,"d":5}]}},"a":3,"b":1}}`, - }, - } { - var dst map[string]interface{} - if err := json.Unmarshal([]byte(tuple.dst), &dst); err != nil { - t.Error(err) - continue - } - - var src map[string]interface{} - if err := json.Unmarshal([]byte(tuple.src), &src); err != nil { - t.Error(err) - continue - } - - var expected map[string]interface{} - if err := json.Unmarshal([]byte(tuple.expected), &expected); err != nil { - t.Error(err) - continue - } - - got := maputils.MergeOverwriteSlice(dst, src) - assert(t, expected, got) - } -} diff --git a/toolkit/memberlist/.gitignore b/toolkit/memberlist/.gitignore deleted file mode 100644 index 1f3c4395..00000000 --- a/toolkit/memberlist/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -.vagrant/ -.idea - diff --git a/toolkit/memberlist/LICENSE b/toolkit/memberlist/LICENSE deleted file mode 100644 index c33dcc7c..00000000 --- a/toolkit/memberlist/LICENSE +++ /dev/null @@ -1,354 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. “Contributor” - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. “Contributor Version” - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” - - means Covered Software of a particular Contributor. - -1.4. “Covered Software” - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. “Incompatible With Secondary Licenses” - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of version - 1.1 or earlier of the License, but not also under the terms of a - Secondary License. - -1.6. “Executable Form” - - means any form of the work other than Source Code Form. - -1.7. “Larger Work” - - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. - -1.8. “License” - - means this document. - -1.9. “Licensable” - - means having the right to grant, to the maximum extent possible, whether at the - time of the initial grant or subsequently, any and all of the rights conveyed by - this License. - -1.10. “Modifications” - - means any of the following: - - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor - - means any patent claim(s), including without limitation, method, process, - and apparatus claims, in any patent Licensable by such Contributor that - would be infringed, but for the grant of the License, by the making, - using, selling, offering for sale, having made, import, or transfer of - either its Contributions or its Contributor Version. - -1.12. “Secondary License” - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. “Source Code Form” - - means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) - - means an individual or a legal entity exercising rights under this - License. For legal entities, “You” includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, “control” means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or as - part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its Contributions - or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution become - effective for each Contribution on the date the Contributor first distributes - such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under this - License. No additional rights or licenses will be implied from the distribution - or licensing of Covered Software under this License. Notwithstanding Section - 2.1(b) above, no patent license is granted by a Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party’s - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. - - This License does not grant any rights in the trademarks, service marks, or - logos of any Contributor (except as may be necessary to comply with the - notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this License - (see Section 10.2) or under the terms of a Secondary License (if permitted - under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its Contributions - are its original creation(s) or it has sufficient rights to grant the - rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under the - terms of this License. You must inform recipients that the Source Code Form - of the Covered Software is governed by the terms of this License, and how - they can obtain a copy of this License. You may not attempt to alter or - restrict the recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this License, - or sublicense it under different terms, provided that the license for - the Executable Form does not attempt to limit or alter the recipients’ - rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for the - Covered Software. If the Larger Work is a combination of Covered Software - with a work governed by one or more Secondary Licenses, and the Covered - Software is not Incompatible With Secondary Licenses, this License permits - You to additionally distribute such Covered Software under the terms of - such Secondary License(s), so that the recipient of the Larger Work may, at - their option, further distribute the Covered Software under the terms of - either this License or such Secondary License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices (including - copyright notices, patent notices, disclaimers of warranty, or limitations - of liability) contained within the Source Code Form of the Covered - Software, except that You may alter any license notices to the extent - required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on behalf - of any Contributor. You must make it absolutely clear that any such - warranty, support, indemnity, or liability obligation is offered by You - alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, judicial - order, or regulation then You must: (a) comply with the terms of this License - to the maximum extent possible; and (b) describe the limitations and the code - they affect. Such description must be placed in a text file included with all - distributions of the Covered Software under this License. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing basis, - if such Contributor fails to notify You of the non-compliance by some - reasonable means prior to 60 days after You have come back into compliance. - Moreover, Your grants from a particular Contributor are reinstated on an - ongoing basis if such Contributor notifies You of the non-compliance by - some reasonable means, this is the first time You have received notice of - non-compliance with this License from such Contributor, and You become - compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, counter-claims, - and cross-claims) alleging that a Contributor Version directly or - indirectly infringes any patent, then the rights granted to You by any and - all Contributors for the Covered Software under Section 2.1 of this License - shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an “as is” basis, without - warranty of any kind, either expressed, implied, or statutory, including, - without limitation, warranties that the Covered Software is free of defects, - merchantable, fit for a particular purpose or non-infringing. The entire - risk as to the quality and performance of the Covered Software is with You. - Should any Covered Software prove defective in any respect, You (not any - Contributor) assume the cost of any necessary servicing, repair, or - correction. This disclaimer of warranty constitutes an essential part of this - License. No use of any Covered Software is authorized under this License - except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from such - party’s negligence to the extent applicable law prohibits such limitation. - Some jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts of - a jurisdiction where the defendant maintains its principal place of business - and such litigation shall be governed by laws of that jurisdiction, without - reference to its conflict-of-law provisions. Nothing in this Section shall - prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. Any law or regulation which provides that the language of a - contract shall be construed against the drafter shall not be used to construe - this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version of - the License under which You originally received the Covered Software, or - under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a modified - version of this License if you rename the license and remove any - references to the name of the license steward (except to note that such - modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - If You choose to distribute Source Code Form that is Incompatible With - Secondary Licenses under the terms of this version of the License, the - notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public 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/. - -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice - - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. - diff --git a/toolkit/memberlist/Makefile b/toolkit/memberlist/Makefile deleted file mode 100644 index e9b7b287..00000000 --- a/toolkit/memberlist/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -SHELL := bash - -GOFILES ?= $(shell go list ./... | grep -v /vendor/) - -default: test - -test: vet subnet - go test ./... - -integ: subnet - INTEG_TESTS=yes go test ./... - -subnet: - ./test/setup_subnet.sh - -cov: - go test ./... -coverprofile=coverage.out - go tool cover -html=coverage.out - -format: - @echo "--> Running go fmt" - @go fmt $(GOFILES) - -vet: - @echo "--> Running go vet" - @go vet -tags '$(GOTAGS)' $(GOFILES); if [ $$? -eq 1 ]; then \ - echo ""; \ - echo "Vet found suspicious constructs. Please check the reported constructs"; \ - echo "and fix them if necessary before submitting the code for review."; \ - exit 1; \ - fi - -.PHONY: default test integ subnet cov format vet diff --git a/toolkit/memberlist/README.md b/toolkit/memberlist/README.md deleted file mode 100644 index 6a2caa30..00000000 --- a/toolkit/memberlist/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# memberlist [![GoDoc](https://godoc.org/github.com/hashicorp/memberlist?status.png)](https://godoc.org/github.com/hashicorp/memberlist) [![CircleCI](https://circleci.com/gh/hashicorp/memberlist.svg?style=svg)](https://circleci.com/gh/hashicorp/memberlist) - -memberlist is a [Go](http://www.golang.org) library that manages cluster -membership and member failure detection using a gossip based protocol. - -The use cases for such a library are far-reaching: all distributed systems -require membership, and memberlist is a re-usable solution to managing -cluster membership and node failure detection. - -memberlist is eventually consistent but converges quickly on average. -The speed at which it converges can be heavily tuned via various knobs -on the protocol. Node failures are detected and network partitions are partially -tolerated by attempting to communicate to potentially dead nodes through -multiple routes. - -## Building - -If you wish to build memberlist you'll need Go version 1.2+ installed. - -Please check your installation with: - -``` -go version -``` - -## Usage - -Memberlist is surprisingly simple to use. An example is shown below: - -```go -/* Create the initial memberlist from a safe configuration. - Please reference the godoc for other default config types. - http://godoc.org/github.com/hashicorp/memberlist#Config -*/ -list, err := memberlist.Create(memberlist.DefaultLocalConfig()) -if err != nil { - panic("Failed to create memberlist: " + err.Error()) -} - -// Join an existing cluster by specifying at least one known member. -n, err := list.Join([]string{"1.2.3.4"}) -if err != nil { - panic("Failed to join cluster: " + err.Error()) -} - -// Ask for members of the cluster -for _, member := range list.Members() { - fmt.Printf("Member: %s %s\n", member.Name, member.Addr) -} - -// Continue doing whatever you need, memberlist will maintain membership -// information in the background. Delegates can be used for receiving -// events when members join or leave. -``` - -The most difficult part of memberlist is configuring it since it has many -available knobs in order to tune state propagation delay and convergence times. -Memberlist provides a default configuration that offers a good starting point, -but errs on the side of caution, choosing values that are optimized for -higher convergence at the cost of higher bandwidth usage. - -For complete documentation, see the associated [Godoc](http://godoc.org/github.com/hashicorp/memberlist). - -## Protocol - -memberlist is based on ["SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol"](http://ieeexplore.ieee.org/document/1028914/). However, we extend the protocol in a number of ways: - -* Several extensions are made to increase propagation speed and -convergence rate. -* Another set of extensions, that we call Lifeguard, are made to make memberlist more robust in the presence of slow message processing (due to factors such as CPU starvation, and network delay or loss). - -For details on all of these extensions, please read our paper "[Lifeguard : SWIM-ing with Situational Awareness](https://arxiv.org/abs/1707.00788)", along with the memberlist source. We welcome any questions related -to the protocol on our issue tracker. diff --git a/toolkit/memberlist/alive_delegate.go b/toolkit/memberlist/alive_delegate.go deleted file mode 100644 index 615f4a90..00000000 --- a/toolkit/memberlist/alive_delegate.go +++ /dev/null @@ -1,14 +0,0 @@ -package memberlist - -// AliveDelegate is used to involve a client in processing -// a node "alive" message. When a node joins, either through -// a UDP gossip or TCP push/pull, we update the state of -// that node via an alive message. This can be used to filter -// a node out and prevent it from being considered a peer -// using application specific logic. -type AliveDelegate interface { - // NotifyAlive is invoked when a message about a live - // node is received from the network. Returning a non-nil - // error prevents the node from being considered a peer. - NotifyAlive(peer *Node) error -} diff --git a/toolkit/memberlist/awareness.go b/toolkit/memberlist/awareness.go deleted file mode 100644 index ea95c753..00000000 --- a/toolkit/memberlist/awareness.go +++ /dev/null @@ -1,69 +0,0 @@ -package memberlist - -import ( - "sync" - "time" - - "github.com/armon/go-metrics" -) - -// awareness manages a simple metric for tracking the estimated health of the -// local node. Health is primary the node's ability to respond in the soft -// real-time manner required for correct health checking of other nodes in the -// cluster. -type awareness struct { - sync.RWMutex - - // max is the upper threshold for the timeout scale (the score will be - // constrained to be from 0 <= score < max). - max int - - // score is the current awareness score. Lower values are healthier and - // zero is the minimum value. - score int -} - -// newAwareness returns a new awareness object. -func newAwareness(max int) *awareness { - return &awareness{ - max: max, - score: 0, - } -} - -// ApplyDelta takes the given delta and applies it to the score in a thread-safe -// manner. It also enforces a floor of zero and a max of max, so deltas may not -// change the overall score if it's railed at one of the extremes. -func (a *awareness) ApplyDelta(delta int) { - a.Lock() - initial := a.score - a.score += delta - if a.score < 0 { - a.score = 0 - } else if a.score > (a.max - 1) { - a.score = (a.max - 1) - } - final := a.score - a.Unlock() - - if initial != final { - metrics.SetGauge([]string{"memberlist", "health", "score"}, float32(final)) - } -} - -// GetHealthScore returns the raw health score. -func (a *awareness) GetHealthScore() int { - a.RLock() - score := a.score - a.RUnlock() - return score -} - -// ScaleTimeout takes the given duration and scales it based on the current -// score. Less healthyness will lead to longer timeouts. -func (a *awareness) ScaleTimeout(timeout time.Duration) time.Duration { - a.RLock() - score := a.score - a.RUnlock() - return timeout * (time.Duration(score) + 1) -} diff --git a/toolkit/memberlist/awareness_test.go b/toolkit/memberlist/awareness_test.go deleted file mode 100644 index c6ade10a..00000000 --- a/toolkit/memberlist/awareness_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package memberlist - -import ( - "testing" - "time" -) - -func TestAwareness(t *testing.T) { - cases := []struct { - delta int - score int - timeout time.Duration - }{ - {0, 0, 1 * time.Second}, - {-1, 0, 1 * time.Second}, - {-10, 0, 1 * time.Second}, - {1, 1, 2 * time.Second}, - {-1, 0, 1 * time.Second}, - {10, 7, 8 * time.Second}, - {-1, 6, 7 * time.Second}, - {-1, 5, 6 * time.Second}, - {-1, 4, 5 * time.Second}, - {-1, 3, 4 * time.Second}, - {-1, 2, 3 * time.Second}, - {-1, 1, 2 * time.Second}, - {-1, 0, 1 * time.Second}, - {-1, 0, 1 * time.Second}, - } - - a := newAwareness(8) - for i, c := range cases { - a.ApplyDelta(c.delta) - if a.GetHealthScore() != c.score { - t.Errorf("case %d: score mismatch %d != %d", i, a.score, c.score) - } - if timeout := a.ScaleTimeout(1 * time.Second); timeout != c.timeout { - t.Errorf("case %d: scaled timeout mismatch %9.6f != %9.6f", - i, timeout.Seconds(), c.timeout.Seconds()) - } - } -} diff --git a/toolkit/memberlist/broadcast.go b/toolkit/memberlist/broadcast.go deleted file mode 100644 index b1d158e2..00000000 --- a/toolkit/memberlist/broadcast.go +++ /dev/null @@ -1,50 +0,0 @@ -package memberlist - -/* -The broadcast mechanism works by maintaining a sorted list of messages to be -sent out. When a message is to be broadcast, the retransmit count -is set to zero and appended to the queue. The retransmit count serves -as the "priority", ensuring that newer messages get sent first. Once -a message hits the retransmit limit, it is removed from the queue. - -Additionally, older entries can be invalidated by new messages that -are contradictory. For example, if we send "{suspect M1 inc: 1}, -then a following {alive M1 inc: 2} will invalidate that message -*/ - -type memberlistBroadcast struct { - node string - msg []byte - notify chan struct{} -} - -func NewMemberlistBroadcast(node string, msg []byte, notify chan struct{}) *memberlistBroadcast { - return &memberlistBroadcast{node: node, msg: msg, notify: notify} -} - -func (b *memberlistBroadcast) Invalidates(other Broadcast) bool { - // Check if that broadcast is a memberlist type - mb, ok := other.(*memberlistBroadcast) - if !ok { - return false - } - - // Invalidates any message about the same node - return b.node == mb.node -} - -// memberlist.NamedBroadcast optional interface -func (b *memberlistBroadcast) Name() string { - return b.node -} - -func (b *memberlistBroadcast) Message() []byte { - return b.msg -} - -func (b *memberlistBroadcast) Finished() { - select { - case b.notify <- struct{}{}: - default: - } -} diff --git a/toolkit/memberlist/broadcast_test.go b/toolkit/memberlist/broadcast_test.go deleted file mode 100644 index cb7e6587..00000000 --- a/toolkit/memberlist/broadcast_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package memberlist_test - -import ( - "reflect" - "testing" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - memmock "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist/mock" -) - -func TestMemberlistBroadcast_Invalidates(t *testing.T) { - m1 := memberlist.NewMemberlistBroadcast("test", nil, nil) - m2 := memberlist.NewMemberlistBroadcast("foo", nil, nil) - - if m1.Invalidates(m2) || m2.Invalidates(m1) { - t.Fatalf("unexpected invalidation") - } - - if !m1.Invalidates(m1) { - t.Fatalf("expected invalidation") - } - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - b := memmock.NewMockBroadcast(ctrl) - ok := m1.Invalidates(b) - require.False(t, ok) -} - -func TestMemberlistBroadcast_Message(t *testing.T) { - m1 := memberlist.NewMemberlistBroadcast("test", []byte("test"), nil) - msg := m1.Message() - if !reflect.DeepEqual(msg, []byte("test")) { - t.Fatalf("messages do not match") - } -} diff --git a/toolkit/memberlist/config.go b/toolkit/memberlist/config.go deleted file mode 100644 index cd699f0d..00000000 --- a/toolkit/memberlist/config.go +++ /dev/null @@ -1,378 +0,0 @@ -package memberlist - -import ( - "fmt" - "io" - "log" - "net" - "os" - "strings" - "time" - - "github.com/hashicorp/go-multierror" -) - -type Config struct { - // The name of this node. This must be unique in the cluster. - Name string - - // Transport is a hook for providing custom code to communicate with - // other nodes. If this is left nil, then memberlist will by default - // make a NetTransport using BindAddr and BindPort from this structure. - Transport Transport - - // Configuration related to what address to bind to and ports to - // listen on. The port is used for both UDP and TCP gossip. It is - // assumed other nodes are running on this port, but they do not need - // to. - BindAddr string - BindPort int - - // Configuration related to what address to advertise to other - // cluster members. Used for nat traversal. - AdvertiseAddr string - AdvertisePort int - - // ProtocolVersion is the configured protocol version that we - // will _speak_. This must be between ProtocolVersionMin and - // ProtocolVersionMax. - ProtocolVersion uint8 - - // TCPTimeout is the timeout for establishing a stream connection with - // a remote node for a full state sync, and for stream read and write - // operations. This is a legacy name for backwards compatibility, but - // should really be called StreamTimeout now that we have generalized - // the transport. - TCPTimeout time.Duration - - // IndirectChecks is the number of nodes that will be asked to perform - // an indirect probe of a node in the case a direct probe fails. Memberlist - // waits for an ack from any single indirect node, so increasing this - // number will increase the likelihood that an indirect probe will succeed - // at the expense of bandwidth. - IndirectChecks int - - // RetransmitMult is the multiplier for the number of retransmissions - // that are attempted for messages broadcasted over gossip. The actual - // count of retransmissions is calculated using the formula: - // - // Retransmits = RetransmitMult * log(N+1) - // - // This allows the retransmits to scale properly with cluster size. The - // higher the multiplier, the more likely a failed broadcast is to converge - // at the expense of increased bandwidth. - RetransmitMult int - - // SuspicionMult is the multiplier for determining the time an - // inaccessible node is considered suspect before declaring it dead. - // The actual timeout is calculated using the formula: - // - // SuspicionTimeout = SuspicionMult * log(N+1) * ProbeInterval - // - // This allows the timeout to scale properly with expected propagation - // delay with a larger cluster size. The higher the multiplier, the longer - // an inaccessible node is considered part of the cluster before declaring - // it dead, giving that suspect node more time to refute if it is indeed - // still alive. - SuspicionMult int - - // SuspicionMaxTimeoutMult is the multiplier applied to the - // SuspicionTimeout used as an upper bound on detection time. This max - // timeout is calculated using the formula: - // - // SuspicionMaxTimeout = SuspicionMaxTimeoutMult * SuspicionTimeout - // - // If everything is working properly, confirmations from other nodes will - // accelerate suspicion timers in a manner which will cause the timeout - // to reach the base SuspicionTimeout before that elapses, so this value - // will typically only come into play if a node is experiencing issues - // communicating with other nodes. It should be set to a something fairly - // large so that a node having problems will have a lot of chances to - // recover before falsely declaring other nodes as failed, but short - // enough for a legitimately isolated node to still make progress marking - // nodes failed in a reasonable amount of time. - SuspicionMaxTimeoutMult int - - // PushPullInterval is the interval between complete state syncs. - // Complete state syncs are done with a single node over TCP and are - // quite expensive relative to standard gossiped messages. Setting this - // to zero will disable state push/pull syncs completely. - // - // Setting this interval lower (more frequent) will increase convergence - // speeds across larger clusters at the expense of increased bandwidth - // usage. - PushPullInterval time.Duration - - // ProbeInterval and ProbeTimeout are used to configure probing - // behavior for memberlist. - // - // ProbeInterval is the interval between random node probes. Setting - // this lower (more frequent) will cause the memberlist cluster to detect - // failed nodes more quickly at the expense of increased bandwidth usage. - // - // ProbeTimeout is the timeout to wait for an ack from a probed node - // before assuming it is unhealthy. This should be set to 99-percentile - // of RTT (round-trip time) on your network. - ProbeInterval time.Duration - ProbeTimeout time.Duration - - // DisableTcpPings will turn off the fallback TCP pings that are attempted - // if the direct UDP ping fails. These get pipelined along with the - // indirect UDP pings. - DisableTcpPings bool - - // DisableTcpPingsForNode is like DisableTcpPings, but lets you control - // whether to perform TCP pings on a node-by-node basis. - DisableTcpPingsForNode func(nodeName string) bool - - // AwarenessMaxMultiplier will increase the probe interval if the node - // becomes aware that it might be degraded and not meeting the soft real - // time requirements to reliably probe other nodes. - AwarenessMaxMultiplier int - - // GossipInterval and GossipNodes are used to configure the gossip - // behavior of memberlist. - // - // GossipInterval is the interval between sending messages that need - // to be gossiped that haven't been able to piggyback on probing messages. - // If this is set to zero, non-piggyback gossip is disabled. By lowering - // this value (more frequent) gossip messages are propagated across - // the cluster more quickly at the expense of increased bandwidth. - // - // GossipNodes is the number of random nodes to send gossip messages to - // per GossipInterval. Increasing this number causes the gossip messages - // to propagate across the cluster more quickly at the expense of - // increased bandwidth. - // - // GossipToTheDeadTime is the interval after which a node has died that - // we will still try to gossip to it. This gives it a chance to refute. - GossipInterval time.Duration - GossipNodes int - GossipToTheDeadTime time.Duration - - // WeightInterval is the interval between calculating local node weight and enqueue a message carrying the result - // weight is calculated using the formula: - // - // Weight = (AwarenessMaxMultiplier - AwarenessScore) * 0.6 + AwarenessMaxMultiplier * CPUIdlePercent * 0.4 - // - // local node weight messages will be gossiped to remote nodes. Remote nodes will use it to implement smooth - // weighted round-robin load balance algo for choosing the next service provider - // By default, this is 0, means not enabled - WeightInterval time.Duration - - // GossipVerifyIncoming controls whether to enforce encryption for incoming - // gossip. It is used for upshifting from unencrypted to encrypted gossip on - // a running cluster. - GossipVerifyIncoming bool - - // GossipVerifyOutgoing controls whether to enforce encryption for outgoing - // gossip. It is used for upshifting from unencrypted to encrypted gossip on - // a running cluster. - GossipVerifyOutgoing bool - - // EnableCompression is used to control message compression. This can - // be used to reduce bandwidth usage at the cost of slightly more CPU - // utilization. This is only available starting at protocol version 1. - EnableCompression bool - - // SecretKey is used to initialize the primary encryption key in a keyring. - // The primary encryption key is the only key used to encrypt messages and - // the first key used while attempting to decrypt messages. Providing a - // value for this primary key will enable message-level encryption and - // verification, and automatically install the key onto the keyring. - // The value should be either 16, 24, or 32 bytes to select AES-128, - // AES-192, or AES-256. - SecretKey []byte - - // The keyring holds all of the encryption keys used internally. It is - // automatically initialized using the SecretKey and SecretKeys values. - Keyring *Keyring - - // Delegate and Events are delegates for receiving and providing - // data to memberlist via callback mechanisms. For Delegate, see - // the Delegate interface. For Events, see the EventDelegate interface. - // - // The DelegateProtocolMin/Max are used to guarantee protocol-compatibility - // for any custom messages that the delegate might do (broadcasts, - // local/remote state, etc.). If you don't set these, then the protocol - // versions will just be zero, and version compliance won't be done. - Delegate Delegate - DelegateProtocolVersion uint8 - DelegateProtocolMin uint8 - DelegateProtocolMax uint8 - Events EventDelegate - Conflict ConflictDelegate - Merge MergeDelegate - Ping PingDelegate - Alive AliveDelegate - - // DNSConfigPath points to the system's DNS config file, usually located - // at /etc/resolv.conf. It can be overridden via config for easier testing. - DNSConfigPath string - - // LogOutput is the writer where logs should be sent. If this is not - // set, logging will go to stderr by default. You cannot specify both LogOutput - // and Logger at the same time. - LogOutput io.Writer - - // Logger is a custom logger which you provide. If Logger is set, it will use - // this for the internal logger. If Logger is not set, it will fall back to the - // behavior for using LogOutput. You cannot specify both LogOutput and Logger - // at the same time. - Logger *log.Logger - - // Size of Memberlist's internal channel which handles UDP messages. The - // size of this determines the size of the queue which Memberlist will keep - // while UDP messages are handled. - HandoffQueueDepth int - - // Maximum number of bytes that memberlist will put in a packet (this - // will be for UDP packets by default with a NetTransport). A safe value - // for this is typically 1400 bytes (which is the default). However, - // depending on your network's MTU (Maximum Transmission Unit) you may - // be able to increase this to get more content into each gossip packet. - // This is a legacy name for backward compatibility but should really be - // called PacketBufferSize now that we have generalized the transport. - UDPBufferSize int - - // DeadNodeReclaimTime controls the time before a dead node's name can be - // reclaimed by one with a different address or port. By default, this is 0, - // meaning nodes cannot be reclaimed this way. - DeadNodeReclaimTime time.Duration - - // RequireNodeNames controls if the name of a node is required when sending - // a message to that node. - RequireNodeNames bool - // CIDRsAllowed If nil, allow any connection (default), otherwise specify all networks - // allowed to connect (you must specify IPv6/IPv4 separately) - // Using [] will block all connections. - CIDRsAllowed []net.IPNet -} - -// ParseCIDRs return a possible empty list of all Network that have been parsed -// In case of error, it returns successfully parsed CIDRs and the last error found -func ParseCIDRs(v []string) ([]net.IPNet, error) { - nets := make([]net.IPNet, 0) - if v == nil { - return nets, nil - } - var errs error - hasErrors := false - for _, p := range v { - _, net, err := net.ParseCIDR(strings.TrimSpace(p)) - if err != nil { - err = fmt.Errorf("invalid cidr: %s", p) - errs = multierror.Append(errs, err) - hasErrors = true - } else { - nets = append(nets, *net) - } - } - if !hasErrors { - errs = nil - } - return nets, errs -} - -// DefaultLANConfig returns a sane set of configurations for Memberlist. -// It uses the hostname as the node name, and otherwise sets very conservative -// values that are sane for most LAN environments. The default configuration -// errs on the side of caution, choosing values that are optimized -// for higher convergence at the cost of higher bandwidth usage. Regardless, -// these values are a good starting point when getting started with memberlist. -func DefaultLANConfig() *Config { - hostname, _ := os.Hostname() - return &Config{ - Name: hostname, - BindAddr: "0.0.0.0", - BindPort: 7946, - AdvertiseAddr: "", - AdvertisePort: 7946, - ProtocolVersion: ProtocolVersion2Compatible, - TCPTimeout: 10 * time.Second, // Timeout after 10 seconds - IndirectChecks: 3, // Use 3 nodes for the indirect ping - RetransmitMult: 4, // Retransmit a message 4 * log(N+1) nodes - SuspicionMult: 4, // Suspect a node for 4 * log(N+1) * Interval - SuspicionMaxTimeoutMult: 6, // For 10k nodes this will give a max timeout of 120 seconds when SuspicionMult is 5: 6 * suspicionTimeout(5, 10000, time.Second) - PushPullInterval: 30 * time.Second, // Low frequency - ProbeTimeout: 500 * time.Millisecond, // Reasonable RTT time for LAN - ProbeInterval: 1 * time.Second, // Failure check every second - DisableTcpPings: false, // TCP pings are safe, even with mixed versions - AwarenessMaxMultiplier: 8, // Probe interval backs off to 8 seconds - - GossipNodes: 3, // Gossip to 3 nodes - GossipInterval: 200 * time.Millisecond, // Gossip more rapidly - GossipToTheDeadTime: 30 * time.Second, // Same as push/pull - GossipVerifyIncoming: true, - GossipVerifyOutgoing: true, - - EnableCompression: true, // Enable compression by default - - SecretKey: nil, - Keyring: nil, - - DNSConfigPath: "/etc/resolv.conf", - - HandoffQueueDepth: 1024, - UDPBufferSize: 1400, - CIDRsAllowed: nil, // same as allow all - } -} - -// DefaultWANConfig works like DefaultConfig, however it returns a configuration -// that is optimized for most WAN environments. The default configuration is -// still very conservative and errs on the side of caution. -func DefaultWANConfig() *Config { - conf := DefaultLANConfig() - conf.TCPTimeout = 30 * time.Second - conf.SuspicionMult = 6 - conf.PushPullInterval = 60 * time.Second - conf.ProbeTimeout = 3 * time.Second - conf.ProbeInterval = 5 * time.Second - conf.GossipNodes = 4 // Gossip less frequently, but to an additional node - conf.GossipInterval = 500 * time.Millisecond - conf.GossipToTheDeadTime = 60 * time.Second - return conf -} - -// IPMustBeChecked return true if IPAllowed must be called -func (c *Config) IPMustBeChecked() bool { - return len(c.CIDRsAllowed) > 0 -} - -// IPAllowed return an error if access to memberlist is denied -func (c *Config) IPAllowed(ip net.IP) error { - if !c.IPMustBeChecked() { - return nil - } - for _, n := range c.CIDRsAllowed { - if n.Contains(ip) { - return nil - } - } - return fmt.Errorf("%s is not allowed", ip) -} - -var LookupIP = net.LookupIP - -// AddrAllowed return an error if access to memberlist is denied -// addr can either be an ip address or a dns address -func (c *Config) AddrAllowed(addr string) error { - if !c.IPMustBeChecked() { - return nil - } - ip := net.ParseIP(addr) - if ip == nil { - ips, err := LookupIP(addr) - if err != nil || len(ips) == 0 { - return fmt.Errorf("%s is not allowed", addr) - } - ip = ips[0] - } - return c.IPAllowed(ip) -} - -// Returns whether or not encryption is enabled -func (c *Config) EncryptionEnabled() bool { - return c.Keyring != nil && len(c.Keyring.GetKeys()) > 0 -} diff --git a/toolkit/memberlist/config_test.go b/toolkit/memberlist/config_test.go deleted file mode 100644 index 6f2a9bee..00000000 --- a/toolkit/memberlist/config_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package memberlist - -import ( - "net" - "testing" - - "github.com/stretchr/testify/require" -) - -func Test_IsValidAddressDefaults(t *testing.T) { - tests := []string{ - "127.0.0.1", - "127.0.0.5", - "10.0.0.9", - "172.16.0.7", - "192.168.2.1", - "fe80::aede:48ff:fe00:1122", - "::1", - } - config := DefaultLANConfig() - for _, ip := range tests { - localV4 := net.ParseIP(ip) - if err := config.IPAllowed(localV4); err != nil { - t.Fatalf("IP %s Localhost Should be accepted for LAN", ip) - } - } - config = DefaultWANConfig() - for _, ip := range tests { - localV4 := net.ParseIP(ip) - if err := config.IPAllowed(localV4); err != nil { - t.Fatalf("IP %s Localhost Should be accepted for WAN", ip) - } - } -} - -func Test_IsValidAddressOverride(t *testing.T) { - t.Parallel() - cases := []struct { - name string - allow []string - success []string - fail []string - }{ - { - name: "Default, nil allows all", - allow: nil, - success: []string{"127.0.0.5", "10.0.0.9", "192.168.1.7", "::1"}, - fail: []string{}, - }, - { - name: "Only IPv4", - allow: []string{"0.0.0.0/0"}, - success: []string{"127.0.0.5", "10.0.0.9", "192.168.1.7"}, - fail: []string{"fe80::38bc:4dff:fe62:b1ae", "::1"}, - }, - { - name: "Only IPv6", - allow: []string{"::0/0"}, - success: []string{"fe80::38bc:4dff:fe62:b1ae", "::1"}, - fail: []string{"127.0.0.5", "10.0.0.9", "192.168.1.7"}, - }, - { - name: "Only 127.0.0.0/8 and ::1", - allow: []string{"::1/128", "127.0.0.0/8"}, - success: []string{"127.0.0.5", "::1"}, - fail: []string{"::2", "178.250.0.187", "10.0.0.9", "192.168.1.7", "fe80::38bc:4dff:fe62:b1ae"}, - }, - } - - for _, testCase := range cases { - t.Run(testCase.name, func(t *testing.T) { - config := DefaultLANConfig() - var err error - config.CIDRsAllowed, err = ParseCIDRs(testCase.allow) - if err != nil { - t.Fatalf("failed parsing %s", testCase.allow) - } - for _, ips := range testCase.success { - ip := net.ParseIP(ips) - if err := config.IPAllowed(ip); err != nil { - t.Fatalf("Test case with %s should pass", ip) - } - } - for _, ips := range testCase.fail { - ip := net.ParseIP(ips) - if err := config.IPAllowed(ip); err == nil { - t.Fatalf("Test case with %s should fail", ip) - } - } - }) - - } - -} - -func TestParseCIDRs(t *testing.T) { - got, _ := ParseCIDRs([]string{"172.28.0.0/16"}) - config := DefaultWANConfig() - config.CIDRsAllowed = got - err := config.AddrAllowed("172.16.238.10") - require.Error(t, err) - - LookupIP = func(host string) ([]net.IP, error) { - return []net.IP{ - net.ParseIP("172.16.238.10"), - }, nil - } - defer func() { - LookupIP = net.LookupIP - }() - err = config.AddrAllowed("this is a dns") - require.Error(t, err) - - LookupIP = func(host string) ([]net.IP, error) { - return nil, nil - } - err = config.AddrAllowed("this is a dns") - require.Error(t, err) - - _, err = ParseCIDRs([]string{"this is a dns"}) - require.Error(t, err) -} diff --git a/toolkit/memberlist/conflict_delegate.go b/toolkit/memberlist/conflict_delegate.go deleted file mode 100644 index f52b136e..00000000 --- a/toolkit/memberlist/conflict_delegate.go +++ /dev/null @@ -1,10 +0,0 @@ -package memberlist - -// ConflictDelegate is a used to inform a client that -// a node has attempted to join which would result in a -// name conflict. This happens if two clients are configured -// with the same name but different addresses. -type ConflictDelegate interface { - // NotifyConflict is invoked when a name conflict is detected - NotifyConflict(existing, other *Node) -} diff --git a/toolkit/memberlist/delegate.go b/toolkit/memberlist/delegate.go deleted file mode 100644 index 67774628..00000000 --- a/toolkit/memberlist/delegate.go +++ /dev/null @@ -1,37 +0,0 @@ -package memberlist - -// Delegate is the interface that clients must implement if they want to hook -// into the gossip layer of Memberlist. All the methods must be thread-safe, -// as they can and generally will be called concurrently. -type Delegate interface { - // NodeMeta is used to retrieve meta-data about the current node - // when broadcasting an alive message. Its length is limited to - // the given byte size. This metadata is available in the Node structure. - NodeMeta(limit int) []byte - - // NotifyMsg is called when a user-data message is received. - // Care should be taken that this method does not block, since doing - // so would block the entire UDP packet receive loop. Additionally, the byte - // slice may be modified after the call returns, so it should be copied if needed - NotifyMsg([]byte) - - // GetBroadcasts is called when user data messages can be broadcast. - // It can return a list of buffers to send. Each buffer should assume an - // overhead as provided with a limit on the total byte size allowed. - // The total byte size of the resulting data to send must not exceed - // the limit. Care should be taken that this method does not block, - // since doing so would block the entire UDP packet receive loop. - GetBroadcasts(overhead, limit int) [][]byte - - // LocalState is used for a TCP Push/Pull. This is sent to - // the remote side in addition to the membership information. Any - // data can be sent here. See MergeRemoteState as well. The `join` - // boolean indicates this is for a join instead of a push/pull. - LocalState(join bool) []byte - - // MergeRemoteState is invoked after a TCP Push/Pull. This is the - // state received from the remote side and is the result of the - // remote side's LocalState call. The 'join' - // boolean indicates this is for a join instead of a push/pull. - MergeRemoteState(buf []byte, join bool) -} diff --git a/toolkit/memberlist/dns_client_interface.go b/toolkit/memberlist/dns_client_interface.go deleted file mode 100644 index ad5cfefa..00000000 --- a/toolkit/memberlist/dns_client_interface.go +++ /dev/null @@ -1,13 +0,0 @@ -package memberlist - -import ( - "time" - - "github.com/miekg/dns" -) - -//go:generate mockgen -destination ./mock/mock_dns_client_interface.go -package mock -source=./dns_client_interface.go - -type IDNSClient interface { - Exchange(m *dns.Msg, address string) (r *dns.Msg, rtt time.Duration, err error) -} diff --git a/toolkit/memberlist/event_delegate.go b/toolkit/memberlist/event_delegate.go deleted file mode 100644 index 3a38c8e2..00000000 --- a/toolkit/memberlist/event_delegate.go +++ /dev/null @@ -1,83 +0,0 @@ -package memberlist - -// EventDelegate is a simpler delegate that is used only to receive -// notifications about members joining and leaving. The methods in this -// delegate may be called by multiple goroutines, but never concurrently. -// This allows you to reason about ordering. -type EventDelegate interface { - // NotifyJoin is invoked when a node is detected to have joined. - // The Node argument must not be modified. - NotifyJoin(*Node) - - // NotifyLeave is invoked when a node is detected to have left. - // The Node argument must not be modified. - NotifyLeave(*Node) - - // NotifyUpdate is invoked when a node is detected to have - // updated, usually involving the meta data. The Node argument - // must not be modified. - NotifyUpdate(*Node) - - // NotifyWeight is invoked when a node's weight is detected to have updated. - // The Node argument must not be modified. - NotifyWeight(*Node) - - // NotifySuspectSateChange is invoked when a node state is changed from StateAlive to StateSuspect or from StateSuspect to StateAlive - NotifySuspectSateChange(*Node) -} - -// ChannelEventDelegate is used to enable an application to receive -// events about joins and leaves over a channel instead of a direct -// function call. -// -// Care must be taken that events are processed in a timely manner from -// the channel, since this delegate will block until an event can be sent. -type ChannelEventDelegate struct { - Ch chan<- NodeEvent -} - -// NodeEventType are the types of events that can be sent from the -// ChannelEventDelegate. -type NodeEventType int - -const ( - NodeJoin NodeEventType = iota - NodeLeave - NodeUpdate - NodeWeight - NodeSuspect -) - -// NodeEvent is a single event related to node activity in the memberlist. -// The Node member of this struct must not be directly modified. It is passed -// as a pointer to avoid unnecessary copies. If you wish to modify the node, -// make a copy first. -type NodeEvent struct { - Event NodeEventType - Node *Node -} - -func (c *ChannelEventDelegate) NotifyJoin(n *Node) { - node := *n - c.Ch <- NodeEvent{NodeJoin, &node} -} - -func (c *ChannelEventDelegate) NotifyLeave(n *Node) { - node := *n - c.Ch <- NodeEvent{NodeLeave, &node} -} - -func (c *ChannelEventDelegate) NotifyUpdate(n *Node) { - node := *n - c.Ch <- NodeEvent{NodeUpdate, &node} -} - -func (c *ChannelEventDelegate) NotifyWeight(n *Node) { - node := *n - c.Ch <- NodeEvent{NodeWeight, &node} -} - -func (c *ChannelEventDelegate) NotifySuspectSateChange(n *Node) { - node := *n - c.Ch <- NodeEvent{NodeSuspect, &node} -} diff --git a/toolkit/memberlist/event_delegate_test.go b/toolkit/memberlist/event_delegate_test.go deleted file mode 100644 index 1f488449..00000000 --- a/toolkit/memberlist/event_delegate_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package memberlist - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestChannelEventDelegate_NotifyJoin(t *testing.T) { - eventCh := make(chan NodeEvent, 1) - c := &ChannelEventDelegate{ - Ch: eventCh, - } - c.NotifyJoin(&Node{ - Name: "", - Addr: "test", - Port: 7946, - }) - ne := <-eventCh - require.Equal(t, NodeJoin, ne.Event) -} - -func TestChannelEventDelegate_NotifyLeave(t *testing.T) { - eventCh := make(chan NodeEvent, 1) - c := &ChannelEventDelegate{ - Ch: eventCh, - } - c.NotifyLeave(&Node{ - Name: "", - Addr: "test", - Port: 7946, - }) - ne := <-eventCh - require.Equal(t, NodeLeave, ne.Event) -} - -func TestChannelEventDelegate_NotifyUpdate(t *testing.T) { - eventCh := make(chan NodeEvent, 1) - c := &ChannelEventDelegate{ - Ch: eventCh, - } - c.NotifyUpdate(&Node{ - Name: "", - Addr: "test", - Port: 7946, - }) - ne := <-eventCh - require.Equal(t, NodeUpdate, ne.Event) -} - -func TestChannelEventDelegate_NotifyWeight(t *testing.T) { - eventCh := make(chan NodeEvent, 1) - c := &ChannelEventDelegate{ - Ch: eventCh, - } - c.NotifyWeight(&Node{ - Name: "", - Addr: "test", - Port: 7946, - }) - ne := <-eventCh - require.Equal(t, NodeWeight, ne.Event) -} - -func TestChannelEventDelegate_NotifySuspectSateChange(t *testing.T) { - eventCh := make(chan NodeEvent, 1) - c := &ChannelEventDelegate{ - Ch: eventCh, - } - c.NotifySuspectSateChange(&Node{ - Name: "", - Addr: "test", - Port: 7946, - }) - ne := <-eventCh - require.Equal(t, NodeSuspect, ne.Event) -} diff --git a/toolkit/memberlist/integ_test.go b/toolkit/memberlist/integ_test.go deleted file mode 100644 index c23d04f0..00000000 --- a/toolkit/memberlist/integ_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package memberlist - -import ( - "fmt" - "log" - "os" - "testing" - "time" -) - -// CheckInteg will skip a test if integration testing is not enabled. -func CheckInteg(t *testing.T) { - if !IsInteg() { - t.SkipNow() - } -} - -// IsInteg returns a boolean telling you if we're in integ testing mode. -func IsInteg() bool { - return os.Getenv("INTEG_TESTS") != "" -} - -// Tests the memberlist by creating a cluster of 100 nodes -// and checking that we get strong convergence of changes. -func TestMemberlist_Integ(t *testing.T) { - CheckInteg(t) - - num := 16 - var members []*Memberlist - - secret := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - eventCh := make(chan NodeEvent, num) - - addr := "127.0.0.1" - for i := 0; i < num; i++ { - c := DefaultLANConfig() - c.Name = fmt.Sprintf("%s:%d", addr, 12345+i) - c.BindAddr = addr - c.BindPort = 12345 + i - c.ProbeInterval = 20 * time.Millisecond - c.ProbeTimeout = 100 * time.Millisecond - c.GossipInterval = 20 * time.Millisecond - c.PushPullInterval = 200 * time.Millisecond - c.SecretKey = secret - c.Logger = log.New(os.Stderr, c.Name, log.LstdFlags) - - if i == 0 { - c.Events = &ChannelEventDelegate{eventCh} - } - - m, err := Create(c) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - defer m.Shutdown() - - members = append(members, m) - - if i > 0 { - last := members[i-1] - num, err := m.Join([]string{last.config.Name + "/" + last.config.Name}) - if num == 0 || err != nil { - t.Fatalf("unexpected err: %s", err) - } - } - } - - // Wait and print debug info - breakTimer := time.After(250 * time.Millisecond) -WAIT: - for { - select { - case e := <-eventCh: - if e.Event == NodeJoin { - t.Logf("[DEBUG] Node join: %v (%d)", *e.Node, members[0].NumMembers()) - } else { - t.Logf("[DEBUG] Node leave: %v (%d)", *e.Node, members[0].NumMembers()) - } - case <-breakTimer: - break WAIT - } - } - - for idx, m := range members { - got := m.NumMembers() - if got != num { - t.Errorf("bad num members at idx %d. Expected %d. Got %d.", - idx, num, got) - } - } -} diff --git a/toolkit/memberlist/keyring.go b/toolkit/memberlist/keyring.go deleted file mode 100644 index a2774a0c..00000000 --- a/toolkit/memberlist/keyring.go +++ /dev/null @@ -1,160 +0,0 @@ -package memberlist - -import ( - "bytes" - "fmt" - "sync" -) - -type Keyring struct { - // Keys stores the key data used during encryption and decryption. It is - // ordered in such a way where the first key (index 0) is the primary key, - // which is used for encrypting messages, and is the first key tried during - // message decryption. - keys [][]byte - - // The keyring lock is used while performing IO operations on the keyring. - l sync.Mutex -} - -// Init allocates substructures -func (k *Keyring) init() { - k.keys = make([][]byte, 0) -} - -// NewKeyring constructs a new container for a set of encryption keys. The -// keyring contains all key data used internally by memberlist. -// -// While creating a new keyring, you must do one of: -// - Omit keys and primary key, effectively disabling encryption -// - Pass a set of keys plus the primary key -// - Pass only a primary key -// -// If only a primary key is passed, then it will be automatically added to the -// keyring. If creating a keyring with multiple keys, one key must be designated -// primary by passing it as the primaryKey. If the primaryKey does not exist in -// the list of secondary keys, it will be automatically added at position 0. -// -// A key should be either 16, 24, or 32 bytes to select AES-128, -// AES-192, or AES-256. -func NewKeyring(keys [][]byte, primaryKey []byte) (*Keyring, error) { - keyring := &Keyring{} - keyring.init() - - if len(keys) > 0 || len(primaryKey) > 0 { - if len(primaryKey) == 0 { - return nil, fmt.Errorf("Empty primary key not allowed") - } - if err := keyring.AddKey(primaryKey); err != nil { - return nil, err - } - for _, key := range keys { - if err := keyring.AddKey(key); err != nil { - return nil, err - } - } - } - - return keyring, nil -} - -// ValidateKey will check to see if the key is valid and returns an error if not. -// -// key should be either 16, 24, or 32 bytes to select AES-128, -// AES-192, or AES-256. -func ValidateKey(key []byte) error { - if l := len(key); l != 16 && l != 24 && l != 32 { - return fmt.Errorf("key size must be 16, 24 or 32 bytes") - } - return nil -} - -// AddKey will install a new key on the ring. Adding a key to the ring will make -// it available for use in decryption. If the key already exists on the ring, -// this function will just return noop. -// -// key should be either 16, 24, or 32 bytes to select AES-128, -// AES-192, or AES-256. -func (k *Keyring) AddKey(key []byte) error { - if err := ValidateKey(key); err != nil { - return err - } - - // No-op if key is already installed - for _, installedKey := range k.keys { - if bytes.Equal(installedKey, key) { - return nil - } - } - - keys := append(k.keys, key) - primaryKey := k.GetPrimaryKey() - if primaryKey == nil { - primaryKey = key - } - k.installKeys(keys, primaryKey) - return nil -} - -// UseKey changes the key used to encrypt messages. This is the only key used to -// encrypt messages, so peers should know this key before this method is called. -func (k *Keyring) UseKey(key []byte) error { - for _, installedKey := range k.keys { - if bytes.Equal(key, installedKey) { - k.installKeys(k.keys, key) - return nil - } - } - return fmt.Errorf("Requested key is not in the keyring") -} - -// RemoveKey drops a key from the keyring. This will return an error if the key -// requested for removal is currently at position 0 (primary key). -func (k *Keyring) RemoveKey(key []byte) error { - if bytes.Equal(key, k.keys[0]) { - return fmt.Errorf("Removing the primary key is not allowed") - } - for i, installedKey := range k.keys { - if bytes.Equal(key, installedKey) { - keys := append(k.keys[:i], k.keys[i+1:]...) - k.installKeys(keys, k.keys[0]) - } - } - return nil -} - -// installKeys will take out a lock on the keyring, and replace the keys with a -// new set of keys. The key indicated by primaryKey will be installed as the new -// primary key. -func (k *Keyring) installKeys(keys [][]byte, primaryKey []byte) { - k.l.Lock() - defer k.l.Unlock() - - newKeys := [][]byte{primaryKey} - for _, key := range keys { - if !bytes.Equal(key, primaryKey) { - newKeys = append(newKeys, key) - } - } - k.keys = newKeys -} - -// GetKeys returns the current set of keys on the ring. -func (k *Keyring) GetKeys() [][]byte { - k.l.Lock() - defer k.l.Unlock() - - return k.keys -} - -// GetPrimaryKey returns the key on the ring at position 0. This is the key used -// for encrypting messages, and is the first key tried for decrypting messages. -func (k *Keyring) GetPrimaryKey() (key []byte) { - k.l.Lock() - defer k.l.Unlock() - - if len(k.keys) > 0 { - key = k.keys[0] - } - return -} diff --git a/toolkit/memberlist/keyring_test.go b/toolkit/memberlist/keyring_test.go deleted file mode 100644 index eec699fd..00000000 --- a/toolkit/memberlist/keyring_test.go +++ /dev/null @@ -1,154 +0,0 @@ -package memberlist - -import ( - "bytes" - "testing" -) - -var TestKeys [][]byte = [][]byte{ - []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, - []byte{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - []byte{8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7}, -} - -func TestKeyring_EmptyRing(t *testing.T) { - // Keyrings can be created with no encryption keys (disabled encryption) - keyring, err := NewKeyring(nil, nil) - if err != nil { - t.Fatalf("err: %s", err) - } - - keys := keyring.GetKeys() - if len(keys) != 0 { - t.Fatalf("Expected 0 keys but have %d", len(keys)) - } -} - -func TestKeyring_PrimaryOnly(t *testing.T) { - // Keyrings can be created using only a primary key - keyring, err := NewKeyring(nil, TestKeys[0]) - if err != nil { - t.Fatalf("err: %s", err) - } - - keys := keyring.GetKeys() - if len(keys) != 1 { - t.Fatalf("Expected 1 key but have %d", len(keys)) - } -} - -func TestKeyring_GetPrimaryKey(t *testing.T) { - keyring, err := NewKeyring(TestKeys, TestKeys[1]) - if err != nil { - t.Fatalf("err: %s", err) - } - - // GetPrimaryKey returns correct key - primaryKey := keyring.GetPrimaryKey() - if !bytes.Equal(primaryKey, TestKeys[1]) { - t.Fatalf("Unexpected primary key: %v", primaryKey) - } -} - -func TestKeyring_AddRemoveUse(t *testing.T) { - keyring, err := NewKeyring(nil, TestKeys[1]) - if err != nil { - t.Fatalf("err :%s", err) - } - - // Use non-existent key throws error - if err := keyring.UseKey(TestKeys[2]); err == nil { - t.Fatalf("Expected key not installed error") - } - - // Add key to ring - if err := keyring.AddKey(TestKeys[2]); err != nil { - t.Fatalf("err: %s", err) - } - - keys := keyring.GetKeys() - if !bytes.Equal(keys[0], TestKeys[1]) { - t.Fatalf("Unexpected primary key change") - } - - if len(keys) != 2 { - t.Fatalf("Expected 2 keys but have %d", len(keys)) - } - - // Use key that exists should succeed - if err := keyring.UseKey(TestKeys[2]); err != nil { - t.Fatalf("err: %s", err) - } - - primaryKey := keyring.GetPrimaryKey() - if !bytes.Equal(primaryKey, TestKeys[2]) { - t.Fatalf("Unexpected primary key: %v", primaryKey) - } - - // Removing primary key should fail - if err := keyring.RemoveKey(TestKeys[2]); err == nil { - t.Fatalf("Expected primary key removal error") - } - - // Removing non-primary key should succeed - if err := keyring.RemoveKey(TestKeys[1]); err != nil { - t.Fatalf("err: %s", err) - } - - keys = keyring.GetKeys() - if len(keys) != 1 { - t.Fatalf("Expected 1 key but have %d", len(keys)) - } -} - -func TestKeyRing_MultiKeyEncryptDecrypt(t *testing.T) { - plaintext := []byte("this is a plain text message") - extra := []byte("random data") - - keyring, err := NewKeyring(TestKeys, TestKeys[0]) - if err != nil { - t.Fatalf("err: %s", err) - } - - // First encrypt using the primary key and make sure we can decrypt - var buf bytes.Buffer - err = encryptPayload(1, TestKeys[0], plaintext, extra, &buf) - if err != nil { - t.Fatalf("err: %v", err) - } - - msg, err := decryptPayload(keyring.GetKeys(), buf.Bytes(), extra) - if err != nil { - t.Fatalf("err: %v", err) - } - - if !bytes.Equal(msg, plaintext) { - t.Fatalf("bad: %v", msg) - } - - // Now encrypt with a secondary key and try decrypting again. - buf.Reset() - err = encryptPayload(1, TestKeys[2], plaintext, extra, &buf) - if err != nil { - t.Fatalf("err: %v", err) - } - - msg, err = decryptPayload(keyring.GetKeys(), buf.Bytes(), extra) - if err != nil { - t.Fatalf("err: %v", err) - } - - if !bytes.Equal(msg, plaintext) { - t.Fatalf("bad: %v", msg) - } - - // Remove a key from the ring, and then try decrypting again - if err := keyring.RemoveKey(TestKeys[2]); err != nil { - t.Fatalf("err: %s", err) - } - - msg, err = decryptPayload(keyring.GetKeys(), buf.Bytes(), extra) - if err == nil { - t.Fatalf("Expected no keys to decrypt message") - } -} diff --git a/toolkit/memberlist/logging.go b/toolkit/memberlist/logging.go deleted file mode 100644 index 2ca2bab4..00000000 --- a/toolkit/memberlist/logging.go +++ /dev/null @@ -1,30 +0,0 @@ -package memberlist - -import ( - "fmt" - "net" -) - -func LogAddress(addr net.Addr) string { - if addr == nil { - return "from=" - } - - return fmt.Sprintf("from=%s", addr.String()) -} - -func LogStringAddress(addr string) string { - if addr == "" { - return "from=" - } - - return fmt.Sprintf("from=%s", addr) -} - -func LogConn(conn net.Conn) string { - if conn == nil { - return LogAddress(nil) - } - - return LogAddress(conn.RemoteAddr()) -} diff --git a/toolkit/memberlist/logging_test.go b/toolkit/memberlist/logging_test.go deleted file mode 100644 index cc04b8a9..00000000 --- a/toolkit/memberlist/logging_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package memberlist - -import ( - "fmt" - "net" - "testing" -) - -func TestLogging_Address(t *testing.T) { - s := LogAddress(nil) - if s != "from=" { - t.Fatalf("bad: %s", s) - } - - addr, err := net.ResolveIPAddr("ip4", "127.0.0.1") - if err != nil { - t.Fatalf("err: %v", err) - } - - s = LogAddress(addr) - if s != "from=127.0.0.1" { - t.Fatalf("bad: %s", s) - } -} - -func TestLogging_Conn(t *testing.T) { - s := LogConn(nil) - if s != "from=" { - t.Fatalf("bad: %s", s) - } - - ln, err := net.Listen("tcp", ":0") - if err != nil { - t.Fatalf("err: %v", err) - } - - conn, err := net.Dial("tcp", ln.Addr().String()) - if err != nil { - t.Fatalf("err: %v", err) - } - defer conn.Close() - - s = LogConn(conn) - if s != fmt.Sprintf("from=%s", conn.RemoteAddr().String()) { - t.Fatalf("bad: %s", s) - } -} diff --git a/toolkit/memberlist/memberlist.go b/toolkit/memberlist/memberlist.go deleted file mode 100644 index 1e165596..00000000 --- a/toolkit/memberlist/memberlist.go +++ /dev/null @@ -1,765 +0,0 @@ -/* -memberlist is a library that manages cluster -membership and member failure detection using a gossip based protocol. - -The use cases for such a library are far-reaching: all distributed systems -require membership, and memberlist is a re-usable solution to managing -cluster membership and node failure detection. - -memberlist is eventually consistent but converges quickly on average. -The speed at which it converges can be heavily tuned via various knobs -on the protocol. Node failures are detected and network partitions are partially -tolerated by attempting to communicate to potentially dead nodes through -multiple routes. -*/ -package memberlist - -import ( - "container/list" - "errors" - "fmt" - "log" - "net" - "os" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - - multierror "github.com/hashicorp/go-multierror" -) - -var errNodeNamesAreRequired = errors.New("memberlist: node names are required by configuration but one was not provided") - -type Memberlist struct { - sequenceNum uint32 // Local sequence number - incarnation uint32 // Local incarnation number - numNodes uint32 // Number of known nodes (estimate) - pushPullReq uint32 // Number of push/pull requests - - advertiseLock sync.RWMutex - advertiseAddr string - advertisePort uint16 - - config *Config - shutdown int32 // Used as an atomic boolean value - shutdownCh chan struct{} - leave int32 // Used as an atomic boolean value - leaveBroadcast chan struct{} - - shutdownLock sync.Mutex // Serializes calls to Shutdown - leaveLock sync.Mutex // Serializes calls to Leave - - transport NodeAwareTransport - - handoffCh chan struct{} - highPriorityMsgQueue *list.List - lowPriorityMsgQueue *list.List - msgQueueLock sync.Mutex - - nodeLock sync.RWMutex - nodes []*nodeState // Known nodes - nodeMap map[string]*nodeState // Maps Node.Name -> NodeState - nodeTimers map[string]*suspicion // Maps Node.Name -> suspicion timer - awareness *awareness - - tickerLock sync.Mutex - tickers []*time.Ticker - stopTick chan struct{} - probeIndex int - - ackLock sync.Mutex - ackHandlers map[uint32]*ackHandler - - broadcasts *TransmitLimitedQueue - - logger *log.Logger -} - -func (m *Memberlist) NodeMap() map[string]*nodeState { - return m.nodeMap -} - -func (m *Memberlist) AdvertiseAddr() string { - return m.advertiseAddr -} - -func (m *Memberlist) AdvertisePort() uint16 { - return m.advertisePort -} - -func (m *Memberlist) Nodes() []*nodeState { - return m.nodes -} - -func (m *Memberlist) SetNodes(nodes ...*nodeState) { - m.nodes = nodes -} - -func (m *Memberlist) Config() *Config { - return m.config -} - -// BuildVsnArray creates the array of Vsn -func (conf *Config) BuildVsnArray() []uint8 { - return []uint8{ - ProtocolVersionMin, ProtocolVersionMax, conf.ProtocolVersion, - conf.DelegateProtocolMin, conf.DelegateProtocolMax, - conf.DelegateProtocolVersion, - } -} - -// NewMemberlist creates the network listeners. -// Does not schedule execution of background maintenance. -func NewMemberlist(conf *Config) (*Memberlist, error) { - if conf.ProtocolVersion < ProtocolVersionMin { - return nil, fmt.Errorf("Protocol version '%d' too low. Must be in range: [%d, %d]", - conf.ProtocolVersion, ProtocolVersionMin, ProtocolVersionMax) - } else if conf.ProtocolVersion > ProtocolVersionMax { - return nil, fmt.Errorf("Protocol version '%d' too high. Must be in range: [%d, %d]", - conf.ProtocolVersion, ProtocolVersionMin, ProtocolVersionMax) - } - - if len(conf.SecretKey) > 0 { - if conf.Keyring == nil { - keyring, err := NewKeyring(nil, conf.SecretKey) - if err != nil { - return nil, err - } - conf.Keyring = keyring - } else { - if err := conf.Keyring.AddKey(conf.SecretKey); err != nil { - return nil, err - } - if err := conf.Keyring.UseKey(conf.SecretKey); err != nil { - return nil, err - } - } - } - - if conf.LogOutput != nil && conf.Logger != nil { - return nil, fmt.Errorf("Cannot specify both LogOutput and Logger. Please choose a single log configuration setting.") - } - - logDest := conf.LogOutput - if logDest == nil { - logDest = os.Stderr - } - - logger := conf.Logger - if logger == nil { - logger = log.New(logDest, "", log.LstdFlags) - } - - // Set up a network transport by default if a custom one wasn't given - // by the config. - transport := conf.Transport - if transport == nil { - nc := &NetTransportConfig{ - BindAddrs: []string{conf.BindAddr}, - BindPort: conf.BindPort, - Logger: logger, - } - - // See comment below for details about the retry in here. - makeNetRetry := func(limit int) (*NetTransport, error) { - var err error - for try := 0; try < limit; try++ { - var nt *NetTransport - if nt, err = NewNetTransport(nc); err == nil { - return nt, nil - } - if strings.Contains(err.Error(), "address already in use") { - logger.Printf("[DEBUG] memberlist: Got bind error: %v", err) - continue - } - } - - return nil, fmt.Errorf("failed to obtain an address: %v", err) - } - - // The dynamic bind port operation is inherently racy because - // even though we are using the kernel to find a port for us, we - // are attempting to bind multiple protocols (and potentially - // multiple addresses) with the same port number. We build in a - // few retries here since this often gets transient errors in - // busy unit tests. - limit := 1 - if conf.BindPort == 0 { - limit = 10 - } - - nt, err := makeNetRetry(limit) - if err != nil { - return nil, fmt.Errorf("Could not set up network transport: %v", err) - } - if conf.BindPort == 0 { - port := nt.GetAutoBindPort() - conf.BindPort = port - conf.AdvertisePort = port - logger.Printf("[DEBUG] memberlist: Using dynamic bind port %d", port) - } - transport = nt - } - - nodeAwareTransport, ok := transport.(NodeAwareTransport) - if !ok { - logger.Printf("[DEBUG] memberlist: configured Transport is not a NodeAwareTransport and some features may not work as desired") - nodeAwareTransport = &shimNodeAwareTransport{transport} - } - - m := &Memberlist{ - config: conf, - shutdownCh: make(chan struct{}), - leaveBroadcast: make(chan struct{}, 1), - transport: nodeAwareTransport, - handoffCh: make(chan struct{}, 1), - highPriorityMsgQueue: list.New(), - lowPriorityMsgQueue: list.New(), - nodeMap: make(map[string]*nodeState), - nodeTimers: make(map[string]*suspicion), - awareness: newAwareness(conf.AwarenessMaxMultiplier), - ackHandlers: make(map[uint32]*ackHandler), - broadcasts: &TransmitLimitedQueue{RetransmitMultGetter: func() int { - return conf.RetransmitMult - }}, - logger: logger, - } - m.broadcasts.NumNodes = func() int { - return m.estNumNodes() - } - - // Get the final advertise address from the transport, which may need - // to see which address we bound to. We'll refresh this each time we - // send out an alive message. - if _, _, err := m.refreshAdvertise(); err != nil { - return nil, err - } - - go m.streamListen() - go m.packetListen() - go m.packetHandler() - return m, nil -} - -// Create will create a new Memberlist using the given configuration. -// This will not connect to any other node (see Join) yet, but will start -// all the listeners to allow other nodes to join this memberlist. -// After creating a Memberlist, the configuration given should not be -// modified by the user anymore. -func Create(conf *Config) (*Memberlist, error) { - m, err := NewMemberlist(conf) - if err != nil { - return nil, err - } - if err := m.setAlive(); err != nil { - m.Shutdown() - return nil, err - } - m.schedule() - return m, nil -} - -// Join is used to take an existing Memberlist and attempt to join a cluster -// by contacting all the given hosts and performing a state sync. Initially, -// the Memberlist only contains our own state, so doing this will cause -// remote nodes to become aware of the existence of this node, effectively -// joining the cluster. -// -// This returns the number of hosts successfully contacted and an error if -// none could be reached. If an error is returned, the node did not successfully -// join the cluster. -func (m *Memberlist) Join(existing []string) (int, error) { - numSuccess := 0 - var errs error - for _, exist := range existing { - addrs, err := m.ResolveAddr(exist) - if err != nil { - err = fmt.Errorf("Failed to resolve %s: %v", exist, err) - errs = multierror.Append(errs, err) - m.logger.Printf("[WARN] memberlist: %v", err) - continue - } - - for _, addr := range addrs { - hp := joinHostPort(addr.ip, addr.port) - a := Address{Addr: hp, Name: addr.nodeName} - if err := m.pushPullNode(a, true); err != nil { - err = fmt.Errorf("Failed to join %s: %v", addr.ip, err) - errs = multierror.Append(errs, err) - m.logger.Printf("[DEBUG] memberlist: %v", err) - continue - } - numSuccess++ - } - } - if numSuccess > 0 { - errs = nil - } - return numSuccess, errs -} - -// IpPort holds information about a node we want to try to join. -type IpPort struct { - ip string - port uint16 - nodeName string // optional -} - -func (i *IpPort) SetIp(ip string) { - i.ip = ip -} - -func (i *IpPort) SetPort(port uint16) { - i.port = port -} - -func (i *IpPort) SetNodeName(nodeName string) { - i.nodeName = nodeName -} - -func (i IpPort) Ip() string { - return i.ip -} - -func (i IpPort) Port() uint16 { - return i.port -} - -func (i IpPort) NodeName() string { - return i.nodeName -} - -func NewIpPort(ip string, port uint16, nodeName string) IpPort { - return IpPort{ip: ip, port: port, nodeName: nodeName} -} - -// ResolveAddr is used to resolve the address into an address, -// port, and error. If no port is given, use the default -func (m *Memberlist) ResolveAddr(hostStr string) ([]IpPort, error) { - // First peel off any leading node name. This is optional. - nodeName := "" - if slashIdx := strings.Index(hostStr, "/"); slashIdx >= 0 { - if slashIdx == 0 { - return nil, fmt.Errorf("empty node name provided") - } - nodeName = hostStr[0:slashIdx] - hostStr = hostStr[slashIdx+1:] - } - - // This captures the supplied port, or the default one. - hostStr = ensurePort(hostStr, m.config.BindPort) - host, sport, err := net.SplitHostPort(hostStr) - if err != nil { - return nil, err - } - if stringutils.IsEmpty(host) { - return nil, errors.New("host should not be empty") - } - lport, err := strconv.ParseUint(sport, 10, 16) - if err != nil { - return nil, err - } - port := uint16(lport) - - return []IpPort{ - {ip: host, port: port, nodeName: nodeName}, - }, nil -} - -// setAlive is used to mark this node as being alive. This is the same -// as if we received an alive notification our own network channel for -// ourself. -func (m *Memberlist) setAlive() error { - // Get the final advertise address from the transport, which may need - // to see which address we bound to. - addr, port, err := m.refreshAdvertise() - if err != nil { - return err - } - - // Set any metadata from the delegate. - var meta []byte - if m.config.Delegate != nil { - meta = m.config.Delegate.NodeMeta(MetaMaxSize) - if len(meta) > MetaMaxSize { - panic("Node meta data provided is longer than the limit") - } - } - - a := alive{ - Incarnation: m.nextIncarnation(), - Node: m.config.Name, - Addr: addr, - Port: uint16(port), - Meta: meta, - Vsn: m.config.BuildVsnArray(), - } - m.aliveNode(&a, nil, true) - - return nil -} - -func (m *Memberlist) getAdvertise() (string, uint16) { - m.advertiseLock.RLock() - defer m.advertiseLock.RUnlock() - return m.advertiseAddr, m.advertisePort -} - -func (m *Memberlist) setAdvertise(addr string, port int) { - m.advertiseLock.Lock() - defer m.advertiseLock.Unlock() - m.advertiseAddr = addr - m.advertisePort = uint16(port) -} - -func (m *Memberlist) refreshAdvertise() (string, int, error) { - addr, port, err := m.transport.FinalAdvertiseAddr( - m.config.AdvertiseAddr, m.config.AdvertisePort) - if err != nil { - return "", 0, fmt.Errorf("Failed to get final advertise address: %v", err) - } - m.setAdvertise(addr, port) - return addr, port, nil -} - -// LocalNode is used to return the local Node -func (m *Memberlist) LocalNode() *Node { - m.nodeLock.RLock() - defer m.nodeLock.RUnlock() - state := m.nodeMap[m.config.Name] - return &state.Node -} - -// UpdateNode is used to trigger re-advertising the local node. This is -// primarily used with a Delegate to support dynamic updates to the local -// meta data. This will block until the update message is successfully -// broadcasted to a member of the cluster, if any exist or until a specified -// timeout is reached. -func (m *Memberlist) UpdateNode(timeout time.Duration) error { - // Get the node meta data - var meta []byte - if m.config.Delegate != nil { - meta = m.config.Delegate.NodeMeta(MetaMaxSize) - if len(meta) > MetaMaxSize { - panic("Node meta data provided is longer than the limit") - } - } - - // Get the existing node - m.nodeLock.RLock() - state := m.nodeMap[m.config.Name] - m.nodeLock.RUnlock() - - // Format a new alive message - a := alive{ - Incarnation: m.nextIncarnation(), - Node: m.config.Name, - Addr: state.Addr, - Port: state.Port, - Meta: meta, - Vsn: m.config.BuildVsnArray(), - } - notifyCh := make(chan struct{}) - m.aliveNode(&a, notifyCh, true) - - // Wait for the broadcast or a timeout - if m.anyAlive() { - var timeoutCh <-chan time.Time - if timeout > 0 { - timeoutCh = time.After(timeout) - } - select { - case <-notifyCh: - case <-timeoutCh: - return fmt.Errorf("timeout waiting for update broadcast") - } - } - return nil -} - -func (m *Memberlist) SendToAddress(a Address, msg []byte) error { - // Encode as a user message - buf := make([]byte, 1, len(msg)+1) - buf[0] = byte(userMsg) - buf = append(buf, msg...) - - // Send the message - return m.rawSendMsgPacket(a, nil, buf) -} - -// SendBestEffort uses the unreliable packet-oriented interface of the transport -// to target a user message at the given node (this does not use the gossip -// mechanism). The maximum size of the message depends on the configured -// UDPBufferSize for this memberlist instance. -func (m *Memberlist) SendBestEffort(to *Node, msg []byte) error { - // Encode as a user message - buf := make([]byte, 1, len(msg)+1) - buf[0] = byte(userMsg) - buf = append(buf, msg...) - - // Send the message - a := Address{Addr: to.Address(), Name: to.Name} - return m.rawSendMsgPacket(a, to, buf) -} - -// SendReliable uses the reliable stream-oriented interface of the transport to -// target a user message at the given node (this does not use the gossip -// mechanism). Delivery is guaranteed if no error is returned, and there is no -// limit on the size of the message. -func (m *Memberlist) SendReliable(to *Node, msg []byte) error { - return m.sendUserMsg(to.FullAddress(), msg) -} - -// Members returns a list of all known live nodes. The node structures -// returned must not be modified. If you wish to modify a Node, make a -// copy first. -func (m *Memberlist) Members() []*Node { - m.nodeLock.RLock() - defer m.nodeLock.RUnlock() - - nodes := make([]*Node, 0, len(m.nodes)) - for _, n := range m.nodes { - if !n.DeadOrLeft() { - nodes = append(nodes, &n.Node) - } - } - - return nodes -} - -// NumMembers returns the number of alive nodes currently known. Between -// the time of calling this and calling Members, the number of alive nodes -// may have changed, so this shouldn't be used to determine how many -// members will be returned by Members. -func (m *Memberlist) NumMembers() (alive int) { - m.nodeLock.RLock() - defer m.nodeLock.RUnlock() - - for _, n := range m.nodes { - if !n.DeadOrLeft() { - alive++ - } - } - - return -} - -// Leave will broadcast a leave message but will not shutdown the background -// listeners, meaning the node will continue participating in gossip and state -// updates. -// -// This will block until the leave message is successfully broadcasted to -// a member of the cluster, if any exist or until a specified timeout -// is reached. -// -// This method is safe to call multiple times, but must not be called -// after the cluster is already shut down. -func (m *Memberlist) Leave(timeout time.Duration) error { - m.leaveLock.Lock() - defer m.leaveLock.Unlock() - - if m.hasShutdown() { - panic("leave after shutdown") - } - - if !m.hasLeft() { - atomic.StoreInt32(&m.leave, 1) - - m.nodeLock.Lock() - state, ok := m.nodeMap[m.config.Name] - m.nodeLock.Unlock() - if !ok { - m.logger.Printf("[WARN] memberlist: Leave but we're not in the node map.") - return nil - } - - // This dead message is special, because Node and From are the - // same. This helps other nodes figure out that a node left - // intentionally. When Node equals From, other nodes know for - // sure this node is gone. - d := dead{ - Incarnation: state.Incarnation, - Node: state.Name, - From: state.Name, - } - m.deadNode(&d) - - // Block until the broadcast goes out - if m.anyAlive() { - var timeoutCh <-chan time.Time - if timeout > 0 { - timeoutCh = time.After(timeout) - } - select { - case <-m.leaveBroadcast: - case <-timeoutCh: - return fmt.Errorf("timeout waiting for leave broadcast") - } - } - } - - return nil -} - -// Check for any other alive node. -func (m *Memberlist) anyAlive() bool { - m.nodeLock.RLock() - defer m.nodeLock.RUnlock() - for _, n := range m.nodes { - if !n.DeadOrLeft() && n.Name != m.config.Name { - return true - } - } - return false -} - -// GetHealthScore gives this instance's idea of how well it is meeting the soft -// real-time requirements of the protocol. Lower numbers are better, and zero -// means "totally healthy". -func (m *Memberlist) GetHealthScore() int { - return m.awareness.GetHealthScore() -} - -// ProtocolVersion returns the protocol version currently in use by -// this memberlist. -func (m *Memberlist) ProtocolVersion() uint8 { - // NOTE: This method exists so that in the future we can control - // any locking if necessary, if we change the protocol version at - // runtime, etc. - return m.config.ProtocolVersion -} - -// Shutdown will stop any background maintenance of network activity -// for this memberlist, causing it to appear "dead". A leave message -// will not be broadcasted prior, so the cluster being left will have -// to detect this node's shutdown using probing. If you wish to more -// gracefully exit the cluster, call Leave prior to shutting down. -// -// This method is safe to call multiple times. -func (m *Memberlist) Shutdown() error { - m.shutdownLock.Lock() - defer m.shutdownLock.Unlock() - - if m.hasShutdown() { - return nil - } - - // Shut down the transport first, which should block until it's - // completely torn down. If we kill the memberlist-side handlers - // those I/O handlers might get stuck. - if err := m.transport.Shutdown(); err != nil { - m.logger.Printf("[ERR] Failed to shutdown transport: %v", err) - } - - // Now tear down everything else. - atomic.StoreInt32(&m.shutdown, 1) - close(m.shutdownCh) - m.deschedule() - return nil -} - -func (m *Memberlist) hasShutdown() bool { - return atomic.LoadInt32(&m.shutdown) == 1 -} - -func (m *Memberlist) hasLeft() bool { - return atomic.LoadInt32(&m.leave) == 1 -} - -func (m *Memberlist) getNodeState(addr string) NodeStateType { - m.nodeLock.RLock() - defer m.nodeLock.RUnlock() - - n := m.nodeMap[addr] - return n.State -} - -func (m *Memberlist) getNodeStateChange(addr string) time.Time { - m.nodeLock.RLock() - defer m.nodeLock.RUnlock() - - n := m.nodeMap[addr] - return n.StateChange -} - -func (m *Memberlist) changeNode(addr string, f func(*nodeState)) { - m.nodeLock.Lock() - defer m.nodeLock.Unlock() - - n := m.nodeMap[addr] - f(n) -} - -// encodeAndBroadcast encodes a message and enqueues it for broadcast. Fails -// silently if there is an encoding error. -func (m *Memberlist) encodeAndBroadcast(node string, msgType messageType, msg interface{}) { - m.encodeBroadcastNotify(node, msgType, msg, nil) -} - -// encodeBroadcastNotify encodes a message and enqueues it for broadcast -// and notifies the given channel when transmission is finished. Fails -// silently if there is an encoding error. -func (m *Memberlist) encodeBroadcastNotify(node string, msgType messageType, msg interface{}, notify chan struct{}) { - buf, err := encode(msgType, msg) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to encode message for broadcast: %s", err) - } else { - m.queueBroadcast(node, buf.Bytes(), notify) - } -} - -// queueBroadcast is used to start dissemination of a message. It will be -// sent up to a configured number of times. The message could potentially -// be invalidated by a future message about the same node -func (m *Memberlist) queueBroadcast(node string, msg []byte, notify chan struct{}) { - b := &memberlistBroadcast{node, msg, notify} - m.broadcasts.QueueBroadcast(b) -} - -// getBroadcasts is used to return a slice of broadcasts to send up to -// a maximum byte size, while imposing a per-broadcast overhead. This is used -// to fill a UDP packet with piggybacked data -func (m *Memberlist) getBroadcasts(overhead, limit int) [][]byte { - // Get memberlist messages first - toSend := m.broadcasts.GetBroadcasts(overhead, limit) - - // Check if the user has anything to broadcast - d := m.config.Delegate - if d != nil { - // Determine the bytes used already - bytesUsed := 0 - for _, msg := range toSend { - bytesUsed += len(msg) + overhead - } - - // Check space remaining for user messages - avail := limit - bytesUsed - if avail > overhead+userMsgOverhead { - userMsgs := d.GetBroadcasts(overhead+userMsgOverhead, avail) - - // Frame each user message - for _, msg := range userMsgs { - buf := make([]byte, 1, len(msg)+1) - buf[0] = byte(userMsg) - buf = append(buf, msg...) - toSend = append(toSend, buf) - } - } - } - return toSend -} - -// encodeWeightMsgAndBroadcast encodes a weight message and enqueues it for broadcast. Fails -// silently if there is an encoding error. -func (m *Memberlist) encodeWeightMsgAndBroadcast(node string, msg interface{}) { - buf, err := encode(weightMsg, msg) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to encode message for weight message broadcast: %s", err) - } else { - m.broadcasts.QueueBroadcast(&weightBroadcast{node, buf.Bytes()}) - } -} diff --git a/toolkit/memberlist/memberlist_interface.go b/toolkit/memberlist/memberlist_interface.go deleted file mode 100644 index 48495d84..00000000 --- a/toolkit/memberlist/memberlist_interface.go +++ /dev/null @@ -1,26 +0,0 @@ -package memberlist - -import ( - "net" - "time" -) - -//go:generate mockgen -destination ./mock/mock_memberlist_interface.go -package mock -source=./memberlist_interface.go - -type IMemberlist interface { - Join(existing []string) (int, error) - Ping(node string, addr net.Addr) (time.Duration, error) - LocalNode() *Node - UpdateNode(timeout time.Duration) error - SendToAddress(a Address, msg []byte) error - SendBestEffort(to *Node, msg []byte) error - SendReliable(to *Node, msg []byte) error - Members() []*Node - NumMembers() (alive int) - Leave(timeout time.Duration) error - GetHealthScore() int - ProtocolVersion() uint8 - Shutdown() error - Config() *Config - AdvertiseAddr() string -} diff --git a/toolkit/memberlist/memberlist_test.go b/toolkit/memberlist/memberlist_test.go deleted file mode 100644 index 0b9c7a0b..00000000 --- a/toolkit/memberlist/memberlist_test.go +++ /dev/null @@ -1,2368 +0,0 @@ -package memberlist_test - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "net" - "os" - "reflect" - "runtime" - "strconv" - "strings" - "sync" - "testing" - "time" - - "github.com/golang/mock/gomock" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - memmock "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist/mock" - - "github.com/miekg/dns" - "github.com/stretchr/testify/require" -) - -func retry(t *testing.T, n int, w time.Duration, fn func(func(string, ...interface{}))) { - t.Helper() - for try := 1; try <= n; try++ { - failed := false - failFormat := "" - failArgs := []interface{}{} - failf := func(format string, args ...interface{}) { - failed = true - failFormat = format - failArgs = args - } - - fn(failf) - - if !failed { - return - } - if try == n { - t.Fatalf(failFormat, failArgs...) - } - time.Sleep(w) - } -} - -var bindLock sync.Mutex -var bindNum byte = 10 - -func getBindAddrNet(network byte) net.IP { - bindLock.Lock() - defer bindLock.Unlock() - - //result := net.IPv4(127, 0, network, bindNum) - //bindNum++ - //if bindNum > 255 { - // bindNum = 10 - //} - - result := net.IPv4(127, 0, 0, 1) - - return result -} - -func getBindAddr() net.IP { - return getBindAddrNet(0) -} - -func testConfigNet(tb testing.TB, network byte) *memberlist.Config { - tb.Helper() - - config := memberlist.DefaultLANConfig() - config.BindAddr = getBindAddrNet(network).String() - config.Name = config.BindAddr - config.BindPort = 0 // choose free port - config.RequireNodeNames = true - config.Logger = log.New(os.Stderr, config.Name, log.LstdFlags) - return config -} - -func testConfig(tb testing.TB) *memberlist.Config { - return testConfigNet(tb, 0) -} - -func yield() { - time.Sleep(250 * time.Millisecond) -} - -type MockDelegate struct { - mu sync.Mutex - meta []byte - msgs [][]byte - broadcasts [][]byte - state []byte - remoteState []byte -} - -func (m *MockDelegate) setMeta(meta []byte) { - m.mu.Lock() - defer m.mu.Unlock() - m.meta = meta -} - -func (m *MockDelegate) setState(state []byte) { - m.mu.Lock() - defer m.mu.Unlock() - m.state = state -} - -func (m *MockDelegate) setBroadcasts(broadcasts [][]byte) { - m.mu.Lock() - defer m.mu.Unlock() - m.broadcasts = broadcasts -} - -func (m *MockDelegate) getRemoteState() []byte { - m.mu.Lock() - defer m.mu.Unlock() - - out := make([]byte, len(m.remoteState)) - copy(out, m.remoteState) - return out -} - -func (m *MockDelegate) getMessages() [][]byte { - m.mu.Lock() - defer m.mu.Unlock() - - out := make([][]byte, len(m.msgs)) - for i, msg := range m.msgs { - out[i] = make([]byte, len(msg)) - copy(out[i], msg) - } - return out -} - -func (m *MockDelegate) NodeMeta(limit int) []byte { - m.mu.Lock() - defer m.mu.Unlock() - - return m.meta -} - -func (m *MockDelegate) NotifyMsg(msg []byte) { - m.mu.Lock() - defer m.mu.Unlock() - - cp := make([]byte, len(msg)) - copy(cp, msg) - m.msgs = append(m.msgs, cp) -} - -func (m *MockDelegate) GetBroadcasts(overhead, limit int) [][]byte { - m.mu.Lock() - defer m.mu.Unlock() - - b := m.broadcasts - m.broadcasts = nil - return b -} - -func (m *MockDelegate) LocalState(join bool) []byte { - m.mu.Lock() - defer m.mu.Unlock() - - return m.state -} - -func (m *MockDelegate) MergeRemoteState(s []byte, join bool) { - m.mu.Lock() - defer m.mu.Unlock() - - m.remoteState = s -} - -func TestDefaultLANConfig_protocolVersion(t *testing.T) { - c := memberlist.DefaultLANConfig() - if c.ProtocolVersion != memberlist.ProtocolVersion2Compatible { - t.Fatalf("should be max: %d", c.ProtocolVersion) - } -} - -func TestCreate_protocolVersion(t *testing.T) { - cases := []struct { - name string - version uint8 - err bool - }{ - {"min", memberlist.ProtocolVersionMin, false}, - {"max", memberlist.ProtocolVersionMax, false}, - {"max+1", memberlist.ProtocolVersionMax + 1, true}, - {"min-1", memberlist.ProtocolVersionMax - 1, false}, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - c := memberlist.DefaultLANConfig() - c.BindAddr = getBindAddr().String() - c.ProtocolVersion = tc.version - - m, err := memberlist.Create(c) - if err == nil { - require.NoError(t, m.Shutdown()) - } - - if tc.err && err == nil { - t.Fatalf("Should've failed with version: %d", tc.version) - } else if !tc.err && err != nil { - t.Fatalf("Version '%d' error: %s", tc.version, err) - } - }) - } -} - -func TestCreate_secretKey(t *testing.T) { - cases := []struct { - name string - key []byte - err bool - }{ - {"size-0", make([]byte, 0), false}, - {"abc", []byte("abc"), true}, - {"size-16", make([]byte, 16), false}, - {"size-38", make([]byte, 38), true}, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - c := memberlist.DefaultLANConfig() - c.BindAddr = getBindAddr().String() - c.SecretKey = tc.key - - m, err := memberlist.Create(c) - if err == nil { - require.NoError(t, m.Shutdown()) - } - - if tc.err && err == nil { - t.Fatalf("Should've failed with key: %#v", tc.key) - } else if !tc.err && err != nil { - t.Fatalf("Key '%#v' error: %s", tc.key, err) - } - }) - } -} - -func TestCreate_secretKeyEmpty(t *testing.T) { - c := memberlist.DefaultLANConfig() - c.BindAddr = getBindAddr().String() - c.SecretKey = make([]byte, 0) - - m, err := memberlist.Create(c) - require.NoError(t, err) - defer m.Shutdown() - - if m.Config().EncryptionEnabled() { - t.Fatalf("Expected encryption to be disabled") - } -} - -func TestCreate_keyringOnly(t *testing.T) { - c := memberlist.DefaultLANConfig() - c.BindAddr = getBindAddr().String() - - keyring, err := memberlist.NewKeyring(nil, make([]byte, 16)) - require.NoError(t, err) - c.Keyring = keyring - - m, err := memberlist.Create(c) - require.NoError(t, err) - defer m.Shutdown() -} - -func TestCreate_keyringAndSecretKey(t *testing.T) { - c := memberlist.DefaultLANConfig() - c.BindAddr = getBindAddr().String() - - keyring, err := memberlist.NewKeyring(nil, make([]byte, 16)) - require.NoError(t, err) - c.Keyring = keyring - c.SecretKey = []byte{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - - m, err := memberlist.Create(c) - require.NoError(t, err) - defer m.Shutdown() - - ringKeys := c.Keyring.GetKeys() - if !bytes.Equal(c.SecretKey, ringKeys[0]) { - t.Fatalf("Unexpected primary key %v", ringKeys[0]) - } -} - -func TestCreate_invalidLoggerSettings(t *testing.T) { - c := memberlist.DefaultLANConfig() - c.BindAddr = getBindAddr().String() - c.Logger = log.New(ioutil.Discard, "", log.LstdFlags) - c.LogOutput = ioutil.Discard - - m, err := memberlist.Create(c) - if err == nil { - require.NoError(t, m.Shutdown()) - t.Fatal("Memberlist should not allow both LogOutput and Logger to be set, but it did not raise an error") - } -} - -func TestCreate(t *testing.T) { - c := testConfig(t) - c.ProtocolVersion = memberlist.ProtocolVersionMin - c.DelegateProtocolVersion = 13 - c.DelegateProtocolMin = 12 - c.DelegateProtocolMax = 24 - - m, err := memberlist.Create(c) - require.NoError(t, err) - defer m.Shutdown() - - yield() - - members := m.Members() - if len(members) != 1 { - t.Fatalf("bad number of members") - } - - if members[0].PMin != memberlist.ProtocolVersionMin { - t.Fatalf("bad: %#v", members[0]) - } - - if members[0].PMax != memberlist.ProtocolVersionMax { - t.Fatalf("bad: %#v", members[0]) - } - - if members[0].PCur != c.ProtocolVersion { - t.Fatalf("bad: %#v", members[0]) - } - - if members[0].DMin != c.DelegateProtocolMin { - t.Fatalf("bad: %#v", members[0]) - } - - if members[0].DMax != c.DelegateProtocolMax { - t.Fatalf("bad: %#v", members[0]) - } - - if members[0].DCur != c.DelegateProtocolVersion { - t.Fatalf("bad: %#v", members[0]) - } -} - -func GetMemberlist(tb testing.TB, f func(c *memberlist.Config)) *memberlist.Memberlist { - c := testConfig(tb) - c.BindPort = 0 - if f != nil { - f(c) - } - - m, err := memberlist.NewMemberlist(c) - require.NoError(tb, err) - return m -} - -func TestMemberList_ResolveAddr(t *testing.T) { - m := GetMemberlist(t, nil) - defer m.Shutdown() - - defaultPort := uint16(m.Config().BindPort) - - type testCase struct { - name string - in string - expectErr bool - ignoreExpectIP bool - expect []memberlist.IpPort - } - - baseCases := []testCase{ - { - name: "localhost", - in: "localhost", - ignoreExpectIP: true, - expect: []memberlist.IpPort{ - memberlist.NewIpPort("", defaultPort, ""), - }, - }, - { - name: "ipv6 pair", - in: "[::1]:80", - expect: []memberlist.IpPort{ - memberlist.NewIpPort(net.IPv6loopback.String(), 80, ""), - }, - }, - { - name: "ipv6 non-pair", - in: "[::1]", - expect: []memberlist.IpPort{ - memberlist.NewIpPort(net.IPv6loopback.String(), defaultPort, ""), - }, - }, - { - name: "hostless port", - in: ":80", - expectErr: true, - }, - { - name: "hostname port combo", - in: "localhost:80", - ignoreExpectIP: true, - expect: []memberlist.IpPort{ - memberlist.NewIpPort("", 80, ""), - }, - }, - { - name: "too high port", - in: "localhost:80000", - expectErr: true, - }, - { - name: "ipv4 port combo", - in: "127.0.0.1:80", - expect: []memberlist.IpPort{ - memberlist.NewIpPort(net.IPv4(127, 0, 0, 1).String(), 80, ""), - }, - }, - { - name: "ipv6 port combo", - in: "[2001:db8:a0b:12f0::1]:80", - expect: []memberlist.IpPort{ - memberlist.NewIpPort(net.IP{0x20, 0x01, 0x0d, 0xb8, 0x0a, 0x0b, 0x12, 0xf0, 0, 0, 0, 0, 0, 0, 0, 0x1}.String(), 80, ""), - }, - }, - { - name: "ipv4 port combo with empty tag", - in: "/127.0.0.1:80", - expectErr: true, - }, - { - name: "ipv4 only", - in: "127.0.0.1", - expect: []memberlist.IpPort{ - memberlist.NewIpPort(net.IPv4(127, 0, 0, 1).String(), defaultPort, ""), - }, - }, - { - name: "ipv6 only", - in: "[2001:db8:a0b:12f0::1]", - expect: []memberlist.IpPort{ - memberlist.NewIpPort(net.IP{0x20, 0x01, 0x0d, 0xb8, 0x0a, 0x0b, 0x12, 0xf0, 0, 0, 0, 0, 0, 0, 0, 0x1}.String(), defaultPort, ""), - }, - }, - } - - // explode the cases to include tagged versions of everything - var cases []testCase - for _, tc := range baseCases { - cases = append(cases, tc) - if !strings.Contains(tc.in, "/") { // don't double tag already tagged cases - tc2 := testCase{ - name: tc.name + " (tagged)", - in: "foo.bar/" + tc.in, - expectErr: tc.expectErr, - ignoreExpectIP: tc.ignoreExpectIP, - } - for _, ipp := range tc.expect { - tc2.expect = append(tc2.expect, memberlist.NewIpPort(ipp.Ip(), ipp.Port(), "foo.bar")) - } - cases = append(cases, tc2) - } - } - - for _, tc := range cases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - got, err := m.ResolveAddr(tc.in) - if tc.expectErr { - require.Error(t, err) - } else { - require.NoError(t, err) - if tc.ignoreExpectIP { - if len(got) > 1 { - got = got[0:1] - } - for i := 0; i < len(got); i++ { - got[i].SetIp("") - } - } - require.Equal(t, tc.expect, got) - } - }) - } -} - -type dnsHandler struct { - t *testing.T -} - -func (h dnsHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { - if len(r.Question) != 1 { - h.t.Fatalf("bad: %#v", r.Question) - } - - name := "join.service.consul." - question := r.Question[0] - if question.Name != name || question.Qtype != dns.TypeANY { - h.t.Fatalf("bad: %#v", question) - } - - m := new(dns.Msg) - m.SetReply(r) - m.Authoritative = true - m.RecursionAvailable = false - m.Answer = append(m.Answer, &dns.A{ - Hdr: dns.RR_Header{ - Name: name, - Rrtype: dns.TypeA, - Class: dns.ClassINET}, - A: net.ParseIP("127.0.0.1"), - }) - m.Answer = append(m.Answer, &dns.AAAA{ - Hdr: dns.RR_Header{ - Name: name, - Rrtype: dns.TypeAAAA, - Class: dns.ClassINET}, - AAAA: net.ParseIP("2001:db8:a0b:12f0::1"), - }) - if err := w.WriteMsg(m); err != nil { - h.t.Fatalf("err: %v", err) - } -} - -func TestMemberList_Members(t *testing.T) { - n1 := &memberlist.Node{Name: "test"} - n2 := &memberlist.Node{Name: "test2"} - n3 := &memberlist.Node{Name: "test3"} - - m := &memberlist.Memberlist{} - m.SetNodes( - memberlist.NewNodeState(*n1, memberlist.StateAlive), - memberlist.NewNodeState(*n2, memberlist.StateDead), - memberlist.NewNodeState(*n3, memberlist.StateSuspect), - ) - - members := m.Members() - if !reflect.DeepEqual(members, []*memberlist.Node{n1, n3}) { - t.Fatalf("bad members") - } -} - -func TestMemberlist_Join(t *testing.T) { - c1 := testConfig(t) - c1.BindPort = 55111 - c1.AdvertisePort = 55111 - c1.Name = "m1" - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := testConfig(t) - c2.BindPort = 55112 - c2.AdvertisePort = 55112 - c2.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - if num != 1 { - t.Fatalf("unexpected 1: %d", num) - } - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - // Check the hosts - if len(m2.Members()) != 2 { - t.Fatalf("should have 2 nodes! %v", m2.Members()) - } -} - -func TestMemberlist_JoinDifferentNetworksUniqueMask(t *testing.T) { - c1 := testConfigNet(t, 0) - c1.BindPort = 55113 - c1.AdvertisePort = 55113 - c1.Name = "m1" - c1.CIDRsAllowed, _ = memberlist.ParseCIDRs([]string{"127.0.0.0/8"}) - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := testConfigNet(t, 1) - c2.CIDRsAllowed, _ = memberlist.ParseCIDRs([]string{"127.0.0.0/8"}) - c2.BindPort = 55114 - c2.AdvertisePort = 55114 - c2.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - if num != 1 { - t.Fatalf("unexpected 1: %d", num) - } - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - // Check the hosts - if len(m2.Members()) != 2 { - t.Fatalf("should have 2 nodes! %v", m2.Members()) - } -} - -func TestMemberlist_JoinDifferentNetworksMultiMasks(t *testing.T) { - c1 := testConfigNet(t, 0) - c1.BindPort = 55115 - c1.AdvertisePort = 55115 - c1.Name = "m1" - c1.CIDRsAllowed, _ = memberlist.ParseCIDRs([]string{"127.0.0.0/24", "127.0.1.0/24"}) - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := testConfigNet(t, 1) - c2.CIDRsAllowed, _ = memberlist.ParseCIDRs([]string{"127.0.0.0/24", "127.0.1.0/24"}) - c2.BindPort = 55116 - c2.AdvertisePort = 55116 - c2.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - err = joinAndTestMemberShip(t, m2, []string{joinUrl}, 2) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } -} - -type CustomMergeDelegate struct { - invoked bool - t *testing.T -} - -func (c *CustomMergeDelegate) NotifyMerge(nodes []*memberlist.Node) error { - c.t.Logf("Cancel merge") - c.invoked = true - return fmt.Errorf("Custom merge canceled") -} - -func TestMemberlist_Join_Cancel(t *testing.T) { - c1 := testConfig(t) - c1.BindPort = 55117 - c1.AdvertisePort = 55117 - c1.Name = "m1" - merge1 := &CustomMergeDelegate{t: t} - c1.Merge = merge1 - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := testConfig(t) - c2.BindPort = 55118 - c2.AdvertisePort = 55118 - c2.Name = "m2" - merge2 := &CustomMergeDelegate{t: t} - c2.Merge = merge2 - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - if num != 0 { - t.Fatalf("unexpected 0: %d", num) - } - if !strings.Contains(err.Error(), "Custom merge canceled") { - t.Fatalf("unexpected err: %s", err) - } - - // Check the hosts - if len(m2.Members()) != 1 { - t.Fatalf("should have 1 nodes! %v", m2.Members()) - } - if len(m1.Members()) != 1 { - t.Fatalf("should have 1 nodes! %v", m1.Members()) - } - - // Check delegate invocation - if !merge1.invoked { - t.Fatalf("should invoke delegate") - } - if !merge2.invoked { - t.Fatalf("should invoke delegate") - } -} - -type CustomAliveDelegate struct { - Ignore string - count int - - t *testing.T -} - -func (c *CustomAliveDelegate) NotifyAlive(peer *memberlist.Node) error { - c.count++ - if peer.Name == c.Ignore { - return nil - } - c.t.Logf("Cancel alive") - return fmt.Errorf("Custom alive canceled") -} - -func TestMemberlist_Join_Cancel_Passive(t *testing.T) { - c1 := testConfig(t) - c1.BindPort = 55119 - c1.AdvertisePort = 55119 - c1.Name = "m1" - alive1 := &CustomAliveDelegate{ - Ignore: c1.Name, - t: t, - } - c1.Alive = alive1 - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := testConfig(t) - c2.BindPort = 55120 - c2.AdvertisePort = 55120 - c2.Name = "m2" - alive2 := &CustomAliveDelegate{ - Ignore: c2.Name, - t: t, - } - c2.Alive = alive2 - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - if num != 1 { - t.Fatalf("unexpected 1: %d", num) - } - if err != nil { - t.Fatalf("err: %s", err) - } - - // Check the hosts - if len(m2.Members()) != 1 { - t.Fatalf("should have 1 nodes! %v", m2.Members()) - } - if len(m1.Members()) != 1 { - t.Fatalf("should have 1 nodes! %v", m1.Members()) - } - - // Check delegate invocation - if alive1.count == 0 { - t.Fatalf("should invoke delegate: %d", alive1.count) - } - if alive2.count == 0 { - t.Fatalf("should invoke delegate: %d", alive2.count) - } -} - -func TestMemberlist_Join_protocolVersions(t *testing.T) { - c1 := testConfig(t) - c1.BindPort = 55121 - c1.AdvertisePort = 55121 - c1.Name = "m1" - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - c2 := testConfig(t) - c2.BindPort = 55110 - c2.AdvertisePort = 55110 - c2.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - c3 := testConfig(t) - c3.BindPort = 55109 - c3.AdvertisePort = 55109 - c3.Name = "m3" - c3.ProtocolVersion = memberlist.ProtocolVersionMax - - m3, err := memberlist.Create(c3) - require.NoError(t, err) - defer m3.Shutdown() - - _, err = m1.Join([]string{c2.Name + "/" + c2.BindAddr}) - require.NoError(t, err) - - yield() - - _, err = m1.Join([]string{c3.Name + "/" + c3.BindAddr}) - require.NoError(t, err) -} - -func joinAndTestMemberShip(t *testing.T, self *memberlist.Memberlist, membersToJoin []string, expectedMembers int) error { - t.Helper() - num, err := self.Join(membersToJoin) - if err != nil { - return err - } - if num != len(membersToJoin) { - t.Fatalf("unexpected %d, was expecting %d to be joined", num, len(membersToJoin)) - } - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - // Check the hosts - if len(self.Members()) != expectedMembers { - t.Fatalf("should have 2 nodes! %v", self.Members()) - } - if len(self.Members()) != expectedMembers { - t.Fatalf("should have 2 nodes! %v", self.Members()) - } - return nil -} - -func TestMemberlist_Leave(t *testing.T) { - newConfig := func() *memberlist.Config { - c := testConfig(t) - c.GossipInterval = time.Millisecond - return c - } - - c1 := newConfig() - c1.BindPort = 55108 - c1.AdvertisePort = 55108 - c1.Name = "m1" - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := newConfig() - c2.BindPort = 55107 - c2.AdvertisePort = 55107 - c2.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - err = joinAndTestMemberShip(t, m2, []string{joinUrl}, 2) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - // Leave - err = m1.Leave(time.Second) - require.NoError(t, err) - - // Wait for leave - time.Sleep(10 * time.Millisecond) - - // m1 should think dead - if len(m1.Members()) != 1 { - t.Fatalf("should have 1 node") - } - - if len(m2.Members()) != 1 { - t.Fatalf("should have 1 node") - } - - if m2.NodeMap()[c1.Name].State != memberlist.StateLeft { - t.Fatalf("bad state") - } -} - -func TestMemberlist_JoinShutdown(t *testing.T) { - newConfig := func() *memberlist.Config { - c := testConfig(t) - c.ProbeInterval = time.Millisecond - c.ProbeTimeout = 100 * time.Microsecond - c.SuspicionMaxTimeoutMult = 1 - return c - } - - c1 := newConfig() - c1.BindPort = 55106 - c1.AdvertisePort = 55106 - c1.Name = "m1" - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := newConfig() - c2.BindPort = 55105 - c2.AdvertisePort = 55105 - c2.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - if num != 1 { - t.Fatalf("unexpected 1: %d", num) - } - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - // Check the hosts - if len(m2.Members()) != 2 { - t.Fatalf("should have 2 nodes! %v", m2.Members()) - } - - require.NoError(t, m1.Shutdown()) - - waitForCondition(t, func() (bool, string) { - n := len(m2.Members()) - return n == 1, fmt.Sprintf("expected 1 node, got %d", n) - }) -} - -func TestMemberlist_delegateMeta(t *testing.T) { - c1 := testConfig(t) - c1.Delegate = &MockDelegate{meta: []byte("web")} - c1.BindPort = 55104 - c1.AdvertisePort = 55104 - c1.Name = "c1" - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - c2 := testConfig(t) - c2.BindPort = 55103 - c2.AdvertisePort = 55103 - c2.Name = "c2" - c2.Delegate = &MockDelegate{meta: []byte("lb")} - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m2.Config().Name, m2.AdvertiseAddr(), m2.AdvertisePort()) - _, err = m1.Join([]string{joinUrl}) - require.NoError(t, err) - - yield() - - var roles map[string]string - - // Check the roles of members of m1 - m1m := m1.Members() - if len(m1m) != 2 { - t.Fatalf("bad: %#v", m1m) - } - - roles = make(map[string]string) - for _, m := range m1m { - roles[m.Name] = string(m.Meta) - } - - if r := roles[c1.Name]; r != "web" { - t.Fatalf("bad role for %s: %s", c1.Name, r) - } - - if r := roles[c2.Name]; r != "lb" { - t.Fatalf("bad role for %s: %s", c2.Name, r) - } - - // Check the roles of members of m2 - m2m := m2.Members() - if len(m2m) != 2 { - t.Fatalf("bad: %#v", m2m) - } - - roles = make(map[string]string) - for _, m := range m2m { - roles[m.Name] = string(m.Meta) - } - - if r := roles[c1.Name]; r != "web" { - t.Fatalf("bad role for %s: %s", c1.Name, r) - } - - if r := roles[c2.Name]; r != "lb" { - t.Fatalf("bad role for %s: %s", c2.Name, r) - } -} - -func TestMemberlist_delegateMeta_Update(t *testing.T) { - c1 := testConfig(t) - c1.BindPort = 55122 - c1.AdvertisePort = 55122 - c1.Name = "m1" - mock1 := &MockDelegate{meta: []byte("web")} - c1.Delegate = mock1 - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - c2 := testConfig(t) - c2.BindPort = 55123 - c2.AdvertisePort = 55123 - c2.Name = "m2" - mock2 := &MockDelegate{meta: []byte("lb")} - c2.Delegate = mock2 - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m2.Config().Name, m2.AdvertiseAddr(), m2.AdvertisePort()) - _, err = m1.Join([]string{joinUrl}) - - require.NoError(t, err) - - yield() - - // Update the meta data roles - mock1.setMeta([]byte("api")) - mock2.setMeta([]byte("db")) - - err = m1.UpdateNode(0) - require.NoError(t, err) - err = m2.UpdateNode(0) - require.NoError(t, err) - - yield() - - // Check the updates have propagated - var roles map[string]string - - // Check the roles of members of m1 - m1m := m1.Members() - if len(m1m) != 2 { - t.Fatalf("bad: %#v", m1m) - } - - roles = make(map[string]string) - for _, m := range m1m { - roles[m.Name] = string(m.Meta) - } - - if r := roles[c1.Name]; r != "api" { - t.Fatalf("bad role for %s: %s", c1.Name, r) - } - - if r := roles[c2.Name]; r != "db" { - t.Fatalf("bad role for %s: %s", c2.Name, r) - } - - // Check the roles of members of m2 - m2m := m2.Members() - if len(m2m) != 2 { - t.Fatalf("bad: %#v", m2m) - } - - roles = make(map[string]string) - for _, m := range m2m { - roles[m.Name] = string(m.Meta) - } - - if r := roles[c1.Name]; r != "api" { - t.Fatalf("bad role for %s: %s", c1.Name, r) - } - - if r := roles[c2.Name]; r != "db" { - t.Fatalf("bad role for %s: %s", c2.Name, r) - } -} - -func TestMemberlist_UserData(t *testing.T) { - newConfig := func() (*memberlist.Config, *MockDelegate) { - d := &MockDelegate{} - c := testConfig(t) - // Set the gossip/pushpull intervals fast enough to get a reasonable test, - // but slow enough to avoid "sendto: operation not permitted" - c.GossipInterval = 100 * time.Millisecond - c.PushPullInterval = 100 * time.Millisecond - c.Delegate = d - return c, d - } - - c1, d1 := newConfig() - c1.BindPort = 55133 - c1.AdvertisePort = 55133 - c1.Name = "m1" - d1.setState([]byte("something")) - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - bcasts := [][]byte{ - []byte("test"), - []byte("foobar"), - } - - // Create a second node - c2, d2 := newConfig() - c2.BindPort = 55134 - c2.AdvertisePort = 55134 - c2.Name = "m2" - - // Second delegate has things to send - d2.setBroadcasts(bcasts) - d2.setState([]byte("my state")) - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - if num != 1 { - t.Fatalf("unexpected 1: %d", num) - } - require.NoError(t, err) - - // Check the hosts - if m2.NumMembers() != 2 { - t.Fatalf("should have 2 nodes! %v", m2.Members()) - } -} - -func TestMemberlist_SendTo(t *testing.T) { - newConfig := func() (*memberlist.Config, *MockDelegate, net.IP) { - d := &MockDelegate{} - c := testConfig(t) - c.GossipInterval = time.Millisecond - c.PushPullInterval = time.Millisecond - c.Delegate = d - return c, d, net.ParseIP(c.BindAddr) - } - - c1, d1, _ := newConfig() - c1.BindPort = 55144 - c1.AdvertisePort = 55144 - c1.Name = "m1" - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - c2, d2, addr2 := newConfig() - c2.BindPort = 55145 - c2.AdvertisePort = 55145 - c2.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - require.NoError(t, err) - require.Equal(t, 1, num) - - // Check the hosts - require.Equal(t, 2, m2.NumMembers(), "should have 2 nodes! %v", m2.Members()) - - // Try to do a direct send - m2Addr := &net.UDPAddr{ - IP: addr2, - Port: int(m2.AdvertisePort()), - } - m2Address := memberlist.Address{ - Addr: m2Addr.String(), - Name: m2.Config().Name, - } - if err := m1.SendToAddress(m2Address, []byte("ping")); err != nil { - t.Fatalf("err: %v", err) - } - - m1Addr := &net.UDPAddr{ - IP: net.ParseIP(m1.Config().BindAddr), - Port: int(m1.AdvertisePort()), - } - m1Address := memberlist.Address{ - Addr: m1Addr.String(), - Name: m1.Config().Name, - } - if err := m2.SendToAddress(m1Address, []byte("pong")); err != nil { - t.Fatalf("err: %v", err) - } - - waitForCondition(t, func() (bool, string) { - msgs := d1.getMessages() - return len(msgs) == 1, fmt.Sprintf("expected 1 message, got %d", len(msgs)) - }) - - msgs1 := d1.getMessages() - if !reflect.DeepEqual(msgs1[0], []byte("pong")) { - t.Fatalf("bad msg %v", msgs1[0]) - } - - waitForCondition(t, func() (bool, string) { - msgs := d2.getMessages() - return len(msgs) == 1, fmt.Sprintf("expected 1 message, got %d", len(msgs)) - }) - msgs2 := d2.getMessages() - if !reflect.DeepEqual(msgs2[0], []byte("ping")) { - t.Fatalf("bad msg %v", msgs2[0]) - } -} - -func waitForCondition(t *testing.T, fn func() (bool, string)) { - start := time.Now() - - var msg string - for time.Since(start) < 20*time.Second { - var done bool - done, msg = fn() - if done { - return - } - time.Sleep(5 * time.Millisecond) - } - t.Fatalf("timeout waiting for condition: %v", msg) -} - -func TestMemberlistProtocolVersion(t *testing.T) { - c := testConfig(t) - c.ProtocolVersion = memberlist.ProtocolVersionMax - - m, err := memberlist.Create(c) - require.NoError(t, err) - defer m.Shutdown() - - result := m.ProtocolVersion() - if result != memberlist.ProtocolVersionMax { - t.Fatalf("bad: %d", result) - } -} - -func TestMemberlist_Join_DeadNode(t *testing.T) { - c1 := testConfig(t) - c1.TCPTimeout = 50 * time.Millisecond - c1.BindPort = 55155 - c1.AdvertisePort = 55155 - c1.Name = "m1" - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second "node", which is just a TCP listener that - // does not ever respond. This is to test our deadlines - addr2 := getBindAddr() - list, err := net.Listen("tcp", net.JoinHostPort(addr2.String(), strconv.Itoa(56156))) - if err != nil { - t.Fatalf("err: %v", err) - } - defer list.Close() - - // Ensure we don't hang forever - timer := time.AfterFunc(100*time.Millisecond, func() { - panic("should have timed out by now") - }) - defer timer.Stop() - - num, err := m1.Join([]string{fmt.Sprintf("%s/%s:%d", "fake", addr2.String(), 56156)}) - if num != 0 { - t.Fatalf("unexpected 0: %d", num) - } - if err == nil { - t.Fatal("expect err") - } -} - -// Tests that nodes running different versions of the protocol can successfully -// discover each other and add themselves to their respective member lists. -func TestMemberlist_Join_Protocol_Compatibility(t *testing.T) { - testProtocolVersionPair := func(t *testing.T, pv1 uint8, pv2 uint8) { - t.Helper() - - c1 := testConfig(t) - c1.ProtocolVersion = pv1 - c1.BindPort = 55166 - c1.AdvertisePort = 55166 - c1.Name = "m1" - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - c2 := testConfig(t) - c2.BindPort = 55167 - c2.AdvertisePort = 55167 - c2.ProtocolVersion = pv2 - c1.Name = "m2" - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - _, err = m2.Join([]string{joinUrl}) - - require.NoError(t, err) - //require.Equal(t, 1, num) - - // Check the hosts - //if len(m2.Members()) != 2 { - // t.Fatalf("should have 2 nodes! %v", m2.Members()) - //} - // - // Check the hosts - //if len(m1.Members()) != 2 { - // t.Fatalf("should have 2 nodes! %v", m1.Members()) - //} - } - - t.Run("2,1", func(t *testing.T) { - testProtocolVersionPair(t, 2, 1) - }) - t.Run("2,3", func(t *testing.T) { - testProtocolVersionPair(t, 2, 3) - }) - t.Run("3,2", func(t *testing.T) { - testProtocolVersionPair(t, 3, 2) - }) - t.Run("3,1", func(t *testing.T) { - testProtocolVersionPair(t, 3, 1) - }) -} - -var ( - ipv6LoopbackAvailableOnce sync.Once - ipv6LoopbackAvailable bool -) - -func isIPv6LoopbackAvailable(t *testing.T) bool { - const ipv6LoopbackAddress = "::1" - ipv6LoopbackAvailableOnce.Do(func() { - ifaces, err := net.Interfaces() - require.NoError(t, err) - - for _, iface := range ifaces { - if iface.Flags&net.FlagLoopback == 0 { - continue - } - addrs, err := iface.Addrs() - require.NoError(t, err) - - for _, addr := range addrs { - ipaddr := addr.(*net.IPNet) - if ipaddr.IP.String() == ipv6LoopbackAddress { - ipv6LoopbackAvailable = true - return - } - } - } - ipv6LoopbackAvailable = false - t.Logf("IPv6 loopback address %q not found, disabling tests that require it", ipv6LoopbackAddress) - }) - - return ipv6LoopbackAvailable -} - -func TestMemberlist_Join_IPv6(t *testing.T) { - if !isIPv6LoopbackAvailable(t) { - t.SkipNow() - return - } - // Since this binds to all interfaces we need to exclude other tests - // from grabbing an interface. - bindLock.Lock() - defer bindLock.Unlock() - - c1 := memberlist.DefaultLANConfig() - c1.Name = "A" - c1.BindAddr = "[::1]" - c1.BindPort = 0 // choose free - c1.Logger = log.New(os.Stderr, c1.Name, log.LstdFlags) - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := memberlist.DefaultLANConfig() - c2.Name = "B" - c2.BindAddr = "[::1]" - c2.BindPort = 0 // choose free - c2.Logger = log.New(os.Stderr, c2.Name, log.LstdFlags) - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - num, err := m2.Join([]string{fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.Config().BindAddr, m1.Config().BindPort)}) - require.NoError(t, err) - require.Equal(t, 1, num) - - // Check the hosts - if len(m2.Members()) != 2 { - t.Fatalf("should have 2 nodes! %v", m2.Members()) - } - - if len(m1.Members()) != 2 { - t.Fatalf("should have 2 nodes! %v", m2.Members()) - } -} - -func reservePort(t *testing.T, ip net.IP, purpose string) int { - for i := 0; i < 10; i++ { - tcpAddr := &net.TCPAddr{IP: ip, Port: 0} - tcpLn, err := net.ListenTCP("tcp", tcpAddr) - if err != nil { - if strings.Contains(err.Error(), "address already in use") { - continue - } - t.Fatalf("unexpected error: %v", err) - } - - port := tcpLn.Addr().(*net.TCPAddr).Port - - udpAddr := &net.UDPAddr{IP: ip, Port: port} - udpLn, err := net.ListenUDP("udp", udpAddr) - if err != nil { - _ = tcpLn.Close() - if strings.Contains(err.Error(), "address already in use") { - continue - } - t.Fatalf("unexpected error: %v", err) - } - - t.Logf("Using dynamic bind port %d for %s", port, purpose) - _ = tcpLn.Close() - _ = udpLn.Close() - return port - } - - t.Fatalf("could not find a free TCP+UDP port to listen on for %s", purpose) - panic("IMPOSSIBLE") -} - -func TestAdvertiseAddr(t *testing.T) { - bindAddr := getBindAddr() - advertiseAddr := getBindAddr() - - bindPort := reservePort(t, bindAddr, "BIND") - advertisePort := reservePort(t, advertiseAddr, "ADVERTISE") - - c := memberlist.DefaultLANConfig() - c.BindAddr = bindAddr.String() - c.BindPort = bindPort - c.Name = c.BindAddr - - c.AdvertiseAddr = advertiseAddr.String() - c.AdvertisePort = advertisePort - - m, err := memberlist.Create(c) - require.NoError(t, err) - defer m.Shutdown() - - yield() - - members := m.Members() - require.Equal(t, 1, len(members)) - - require.Equal(t, advertiseAddr.String(), members[0].Addr) - require.Equal(t, advertisePort, int(members[0].Port)) -} - -type MockConflict struct { - existing *memberlist.Node - other *memberlist.Node -} - -func (m *MockConflict) NotifyConflict(existing, other *memberlist.Node) { - m.existing = existing - m.other = other -} - -func TestMemberlist_conflictDelegate(t *testing.T) { - c1 := testConfig(t) - c1.BindPort = 55177 - c1.AdvertisePort = 55177 - mock := &MockConflict{} - c1.Conflict = mock - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Ensure name conflict - c2 := testConfig(t) - c2.Name = c1.Name - c2.BindPort = 55178 - c2.AdvertisePort = 55178 - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m2.Config().Name, m2.AdvertiseAddr(), m2.AdvertisePort()) - num, err := m1.Join([]string{joinUrl}) - require.NoError(t, err) - require.Equal(t, 1, num) - - yield() - - // Ensure we were notified - if mock.existing == nil || mock.other == nil { - t.Fatalf("should get notified mock.existing=%v VS mock.other=%v", mock.existing, mock.other) - } - if mock.existing.Name != mock.other.Name { - t.Fatalf("bad: %v %v", mock.existing, mock.other) - } -} - -type MockPing struct { - mu sync.Mutex - other *memberlist.Node - rtt time.Duration - payload []byte -} - -func (m *MockPing) NotifyPingComplete(other *memberlist.Node, rtt time.Duration, payload []byte) { - m.mu.Lock() - defer m.mu.Unlock() - - m.other = other - m.rtt = rtt - m.payload = payload -} - -func (m *MockPing) getContents() (*memberlist.Node, time.Duration, []byte) { - m.mu.Lock() - defer m.mu.Unlock() - return m.other, m.rtt, m.payload -} - -const DEFAULT_PAYLOAD = "whatever" - -func (m *MockPing) AckPayload() []byte { - return []byte(DEFAULT_PAYLOAD) -} - -func TestMemberlist_PingDelegate(t *testing.T) { - newConfig := func() *memberlist.Config { - c := testConfig(t) - c.ProbeInterval = 100 * time.Millisecond - c.Ping = &MockPing{} - return c - } - - c1 := newConfig() - c1.BindPort = 55199 - c1.AdvertisePort = 55199 - c1.Name = "m1" - - m1, err := memberlist.Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - // Create a second node - c2 := newConfig() - c2.BindPort = 55200 - c2.AdvertisePort = 55200 - c2.Name = "m2" - mock := c2.Ping.(*MockPing) - - m2, err := memberlist.Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - joinUrl := fmt.Sprintf("%s/%s:%d", m1.Config().Name, m1.AdvertiseAddr(), m1.AdvertisePort()) - num, err := m2.Join([]string{joinUrl}) - require.NoError(t, err) - require.Equal(t, 1, num) - - waitUntilSize(t, m1, 2) - waitUntilSize(t, m2, 2) - - time.Sleep(2 * c1.ProbeInterval) - - require.NoError(t, m1.Shutdown()) - require.NoError(t, m2.Shutdown()) - - mOther, mRTT, _ := mock.getContents() - - // Ensure we were notified - if mOther == nil { - t.Fatalf("should get notified") - } - - //if !reflect.DeepEqual(mOther, m1.LocalNode()) { - // t.Fatalf("not notified about the correct node; expected: %+v; actual: %+v", - // m2.LocalNode(), mOther) - //} - - if mRTT <= 0 { - t.Fatalf("rtt should be greater than 0") - } - - //if bytes.Compare(mPayload, []byte(DEFAULT_PAYLOAD)) != 0 { - // t.Fatalf("incorrect payload. expected: %v; actual: %v", - // []byte(DEFAULT_PAYLOAD), mPayload) - //} -} - -func waitUntilSize(t *testing.T, m *memberlist.Memberlist, expected int) { - t.Helper() - retry(t, 15, 500*time.Millisecond, func(failf func(string, ...interface{})) { - t.Helper() - - if m.NumMembers() != expected { - failf("%s expected to have %d members but had: %v", m.Config().Name, expected, m.Members()) - } - }) -} - -func isPortFree(t *testing.T, addr string, port int) error { - t.Helper() - - ip := net.ParseIP(addr) - tcpAddr := &net.TCPAddr{IP: ip, Port: port} - tcpLn, err := net.ListenTCP("tcp", tcpAddr) - if err != nil { - return err - } - if err := tcpLn.Close(); err != nil { - return err - } - - udpAddr := &net.UDPAddr{IP: ip, Port: port} - udpLn, err := net.ListenUDP("udp", udpAddr) - if err != nil { - return err - } - - return udpLn.Close() -} - -func waitUntilPortIsFree(t *testing.T, m *memberlist.Memberlist) { - t.Helper() - - // wait until we know for certain that m1 is dead dead - addr := m.Config().BindAddr - port := m.Config().BindPort - - retry(t, 15, 250*time.Millisecond, func(failf func(string, ...interface{})) { - t.Helper() - - if err := isPortFree(t, addr, port); err != nil { - failf("%s port is not yet free", m.Config().Name) - } - }) -} - -// This test should follow the recommended upgrade guide: -// https://www.consul.io/docs/agent/encryption.html#configuring-gossip-encryption-on-an-existing-cluster -// -// We will use two nodes for this: m0 and m1 -// -// 0. Start with nodes without encryption. -// 1. Set an encryption key and set GossipVerifyIncoming=false and GossipVerifyOutgoing=false to all nodes. -// 2. Change GossipVerifyOutgoing=true to all nodes. -// 3. Change GossipVerifyIncoming=true to all nodes. -//func TestMemberlist_EncryptedGossipTransition(t *testing.T) { -// // ensure these all get the same general set of customizations -// pretty := make(map[string]string) // addr->shortName -// newConfig := func(shortName string, addr string) *memberlist.Config { -// t.Helper() -// -// conf := memberlist.DefaultLANConfig() -// if addr == "" { -// addr = getBindAddr().String() -// } -// conf.Name = addr -// // conf.Name = shortName -// conf.BindAddr = addr -// conf.BindPort = 0 -// // Set the gossip interval fast enough to get a reasonable test, -// // but slow enough to avoid "sendto: operation not permitted" -// conf.GossipInterval = 100 * time.Millisecond -// conf.Logger = log.New(os.Stderr, shortName, log.LstdFlags) -// -// pretty[conf.Name] = shortName -// return conf -// } -// -// var bindPort int -// createOK := func(conf *memberlist.Config) *Memberlist { -// t.Helper() -// -// if bindPort > 0 { -// conf.BindPort = bindPort -// } else { -// // try a range of port numbers until something sticks -// } -// m, err := memberlist.Create(conf) -// require.NoError(t, err) -// -// if bindPort == 0 { -// bindPort = m.config.BindPort -// } -// return m -// } -// -// joinOK := func(src, dst *Memberlist, numNodes int) { -// t.Helper() -// -// srcName, dstName := pretty[src.Config().Name], pretty[dst.Config().Name] -// t.Logf("Node %s[%s] joining node %s[%s]", srcName, src.Config().Name, dstName, dst.Config().Name) -// -// num, err := src.Join([]string{dst.Config().Name + "/" + dst.config.BindAddr}) -// require.NoError(t, err) -// require.Equal(t, 1, num) -// -// waitUntilSize(t, src, numNodes) -// waitUntilSize(t, dst, numNodes) -// -// // Check the hosts -// require.Equal(t, numNodes, len(src.Members()), "nodes: %v", src.Members()) -// require.Equal(t, numNodes, src.estNumNodes(), "nodes: %v", src.Members()) -// require.Equal(t, numNodes, len(dst.Members()), "nodes: %v", dst.Members()) -// require.Equal(t, numNodes, dst.estNumNodes(), "nodes: %v", dst.Members()) -// } -// -// leaveOK := func(m *Memberlist, why string) { -// t.Helper() -// -// name := pretty[m.Config().Name] -// t.Logf("Node %s[%s] is leaving %s", name, m.Config().Name, why) -// err := m.Leave(time.Second) -// require.NoError(t, err) -// } -// -// shutdownOK := func(m *Memberlist, why string) { -// t.Helper() -// -// name := pretty[m.Config().Name] -// t.Logf("Node %s[%s] is shutting down %s", name, m.Config().Name, why) -// err := m.Shutdown() -// require.NoError(t, err) -// -// // Double check that it genuinely shutdown. -// waitUntilPortIsFree(t, m) -// } -// -// leaveAndShutdown := func(leaver, bystander *Memberlist, why string) { -// t.Helper() -// -// leaveOK(leaver, why) -// waitUntilSize(t, bystander, 1) -// shutdownOK(leaver, why) -// waitUntilSize(t, bystander, 1) -// } -// -// // ==== STEP 0 ==== -// -// // Create a first cluster of 2 nodes with no gossip encryption settings. -// conf0 := newConfig("m0", "") -// m0 := memberlist.CreateOK(conf0) -// defer m0.Shutdown() -// -// conf1 := newConfig("m1", "") -// m1 := memberlist.CreateOK(conf1) -// defer m1.Shutdown() -// -// joinOK(m1, m0, 2) -// -// t.Logf("==== STEP 0 complete: two node unencrypted cluster ====") -// -// // ==== STEP 1 ==== -// -// // Take down m0, upgrade to first stage of gossip transition settings. -// leaveAndShutdown(m0, m1, "to upgrade gossip to first stage") -// -// // Resurrect the first node with the first stage of gossip transition settings. -// conf0 = newConfig("m0", m0.config.BindAddr) -// conf0.SecretKey = []byte("Hi16ZXu2lNCRVwtr20khAg==") -// conf0.GossipVerifyIncoming = false -// conf0.GossipVerifyOutgoing = false -// m0 = createOK(conf0) -// defer m0.Shutdown() -// -// // Join the second node. m1 has no encryption while m0 has encryption configured and -// // can receive encrypted gossip, but will not encrypt outgoing gossip. -// joinOK(m0, m1, 2) -// -// leaveAndShutdown(m1, m0, "to upgrade gossip to first stage") -// -// // Resurrect the second node with the first stage of gossip transition settings. -// conf1 = newConfig("m1", m1.config.BindAddr) -// conf1.SecretKey = []byte("Hi16ZXu2lNCRVwtr20khAg==") -// conf1.GossipVerifyIncoming = false -// conf1.GossipVerifyOutgoing = false -// m1 = createOK(conf1) -// defer m1.Shutdown() -// -// // Join the first node. Both have encryption configured and can receive -// // encrypted gossip, but will not encrypt outgoing gossip. -// joinOK(m1, m0, 2) -// -// t.Logf("==== STEP 1 complete: two node encryption-aware cluster ====") -// -// // ==== STEP 2 ==== -// -// // Take down m0, upgrade to second stage of gossip transition settings. -// leaveAndShutdown(m0, m1, "to upgrade gossip to second stage") -// -// // Resurrect the first node with the second stage of gossip transition settings. -// conf0 = newConfig("m0", m0.config.BindAddr) -// conf0.SecretKey = []byte("Hi16ZXu2lNCRVwtr20khAg==") -// conf0.GossipVerifyIncoming = false -// m0 = createOK(conf0) -// defer m0.Shutdown() -// -// // Join the second node. At this step, both nodes have encryption -// // configured but only m0 is sending encrypted gossip. -// joinOK(m0, m1, 2) -// -// leaveAndShutdown(m1, m0, "to upgrade gossip to second stage") -// -// // Resurrect the second node with the second stage of gossip transition settings. -// conf1 = newConfig("m1", m1.config.BindAddr) -// conf1.SecretKey = []byte("Hi16ZXu2lNCRVwtr20khAg==") -// conf1.GossipVerifyIncoming = false -// m1 = createOK(conf1) -// defer m1.Shutdown() -// -// // Join the first node. Both have encryption configured and can receive -// // encrypted gossip, and encrypt outgoing gossip, but aren't forcing -// // incoming gossip is encrypted. -// joinOK(m1, m0, 2) -// -// t.Logf("==== STEP 2 complete: two node encryption-aware cluster being encrypted ====") -// -// // ==== STEP 3 ==== -// -// // Take down m0, upgrade to final stage of gossip transition settings. -// leaveAndShutdown(m0, m1, "to upgrade gossip to final stage") -// -// // Resurrect the first node with the final stage of gossip transition settings. -// conf0 = newConfig("m0", m0.config.BindAddr) -// conf0.SecretKey = []byte("Hi16ZXu2lNCRVwtr20khAg==") -// m0 = createOK(conf0) -// defer m0.Shutdown() -// -// // Join the second node. At this step, both nodes have encryption -// // configured and are sending it, bu tonly m0 is verifying inbound gossip -// // is encrypted. -// joinOK(m0, m1, 2) -// -// leaveAndShutdown(m1, m0, "to upgrade gossip to final stage") -// -// // Resurrect the second node with the final stage of gossip transition settings. -// conf1 = newConfig("m1", m1.config.BindAddr) -// conf1.SecretKey = []byte("Hi16ZXu2lNCRVwtr20khAg==") -// m1 = createOK(conf1) -// defer m1.Shutdown() -// -// // Join the first node. Both have encryption configured and fully in -// // enforcement. -// joinOK(m1, m0, 2) -// -// t.Logf("==== STEP 3 complete: two node encrypted cluster locked down ====") -//} - -// Consul bug, rapid restart (before failure detection), -// with an updated meta data. Should be at incarnation 1 for -// both. -// -// This test is uncommented because it requires that either we -// can rebind the socket (SO_REUSEPORT) which Go does not allow, -// OR we must disable the address conflict checking in memberlist. -// I just comment out that code to test this case. -// -//func TestMemberlist_Restart_delegateMeta_Update(t *testing.T) { -// c1 := testConfig() -// c2 := testConfig() -// mock1 := &MockDelegate{meta: []byte("web")} -// mock2 := &MockDelegate{meta: []byte("lb")} -// c1.Delegate = mock1 -// c2.Delegate = mock2 - -// m1, err := memberlist.Create(c1) -// if err != nil { -// t.Fatalf("err: %s", err) -// } -// defer m1.Shutdown() - -// m2, err := memberlist.Create(c2) -// if err != nil { -// t.Fatalf("err: %s", err) -// } -// defer m2.Shutdown() - -// _, err = m1.Join([]string{c2.BindAddr}) -// if err != nil { -// t.Fatalf("err: %s", err) -// } - -// yield() - -// // Recreate m1 with updated meta -// m1.Shutdown() -// c3 := testConfig() -// c3.Name = c1.Name -// c3.Delegate = mock1 -// c3.GossipInterval = time.Millisecond -// mock1.meta = []byte("api") - -// m1, err = Create(c3) -// if err != nil { -// t.Fatalf("err: %s", err) -// } -// defer m1.Shutdown() - -// _, err = m1.Join([]string{c2.BindAddr}) -// if err != nil { -// t.Fatalf("err: %s", err) -// } - -// yield() -// yield() - -// // Check the updates have propagated -// var roles map[string]string - -// // Check the roles of members of m1 -// m1m := m1.Members() -// if len(m1m) != 2 { -// t.Fatalf("bad: %#v", m1m) -// } - -// roles = make(map[string]string) -// for _, m := range m1m { -// roles[m.Name] = string(m.Meta) -// } - -// if r := roles[c1.Name]; r != "api" { -// t.Fatalf("bad role for %s: %s", c1.Name, r) -// } - -// if r := roles[c2.Name]; r != "lb" { -// t.Fatalf("bad role for %s: %s", c2.Name, r) -// } - -// // Check the roles of members of m2 -// m2m := m2.Members() -// if len(m2m) != 2 { -// t.Fatalf("bad: %#v", m2m) -// } - -// roles = make(map[string]string) -// for _, m := range m2m { -// roles[m.Name] = string(m.Meta) -// } - -// if r := roles[c1.Name]; r != "api" { -// t.Fatalf("bad role for %s: %s", c1.Name, r) -// } - -// if r := roles[c2.Name]; r != "lb" { -// t.Fatalf("bad role for %s: %s", c2.Name, r) -// } -//} - -// Failer is an interface compatible with testing.T. -type Failer interface { - // Log is called for the final test output - Log(args ...interface{}) - - // FailNow is called when the retrying is abandoned. - FailNow() -} - -// R provides context for the retryer. -type R struct { - fail bool - output []string -} - -func (r *R) FailNow() { - r.fail = true - runtime.Goexit() -} - -func (r *R) Fatal(args ...interface{}) { - r.log(fmt.Sprint(args...)) - r.FailNow() -} - -func (r *R) Fatalf(format string, args ...interface{}) { - r.log(fmt.Sprintf(format, args...)) - r.FailNow() -} - -func (r *R) Error(args ...interface{}) { - r.log(fmt.Sprint(args...)) - r.fail = true -} - -func (r *R) Errorf(format string, args ...interface{}) { - r.log(fmt.Sprintf(format, args...)) - r.fail = true -} - -func (r *R) Check(err error) { - if err != nil { - r.log(err.Error()) - r.FailNow() - } -} - -func (r *R) log(s string) { - r.output = append(r.output, decorate(s)) -} - -func decorate(s string) string { - _, file, line, ok := runtime.Caller(3) - if ok { - n := strings.LastIndex(file, "/") - if n >= 0 { - file = file[n+1:] - } - } else { - file = "???" - line = 1 - } - return fmt.Sprintf("%s:%d: %s", file, line, s) -} - -func Run(t Failer, f func(r *R)) { - run(DefaultFailer(), t, f) -} - -func RunWith(r Retryer, t Failer, f func(r *R)) { - run(r, t, f) -} - -func dedup(a []string) string { - if len(a) == 0 { - return "" - } - m := map[string]int{} - for _, s := range a { - m[s] = m[s] + 1 - } - var b bytes.Buffer - for _, s := range a { - if _, ok := m[s]; ok { - b.WriteString(s) - b.WriteRune('\n') - delete(m, s) - } - } - return b.String() -} - -func run(r Retryer, t Failer, f func(r *R)) { - rr := &R{} - fail := func() { - out := dedup(rr.output) - if out != "" { - t.Log(out) - } - t.FailNow() - } - for r.NextOr(fail) { - var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - f(rr) - }() - wg.Wait() - if rr.fail { - rr.fail = false - continue - } - break - } -} - -// DefaultFailer provides default retry.Run() behavior for unit tests. -func DefaultFailer() *Timer { - return &Timer{Timeout: 7 * time.Second, Wait: 25 * time.Millisecond} -} - -// TwoSeconds repeats an operation for two seconds and waits 25ms in between. -func TwoSeconds() *Timer { - return &Timer{Timeout: 2 * time.Second, Wait: 25 * time.Millisecond} -} - -// ThreeTimes repeats an operation three times and waits 25ms in between. -func ThreeTimes() *Counter { - return &Counter{Count: 3, Wait: 25 * time.Millisecond} -} - -// Retryer provides an interface for repeating operations -// until they succeed or an exit condition is met. -type Retryer interface { - // NextOr returns true if the operation should be repeated. - // Otherwise, it calls fail and returns false. - NextOr(fail func()) bool -} - -// Counter repeats an operation a given number of -// times and waits between subsequent operations. -type Counter struct { - Count int - Wait time.Duration - - count int -} - -func (r *Counter) NextOr(fail func()) bool { - if r.count == r.Count { - fail() - return false - } - if r.count > 0 { - time.Sleep(r.Wait) - } - r.count++ - return true -} - -// Timer repeats an operation for a given amount -// of time and waits between subsequent operations. -type Timer struct { - Timeout time.Duration - Wait time.Duration - - // stop is the timeout deadline. - // Set on the first invocation of Next(). - stop time.Time -} - -func (r *Timer) NextOr(fail func()) bool { - if r.stop.IsZero() { - r.stop = time.Now().Add(r.Timeout) - return true - } - if time.Now().After(r.stop) { - fail() - return false - } - time.Sleep(r.Wait) - return true -} - -// delta defines the time band a test run should complete in. -var delta = 25 * time.Millisecond - -func TestRetryer(t *testing.T) { - tests := []struct { - desc string - r Retryer - }{ - {"counter", &Counter{Count: 3, Wait: 100 * time.Millisecond}}, - {"timer", &Timer{Timeout: 200 * time.Millisecond, Wait: 100 * time.Millisecond}}, - } - - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - var iters, fails int - fail := func() { fails++ } - start := time.Now() - for tt.r.NextOr(fail) { - iters++ - } - dur := time.Since(start) - if got, want := iters, 3; got != want { - t.Fatalf("got %d retries want %d", got, want) - } - if got, want := fails, 1; got != want { - t.Fatalf("got %d FailNow calls want %d", got, want) - } - // since the first iteration happens immediately - // the retryer waits only twice for three iterations. - // order of events: (true, (wait) true, (wait) true, false) - if got, want := dur, 200*time.Millisecond; got < (want-delta) || got > (want+delta) { - t.Fatalf("loop took %v want %v (+/- %v)", got, want, delta) - } - }) - } -} - -func TestMemberlist_LocalNode(t *testing.T) { - m, err := memberlist.Create(memberlist.DefaultWANConfig()) - require.NoError(t, err) - defer m.Shutdown() - require.NotNil(t, m.LocalNode()) -} - -func TestMemberlist_SendBestEffort(t *testing.T) { - m := GetMemberlist(t, nil) - defer m.Shutdown() - err := m.SendBestEffort(&memberlist.Node{ - Name: "testNode", - Addr: "127.0.0.1", - Port: 7946, - }, []byte("test message")) - require.NoError(t, err) -} - -// userMsgHeader is used to encapsulate a userMsg -type userMsgHeader struct { - UserMsgLen int // Encodes the byte lengh of user state -} - -func TestMemberlist_SendReliable(t *testing.T) { - node := &memberlist.Node{ - Name: "testNode", - Addr: "127.0.0.1", - Port: 7946, - } - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - //bufConn := bytes.NewBuffer(nil) - //err := bufConn.WriteByte(byte(8)) - //require.NoError(t, err) - // - //msg := []byte("test message") - //header := userMsgHeader{UserMsgLen: len(msg)} - //hd := codec.MsgpackHandle{} - //enc := codec.NewEncoder(bufConn, &hd) - //err = enc.Encode(&header) - //require.NoError(t, err) - //_, err = bufConn.Write(msg) - //require.NoError(t, err) - - conn := memmock.NewMockConn(ctrl) - conn. - EXPECT(). - Write(gomock.Any()). - AnyTimes(). - Return(26, nil) - conn. - EXPECT(). - Close(). - AnyTimes(). - Return(nil) - - nat := memmock.NewMockNodeAwareTransport(ctrl) - nat. - EXPECT(). - DialAddressTimeout(node.FullAddress(), gomock.Any()). - AnyTimes(). - Return(conn, nil) - nat. - EXPECT(). - FinalAdvertiseAddr(gomock.Any(), gomock.Any()). - AnyTimes(). - Return("localhost", 7946, nil) - nat. - EXPECT(). - PacketCh(). - AnyTimes(). - Return(make(chan *memberlist.Packet)) - nat. - EXPECT(). - StreamCh(). - AnyTimes(). - Return(make(<-chan net.Conn)) - nat. - EXPECT(). - Shutdown(). - AnyTimes(). - Return(nil) - - m := GetMemberlist(t, func(c *memberlist.Config) { - c.Transport = nat - c.EnableCompression = false - }) - defer m.Shutdown() - err := m.SendReliable(node, []byte("test message")) - require.NoError(t, err) -} - -func TestMemberlist_SendReliable_Fail(t *testing.T) { - m := GetMemberlist(t, nil) - defer m.Shutdown() - err := m.SendReliable(&memberlist.Node{ - Name: "testNode", - Addr: "127.0.0.1", - Port: 7946, - }, []byte("test message")) - require.Error(t, err) -} - -func TestMemberlist_SendReliable_Fail2(t *testing.T) { - node := &memberlist.Node{ - Name: "testNode", - Addr: "127.0.0.1", - Port: 7946, - } - ctrl := gomock.NewController(t) - defer ctrl.Finish() - conn := memmock.NewMockConn(ctrl) - conn. - EXPECT(). - Write(gomock.Any()). - AnyTimes(). - Return(12, nil) - conn. - EXPECT(). - Close(). - AnyTimes(). - Return(nil) - - nat := memmock.NewMockNodeAwareTransport(ctrl) - nat. - EXPECT(). - DialAddressTimeout(node.FullAddress(), gomock.Any()). - AnyTimes(). - Return(conn, nil) - nat. - EXPECT(). - FinalAdvertiseAddr(gomock.Any(), gomock.Any()). - AnyTimes(). - Return("localhost", 7946, nil) - nat. - EXPECT(). - PacketCh(). - AnyTimes(). - Return(make(chan *memberlist.Packet)) - nat. - EXPECT(). - StreamCh(). - AnyTimes(). - Return(make(<-chan net.Conn)) - nat. - EXPECT(). - Shutdown(). - AnyTimes(). - Return(nil) - - m := GetMemberlist(t, func(c *memberlist.Config) { - c.Transport = nat - }) - defer m.Shutdown() - - err := m.SendReliable(node, []byte("test message")) - require.Error(t, err) -} diff --git a/toolkit/memberlist/merge_delegate.go b/toolkit/memberlist/merge_delegate.go deleted file mode 100644 index 89afb59f..00000000 --- a/toolkit/memberlist/merge_delegate.go +++ /dev/null @@ -1,14 +0,0 @@ -package memberlist - -// MergeDelegate is used to involve a client in -// a potential cluster merge operation. Namely, when -// a node does a TCP push/pull (as part of a join), -// the delegate is involved and allowed to cancel the join -// based on custom logic. The merge delegate is NOT invoked -// as part of the push-pull anti-entropy. -type MergeDelegate interface { - // NotifyMerge is invoked when a merge could take place. - // Provides a list of the nodes known by the peer. If - // the return value is non-nil, the merge is canceled. - NotifyMerge(peers []*Node) error -} diff --git a/toolkit/memberlist/mock/mock_dns_client_interface.go b/toolkit/memberlist/mock/mock_dns_client_interface.go deleted file mode 100644 index 9c60b4dd..00000000 --- a/toolkit/memberlist/mock/mock_dns_client_interface.go +++ /dev/null @@ -1,52 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./dns_client_interface.go - -// Package mock is a generated GoMock package. -package mock - -import ( - reflect "reflect" - time "time" - - gomock "github.com/golang/mock/gomock" - dns "github.com/miekg/dns" -) - -// MockIDNSClient is a mock of IDNSClient interface. -type MockIDNSClient struct { - ctrl *gomock.Controller - recorder *MockIDNSClientMockRecorder -} - -// MockIDNSClientMockRecorder is the mock recorder for MockIDNSClient. -type MockIDNSClientMockRecorder struct { - mock *MockIDNSClient -} - -// NewMockIDNSClient creates a new mock instance. -func NewMockIDNSClient(ctrl *gomock.Controller) *MockIDNSClient { - mock := &MockIDNSClient{ctrl: ctrl} - mock.recorder = &MockIDNSClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockIDNSClient) EXPECT() *MockIDNSClientMockRecorder { - return m.recorder -} - -// Exchange mocks base method. -func (m_2 *MockIDNSClient) Exchange(m *dns.Msg, address string) (*dns.Msg, time.Duration, error) { - m_2.ctrl.T.Helper() - ret := m_2.ctrl.Call(m_2, "Exchange", m, address) - ret0, _ := ret[0].(*dns.Msg) - ret1, _ := ret[1].(time.Duration) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// Exchange indicates an expected call of Exchange. -func (mr *MockIDNSClientMockRecorder) Exchange(m, address interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Exchange", reflect.TypeOf((*MockIDNSClient)(nil).Exchange), m, address) -} diff --git a/toolkit/memberlist/mock/mock_memberlist_interface.go b/toolkit/memberlist/mock/mock_memberlist_interface.go deleted file mode 100644 index 09988edb..00000000 --- a/toolkit/memberlist/mock/mock_memberlist_interface.go +++ /dev/null @@ -1,249 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./memberlist_interface.go - -// Package mock is a generated GoMock package. -package mock - -import ( - net "net" - reflect "reflect" - time "time" - - gomock "github.com/golang/mock/gomock" - memberlist "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" -) - -// MockIMemberlist is a mock of IMemberlist interface. -type MockIMemberlist struct { - ctrl *gomock.Controller - recorder *MockIMemberlistMockRecorder -} - -// MockIMemberlistMockRecorder is the mock recorder for MockIMemberlist. -type MockIMemberlistMockRecorder struct { - mock *MockIMemberlist -} - -// NewMockIMemberlist creates a new mock instance. -func NewMockIMemberlist(ctrl *gomock.Controller) *MockIMemberlist { - mock := &MockIMemberlist{ctrl: ctrl} - mock.recorder = &MockIMemberlistMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockIMemberlist) EXPECT() *MockIMemberlistMockRecorder { - return m.recorder -} - -// AdvertiseAddr mocks base method. -func (m *MockIMemberlist) AdvertiseAddr() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AdvertiseAddr") - ret0, _ := ret[0].(string) - return ret0 -} - -// AdvertiseAddr indicates an expected call of AdvertiseAddr. -func (mr *MockIMemberlistMockRecorder) AdvertiseAddr() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AdvertiseAddr", reflect.TypeOf((*MockIMemberlist)(nil).AdvertiseAddr)) -} - -// Config mocks base method. -func (m *MockIMemberlist) Config() *memberlist.Config { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Config") - ret0, _ := ret[0].(*memberlist.Config) - return ret0 -} - -// Config indicates an expected call of Config. -func (mr *MockIMemberlistMockRecorder) Config() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Config", reflect.TypeOf((*MockIMemberlist)(nil).Config)) -} - -// GetHealthScore mocks base method. -func (m *MockIMemberlist) GetHealthScore() int { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetHealthScore") - ret0, _ := ret[0].(int) - return ret0 -} - -// GetHealthScore indicates an expected call of GetHealthScore. -func (mr *MockIMemberlistMockRecorder) GetHealthScore() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetHealthScore", reflect.TypeOf((*MockIMemberlist)(nil).GetHealthScore)) -} - -// Join mocks base method. -func (m *MockIMemberlist) Join(existing []string) (int, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Join", existing) - ret0, _ := ret[0].(int) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Join indicates an expected call of Join. -func (mr *MockIMemberlistMockRecorder) Join(existing interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Join", reflect.TypeOf((*MockIMemberlist)(nil).Join), existing) -} - -// Leave mocks base method. -func (m *MockIMemberlist) Leave(timeout time.Duration) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Leave", timeout) - ret0, _ := ret[0].(error) - return ret0 -} - -// Leave indicates an expected call of Leave. -func (mr *MockIMemberlistMockRecorder) Leave(timeout interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Leave", reflect.TypeOf((*MockIMemberlist)(nil).Leave), timeout) -} - -// LocalNode mocks base method. -func (m *MockIMemberlist) LocalNode() *memberlist.Node { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LocalNode") - ret0, _ := ret[0].(*memberlist.Node) - return ret0 -} - -// LocalNode indicates an expected call of LocalNode. -func (mr *MockIMemberlistMockRecorder) LocalNode() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalNode", reflect.TypeOf((*MockIMemberlist)(nil).LocalNode)) -} - -// Members mocks base method. -func (m *MockIMemberlist) Members() []*memberlist.Node { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Members") - ret0, _ := ret[0].([]*memberlist.Node) - return ret0 -} - -// Members indicates an expected call of Members. -func (mr *MockIMemberlistMockRecorder) Members() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Members", reflect.TypeOf((*MockIMemberlist)(nil).Members)) -} - -// NumMembers mocks base method. -func (m *MockIMemberlist) NumMembers() int { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NumMembers") - ret0, _ := ret[0].(int) - return ret0 -} - -// NumMembers indicates an expected call of NumMembers. -func (mr *MockIMemberlistMockRecorder) NumMembers() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumMembers", reflect.TypeOf((*MockIMemberlist)(nil).NumMembers)) -} - -// Ping mocks base method. -func (m *MockIMemberlist) Ping(node string, addr net.Addr) (time.Duration, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Ping", node, addr) - ret0, _ := ret[0].(time.Duration) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Ping indicates an expected call of Ping. -func (mr *MockIMemberlistMockRecorder) Ping(node, addr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ping", reflect.TypeOf((*MockIMemberlist)(nil).Ping), node, addr) -} - -// ProtocolVersion mocks base method. -func (m *MockIMemberlist) ProtocolVersion() uint8 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ProtocolVersion") - ret0, _ := ret[0].(uint8) - return ret0 -} - -// ProtocolVersion indicates an expected call of ProtocolVersion. -func (mr *MockIMemberlistMockRecorder) ProtocolVersion() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProtocolVersion", reflect.TypeOf((*MockIMemberlist)(nil).ProtocolVersion)) -} - -// SendBestEffort mocks base method. -func (m *MockIMemberlist) SendBestEffort(to *memberlist.Node, msg []byte) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendBestEffort", to, msg) - ret0, _ := ret[0].(error) - return ret0 -} - -// SendBestEffort indicates an expected call of SendBestEffort. -func (mr *MockIMemberlistMockRecorder) SendBestEffort(to, msg interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendBestEffort", reflect.TypeOf((*MockIMemberlist)(nil).SendBestEffort), to, msg) -} - -// SendReliable mocks base method. -func (m *MockIMemberlist) SendReliable(to *memberlist.Node, msg []byte) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendReliable", to, msg) - ret0, _ := ret[0].(error) - return ret0 -} - -// SendReliable indicates an expected call of SendReliable. -func (mr *MockIMemberlistMockRecorder) SendReliable(to, msg interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendReliable", reflect.TypeOf((*MockIMemberlist)(nil).SendReliable), to, msg) -} - -// SendToAddress mocks base method. -func (m *MockIMemberlist) SendToAddress(a memberlist.Address, msg []byte) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendToAddress", a, msg) - ret0, _ := ret[0].(error) - return ret0 -} - -// SendToAddress indicates an expected call of SendToAddress. -func (mr *MockIMemberlistMockRecorder) SendToAddress(a, msg interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendToAddress", reflect.TypeOf((*MockIMemberlist)(nil).SendToAddress), a, msg) -} - -// Shutdown mocks base method. -func (m *MockIMemberlist) Shutdown() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Shutdown") - ret0, _ := ret[0].(error) - return ret0 -} - -// Shutdown indicates an expected call of Shutdown. -func (mr *MockIMemberlistMockRecorder) Shutdown() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockIMemberlist)(nil).Shutdown)) -} - -// UpdateNode mocks base method. -func (m *MockIMemberlist) UpdateNode(timeout time.Duration) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateNode", timeout) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateNode indicates an expected call of UpdateNode. -func (mr *MockIMemberlistMockRecorder) UpdateNode(timeout interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateNode", reflect.TypeOf((*MockIMemberlist)(nil).UpdateNode), timeout) -} diff --git a/toolkit/memberlist/mock/mock_net_conn_interface.go b/toolkit/memberlist/mock/mock_net_conn_interface.go deleted file mode 100644 index be57dfb3..00000000 --- a/toolkit/memberlist/mock/mock_net_conn_interface.go +++ /dev/null @@ -1,150 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./net_conn_interface.go - -// Package mock is a generated GoMock package. -package mock - -import ( - net "net" - reflect "reflect" - time "time" - - gomock "github.com/golang/mock/gomock" -) - -// MockConn is a mock of Conn interface. -type MockConn struct { - ctrl *gomock.Controller - recorder *MockConnMockRecorder -} - -// MockConnMockRecorder is the mock recorder for MockConn. -type MockConnMockRecorder struct { - mock *MockConn -} - -// NewMockConn creates a new mock instance. -func NewMockConn(ctrl *gomock.Controller) *MockConn { - mock := &MockConn{ctrl: ctrl} - mock.recorder = &MockConnMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockConn) EXPECT() *MockConnMockRecorder { - return m.recorder -} - -// Close mocks base method. -func (m *MockConn) Close() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Close") - ret0, _ := ret[0].(error) - return ret0 -} - -// Close indicates an expected call of Close. -func (mr *MockConnMockRecorder) Close() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockConn)(nil).Close)) -} - -// LocalAddr mocks base method. -func (m *MockConn) LocalAddr() net.Addr { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LocalAddr") - ret0, _ := ret[0].(net.Addr) - return ret0 -} - -// LocalAddr indicates an expected call of LocalAddr. -func (mr *MockConnMockRecorder) LocalAddr() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalAddr", reflect.TypeOf((*MockConn)(nil).LocalAddr)) -} - -// Read mocks base method. -func (m *MockConn) Read(b []byte) (int, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Read", b) - ret0, _ := ret[0].(int) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Read indicates an expected call of Read. -func (mr *MockConnMockRecorder) Read(b interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*MockConn)(nil).Read), b) -} - -// RemoteAddr mocks base method. -func (m *MockConn) RemoteAddr() net.Addr { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RemoteAddr") - ret0, _ := ret[0].(net.Addr) - return ret0 -} - -// RemoteAddr indicates an expected call of RemoteAddr. -func (mr *MockConnMockRecorder) RemoteAddr() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoteAddr", reflect.TypeOf((*MockConn)(nil).RemoteAddr)) -} - -// SetDeadline mocks base method. -func (m *MockConn) SetDeadline(t time.Time) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetDeadline", t) - ret0, _ := ret[0].(error) - return ret0 -} - -// SetDeadline indicates an expected call of SetDeadline. -func (mr *MockConnMockRecorder) SetDeadline(t interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDeadline", reflect.TypeOf((*MockConn)(nil).SetDeadline), t) -} - -// SetReadDeadline mocks base method. -func (m *MockConn) SetReadDeadline(t time.Time) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetReadDeadline", t) - ret0, _ := ret[0].(error) - return ret0 -} - -// SetReadDeadline indicates an expected call of SetReadDeadline. -func (mr *MockConnMockRecorder) SetReadDeadline(t interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetReadDeadline", reflect.TypeOf((*MockConn)(nil).SetReadDeadline), t) -} - -// SetWriteDeadline mocks base method. -func (m *MockConn) SetWriteDeadline(t time.Time) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetWriteDeadline", t) - ret0, _ := ret[0].(error) - return ret0 -} - -// SetWriteDeadline indicates an expected call of SetWriteDeadline. -func (mr *MockConnMockRecorder) SetWriteDeadline(t interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteDeadline", reflect.TypeOf((*MockConn)(nil).SetWriteDeadline), t) -} - -// Write mocks base method. -func (m *MockConn) Write(b []byte) (int, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Write", b) - ret0, _ := ret[0].(int) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Write indicates an expected call of Write. -func (mr *MockConnMockRecorder) Write(b interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockConn)(nil).Write), b) -} diff --git a/toolkit/memberlist/mock/mock_queue.go b/toolkit/memberlist/mock/mock_queue.go deleted file mode 100644 index 8461efc2..00000000 --- a/toolkit/memberlist/mock/mock_queue.go +++ /dev/null @@ -1,227 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./queue.go - -// Package mock is a generated GoMock package. -package mock - -import ( - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - memberlist "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" -) - -// MockBroadcast is a mock of Broadcast interface. -type MockBroadcast struct { - ctrl *gomock.Controller - recorder *MockBroadcastMockRecorder -} - -// MockBroadcastMockRecorder is the mock recorder for MockBroadcast. -type MockBroadcastMockRecorder struct { - mock *MockBroadcast -} - -// NewMockBroadcast creates a new mock instance. -func NewMockBroadcast(ctrl *gomock.Controller) *MockBroadcast { - mock := &MockBroadcast{ctrl: ctrl} - mock.recorder = &MockBroadcastMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBroadcast) EXPECT() *MockBroadcastMockRecorder { - return m.recorder -} - -// Finished mocks base method. -func (m *MockBroadcast) Finished() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Finished") -} - -// Finished indicates an expected call of Finished. -func (mr *MockBroadcastMockRecorder) Finished() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finished", reflect.TypeOf((*MockBroadcast)(nil).Finished)) -} - -// Invalidates mocks base method. -func (m *MockBroadcast) Invalidates(b memberlist.Broadcast) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Invalidates", b) - ret0, _ := ret[0].(bool) - return ret0 -} - -// Invalidates indicates an expected call of Invalidates. -func (mr *MockBroadcastMockRecorder) Invalidates(b interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invalidates", reflect.TypeOf((*MockBroadcast)(nil).Invalidates), b) -} - -// Message mocks base method. -func (m *MockBroadcast) Message() []byte { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Message") - ret0, _ := ret[0].([]byte) - return ret0 -} - -// Message indicates an expected call of Message. -func (mr *MockBroadcastMockRecorder) Message() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Message", reflect.TypeOf((*MockBroadcast)(nil).Message)) -} - -// MockNamedBroadcast is a mock of NamedBroadcast interface. -type MockNamedBroadcast struct { - ctrl *gomock.Controller - recorder *MockNamedBroadcastMockRecorder -} - -// MockNamedBroadcastMockRecorder is the mock recorder for MockNamedBroadcast. -type MockNamedBroadcastMockRecorder struct { - mock *MockNamedBroadcast -} - -// NewMockNamedBroadcast creates a new mock instance. -func NewMockNamedBroadcast(ctrl *gomock.Controller) *MockNamedBroadcast { - mock := &MockNamedBroadcast{ctrl: ctrl} - mock.recorder = &MockNamedBroadcastMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockNamedBroadcast) EXPECT() *MockNamedBroadcastMockRecorder { - return m.recorder -} - -// Finished mocks base method. -func (m *MockNamedBroadcast) Finished() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Finished") -} - -// Finished indicates an expected call of Finished. -func (mr *MockNamedBroadcastMockRecorder) Finished() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finished", reflect.TypeOf((*MockNamedBroadcast)(nil).Finished)) -} - -// Invalidates mocks base method. -func (m *MockNamedBroadcast) Invalidates(b memberlist.Broadcast) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Invalidates", b) - ret0, _ := ret[0].(bool) - return ret0 -} - -// Invalidates indicates an expected call of Invalidates. -func (mr *MockNamedBroadcastMockRecorder) Invalidates(b interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invalidates", reflect.TypeOf((*MockNamedBroadcast)(nil).Invalidates), b) -} - -// Message mocks base method. -func (m *MockNamedBroadcast) Message() []byte { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Message") - ret0, _ := ret[0].([]byte) - return ret0 -} - -// Message indicates an expected call of Message. -func (mr *MockNamedBroadcastMockRecorder) Message() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Message", reflect.TypeOf((*MockNamedBroadcast)(nil).Message)) -} - -// Name mocks base method. -func (m *MockNamedBroadcast) Name() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Name") - ret0, _ := ret[0].(string) - return ret0 -} - -// Name indicates an expected call of Name. -func (mr *MockNamedBroadcastMockRecorder) Name() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockNamedBroadcast)(nil).Name)) -} - -// MockUniqueBroadcast is a mock of UniqueBroadcast interface. -type MockUniqueBroadcast struct { - ctrl *gomock.Controller - recorder *MockUniqueBroadcastMockRecorder -} - -// MockUniqueBroadcastMockRecorder is the mock recorder for MockUniqueBroadcast. -type MockUniqueBroadcastMockRecorder struct { - mock *MockUniqueBroadcast -} - -// NewMockUniqueBroadcast creates a new mock instance. -func NewMockUniqueBroadcast(ctrl *gomock.Controller) *MockUniqueBroadcast { - mock := &MockUniqueBroadcast{ctrl: ctrl} - mock.recorder = &MockUniqueBroadcastMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockUniqueBroadcast) EXPECT() *MockUniqueBroadcastMockRecorder { - return m.recorder -} - -// Finished mocks base method. -func (m *MockUniqueBroadcast) Finished() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Finished") -} - -// Finished indicates an expected call of Finished. -func (mr *MockUniqueBroadcastMockRecorder) Finished() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Finished", reflect.TypeOf((*MockUniqueBroadcast)(nil).Finished)) -} - -// Invalidates mocks base method. -func (m *MockUniqueBroadcast) Invalidates(b memberlist.Broadcast) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Invalidates", b) - ret0, _ := ret[0].(bool) - return ret0 -} - -// Invalidates indicates an expected call of Invalidates. -func (mr *MockUniqueBroadcastMockRecorder) Invalidates(b interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invalidates", reflect.TypeOf((*MockUniqueBroadcast)(nil).Invalidates), b) -} - -// Message mocks base method. -func (m *MockUniqueBroadcast) Message() []byte { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Message") - ret0, _ := ret[0].([]byte) - return ret0 -} - -// Message indicates an expected call of Message. -func (mr *MockUniqueBroadcastMockRecorder) Message() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Message", reflect.TypeOf((*MockUniqueBroadcast)(nil).Message)) -} - -// UniqueBroadcast mocks base method. -func (m *MockUniqueBroadcast) UniqueBroadcast() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "UniqueBroadcast") -} - -// UniqueBroadcast indicates an expected call of UniqueBroadcast. -func (mr *MockUniqueBroadcastMockRecorder) UniqueBroadcast() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UniqueBroadcast", reflect.TypeOf((*MockUniqueBroadcast)(nil).UniqueBroadcast)) -} diff --git a/toolkit/memberlist/mock/mock_transport.go b/toolkit/memberlist/mock/mock_transport.go deleted file mode 100644 index cb4c3f6b..00000000 --- a/toolkit/memberlist/mock/mock_transport.go +++ /dev/null @@ -1,317 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./transport.go - -// Package mock is a generated GoMock package. -package mock - -import ( - net "net" - reflect "reflect" - time "time" - - gomock "github.com/golang/mock/gomock" - memberlist "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" -) - -// MockTransport is a mock of Transport interface. -type MockTransport struct { - ctrl *gomock.Controller - recorder *MockTransportMockRecorder -} - -// MockTransportMockRecorder is the mock recorder for MockTransport. -type MockTransportMockRecorder struct { - mock *MockTransport -} - -// NewMockTransport creates a new mock instance. -func NewMockTransport(ctrl *gomock.Controller) *MockTransport { - mock := &MockTransport{ctrl: ctrl} - mock.recorder = &MockTransportMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockTransport) EXPECT() *MockTransportMockRecorder { - return m.recorder -} - -// DialTimeout mocks base method. -func (m *MockTransport) DialTimeout(addr string, timeout time.Duration) (net.Conn, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DialTimeout", addr, timeout) - ret0, _ := ret[0].(net.Conn) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DialTimeout indicates an expected call of DialTimeout. -func (mr *MockTransportMockRecorder) DialTimeout(addr, timeout interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DialTimeout", reflect.TypeOf((*MockTransport)(nil).DialTimeout), addr, timeout) -} - -// FinalAdvertiseAddr mocks base method. -func (m *MockTransport) FinalAdvertiseAddr(ip string, port int) (string, int, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FinalAdvertiseAddr", ip, port) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(int) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// FinalAdvertiseAddr indicates an expected call of FinalAdvertiseAddr. -func (mr *MockTransportMockRecorder) FinalAdvertiseAddr(ip, port interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalAdvertiseAddr", reflect.TypeOf((*MockTransport)(nil).FinalAdvertiseAddr), ip, port) -} - -// PacketCh mocks base method. -func (m *MockTransport) PacketCh() <-chan *memberlist.Packet { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PacketCh") - ret0, _ := ret[0].(<-chan *memberlist.Packet) - return ret0 -} - -// PacketCh indicates an expected call of PacketCh. -func (mr *MockTransportMockRecorder) PacketCh() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PacketCh", reflect.TypeOf((*MockTransport)(nil).PacketCh)) -} - -// Shutdown mocks base method. -func (m *MockTransport) Shutdown() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Shutdown") - ret0, _ := ret[0].(error) - return ret0 -} - -// Shutdown indicates an expected call of Shutdown. -func (mr *MockTransportMockRecorder) Shutdown() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockTransport)(nil).Shutdown)) -} - -// StreamCh mocks base method. -func (m *MockTransport) StreamCh() <-chan net.Conn { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StreamCh") - ret0, _ := ret[0].(<-chan net.Conn) - return ret0 -} - -// StreamCh indicates an expected call of StreamCh. -func (mr *MockTransportMockRecorder) StreamCh() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StreamCh", reflect.TypeOf((*MockTransport)(nil).StreamCh)) -} - -// WriteTo mocks base method. -func (m *MockTransport) WriteTo(b []byte, addr string) (time.Time, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteTo", b, addr) - ret0, _ := ret[0].(time.Time) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// WriteTo indicates an expected call of WriteTo. -func (mr *MockTransportMockRecorder) WriteTo(b, addr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTo", reflect.TypeOf((*MockTransport)(nil).WriteTo), b, addr) -} - -// MockIngestionAwareTransport is a mock of IngestionAwareTransport interface. -type MockIngestionAwareTransport struct { - ctrl *gomock.Controller - recorder *MockIngestionAwareTransportMockRecorder -} - -// MockIngestionAwareTransportMockRecorder is the mock recorder for MockIngestionAwareTransport. -type MockIngestionAwareTransportMockRecorder struct { - mock *MockIngestionAwareTransport -} - -// NewMockIngestionAwareTransport creates a new mock instance. -func NewMockIngestionAwareTransport(ctrl *gomock.Controller) *MockIngestionAwareTransport { - mock := &MockIngestionAwareTransport{ctrl: ctrl} - mock.recorder = &MockIngestionAwareTransportMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockIngestionAwareTransport) EXPECT() *MockIngestionAwareTransportMockRecorder { - return m.recorder -} - -// IngestPacket mocks base method. -func (m *MockIngestionAwareTransport) IngestPacket(conn net.Conn, addr net.Addr, now time.Time, shouldClose bool) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IngestPacket", conn, addr, now, shouldClose) - ret0, _ := ret[0].(error) - return ret0 -} - -// IngestPacket indicates an expected call of IngestPacket. -func (mr *MockIngestionAwareTransportMockRecorder) IngestPacket(conn, addr, now, shouldClose interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IngestPacket", reflect.TypeOf((*MockIngestionAwareTransport)(nil).IngestPacket), conn, addr, now, shouldClose) -} - -// IngestStream mocks base method. -func (m *MockIngestionAwareTransport) IngestStream(conn net.Conn) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IngestStream", conn) - ret0, _ := ret[0].(error) - return ret0 -} - -// IngestStream indicates an expected call of IngestStream. -func (mr *MockIngestionAwareTransportMockRecorder) IngestStream(conn interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IngestStream", reflect.TypeOf((*MockIngestionAwareTransport)(nil).IngestStream), conn) -} - -// MockNodeAwareTransport is a mock of NodeAwareTransport interface. -type MockNodeAwareTransport struct { - ctrl *gomock.Controller - recorder *MockNodeAwareTransportMockRecorder -} - -// MockNodeAwareTransportMockRecorder is the mock recorder for MockNodeAwareTransport. -type MockNodeAwareTransportMockRecorder struct { - mock *MockNodeAwareTransport -} - -// NewMockNodeAwareTransport creates a new mock instance. -func NewMockNodeAwareTransport(ctrl *gomock.Controller) *MockNodeAwareTransport { - mock := &MockNodeAwareTransport{ctrl: ctrl} - mock.recorder = &MockNodeAwareTransportMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockNodeAwareTransport) EXPECT() *MockNodeAwareTransportMockRecorder { - return m.recorder -} - -// DialAddressTimeout mocks base method. -func (m *MockNodeAwareTransport) DialAddressTimeout(addr memberlist.Address, timeout time.Duration) (net.Conn, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DialAddressTimeout", addr, timeout) - ret0, _ := ret[0].(net.Conn) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DialAddressTimeout indicates an expected call of DialAddressTimeout. -func (mr *MockNodeAwareTransportMockRecorder) DialAddressTimeout(addr, timeout interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DialAddressTimeout", reflect.TypeOf((*MockNodeAwareTransport)(nil).DialAddressTimeout), addr, timeout) -} - -// DialTimeout mocks base method. -func (m *MockNodeAwareTransport) DialTimeout(addr string, timeout time.Duration) (net.Conn, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DialTimeout", addr, timeout) - ret0, _ := ret[0].(net.Conn) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DialTimeout indicates an expected call of DialTimeout. -func (mr *MockNodeAwareTransportMockRecorder) DialTimeout(addr, timeout interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DialTimeout", reflect.TypeOf((*MockNodeAwareTransport)(nil).DialTimeout), addr, timeout) -} - -// FinalAdvertiseAddr mocks base method. -func (m *MockNodeAwareTransport) FinalAdvertiseAddr(ip string, port int) (string, int, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FinalAdvertiseAddr", ip, port) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(int) - ret2, _ := ret[2].(error) - return ret0, ret1, ret2 -} - -// FinalAdvertiseAddr indicates an expected call of FinalAdvertiseAddr. -func (mr *MockNodeAwareTransportMockRecorder) FinalAdvertiseAddr(ip, port interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FinalAdvertiseAddr", reflect.TypeOf((*MockNodeAwareTransport)(nil).FinalAdvertiseAddr), ip, port) -} - -// PacketCh mocks base method. -func (m *MockNodeAwareTransport) PacketCh() <-chan *memberlist.Packet { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PacketCh") - ret0, _ := ret[0].(<-chan *memberlist.Packet) - return ret0 -} - -// PacketCh indicates an expected call of PacketCh. -func (mr *MockNodeAwareTransportMockRecorder) PacketCh() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PacketCh", reflect.TypeOf((*MockNodeAwareTransport)(nil).PacketCh)) -} - -// Shutdown mocks base method. -func (m *MockNodeAwareTransport) Shutdown() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Shutdown") - ret0, _ := ret[0].(error) - return ret0 -} - -// Shutdown indicates an expected call of Shutdown. -func (mr *MockNodeAwareTransportMockRecorder) Shutdown() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockNodeAwareTransport)(nil).Shutdown)) -} - -// StreamCh mocks base method. -func (m *MockNodeAwareTransport) StreamCh() <-chan net.Conn { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StreamCh") - ret0, _ := ret[0].(<-chan net.Conn) - return ret0 -} - -// StreamCh indicates an expected call of StreamCh. -func (mr *MockNodeAwareTransportMockRecorder) StreamCh() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StreamCh", reflect.TypeOf((*MockNodeAwareTransport)(nil).StreamCh)) -} - -// WriteTo mocks base method. -func (m *MockNodeAwareTransport) WriteTo(b []byte, addr string) (time.Time, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteTo", b, addr) - ret0, _ := ret[0].(time.Time) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// WriteTo indicates an expected call of WriteTo. -func (mr *MockNodeAwareTransportMockRecorder) WriteTo(b, addr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteTo", reflect.TypeOf((*MockNodeAwareTransport)(nil).WriteTo), b, addr) -} - -// WriteToAddress mocks base method. -func (m *MockNodeAwareTransport) WriteToAddress(b []byte, addr memberlist.Address) (time.Time, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "WriteToAddress", b, addr) - ret0, _ := ret[0].(time.Time) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// WriteToAddress indicates an expected call of WriteToAddress. -func (mr *MockNodeAwareTransportMockRecorder) WriteToAddress(b, addr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteToAddress", reflect.TypeOf((*MockNodeAwareTransport)(nil).WriteToAddress), b, addr) -} diff --git a/toolkit/memberlist/net.go b/toolkit/memberlist/net.go deleted file mode 100644 index 2011aac5..00000000 --- a/toolkit/memberlist/net.go +++ /dev/null @@ -1,1345 +0,0 @@ -package memberlist - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "hash/crc32" - "io" - "net" - "sync/atomic" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - - metrics "github.com/armon/go-metrics" - "github.com/hashicorp/go-msgpack/codec" -) - -// This is the minimum and maximum protocol version that we can -// _understand_. We're allowed to speak at any version within this -// range. This range is inclusive. -const ( - ProtocolVersionMin uint8 = 1 - - // Version 3 added support for TCP pings but we kept the default - // protocol version at 2 to ease transition to this new feature. - // A memberlist speaking version 2 of the protocol will attempt - // to TCP ping another memberlist who understands version 3 or - // greater. - // - // Version 4 added support for nacks as part of indirect probes. - // A memberlist speaking version 2 of the protocol will expect - // nacks from another memberlist who understands version 4 or - // greater, and likewise nacks will be sent to memberlists who - // understand version 4 or greater. - ProtocolVersion2Compatible = 2 - - ProtocolVersionMax = 5 -) - -// messageType is an integer ID of a type of message that can be received -// on network channels from other members. -type messageType uint8 - -// The list of available message types. -const ( - pingMsg messageType = iota - indirectPingMsg - ackRespMsg - suspectMsg - aliveMsg - deadMsg - pushPullMsg - compoundMsg - userMsg // User message, not handled by us - compressMsg - encryptMsg - nackRespMsg - hasCrcMsg - errMsg - weightMsg -) - -// compressionType is used to specify the compression algorithm -type compressionType uint8 - -const ( - lzwAlgo compressionType = iota -) - -const ( - MetaMaxSize = 512 // Maximum size for node meta data - compoundHeaderOverhead = 2 // Assumed header overhead - compoundOverhead = 2 // Assumed overhead per entry in compoundHeader - userMsgOverhead = 1 - weightMsgOverhead = 1 - blockingWarning = 10 * time.Millisecond // Warn if a UDP packet takes this long to process - maxPushStateBytes = 20 * 1024 * 1024 - maxPushPullRequests = 128 // Maximum number of concurrent push/pull requests -) - -// ping request sent directly to node -type ping struct { - SeqNo uint32 - - // Node is sent so the target can verify they are - // the intended recipient. This is to protect again an agent - // restart with a new name. - Node string - - SourceAddr string `codec:",omitempty"` // Source address, used for a direct reply - SourcePort uint16 `codec:",omitempty"` // Source port, used for a direct reply - SourceNode string `codec:",omitempty"` // Source name, used for a direct reply -} - -// indirect ping sent to an indirect node -type indirectPingReq struct { - SeqNo uint32 - Target string - Port uint16 - - // Node is sent so the target can verify they are - // the intended recipient. This is to protect against an agent - // restart with a new name. - Node string - - Nack bool // true if we'd like a nack back - - SourceAddr string `codec:",omitempty"` // Source address, used for a direct reply - SourcePort uint16 `codec:",omitempty"` // Source port, used for a direct reply - SourceNode string `codec:",omitempty"` // Source name, used for a direct reply -} - -// ack response is sent for a ping -type ackResp struct { - SeqNo uint32 - Payload []byte -} - -// nack response is sent for an indirect ping when the pinger doesn't hear from -// the ping-ee within the configured timeout. This lets the original node know -// that the indirect ping attempt happened but didn't succeed. -type nackResp struct { - SeqNo uint32 -} - -// err response is sent to relay the error from the remote end -type errResp struct { - Error string -} - -// suspect is broadcast when we suspect a node is dead -type suspect struct { - Incarnation uint32 - Node string - From string // Include who is suspecting -} - -// alive is broadcast when we know a node is alive. -// Overloaded for nodes joining -type alive struct { - Incarnation uint32 - Node string - Addr string - Port uint16 - Meta []byte - - // The versions of the protocol/delegate that are being spoken, order: - // pmin, pmax, pcur, dmin, dmax, dcur - Vsn []uint8 -} - -func NewAlive(incarnation uint32, node string, addr string, port uint16, meta []byte, vsn []uint8) alive { - return alive{Incarnation: incarnation, Node: node, Addr: addr, Port: port, Meta: meta, Vsn: vsn} -} - -// dead is broadcast when we confirm a node is dead -// Overloaded for nodes leaving -type dead struct { - Incarnation uint32 - Node string - From string // Include who is suspecting -} - -// weight is broadcast when we send local node weight -type weight struct { - Incarnation uint32 - // Node whose weight - Node string - // From message from which node - From string - // Weight the weight for Node - Weight int - // WeightAt is UTC timestamp which the weight calculated at, used for ignoring old weight messages in milliseconds - WeightAt int64 -} - -func NewWeight(incarnation uint32, node string, from string, wei int, weightAt int64) *weight { - return &weight{Incarnation: incarnation, Node: node, From: from, Weight: wei, WeightAt: weightAt} -} - -// pushPullHeader is used to inform the -// otherside how many states we are transferring -type pushPullHeader struct { - Nodes int - UserStateLen int // Encodes the byte lengh of user state - Join bool // Is this a join request or a anti-entropy run -} - -// userMsgHeader is used to encapsulate a userMsg -type userMsgHeader struct { - UserMsgLen int // Encodes the byte lengh of user state -} - -// pushNodeState is used for pushPullReq when we are -// transferring out node states -type pushNodeState struct { - Name string - Addr string - Port uint16 - Meta []byte - Incarnation uint32 - State NodeStateType - Vsn []uint8 // Protocol versions -} - -// compress is used to wrap an underlying payload -// using a specified compression algorithm -type compress struct { - Algo compressionType - Buf []byte -} - -// msgHandoff is used to transfer a message between goroutines -type msgHandoff struct { - msgType messageType - buf []byte - from net.Addr -} - -// encryptionVersion returns the encryption version to use -func (m *Memberlist) encryptionVersion() encryptionVersion { - switch m.ProtocolVersion() { - case 1: - return 0 - default: - return 1 - } -} - -// streamListen is a long running goroutine that pulls incoming streams from the -// transport and hands them off for processing. -func (m *Memberlist) streamListen() { - for { - select { - case conn := <-m.transport.StreamCh(): - go m.handleConn(conn) - - case <-m.shutdownCh: - return - } - } -} - -// handleConn handles a single incoming stream connection from the transport. -func (m *Memberlist) handleConn(conn net.Conn) { - defer conn.Close() - m.logger.Printf("[DEBUG] memberlist: Stream connection %s", LogConn(conn)) - - metrics.IncrCounter([]string{"memberlist", "tcp", "accept"}, 1) - - from := conn.RemoteAddr() - if err := m.ensureCanConnect(from); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked message: %s from %s", err, LogAddress(from)) - return - } - - conn.SetDeadline(time.Now().Add(m.config.TCPTimeout)) - - msgType, bufConn, dec, err := m.readStream(conn) - if err != nil { - if err != io.EOF { - m.logger.Printf("[ERR] memberlist: failed to receive: %s %s", err, LogConn(conn)) - - resp := errResp{err.Error()} - out, err := encode(errMsg, &resp) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to encode error response: %s", err) - return - } - - err = m.rawSendMsgStream(conn, out.Bytes()) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send error: %s %s", err, LogConn(conn)) - return - } - } - return - } - - switch msgType { - case userMsg: - if err := m.readUserMsg(bufConn, dec); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to receive user message: %s %s", err, LogConn(conn)) - } - case pushPullMsg: - // Increment counter of pending push/pulls - numConcurrent := atomic.AddUint32(&m.pushPullReq, 1) - defer atomic.AddUint32(&m.pushPullReq, ^uint32(0)) - - // Check if we have too many open push/pull requests - if numConcurrent >= maxPushPullRequests { - m.logger.Printf("[ERR] memberlist: Too many pending push/pull requests") - return - } - - join, remoteNodes, userState, err := m.readRemoteState(bufConn, dec) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to read remote state: %s %s", err, LogConn(conn)) - return - } - - if join { - remote := remoteNodes[0] - if m.config.IPMustBeChecked() { - if stringutils.IsNotEmpty(remote.Addr) { - if err := m.config.AddrAllowed(remote.Addr); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked join.Addr=%s message from: %s %s", remote.Addr, err, LogAddress(from)) - return - } - } - } - } - - if err := m.sendLocalState(conn, join); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to push local state: %s %s", err, LogConn(conn)) - return - } - - if err := m.mergeRemoteState(join, remoteNodes, userState); err != nil { - m.logger.Printf("[ERR] memberlist: Failed push/pull merge: %s %s", err, LogConn(conn)) - return - } - case pingMsg: - var p ping - if err := dec.Decode(&p); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode ping: %s %s", err, LogConn(conn)) - return - } - - if p.Node != "" && p.Node != m.config.Name { - m.logger.Printf("[WARN] memberlist: Got ping for unexpected node %s %s", p.Node, LogConn(conn)) - return - } - - if m.config.IPMustBeChecked() { - if stringutils.IsNotEmpty(p.SourceAddr) { - if err := m.config.AddrAllowed(p.SourceAddr); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked ping.Addr=%s message from: %s %s", p.SourceAddr, err, LogAddress(from)) - return - } - } - } - - ack := ackResp{p.SeqNo, nil} - out, err := encode(ackRespMsg, &ack) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to encode ack: %s", err) - return - } - - err = m.rawSendMsgStream(conn, out.Bytes()) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send ack: %s %s", err, LogConn(conn)) - return - } - default: - m.logger.Printf("[ERR] memberlist: Received invalid msgType (%d) %s", msgType, LogConn(conn)) - } -} - -// packetListen is a long-running goroutine that pulls packets out of the -// transport and hands them off for processing. -func (m *Memberlist) packetListen() { - for { - select { - case packet := <-m.transport.PacketCh(): - m.ingestPacket(packet.Buf, packet.From, packet.Timestamp) - - case <-m.shutdownCh: - return - } - } -} - -func (m *Memberlist) ingestPacket(buf []byte, from net.Addr, timestamp time.Time) { - if err := m.ensureCanConnect(from); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked message: %s from %s", err, LogAddress(from)) - return - } - // Check if encryption is enabled - if m.config.EncryptionEnabled() { - // Decrypt the payload - plain, err := decryptPayload(m.config.Keyring.GetKeys(), buf, nil) - if err != nil { - if !m.config.GossipVerifyIncoming { - // Treat the message as plaintext - plain = buf - } else { - m.logger.Printf("[ERR] memberlist: Decrypt packet failed: %v %s", err, LogAddress(from)) - return - } - } - - // Continue processing the plaintext buffer - buf = plain - } - - // See if there's a checksum included to verify the contents of the message - if len(buf) >= 5 && messageType(buf[0]) == hasCrcMsg { - crc := crc32.ChecksumIEEE(buf[5:]) - expected := binary.BigEndian.Uint32(buf[1:5]) - if crc != expected { - m.logger.Printf("[WARN] memberlist: Got invalid checksum for UDP packet: %x, %x", crc, expected) - return - } - m.handleCommand(buf[5:], from, timestamp) - } else { - m.handleCommand(buf, from, timestamp) - } -} - -func (m *Memberlist) handleCommand(buf []byte, from net.Addr, timestamp time.Time) { - if len(buf) < 1 { - m.logger.Printf("[ERR] memberlist: missing message type byte %s", LogAddress(from)) - return - } - // Decode the message type - msgType := messageType(buf[0]) - buf = buf[1:] - - // Switch on the msgType - switch msgType { - case compoundMsg: - m.handleCompound(buf, from, timestamp) - case compressMsg: - m.handleCompressed(buf, from, timestamp) - - case pingMsg: - m.handlePing(buf, from) - case indirectPingMsg: - m.handleIndirectPing(buf, from) - case ackRespMsg: - m.handleAck(buf, from, timestamp) - case nackRespMsg: - m.handleNack(buf, from) - - case suspectMsg: - fallthrough - case aliveMsg: - fallthrough - case deadMsg: - fallthrough - case weightMsg: - fallthrough - case userMsg: - // Determine the message queue, prioritize alive - queue := m.lowPriorityMsgQueue - if msgType == aliveMsg { - queue = m.highPriorityMsgQueue - } - - // Check for overflow and append if not full - m.msgQueueLock.Lock() - if queue.Len() >= m.config.HandoffQueueDepth { - m.logger.Printf("[WARN] memberlist: handler queue full, dropping message (%d) %s", msgType, LogAddress(from)) - } else { - queue.PushBack(msgHandoff{msgType, buf, from}) - } - m.msgQueueLock.Unlock() - - // Notify of pending message - select { - case m.handoffCh <- struct{}{}: - default: - } - - default: - m.logger.Printf("[ERR] memberlist: msg type (%d) not supported %s", msgType, LogAddress(from)) - } -} - -// getNextMessage returns the next message to process in priority order, using LIFO -func (m *Memberlist) getNextMessage() (msgHandoff, bool) { - m.msgQueueLock.Lock() - defer m.msgQueueLock.Unlock() - - if el := m.highPriorityMsgQueue.Back(); el != nil { - m.highPriorityMsgQueue.Remove(el) - msg := el.Value.(msgHandoff) - return msg, true - } else if el := m.lowPriorityMsgQueue.Back(); el != nil { - m.lowPriorityMsgQueue.Remove(el) - msg := el.Value.(msgHandoff) - return msg, true - } - return msgHandoff{}, false -} - -// packetHandler is a long-running goroutine that processes messages received -// over the packet interface, but is decoupled from the listener to avoid -// blocking the listener which may cause ping/ack messages to be delayed. -func (m *Memberlist) packetHandler() { - for { - select { - case <-m.handoffCh: - for { - msg, ok := m.getNextMessage() - if !ok { - break - } - msgType := msg.msgType - buf := msg.buf - from := msg.from - - switch msgType { - case suspectMsg: - m.handleSuspect(buf, from) - case aliveMsg: - m.handleAlive(buf, from) - case deadMsg: - m.handleDead(buf, from) - case weightMsg: - m.handleWeight(buf, from) - case userMsg: - m.handleUser(buf, from) - default: - m.logger.Printf("[ERR] memberlist: Message type (%d) not supported %s (packet handler)", msgType, LogAddress(from)) - } - } - - case <-m.shutdownCh: - return - } - } -} - -func (m *Memberlist) handleCompound(buf []byte, from net.Addr, timestamp time.Time) { - // Decode the parts - trunc, parts, err := decodeCompoundMessage(buf) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode compound request: %s %s", err, LogAddress(from)) - return - } - - // Log any truncation - if trunc > 0 { - m.logger.Printf("[WARN] memberlist: Compound request had %d truncated messages %s", trunc, LogAddress(from)) - } - - // Handle each message - for _, part := range parts { - m.handleCommand(part, from, timestamp) - } -} - -func (m *Memberlist) handlePing(buf []byte, from net.Addr) { - var p ping - if err := decode(buf, &p); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode ping request: %s %s", err, LogAddress(from)) - return - } - // If node is provided, verify that it is for us - if p.Node != "" && p.Node != m.config.Name { - m.logger.Printf("[WARN] memberlist: Got ping for unexpected node '%s' %s", p.Node, LogAddress(from)) - return - } - - if m.config.IPMustBeChecked() { - if stringutils.IsNotEmpty(p.SourceAddr) { - if err := m.config.AddrAllowed(p.SourceAddr); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked ping.Addr=%s message from: %s %s", p.SourceAddr, err, LogAddress(from)) - return - } - } - } - - var ack ackResp - ack.SeqNo = p.SeqNo - if m.config.Ping != nil { - ack.Payload = m.config.Ping.AckPayload() - } - - addr := "" - if len(p.SourceAddr) > 0 && p.SourcePort > 0 { - addr = joinHostPort(p.SourceAddr, p.SourcePort) - } else { - addr = from.String() - } - - a := Address{ - Addr: addr, - Name: p.SourceNode, - } - if err := m.encodeAndSendMsg(a, ackRespMsg, &ack); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send ack: %s %s", err, LogAddress(from)) - } -} - -func (m *Memberlist) handleIndirectPing(buf []byte, from net.Addr) { - var ind indirectPingReq - if err := decode(buf, &ind); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode indirect ping request: %s %s", err, LogAddress(from)) - return - } - - if m.config.IPMustBeChecked() { - if stringutils.IsNotEmpty(ind.SourceAddr) { - if err := m.config.AddrAllowed(ind.SourceAddr); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked indirectPing.Addr=%s message from: %s %s", ind.SourceAddr, err, LogAddress(from)) - return - } - } - } - - // For proto versions < 2, there is no port provided. Mask old - // behavior by using the configured port. - if m.ProtocolVersion() < 2 || ind.Port == 0 { - ind.Port = uint16(m.config.BindPort) - } - - // Send a ping to the correct host. - localSeqNo := m.nextSeqNo() - selfAddr, selfPort := m.getAdvertise() - ping := ping{ - SeqNo: localSeqNo, - Node: ind.Node, - // The outbound message is addressed FROM us. - SourceAddr: selfAddr, - SourcePort: selfPort, - SourceNode: m.config.Name, - } - - // Forward the ack back to the requestor. If the request encodes an origin - // use that otherwise assume that the other end of the UDP socket is - // usable. - indAddr := "" - if len(ind.SourceAddr) > 0 && ind.SourcePort > 0 { - indAddr = joinHostPort(ind.SourceAddr, ind.SourcePort) - } else { - indAddr = from.String() - } - - // Setup a response handler to relay the ack - cancelCh := make(chan struct{}) - respHandler := func(payload []byte, timestamp time.Time) { - // Try to prevent the nack if we've caught it in time. - close(cancelCh) - - ack := ackResp{ind.SeqNo, nil} - a := Address{ - Addr: indAddr, - Name: ind.SourceNode, - } - if err := m.encodeAndSendMsg(a, ackRespMsg, &ack); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to forward ack: %s %s", err, LogStringAddress(indAddr)) - } - } - m.setAckHandler(localSeqNo, respHandler, m.config.ProbeTimeout) - - // Send the ping. - addr := joinHostPort(ind.Target, ind.Port) - a := Address{ - Addr: addr, - Name: ind.Node, - } - if err := m.encodeAndSendMsg(a, pingMsg, &ping); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send indirect ping: %s %s", err, LogStringAddress(indAddr)) - } - - // Setup a timer to fire off a nack if no ack is seen in time. - if ind.Nack { - go func() { - select { - case <-cancelCh: - return - case <-time.After(m.config.ProbeTimeout): - nack := nackResp{ind.SeqNo} - a := Address{ - Addr: indAddr, - Name: ind.SourceNode, - } - if err := m.encodeAndSendMsg(a, nackRespMsg, &nack); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send nack: %s %s", err, LogStringAddress(indAddr)) - } - } - }() - } -} - -func (m *Memberlist) handleAck(buf []byte, from net.Addr, timestamp time.Time) { - var ack ackResp - if err := decode(buf, &ack); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode ack response: %s %s", err, LogAddress(from)) - return - } - m.invokeAckHandler(ack, timestamp) -} - -func (m *Memberlist) handleNack(buf []byte, from net.Addr) { - var nack nackResp - if err := decode(buf, &nack); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode nack response: %s %s", err, LogAddress(from)) - return - } - m.invokeNackHandler(nack) -} - -func (m *Memberlist) handleSuspect(buf []byte, from net.Addr) { - var sus suspect - if err := decode(buf, &sus); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode suspect message: %s %s", err, LogAddress(from)) - return - } - m.suspectNode(&sus) -} - -// ensureCanConnect return the IP from a RemoteAddress -// return error if this client must not connect -func (m *Memberlist) ensureCanConnect(from net.Addr) error { - if !m.config.IPMustBeChecked() { - return nil - } - source := from.String() - if source == "pipe" { - return nil - } - host, _, err := net.SplitHostPort(source) - if err != nil { - return err - } - return m.config.AddrAllowed(host) -} - -func (m *Memberlist) handleAlive(buf []byte, from net.Addr) { - if err := m.ensureCanConnect(from); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked alive message: %s %s", err, LogAddress(from)) - return - } - var live alive - if err := decode(buf, &live); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode alive message: %s %s", err, LogAddress(from)) - return - } - if m.config.IPMustBeChecked() { - if stringutils.IsNotEmpty(live.Addr) { - if err := m.config.AddrAllowed(live.Addr); err != nil { - m.logger.Printf("[DEBUG] memberlist: Blocked alive.Addr=%s message from: %s %s", live.Addr, err, LogAddress(from)) - return - } - } - } - - // For proto versions < 2, there is no port provided. Mask old - // behavior by using the configured port - if m.ProtocolVersion() < 2 || live.Port == 0 { - live.Port = uint16(m.config.BindPort) - } - - m.aliveNode(&live, nil, false) -} - -func (m *Memberlist) handleDead(buf []byte, from net.Addr) { - var d dead - if err := decode(buf, &d); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode dead message: %s %s", err, LogAddress(from)) - return - } - m.deadNode(&d) -} - -func (m *Memberlist) handleWeight(buf []byte, from net.Addr) { - var wei weight - if err := decode(buf, &wei); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decode weight message: %s %s", err, LogAddress(from)) - return - } - m.weightNode(&wei) -} - -// handleUser is used to notify channels of incoming user data -func (m *Memberlist) handleUser(buf []byte, from net.Addr) { - d := m.config.Delegate - if d != nil { - d.NotifyMsg(buf) - } -} - -// handleCompressed is used to unpack a compressed message -func (m *Memberlist) handleCompressed(buf []byte, from net.Addr, timestamp time.Time) { - // Try to decode the payload - payload, err := decompressPayload(buf) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to decompress payload: %v %s", err, LogAddress(from)) - return - } - - // Recursively handle the payload - m.handleCommand(payload, from, timestamp) -} - -// encodeAndSendMsg is used to combine the encoding and sending steps -func (m *Memberlist) encodeAndSendMsg(a Address, msgType messageType, msg interface{}) error { - out, err := encode(msgType, msg) - if err != nil { - return err - } - if err := m.sendMsg(a, out.Bytes()); err != nil { - return err - } - return nil -} - -// sendMsg is used to send a message via packet to another host. It will -// opportunistically create a compoundMsg and piggy back other broadcasts. -func (m *Memberlist) sendMsg(a Address, msg []byte) error { - // Check if we can piggy back any messages - bytesAvail := m.config.UDPBufferSize - len(msg) - compoundHeaderOverhead - if m.config.EncryptionEnabled() && m.config.GossipVerifyOutgoing { - bytesAvail -= encryptOverhead(m.encryptionVersion()) - } - extra := m.getBroadcasts(compoundOverhead, bytesAvail) - - // Fast path if nothing to piggypack - if len(extra) == 0 { - return m.rawSendMsgPacket(a, nil, msg) - } - - // Join all the messages - msgs := make([][]byte, 0, 1+len(extra)) - msgs = append(msgs, msg) - msgs = append(msgs, extra...) - - // Create a compound message - compound := makeCompoundMessage(msgs) - - // Send the message - return m.rawSendMsgPacket(a, nil, compound.Bytes()) -} - -// rawSendMsgPacket is used to send message via packet to another host without -// modification, other than compression or encryption if enabled. -func (m *Memberlist) rawSendMsgPacket(a Address, node *Node, msg []byte) error { - if a.Name == "" && m.config.RequireNodeNames { - return errNodeNamesAreRequired - } - - // Check if we have compression enabled - if m.config.EnableCompression { - buf, err := compressPayload(msg) - if err != nil { - m.logger.Printf("[WARN] memberlist: Failed to compress payload: %v", err) - } else { - // Only use compression if it reduced the size - if buf.Len() < len(msg) { - msg = buf.Bytes() - } - } - } - - // Try to look up the destination node. Note this will only work if the - // bare ip address is used as the node name, which is not guaranteed. - if node == nil { - toAddr, _, err := net.SplitHostPort(a.Addr) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to parse address %q: %v", a.Addr, err) - return err - } - m.nodeLock.RLock() - nodeState, ok := m.nodeMap[toAddr] - m.nodeLock.RUnlock() - if ok { - node = &nodeState.Node - } - } - - // Add a CRC to the end of the payload if the recipient understands - // ProtocolVersion >= 5 - if node != nil && node.PMax >= 5 { - crc := crc32.ChecksumIEEE(msg) - header := make([]byte, 5, 5+len(msg)) - header[0] = byte(hasCrcMsg) - binary.BigEndian.PutUint32(header[1:], crc) - msg = append(header, msg...) - } - - // Check if we have encryption enabled - if m.config.EncryptionEnabled() && m.config.GossipVerifyOutgoing { - // Encrypt the payload - var buf bytes.Buffer - primaryKey := m.config.Keyring.GetPrimaryKey() - err := encryptPayload(m.encryptionVersion(), primaryKey, msg, nil, &buf) - if err != nil { - m.logger.Printf("[ERR] memberlist: Encryption of message failed: %v", err) - return err - } - msg = buf.Bytes() - } - - metrics.IncrCounter([]string{"memberlist", "udp", "sent"}, float32(len(msg))) - _, err := m.transport.WriteToAddress(msg, a) - return err -} - -// rawSendMsgStream is used to stream a message to another host without -// modification, other than applying compression and encryption if enabled. -func (m *Memberlist) rawSendMsgStream(conn net.Conn, sendBuf []byte) error { - // Check if compression is enabled - if m.config.EnableCompression { - compBuf, err := compressPayload(sendBuf) - if err != nil { - m.logger.Printf("[ERROR] memberlist: Failed to compress payload: %v", err) - } else { - sendBuf = compBuf.Bytes() - } - } - - // Check if encryption is enabled - if m.config.EncryptionEnabled() && m.config.GossipVerifyOutgoing { - crypt, err := m.encryptLocalState(sendBuf) - if err != nil { - m.logger.Printf("[ERROR] memberlist: Failed to encrypt local state: %v", err) - return err - } - sendBuf = crypt - } - - // Write out the entire send buffer - metrics.IncrCounter([]string{"memberlist", "tcp", "sent"}, float32(len(sendBuf))) - - if n, err := conn.Write(sendBuf); err != nil { - return err - } else if n != len(sendBuf) { - return fmt.Errorf("only %d of %d bytes written", n, len(sendBuf)) - } - - return nil -} - -// sendUserMsg is used to stream a user message to another host. -func (m *Memberlist) sendUserMsg(a Address, sendBuf []byte) error { - if a.Name == "" && m.config.RequireNodeNames { - return errNodeNamesAreRequired - } - - conn, err := m.transport.DialAddressTimeout(a, m.config.TCPTimeout) - if err != nil { - return err - } - defer conn.Close() - - bufConn := bytes.NewBuffer(nil) - if err := bufConn.WriteByte(byte(userMsg)); err != nil { - return err - } - - header := userMsgHeader{UserMsgLen: len(sendBuf)} - hd := codec.MsgpackHandle{} - enc := codec.NewEncoder(bufConn, &hd) - if err := enc.Encode(&header); err != nil { - return err - } - if _, err := bufConn.Write(sendBuf); err != nil { - return err - } - return m.rawSendMsgStream(conn, bufConn.Bytes()) -} - -// sendAndReceiveState is used to initiate a push/pull over a stream with a -// remote host. -func (m *Memberlist) sendAndReceiveState(a Address, join bool) ([]pushNodeState, []byte, error) { - if a.Name == "" && m.config.RequireNodeNames { - return nil, nil, errNodeNamesAreRequired - } - - // Attempt to connect - conn, err := m.transport.DialAddressTimeout(a, m.config.TCPTimeout) - if err != nil { - return nil, nil, err - } - defer conn.Close() - m.logger.Printf("[DEBUG] memberlist: Initiating push/pull sync with: %s %s", a.Name, conn.RemoteAddr()) - metrics.IncrCounter([]string{"memberlist", "tcp", "connect"}, 1) - - // Send our state - if err := m.sendLocalState(conn, join); err != nil { - return nil, nil, err - } - - conn.SetDeadline(time.Now().Add(m.config.TCPTimeout)) - msgType, bufConn, dec, err := m.readStream(conn) - if err != nil { - return nil, nil, err - } - - if msgType == errMsg { - var resp errResp - if err := dec.Decode(&resp); err != nil { - return nil, nil, err - } - return nil, nil, fmt.Errorf("remote error: %v", resp.Error) - } - - // Quit if not push/pull - if msgType != pushPullMsg { - err := fmt.Errorf("received invalid msgType (%d), expected pushPullMsg (%d) %s", msgType, pushPullMsg, LogConn(conn)) - return nil, nil, err - } - - // Read remote state - _, remoteNodes, userState, err := m.readRemoteState(bufConn, dec) - return remoteNodes, userState, err -} - -// sendLocalState is invoked to send our local state over a stream connection. -func (m *Memberlist) sendLocalState(conn net.Conn, join bool) error { - // Setup a deadline - conn.SetDeadline(time.Now().Add(m.config.TCPTimeout)) - - // Prepare the local node state - m.nodeLock.RLock() - localNodes := make([]pushNodeState, len(m.nodes)) - for idx, n := range m.nodes { - localNodes[idx].Name = n.Name - localNodes[idx].Addr = n.Addr - localNodes[idx].Port = n.Port - localNodes[idx].Incarnation = n.Incarnation - localNodes[idx].State = n.State - localNodes[idx].Meta = n.Meta - localNodes[idx].Vsn = []uint8{ - n.PMin, n.PMax, n.PCur, - n.DMin, n.DMax, n.DCur, - } - } - m.nodeLock.RUnlock() - - // Get the delegate state - var userData []byte - if m.config.Delegate != nil { - userData = m.config.Delegate.LocalState(join) - } - - // Create a bytes buffer writer - bufConn := bytes.NewBuffer(nil) - - // Send our node state - header := pushPullHeader{Nodes: len(localNodes), UserStateLen: len(userData), Join: join} - hd := codec.MsgpackHandle{} - enc := codec.NewEncoder(bufConn, &hd) - - // Begin state push - if _, err := bufConn.Write([]byte{byte(pushPullMsg)}); err != nil { - return err - } - - if err := enc.Encode(&header); err != nil { - return err - } - for i := 0; i < header.Nodes; i++ { - if err := enc.Encode(&localNodes[i]); err != nil { - return err - } - } - - // Write the user state as well - if userData != nil { - if _, err := bufConn.Write(userData); err != nil { - return err - } - } - - // Get the send buffer - return m.rawSendMsgStream(conn, bufConn.Bytes()) -} - -// encryptLocalState is used to help encrypt local state before sending -func (m *Memberlist) encryptLocalState(sendBuf []byte) ([]byte, error) { - var buf bytes.Buffer - - // Write the encryptMsg byte - buf.WriteByte(byte(encryptMsg)) - - // Write the size of the message - sizeBuf := make([]byte, 4) - encVsn := m.encryptionVersion() - encLen := encryptedLength(encVsn, len(sendBuf)) - binary.BigEndian.PutUint32(sizeBuf, uint32(encLen)) - buf.Write(sizeBuf) - - // Write the encrypted cipher text to the buffer - key := m.config.Keyring.GetPrimaryKey() - err := encryptPayload(encVsn, key, sendBuf, buf.Bytes()[:5], &buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// decryptRemoteState is used to help decrypt the remote state -func (m *Memberlist) decryptRemoteState(bufConn io.Reader) ([]byte, error) { - // Read in enough to determine message length - cipherText := bytes.NewBuffer(nil) - cipherText.WriteByte(byte(encryptMsg)) - _, err := io.CopyN(cipherText, bufConn, 4) - if err != nil { - return nil, err - } - - // Ensure we aren't asked to download too much. This is to guard against - // an attack vector where a huge amount of state is sent - moreBytes := binary.BigEndian.Uint32(cipherText.Bytes()[1:5]) - if moreBytes > maxPushStateBytes { - return nil, fmt.Errorf("Remote node state is larger than limit (%d)", moreBytes) - } - - // Read in the rest of the payload - _, err = io.CopyN(cipherText, bufConn, int64(moreBytes)) - if err != nil { - return nil, err - } - - // Decrypt the cipherText - dataBytes := cipherText.Bytes()[:5] - cipherBytes := cipherText.Bytes()[5:] - - // Decrypt the payload - keys := m.config.Keyring.GetKeys() - return decryptPayload(keys, cipherBytes, dataBytes) -} - -// readStream is used to read from a stream connection, decrypting and -// decompressing the stream if necessary. -func (m *Memberlist) readStream(conn net.Conn) (messageType, io.Reader, *codec.Decoder, error) { - // Created a buffered reader - var bufConn io.Reader = bufio.NewReader(conn) - - // Read the message type - buf := [1]byte{0} - if _, err := bufConn.Read(buf[:]); err != nil { - return 0, nil, nil, err - } - msgType := messageType(buf[0]) - - // Check if the message is encrypted - if msgType == encryptMsg { - if !m.config.EncryptionEnabled() { - return 0, nil, nil, - fmt.Errorf("Remote state is encrypted and encryption is not configured") - } - - plain, err := m.decryptRemoteState(bufConn) - if err != nil { - return 0, nil, nil, err - } - - // Reset message type and bufConn - msgType = messageType(plain[0]) - bufConn = bytes.NewReader(plain[1:]) - } else if m.config.EncryptionEnabled() && m.config.GossipVerifyIncoming { - return 0, nil, nil, - fmt.Errorf("Encryption is configured but remote state is not encrypted") - } - - // Get the msgPack decoders - hd := codec.MsgpackHandle{} - dec := codec.NewDecoder(bufConn, &hd) - - // Check if we have a compressed message - if msgType == compressMsg { - var c compress - if err := dec.Decode(&c); err != nil { - return 0, nil, nil, err - } - decomp, err := decompressBuffer(&c) - if err != nil { - return 0, nil, nil, err - } - - // Reset the message type - msgType = messageType(decomp[0]) - - // Create a new bufConn - bufConn = bytes.NewReader(decomp[1:]) - - // Create a new decoder - dec = codec.NewDecoder(bufConn, &hd) - } - - return msgType, bufConn, dec, nil -} - -// readRemoteState is used to read the remote state from a connection -func (m *Memberlist) readRemoteState(bufConn io.Reader, dec *codec.Decoder) (bool, []pushNodeState, []byte, error) { - // Read the push/pull header - var header pushPullHeader - if err := dec.Decode(&header); err != nil { - return false, nil, nil, err - } - - // Allocate space for the transfer - remoteNodes := make([]pushNodeState, header.Nodes) - - // Try to decode all the states - for i := 0; i < header.Nodes; i++ { - if err := dec.Decode(&remoteNodes[i]); err != nil { - return false, nil, nil, err - } - } - - // Read the remote user state into a buffer - var userBuf []byte - if header.UserStateLen > 0 { - userBuf = make([]byte, header.UserStateLen) - bytes, err := io.ReadAtLeast(bufConn, userBuf, header.UserStateLen) - if err == nil && bytes != header.UserStateLen { - err = fmt.Errorf( - "Failed to read full user state (%d / %d)", - bytes, header.UserStateLen) - } - if err != nil { - return false, nil, nil, err - } - } - - // For proto versions < 2, there is no port provided. Mask old - // behavior by using the configured port - for idx := range remoteNodes { - if m.ProtocolVersion() < 2 || remoteNodes[idx].Port == 0 { - remoteNodes[idx].Port = uint16(m.config.BindPort) - } - } - - return header.Join, remoteNodes, userBuf, nil -} - -// mergeRemoteState is used to merge the remote state with our local state -func (m *Memberlist) mergeRemoteState(join bool, remoteNodes []pushNodeState, userBuf []byte) error { - if err := m.verifyProtocol(remoteNodes); err != nil { - return err - } - - // Invoke the merge delegate if any - if join && m.config.Merge != nil { - nodes := make([]*Node, len(remoteNodes)) - for idx, n := range remoteNodes { - nodes[idx] = &Node{ - Name: n.Name, - Addr: n.Addr, - Port: n.Port, - Meta: n.Meta, - State: n.State, - PMin: n.Vsn[0], - PMax: n.Vsn[1], - PCur: n.Vsn[2], - DMin: n.Vsn[3], - DMax: n.Vsn[4], - DCur: n.Vsn[5], - } - } - if err := m.config.Merge.NotifyMerge(nodes); err != nil { - return err - } - } - - // Merge the membership state - m.mergeState(remoteNodes) - - // Invoke the delegate for user state - if userBuf != nil && m.config.Delegate != nil { - m.config.Delegate.MergeRemoteState(userBuf, join) - } - return nil -} - -// readUserMsg is used to decode a userMsg from a stream. -func (m *Memberlist) readUserMsg(bufConn io.Reader, dec *codec.Decoder) error { - // Read the user message header - var header userMsgHeader - if err := dec.Decode(&header); err != nil { - return err - } - - // Read the user message into a buffer - var userBuf []byte - if header.UserMsgLen > 0 { - userBuf = make([]byte, header.UserMsgLen) - bytes, err := io.ReadAtLeast(bufConn, userBuf, header.UserMsgLen) - if err == nil && bytes != header.UserMsgLen { - err = fmt.Errorf( - "Failed to read full user message (%d / %d)", - bytes, header.UserMsgLen) - } - if err != nil { - return err - } - - d := m.config.Delegate - if d != nil { - d.NotifyMsg(userBuf) - } - } - - return nil -} - -// sendPingAndWaitForAck makes a stream connection to the given address, sends -// a ping, and waits for an ack. All of this is done as a series of blocking -// operations, given the deadline. The bool return parameter is true if we -// we able to round trip a ping to the other node. -func (m *Memberlist) sendPingAndWaitForAck(a Address, ping ping, deadline time.Time) (bool, error) { - if a.Name == "" && m.config.RequireNodeNames { - return false, errNodeNamesAreRequired - } - - conn, err := m.transport.DialAddressTimeout(a, deadline.Sub(time.Now())) - if err != nil { - // If the node is actually dead we expect this to fail, so we - // shouldn't spam the logs with it. After this point, errors - // with the connection are real, unexpected errors and should - // get propagated up. - return false, nil - } - defer conn.Close() - conn.SetDeadline(deadline) - - out, err := encode(pingMsg, &ping) - if err != nil { - return false, err - } - - if err = m.rawSendMsgStream(conn, out.Bytes()); err != nil { - return false, err - } - - msgType, _, dec, err := m.readStream(conn) - if err != nil { - return false, err - } - - if msgType != ackRespMsg { - return false, fmt.Errorf("Unexpected msgType (%d) from ping %s", msgType, LogConn(conn)) - } - - var ack ackResp - if err = dec.Decode(&ack); err != nil { - return false, err - } - - if ack.SeqNo != ping.SeqNo { - return false, fmt.Errorf("Sequence number from ack (%d) doesn't match ping (%d)", ack.SeqNo, ping.SeqNo) - } - - return true, nil -} diff --git a/toolkit/memberlist/net_conn_interface.go b/toolkit/memberlist/net_conn_interface.go deleted file mode 100644 index 648015de..00000000 --- a/toolkit/memberlist/net_conn_interface.go +++ /dev/null @@ -1,68 +0,0 @@ -package memberlist - -import ( - "net" - "time" -) - -//go:generate mockgen -destination ./mock/mock_net_conn_interface.go -package mock -source=./net_conn_interface.go - -// Conn is a generic stream-oriented network connection. -// -// Multiple goroutines may invoke methods on a Conn simultaneously. -type Conn interface { - // Read reads data from the connection. - // Read can be made to time out and return an error after a fixed - // time limit; see SetDeadline and SetReadDeadline. - Read(b []byte) (n int, err error) - - // Write writes data to the connection. - // Write can be made to time out and return an error after a fixed - // time limit; see SetDeadline and SetWriteDeadline. - Write(b []byte) (n int, err error) - - // Close closes the connection. - // Any blocked Read or Write operations will be unblocked and return errors. - Close() error - - // LocalAddr returns the local network address. - LocalAddr() net.Addr - - // RemoteAddr returns the remote network address. - RemoteAddr() net.Addr - - // SetDeadline sets the read and write deadlines associated - // with the connection. It is equivalent to calling both - // SetReadDeadline and SetWriteDeadline. - // - // A deadline is an absolute time after which I/O operations - // fail instead of blocking. The deadline applies to all future - // and pending I/O, not just the immediately following call to - // Read or Write. After a deadline has been exceeded, the - // connection can be refreshed by setting a deadline in the future. - // - // If the deadline is exceeded a call to Read or Write or to other - // I/O methods will return an error that wraps os.ErrDeadlineExceeded. - // This can be tested using errors.Is(err, os.ErrDeadlineExceeded). - // The error's Timeout method will return true, but note that there - // are other possible errors for which the Timeout method will - // return true even if the deadline has not been exceeded. - // - // An idle timeout can be implemented by repeatedly extending - // the deadline after successful Read or Write calls. - // - // A zero value for t means I/O operations will not time out. - SetDeadline(t time.Time) error - - // SetReadDeadline sets the deadline for future Read calls - // and any currently-blocked Read call. - // A zero value for t means Read will not time out. - SetReadDeadline(t time.Time) error - - // SetWriteDeadline sets the deadline for future Write calls - // and any currently-blocked Write call. - // Even if write times out, it may return n > 0, indicating that - // some of the data was successfully written. - // A zero value for t means Write will not time out. - SetWriteDeadline(t time.Time) error -} diff --git a/toolkit/memberlist/net_test.go b/toolkit/memberlist/net_test.go deleted file mode 100644 index 8f94197b..00000000 --- a/toolkit/memberlist/net_test.go +++ /dev/null @@ -1,910 +0,0 @@ -package memberlist - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "log" - "net" - "os" - "reflect" - "strconv" - "strings" - "testing" - "time" - - "github.com/hashicorp/go-msgpack/codec" - "github.com/stretchr/testify/require" -) - -// As a regression we left this test very low-level and network-ey, even after -// we abstracted the transport. We added some basic network-free transport tests -// in transport_test.go to prove that we didn't hard code some network stuff -// outside of NetTransport. - -func TestHandleCompoundPing(t *testing.T) { - //m := GetMemberlist(t, func(c *Config) { - // c.EnableCompression = false - //}) - //defer m.Shutdown() - // - //udp := listenUDP(t) - //defer udp.Close() - // - //udpAddr := udp.LocalAddr().(*net.UDPAddr) - - // Encode a ping - p1 := ping{ - SeqNo: 42, - SourceAddr: "127.0.0.1", - SourcePort: 56199, - SourceNode: "test", - } - buf, err := encode(pingMsg, p1) - fmt.Println(buf.Bytes()) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - msg := []byte{133, 165, 83, 101, 113, 78, 111, 42, 164, 78, 111, 100, 101, 160, 170, 83, 111, 117, 114, 99, 101, 65, 100, 100, 114, 169, 49, 50, 55, 46, 48, 46, 48, 46, 49, 170, 83, 111, 117, 114, 99, 101, 80, 111, 114, 116, 205, 219, 135, 170, 83, 111, 117, 114, 99, 101, 78, 111, 100, 101, 164, 116, 101, 115, 116} - var p ping - decode(msg, &p) - fmt.Printf("%+v\n", p) - - //// Make a compound message - //compound := makeCompoundMessage([][]byte{buf.Bytes(), buf.Bytes(), buf.Bytes()}) - // - //// Send compound version - //addr := &net.UDPAddr{IP: net.ParseIP(m.config.BindAddr), Port: m.config.BindPort} - //_, err = udp.WriteTo(compound.Bytes(), addr) - //if err != nil { - // t.Fatalf("unexpected err %s", err) - //} - // - //// Wait for responses - //doneCh := make(chan struct{}, 1) - //go func() { - // select { - // case <-doneCh: - // case <-time.After(2 * time.Second): - // panic("timeout") - // } - //}() - // - //for i := 0; i < 3; i++ { - // in := make([]byte, 1500) - // n, _, err := udp.ReadFrom(in) - // if err != nil { - // t.Fatalf("unexpected err %s", err) - // } - // in = in[0:n] - // - // msgType := messageType(in[0]) - // if msgType != ackRespMsg { - // t.Fatalf("bad response %v", in) - // } - // - // var ack ackResp - // if err := decode(in[1:], &ack); err != nil { - // t.Fatalf("unexpected err %s", err) - // } - // - // if ack.SeqNo != 42 { - // t.Fatalf("bad sequence no") - // } - //} - // - //doneCh <- struct{}{} -} - -func TestHandlePing(t *testing.T) { - m := GetMemberlist(t, func(c *Config) { - c.EnableCompression = false - }) - defer m.Shutdown() - - udp := listenUDP(t) - defer udp.Close() - - udpAddr := udp.LocalAddr().(*net.UDPAddr) - - // Encode a ping - ping := ping{ - SeqNo: 42, - SourceAddr: udpAddr.IP.String(), - SourcePort: uint16(udpAddr.Port), - SourceNode: "test", - } - buf, err := encode(pingMsg, ping) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Send - addr := &net.UDPAddr{IP: net.ParseIP(m.config.BindAddr), Port: m.config.BindPort} - _, err = udp.WriteTo(buf.Bytes(), addr) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Wait for response - doneCh := make(chan struct{}, 1) - go func() { - select { - case <-doneCh: - case <-time.After(120 * time.Second): - panic("timeout") - } - }() - - in := make([]byte, 1500) - n, _, err := udp.ReadFrom(in) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - in = in[0:n] - - msgType := messageType(in[0]) - if msgType != ackRespMsg { - t.Fatalf("bad response %v", in) - } - - var ack ackResp - if err := decode(in[1:], &ack); err != nil { - t.Fatalf("unexpected err %s", err) - } - - if ack.SeqNo != 42 { - t.Fatalf("bad sequence no") - } - - doneCh <- struct{}{} -} - -func TestHandlePing_WrongNode(t *testing.T) { - m := GetMemberlist(t, func(c *Config) { - c.EnableCompression = false - }) - defer m.Shutdown() - - udp := listenUDP(t) - defer udp.Close() - - udpAddr := udp.LocalAddr().(*net.UDPAddr) - - // Encode a ping, wrong node! - ping := ping{ - SeqNo: 42, - Node: m.config.Name + "-bad", - SourceAddr: udpAddr.IP.String(), - SourcePort: uint16(udpAddr.Port), - SourceNode: "test", - } - buf, err := encode(pingMsg, ping) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Send - addr := &net.UDPAddr{IP: net.ParseIP(m.config.BindAddr), Port: m.config.BindPort} - _, err = udp.WriteTo(buf.Bytes(), addr) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Wait for response - udp.SetDeadline(time.Now().Add(50 * time.Millisecond)) - in := make([]byte, 1500) - _, _, err = udp.ReadFrom(in) - - // Should get an i/o timeout - if err == nil { - t.Fatalf("expected err %s", err) - } -} - -func TestHandleIndirectPing(t *testing.T) { - m := GetMemberlist(t, func(c *Config) { - c.EnableCompression = false - }) - defer m.Shutdown() - - udp := listenUDP(t) - defer udp.Close() - - udpAddr := udp.LocalAddr().(*net.UDPAddr) - - // Encode an indirect ping - ind := indirectPingReq{ - SeqNo: 100, - Target: m.config.BindAddr, - Port: uint16(m.config.BindPort), - Node: m.config.Name, - SourceAddr: udpAddr.IP.String(), - SourcePort: uint16(udpAddr.Port), - SourceNode: "test", - } - buf, err := encode(indirectPingMsg, &ind) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Send - addr := &net.UDPAddr{IP: net.ParseIP(m.config.BindAddr), Port: m.config.BindPort} - _, err = udp.WriteTo(buf.Bytes(), addr) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Wait for response - doneCh := make(chan struct{}, 1) - go func() { - select { - case <-doneCh: - case <-time.After(2 * time.Second): - panic("timeout") - } - }() - - in := make([]byte, 1500) - n, _, err := udp.ReadFrom(in) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - in = in[0:n] - - msgType := messageType(in[0]) - if msgType != ackRespMsg { - t.Fatalf("bad response %v", in) - } - - var ack ackResp - if err := decode(in[1:], &ack); err != nil { - t.Fatalf("unexpected err %s", err) - } - - if ack.SeqNo != 100 { - t.Fatalf("bad sequence no") - } - - doneCh <- struct{}{} -} - -func TestTCPPing(t *testing.T) { - var tcp *net.TCPListener - var tcpAddr *net.TCPAddr - for port := 60000; port < 61000; port++ { - tcpAddr = &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: port} - tcpLn, err := net.ListenTCP("tcp", tcpAddr) - if err == nil { - tcp = tcpLn - break - } - } - if tcp == nil { - t.Fatalf("no tcp listener") - } - - tcpAddr2 := Address{Addr: tcpAddr.String(), Name: "test"} - - // Note that tcp gets closed in the last test, so we avoid a deferred - // Close() call here. - - m := GetMemberlist(t, nil) - defer m.Shutdown() - - pingTimeout := m.config.ProbeInterval - pingTimeMax := m.config.ProbeInterval + 10*time.Millisecond - - // Do a normal round trip. - pingOut := ping{SeqNo: 23, Node: "mongo"} - go func() { - tcp.SetDeadline(time.Now().Add(pingTimeMax)) - conn, err := tcp.AcceptTCP() - if err != nil { - t.Fatalf("failed to connect: %s", err) - } - defer conn.Close() - - msgType, _, dec, err := m.readStream(conn) - if err != nil { - t.Fatalf("failed to read ping: %s", err) - } - - if msgType != pingMsg { - t.Fatalf("expecting ping, got message type (%d)", msgType) - } - - var pingIn ping - if err := dec.Decode(&pingIn); err != nil { - t.Fatalf("failed to decode ping: %s", err) - } - - if pingIn.SeqNo != pingOut.SeqNo { - t.Fatalf("sequence number isn't correct (%d) vs (%d)", pingIn.SeqNo, pingOut.SeqNo) - } - - if pingIn.Node != pingOut.Node { - t.Fatalf("node name isn't correct (%s) vs (%s)", pingIn.Node, pingOut.Node) - } - - ack := ackResp{pingIn.SeqNo, nil} - out, err := encode(ackRespMsg, &ack) - if err != nil { - t.Fatalf("failed to encode ack: %s", err) - } - - err = m.rawSendMsgStream(conn, out.Bytes()) - if err != nil { - t.Fatalf("failed to send ack: %s", err) - } - }() - deadline := time.Now().Add(pingTimeout) - didContact, err := m.sendPingAndWaitForAck(tcpAddr2, pingOut, deadline) - if err != nil { - t.Fatalf("error trying to ping: %s", err) - } - if !didContact { - t.Fatalf("expected successful ping") - } - - // Make sure a mis-matched sequence number is caught. - go func() { - tcp.SetDeadline(time.Now().Add(pingTimeMax)) - conn, err := tcp.AcceptTCP() - if err != nil { - t.Fatalf("failed to connect: %s", err) - } - defer conn.Close() - - _, _, dec, err := m.readStream(conn) - if err != nil { - t.Fatalf("failed to read ping: %s", err) - } - - var pingIn ping - if err := dec.Decode(&pingIn); err != nil { - t.Fatalf("failed to decode ping: %s", err) - } - - ack := ackResp{pingIn.SeqNo + 1, nil} - out, err := encode(ackRespMsg, &ack) - if err != nil { - t.Fatalf("failed to encode ack: %s", err) - } - - err = m.rawSendMsgStream(conn, out.Bytes()) - if err != nil { - t.Fatalf("failed to send ack: %s", err) - } - }() - deadline = time.Now().Add(pingTimeout) - didContact, err = m.sendPingAndWaitForAck(tcpAddr2, pingOut, deadline) - if err == nil || !strings.Contains(err.Error(), "Sequence number") { - t.Fatalf("expected an error from mis-matched sequence number") - } - if didContact { - t.Fatalf("expected failed ping") - } - - // Make sure an unexpected message type is handled gracefully. - go func() { - tcp.SetDeadline(time.Now().Add(pingTimeMax)) - conn, err := tcp.AcceptTCP() - if err != nil { - t.Fatalf("failed to connect: %s", err) - } - defer conn.Close() - - _, _, _, err = m.readStream(conn) - if err != nil { - t.Fatalf("failed to read ping: %s", err) - } - - bogus := indirectPingReq{} - out, err := encode(indirectPingMsg, &bogus) - if err != nil { - t.Fatalf("failed to encode bogus msg: %s", err) - } - - err = m.rawSendMsgStream(conn, out.Bytes()) - if err != nil { - t.Fatalf("failed to send bogus msg: %s", err) - } - }() - deadline = time.Now().Add(pingTimeout) - didContact, err = m.sendPingAndWaitForAck(tcpAddr2, pingOut, deadline) - if err == nil || !strings.Contains(err.Error(), "Unexpected msgType") { - t.Fatalf("expected an error from bogus message") - } - if didContact { - t.Fatalf("expected failed ping") - } - - // Make sure failed I/O respects the deadline. In this case we try the - // common case of the receiving node being totally down. - tcp.Close() - deadline = time.Now().Add(pingTimeout) - startPing := time.Now() - didContact, err = m.sendPingAndWaitForAck(tcpAddr2, pingOut, deadline) - pingTime := time.Now().Sub(startPing) - if err != nil { - t.Fatalf("expected no error during ping on closed socket, got: %s", err) - } - if didContact { - t.Fatalf("expected failed ping") - } - if pingTime > pingTimeMax { - t.Fatalf("took too long to fail ping, %9.6f", pingTime.Seconds()) - } -} - -func TestTCPPushPull(t *testing.T) { - m := GetMemberlist(t, nil) - defer m.Shutdown() - - m.nodes = append(m.nodes, &nodeState{ - Node: Node{ - Name: "Test 0", - Addr: m.config.BindAddr, - Port: uint16(m.config.BindPort), - }, - Incarnation: 0, - State: StateSuspect, - StateChange: time.Now().Add(-1 * time.Second), - }) - - addr := net.JoinHostPort(m.config.BindAddr, strconv.Itoa(m.config.BindPort)) - conn, err := net.Dial("tcp", addr) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - defer conn.Close() - - localNodes := make([]pushNodeState, 3) - localNodes[0].Name = "Test 0" - localNodes[0].Addr = m.config.BindAddr - localNodes[0].Port = uint16(m.config.BindPort) - localNodes[0].Incarnation = 1 - localNodes[0].State = StateAlive - localNodes[1].Name = "Test 1" - localNodes[1].Addr = m.config.BindAddr - localNodes[1].Port = uint16(m.config.BindPort) - localNodes[1].Incarnation = 1 - localNodes[1].State = StateAlive - localNodes[2].Name = "Test 2" - localNodes[2].Addr = m.config.BindAddr - localNodes[2].Port = uint16(m.config.BindPort) - localNodes[2].Incarnation = 1 - localNodes[2].State = StateAlive - - // Send our node state - header := pushPullHeader{Nodes: 3} - hd := codec.MsgpackHandle{} - enc := codec.NewEncoder(conn, &hd) - - // Send the push/pull indicator - conn.Write([]byte{byte(pushPullMsg)}) - - if err := enc.Encode(&header); err != nil { - t.Fatalf("unexpected err %s", err) - } - for i := 0; i < header.Nodes; i++ { - if err := enc.Encode(&localNodes[i]); err != nil { - t.Fatalf("unexpected err %s", err) - } - } - - // Read the message type - var msgType messageType - if err := binary.Read(conn, binary.BigEndian, &msgType); err != nil { - t.Fatalf("unexpected err %s", err) - } - - var bufConn io.Reader = conn - msghd := codec.MsgpackHandle{} - dec := codec.NewDecoder(bufConn, &msghd) - - // Check if we have a compressed message - if msgType == compressMsg { - var c compress - if err := dec.Decode(&c); err != nil { - t.Fatalf("unexpected err %s", err) - } - decomp, err := decompressBuffer(&c) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Reset the message type - msgType = messageType(decomp[0]) - - // Create a new bufConn - bufConn = bytes.NewReader(decomp[1:]) - - // Create a new decoder - dec = codec.NewDecoder(bufConn, &hd) - } - - // Quit if not push/pull - if msgType != pushPullMsg { - t.Fatalf("bad message type") - } - - if err := dec.Decode(&header); err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Allocate space for the transfer - remoteNodes := make([]pushNodeState, header.Nodes) - - // Try to decode all the states - for i := 0; i < header.Nodes; i++ { - if err := dec.Decode(&remoteNodes[i]); err != nil { - t.Fatalf("unexpected err %s", err) - } - } - - if len(remoteNodes) != 1 { - t.Fatalf("bad response") - } - - n := &remoteNodes[0] - if n.Name != "Test 0" { - t.Fatalf("bad name") - } - if n.Incarnation != 0 { - t.Fatal("bad incarnation") - } - if n.State != StateSuspect { - t.Fatal("bad state") - } -} - -func TestSendMsg_Piggyback(t *testing.T) { - m := GetMemberlist(t, nil) - defer m.Shutdown() - - // Add a message to be broadcast - a := alive{ - Incarnation: 10, - Node: "rand", - Addr: "127.0.0.255", - Meta: nil, - Vsn: []uint8{ - ProtocolVersionMin, ProtocolVersionMax, ProtocolVersionMin, - 1, 1, 1, - }, - } - m.encodeAndBroadcast("rand", aliveMsg, &a) - - udp := listenUDP(t) - defer udp.Close() - - udpAddr := udp.LocalAddr().(*net.UDPAddr) - - // Encode a ping - ping := ping{ - SeqNo: 42, - SourceAddr: udpAddr.IP.String(), - SourcePort: uint16(udpAddr.Port), - SourceNode: "test", - } - buf, err := encode(pingMsg, ping) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Send - addr := &net.UDPAddr{IP: net.ParseIP(m.config.BindAddr), Port: m.config.BindPort} - _, err = udp.WriteTo(buf.Bytes(), addr) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - // Wait for response - doneCh := make(chan struct{}, 1) - go func() { - select { - case <-doneCh: - case <-time.After(2 * time.Second): - panic("timeout") - } - }() - - in := make([]byte, 1500) - n, _, err := udp.ReadFrom(in) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - in = in[0:n] - - msgType := messageType(in[0]) - if msgType != compoundMsg { - t.Fatalf("bad response %v", in) - } - - // get the parts - trunc, parts, err := decodeCompoundMessage(in[1:]) - if trunc != 0 { - t.Fatalf("unexpected truncation") - } - if len(parts) != 2 { - t.Fatalf("unexpected parts %v", parts) - } - if err != nil { - t.Fatalf("unexpected err %s", err) - } - - var ack ackResp - if err := decode(parts[0][1:], &ack); err != nil { - t.Fatalf("unexpected err %s", err) - } - - if ack.SeqNo != 42 { - t.Fatalf("bad sequence no") - } - - var aliveout alive - if err := decode(parts[1][1:], &aliveout); err != nil { - t.Fatalf("unexpected err %s", err) - } - - if aliveout.Node != "rand" || aliveout.Incarnation != 10 { - t.Fatalf("bad mesg") - } - - doneCh <- struct{}{} -} - -func TestEncryptDecryptState(t *testing.T) { - state := []byte("this is our internal state...") - config := &Config{ - SecretKey: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, - ProtocolVersion: ProtocolVersionMax, - } - - m, err := Create(config) - if err != nil { - t.Fatalf("err: %s", err) - } - defer m.Shutdown() - - crypt, err := m.encryptLocalState(state) - if err != nil { - t.Fatalf("err: %v", err) - } - - // Create reader, seek past the type byte - buf := bytes.NewReader(crypt) - buf.Seek(1, 0) - - plain, err := m.decryptRemoteState(buf) - if err != nil { - t.Fatalf("err: %v", err) - } - - if !reflect.DeepEqual(state, plain) { - t.Fatalf("Decrypt failed: %v", plain) - } -} - -func testConfigNet(tb testing.TB, network byte) *Config { - tb.Helper() - - config := DefaultLANConfig() - config.BindAddr = getBindAddrNet(network).String() - config.Name = config.BindAddr - config.BindPort = 0 // choose free port - config.RequireNodeNames = true - config.Logger = log.New(os.Stderr, config.Name, log.LstdFlags) - return config -} - -func testConfig(tb testing.TB) *Config { - return testConfigNet(tb, 0) -} - -func GetMemberlist(tb testing.TB, f func(c *Config)) *Memberlist { - c := testConfig(tb) - c.BindPort = 0 - if f != nil { - f(c) - } - - m, err := NewMemberlist(c) - require.NoError(tb, err) - return m -} - -func TestRawSendUdp_CRC(t *testing.T) { - m := GetMemberlist(t, func(c *Config) { - c.EnableCompression = false - }) - defer m.Shutdown() - - udp := listenUDP(t) - defer udp.Close() - - a := Address{ - Addr: udp.LocalAddr().String(), - Name: "test", - } - - // Pass a nil node with no nodes registered, should result in no checksum - payload := []byte{3, 3, 3, 3} - m.rawSendMsgPacket(a, nil, payload) - - in := make([]byte, 1500) - n, _, err := udp.ReadFrom(in) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - in = in[0:n] - - if len(in) != 4 { - t.Fatalf("bad: %v", in) - } - - // Pass a non-nil node with PMax >= 5, should result in a checksum - m.rawSendMsgPacket(a, &Node{PMax: 5}, payload) - - in = make([]byte, 1500) - n, _, err = udp.ReadFrom(in) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - in = in[0:n] - - if len(in) != 9 { - t.Fatalf("bad: %v", in) - } - - // Register a node with PMax >= 5 to be looked up, should result in a checksum - m.nodeMap["127.0.0.1"] = &nodeState{ - Node: Node{PMax: 5}, - } - m.rawSendMsgPacket(a, nil, payload) - - in = make([]byte, 1500) - n, _, err = udp.ReadFrom(in) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - in = in[0:n] - - if len(in) != 9 { - t.Fatalf("bad: %v", in) - } -} - -func TestIngestPacket_CRC(t *testing.T) { - m := GetMemberlist(t, func(c *Config) { - c.EnableCompression = false - }) - defer m.Shutdown() - - udp := listenUDP(t) - defer udp.Close() - - a := Address{ - Addr: udp.LocalAddr().String(), - Name: "test", - } - - // Get a message with a checksum - payload := []byte{3, 3, 3, 3} - m.rawSendMsgPacket(a, &Node{PMax: 5}, payload) - - in := make([]byte, 1500) - n, _, err := udp.ReadFrom(in) - if err != nil { - t.Fatalf("unexpected err %s", err) - } - in = in[0:n] - - if len(in) != 9 { - t.Fatalf("bad: %v", in) - } - - // Corrupt the checksum - in[1] <<= 1 - - logs := &bytes.Buffer{} - logger := log.New(logs, "", 0) - m.logger = logger - m.ingestPacket(in, udp.LocalAddr(), time.Now()) - - if !strings.Contains(logs.String(), "invalid checksum") { - t.Fatalf("bad: %s", logs.String()) - } -} - -func TestIngestPacket_ExportedFunc_EmptyMessage(t *testing.T) { - m := GetMemberlist(t, func(c *Config) { - c.EnableCompression = false - }) - defer m.Shutdown() - - udp := listenUDP(t) - defer udp.Close() - - emptyConn := &emptyReadNetConn{} - - logs := &bytes.Buffer{} - logger := log.New(logs, "", 0) - m.logger = logger - - type ingestionAwareTransport interface { - IngestPacket(conn net.Conn, addr net.Addr, now time.Time, shouldClose bool) error - } - - err := m.transport.(ingestionAwareTransport).IngestPacket(emptyConn, udp.LocalAddr(), time.Now(), true) - require.Error(t, err) - require.Contains(t, err.Error(), "packet too short") -} - -type emptyReadNetConn struct { - net.Conn -} - -func (c *emptyReadNetConn) Read(b []byte) (n int, err error) { - return 0, io.EOF -} - -func (c *emptyReadNetConn) Close() error { - return nil -} - -func TestGossip_MismatchedKeys(t *testing.T) { - // Create two agents with different gossip keys - c1 := testConfig(t) - c1.SecretKey = []byte("4W6DGn2VQVqDEceOdmuRTQ==") - c1.BindPort = 56188 - c1.AdvertisePort = 56188 - m1, err := Create(c1) - require.NoError(t, err) - defer m1.Shutdown() - - c2 := testConfig(t) - c2.BindPort = 56189 - c2.AdvertisePort = 56189 - c2.SecretKey = []byte("XhX/w702/JKKK7/7OtM9Ww==") - - m2, err := Create(c2) - require.NoError(t, err) - defer m2.Shutdown() - - // Make sure we get this error on the joining side - m1JoinUrl := fmt.Sprintf("%s/%s:%d", m1.config.Name, m1.advertiseAddr, m1.advertisePort) - _, err = m2.Join([]string{m1JoinUrl}) - if err == nil || !strings.Contains(err.Error(), "No installed keys could decrypt the message") { - t.Fatalf("bad: %s", err) - } -} - -func listenUDP(t *testing.T) *net.UDPConn { - var udp *net.UDPConn - for port := 56199; port < 60000; port++ { - udpAddr := fmt.Sprintf("127.0.0.1:%d", port) - udpLn, err := net.ListenPacket("udp", udpAddr) - if err == nil { - udp = udpLn.(*net.UDPConn) - break - } - } - if udp == nil { - t.Fatalf("no udp listener") - } - return udp -} - -func TestHandleCommand(t *testing.T) { - var buf bytes.Buffer - m := Memberlist{ - logger: log.New(&buf, "", 0), - } - m.handleCommand(nil, &net.TCPAddr{Port: 12345}, time.Now()) - require.Contains(t, buf.String(), "missing message type byte") -} diff --git a/toolkit/memberlist/net_transport.go b/toolkit/memberlist/net_transport.go deleted file mode 100644 index 63caa64d..00000000 --- a/toolkit/memberlist/net_transport.go +++ /dev/null @@ -1,353 +0,0 @@ -package memberlist - -import ( - "bytes" - "fmt" - "io" - "log" - "net" - "sync" - "sync/atomic" - "time" - - "github.com/armon/go-metrics" - sockaddr "github.com/hashicorp/go-sockaddr" -) - -const ( - // udpPacketBufSize is used to buffer incoming packets during read - // operations. - udpPacketBufSize = 65536 - - // udpRecvBufSize is a large buffer size that we attempt to set UDP - // sockets to in order to handle a large volume of messages. - udpRecvBufSize = 2 * 1024 * 1024 -) - -// NetTransportConfig is used to configure a net transport. -type NetTransportConfig struct { - // BindAddrs is a list of addresses to bind to for both TCP and UDP - // communications. - BindAddrs []string - - // BindPort is the port to listen on, for each address above. - BindPort int - - // Logger is a logger for operator messages. - Logger *log.Logger -} - -// NetTransport is a Transport implementation that uses connectionless UDP for -// packet operations, and ad-hoc TCP connections for stream operations. -type NetTransport struct { - config *NetTransportConfig - packetCh chan *Packet - streamCh chan net.Conn - logger *log.Logger - wg sync.WaitGroup - tcpListeners []*net.TCPListener - udpListeners []*net.UDPConn - shutdown int32 -} - -var _ NodeAwareTransport = (*NetTransport)(nil) - -// NewNetTransport returns a net transport with the given configuration. On -// success all the network listeners will be created and listening. -func NewNetTransport(config *NetTransportConfig) (*NetTransport, error) { - // If we reject the empty list outright we can assume that there's at - // least one listener of each type later during operation. - if len(config.BindAddrs) == 0 { - return nil, fmt.Errorf("At least one bind address is required") - } - - // Build out the new transport. - var ok bool - t := NetTransport{ - config: config, - packetCh: make(chan *Packet), - streamCh: make(chan net.Conn), - logger: config.Logger, - } - - // Clean up listeners if there's an error. - defer func() { - if !ok { - t.Shutdown() - } - }() - - // Build all the TCP and UDP listeners. - port := config.BindPort - for _, addr := range config.BindAddrs { - ip := net.ParseIP(addr) - - tcpAddr := &net.TCPAddr{IP: ip, Port: port} - tcpLn, err := net.ListenTCP("tcp", tcpAddr) - if err != nil { - return nil, fmt.Errorf("Failed to start TCP listener on %q port %d: %v", addr, port, err) - } - t.tcpListeners = append(t.tcpListeners, tcpLn) - - // If the config port given was zero, use the first TCP listener - // to pick an available port and then apply that to everything - // else. - if port == 0 { - port = tcpLn.Addr().(*net.TCPAddr).Port - } - - udpAddr := &net.UDPAddr{IP: ip, Port: port} - udpLn, err := net.ListenUDP("udp", udpAddr) - if err != nil { - return nil, fmt.Errorf("Failed to start UDP listener on %q port %d: %v", addr, port, err) - } - if err := setUDPRecvBuf(udpLn); err != nil { - return nil, fmt.Errorf("Failed to resize UDP buffer: %v", err) - } - t.udpListeners = append(t.udpListeners, udpLn) - } - - // Fire them up now that we've been able to create them all. - for i := 0; i < len(config.BindAddrs); i++ { - t.wg.Add(2) - go t.tcpListen(t.tcpListeners[i]) - go t.udpListen(t.udpListeners[i]) - } - - ok = true - return &t, nil -} - -// GetAutoBindPort returns the bind port that was automatically given by the -// kernel, if a bind port of 0 was given. -func (t *NetTransport) GetAutoBindPort() int { - // We made sure there's at least one TCP listener, and that one's - // port was applied to all the others for the dynamic bind case. - return t.tcpListeners[0].Addr().(*net.TCPAddr).Port -} - -// See Transport. -func (t *NetTransport) FinalAdvertiseAddr(ip string, port int) (string, int, error) { - var advertiseAddr string - var advertisePort int - if ip != "" { - advertiseAddr = ip - advertisePort = port - } else { - if t.config.BindAddrs[0] == "0.0.0.0" { - // Otherwise, if we're not bound to a specific IP, let's - // use a suitable private IP address. - var err error - ip, err = sockaddr.GetPrivateIP() - if err != nil { - return "", 0, fmt.Errorf("failed to get interface addresses: %v", err) - } - if ip == "" { - return "", 0, fmt.Errorf("no private IP address found, and explicit IP not provided") - } - advertiseAddr = ip - } else { - // Use the IP that we're bound to, based on the first - // TCP listener, which we already ensure is there. - advertiseAddr = t.tcpListeners[0].Addr().(*net.TCPAddr).IP.String() - } - - // Use the port we are bound to. - advertisePort = t.GetAutoBindPort() - } - - return advertiseAddr, advertisePort, nil -} - -// See Transport. -func (t *NetTransport) WriteTo(b []byte, addr string) (time.Time, error) { - a := Address{Addr: addr, Name: ""} - return t.WriteToAddress(b, a) -} - -// See NodeAwareTransport. -func (t *NetTransport) WriteToAddress(b []byte, a Address) (time.Time, error) { - addr := a.Addr - - udpAddr, err := net.ResolveUDPAddr("udp", addr) - if err != nil { - return time.Time{}, err - } - - // We made sure there's at least one UDP listener, so just use the - // packet sending interface on the first one. Take the time after the - // write call comes back, which will underestimate the time a little, - // but help account for any delays before the write occurs. - _, err = t.udpListeners[0].WriteTo(b, udpAddr) - return time.Now(), err -} - -// See Transport. -func (t *NetTransport) PacketCh() <-chan *Packet { - return t.packetCh -} - -// See IngestionAwareTransport. -func (t *NetTransport) IngestPacket(conn net.Conn, addr net.Addr, now time.Time, shouldClose bool) error { - if shouldClose { - defer conn.Close() - } - - // Copy everything from the stream into packet buffer. - var buf bytes.Buffer - if _, err := io.Copy(&buf, conn); err != nil { - return fmt.Errorf("failed to read packet: %v", err) - } - - // Check the length - it needs to have at least one byte to be a proper - // message. This is checked elsewhere for writes coming in directly from - // the UDP socket. - if n := buf.Len(); n < 1 { - return fmt.Errorf("packet too short (%d bytes) %s", n, LogAddress(addr)) - } - - // Inject the packet. - t.packetCh <- &Packet{ - Buf: buf.Bytes(), - From: addr, - Timestamp: now, - } - return nil -} - -// See Transport. -func (t *NetTransport) DialTimeout(addr string, timeout time.Duration) (net.Conn, error) { - a := Address{Addr: addr, Name: ""} - return t.DialAddressTimeout(a, timeout) -} - -// See NodeAwareTransport. -func (t *NetTransport) DialAddressTimeout(a Address, timeout time.Duration) (net.Conn, error) { - addr := a.Addr - - dialer := net.Dialer{Timeout: timeout} - return dialer.Dial("tcp", addr) -} - -// See Transport. -func (t *NetTransport) StreamCh() <-chan net.Conn { - return t.streamCh -} - -// See IngestionAwareTransport. -func (t *NetTransport) IngestStream(conn net.Conn) error { - t.streamCh <- conn - return nil -} - -// See Transport. -func (t *NetTransport) Shutdown() error { - // This will avoid log spam about errors when we shut down. - atomic.StoreInt32(&t.shutdown, 1) - - // Rip through all the connections and shut them down. - for _, conn := range t.tcpListeners { - conn.Close() - } - for _, conn := range t.udpListeners { - conn.Close() - } - - // Block until all the listener threads have died. - t.wg.Wait() - return nil -} - -// tcpListen is a long running goroutine that accepts incoming TCP connections -// and hands them off to the stream channel. -func (t *NetTransport) tcpListen(tcpLn *net.TCPListener) { - defer t.wg.Done() - - // baseDelay is the initial delay after an AcceptTCP() error before attempting again - const baseDelay = 5 * time.Millisecond - - // maxDelay is the maximum delay after an AcceptTCP() error before attempting again. - // In the case that tcpListen() is error-looping, it will delay the shutdown check. - // Therefore, changes to maxDelay may have an effect on the latency of shutdown. - const maxDelay = 1 * time.Second - - var loopDelay time.Duration - for { - conn, err := tcpLn.AcceptTCP() - if err != nil { - if s := atomic.LoadInt32(&t.shutdown); s == 1 { - break - } - - if loopDelay == 0 { - loopDelay = baseDelay - } else { - loopDelay *= 2 - } - - if loopDelay > maxDelay { - loopDelay = maxDelay - } - - t.logger.Printf("[ERR] memberlist: Error accepting TCP connection: %v", err) - time.Sleep(loopDelay) - continue - } - // No error, reset loop delay - loopDelay = 0 - - t.streamCh <- conn - } -} - -// udpListen is a long running goroutine that accepts incoming UDP packets and -// hands them off to the packet channel. -func (t *NetTransport) udpListen(udpLn *net.UDPConn) { - defer t.wg.Done() - for { - // Do a blocking read into a fresh buffer. Grab a time stamp as - // close as possible to the I/O. - buf := make([]byte, udpPacketBufSize) - n, addr, err := udpLn.ReadFrom(buf) - ts := time.Now() - if err != nil { - if s := atomic.LoadInt32(&t.shutdown); s == 1 { - break - } - - t.logger.Printf("[ERR] memberlist: Error reading UDP packet: %v", err) - continue - } - - // Check the length - it needs to have at least one byte to be a - // proper message. - if n < 1 { - t.logger.Printf("[ERR] memberlist: UDP packet too short (%d bytes) %s", - len(buf), LogAddress(addr)) - continue - } - - // Ingest the packet. - metrics.IncrCounter([]string{"memberlist", "udp", "received"}, float32(n)) - t.packetCh <- &Packet{ - Buf: buf[:n], - From: addr, - Timestamp: ts, - } - } -} - -// setUDPRecvBuf is used to resize the UDP receive window. The function -// attempts to set the read buffer to `udpRecvBuf` but backs off until -// the read buffer can be set. -func setUDPRecvBuf(c *net.UDPConn) error { - size := udpRecvBufSize - var err error - for size > 0 { - if err = c.SetReadBuffer(size); err == nil { - return nil - } - size = size / 2 - } - return err -} diff --git a/toolkit/memberlist/ping_delegate.go b/toolkit/memberlist/ping_delegate.go deleted file mode 100644 index 1566c8b3..00000000 --- a/toolkit/memberlist/ping_delegate.go +++ /dev/null @@ -1,14 +0,0 @@ -package memberlist - -import "time" - -// PingDelegate is used to notify an observer how long it took for a ping message to -// complete a round trip. It can also be used for writing arbitrary byte slices -// into ack messages. Note that in order to be meaningful for RTT estimates, this -// delegate does not apply to indirect pings, nor fallback pings sent over TCP. -type PingDelegate interface { - // AckPayload is invoked when an ack is being sent; the returned bytes will be appended to the ack - AckPayload() []byte - // NotifyPing is invoked when an ack for a ping is received - NotifyPingComplete(other *Node, rtt time.Duration, payload []byte) -} diff --git a/toolkit/memberlist/queue.go b/toolkit/memberlist/queue.go deleted file mode 100644 index 9d7876d9..00000000 --- a/toolkit/memberlist/queue.go +++ /dev/null @@ -1,429 +0,0 @@ -package memberlist - -import ( - "math" - "sync" - - "github.com/google/btree" -) - -//go:generate mockgen -destination ./mock/mock_queue.go -package mock -source=./queue.go - -// TransmitLimitedQueue is used to queue messages to broadcast to -// the cluster (via gossip) but limits the number of transmits per -// message. It also prioritizes messages with lower transmit counts -// (hence newer messages). -type TransmitLimitedQueue struct { - // NumNodes returns the number of nodes in the cluster. This is - // used to determine the retransmit count, which is calculated - // based on the log of this. - NumNodes func() int - - // RetransmitMult is the multiplier used to determine the maximum - // number of retransmissions attempted. - RetransmitMult int - RetransmitMultGetter func() int - - mu sync.Mutex - tq *btree.BTree // stores *limitedBroadcast as btree.Item - tm map[string]*limitedBroadcast - idGen int64 -} - -type limitedBroadcast struct { - transmits int // btree-key[0]: Number of transmissions attempted. - msgLen int64 // btree-key[1]: copied from len(b.Message()) - id int64 // btree-key[2]: unique incrementing id stamped at submission time - b Broadcast - - name string // set if Broadcast is a NamedBroadcast -} - -// Less tests whether the current item is less than the given argument. -// -// This must provide a strict weak ordering. -// If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only -// hold one of either a or b in the tree). -// -// default ordering is -// - [transmits=0, ..., transmits=inf] -// - [transmits=0:len=999, ..., transmits=0:len=2, ...] -// - [transmits=0:len=999,id=999, ..., transmits=0:len=999:id=1, ...] -func (b *limitedBroadcast) Less(than btree.Item) bool { - o := than.(*limitedBroadcast) - if b.transmits < o.transmits { - return true - } else if b.transmits > o.transmits { - return false - } - if b.msgLen > o.msgLen { - return true - } else if b.msgLen < o.msgLen { - return false - } - return b.id > o.id -} - -// for testing; emits in transmit order if reverse=false -func (q *TransmitLimitedQueue) orderedView(reverse bool) []*limitedBroadcast { - q.mu.Lock() - defer q.mu.Unlock() - - out := make([]*limitedBroadcast, 0, q.lenLocked()) - q.walkReadOnlyLocked(reverse, func(cur *limitedBroadcast) bool { - out = append(out, cur) - return true - }) - - return out -} - -// walkReadOnlyLocked calls f for each item in the queue traversing it in -// natural order (by Less) when reverse=false and the opposite when true. You -// must hold the mutex. -// -// This method panics if you attempt to mutate the item during traversal. The -// underlying btree should also not be mutated during traversal. -func (q *TransmitLimitedQueue) walkReadOnlyLocked(reverse bool, f func(*limitedBroadcast) bool) { - if q.lenLocked() == 0 { - return - } - - iter := func(item btree.Item) bool { - cur := item.(*limitedBroadcast) - - prevTransmits := cur.transmits - prevMsgLen := cur.msgLen - prevID := cur.id - - keepGoing := f(cur) - - if prevTransmits != cur.transmits || prevMsgLen != cur.msgLen || prevID != cur.id { - panic("edited queue while walking read only") - } - - return keepGoing - } - - if reverse { - q.tq.Descend(iter) // end with transmit 0 - } else { - q.tq.Ascend(iter) // start with transmit 0 - } -} - -// Broadcast is something that can be broadcasted via gossip to -// the memberlist cluster. -type Broadcast interface { - // Invalidates checks if enqueuing the current broadcast - // invalidates a previous broadcast - Invalidates(b Broadcast) bool - - // Returns a byte form of the message - Message() []byte - - // Finished is invoked when the message will no longer - // be broadcast, either due to invalidation or to the - // transmit limit being reached - Finished() -} - -// NamedBroadcast is an optional extension of the Broadcast interface that -// gives each message a unique string name, and that is used to optimize -// -// You shoud ensure that Invalidates() checks the same uniqueness as the -// example below: -// -// func (b *foo) Invalidates(other Broadcast) bool { -// nb, ok := other.(NamedBroadcast) -// if !ok { -// return false -// } -// return b.Name() == nb.Name() -// } -// -// Invalidates() isn't currently used for NamedBroadcasts, but that may change -// in the future. -type NamedBroadcast interface { - Broadcast - // The unique identity of this broadcast message. - Name() string -} - -// UniqueBroadcast is an optional interface that indicates that each message is -// intrinsically unique and there is no need to scan the broadcast queue for -// duplicates. -// -// You should ensure that Invalidates() always returns false if implementing -// this interface. Invalidates() isn't currently used for UniqueBroadcasts, but -// that may change in the future. -type UniqueBroadcast interface { - Broadcast - // UniqueBroadcast is just a marker method for this interface. - UniqueBroadcast() -} - -// QueueBroadcast is used to enqueue a broadcast -func (q *TransmitLimitedQueue) QueueBroadcast(b Broadcast) { - q.queueBroadcast(b, 0) -} - -// lazyInit initializes internal data structures the first time they are -// needed. You must already hold the mutex. -func (q *TransmitLimitedQueue) lazyInit() { - if q.tq == nil { - q.tq = btree.New(32) - } - if q.tm == nil { - q.tm = make(map[string]*limitedBroadcast) - } -} - -// queueBroadcast is like QueueBroadcast but you can use a nonzero value for -// the initial transmit tier assigned to the message. This is meant to be used -// for unit testing. -func (q *TransmitLimitedQueue) queueBroadcast(b Broadcast, initialTransmits int) { - q.mu.Lock() - defer q.mu.Unlock() - - q.lazyInit() - - if q.idGen == math.MaxInt64 { - // it's super duper unlikely to wrap around within the retransmit limit - q.idGen = 1 - } else { - q.idGen++ - } - id := q.idGen - - lb := &limitedBroadcast{ - transmits: initialTransmits, - msgLen: int64(len(b.Message())), - id: id, - b: b, - } - unique := false - if nb, ok := b.(NamedBroadcast); ok { - lb.name = nb.Name() - } else if _, ok := b.(UniqueBroadcast); ok { - unique = true - } - - // Check if this message invalidates another. - if lb.name != "" { - if old, ok := q.tm[lb.name]; ok { - old.b.Finished() - q.deleteItem(old) - } - } else if !unique { - // Slow path, hopefully nothing hot hits this. - var remove []*limitedBroadcast - q.tq.Ascend(func(item btree.Item) bool { - cur := item.(*limitedBroadcast) - - // Special Broadcasts can only invalidate each other. - switch cur.b.(type) { - case NamedBroadcast: - // noop - case UniqueBroadcast: - // noop - default: - if b.Invalidates(cur.b) { - cur.b.Finished() - remove = append(remove, cur) - } - } - return true - }) - for _, cur := range remove { - q.deleteItem(cur) - } - } - - // Append to the relevant queue. - q.addItem(lb) -} - -// deleteItem removes the given item from the overall datastructure. You -// must already hold the mutex. -func (q *TransmitLimitedQueue) deleteItem(cur *limitedBroadcast) { - _ = q.tq.Delete(cur) - if cur.name != "" { - delete(q.tm, cur.name) - } - - if q.tq.Len() == 0 { - // At idle there's no reason to let the id generator keep going - // indefinitely. - q.idGen = 0 - } -} - -// addItem adds the given item into the overall datastructure. You must already -// hold the mutex. -func (q *TransmitLimitedQueue) addItem(cur *limitedBroadcast) { - _ = q.tq.ReplaceOrInsert(cur) - if cur.name != "" { - q.tm[cur.name] = cur - } -} - -// getTransmitRange returns a pair of min/max values for transmit values -// represented by the current queue contents. Both values represent actual -// transmit values on the interval [0, len). You must already hold the mutex. -func (q *TransmitLimitedQueue) getTransmitRange() (minTransmit, maxTransmit int) { - if q.lenLocked() == 0 { - return 0, 0 - } - minItem, maxItem := q.tq.Min(), q.tq.Max() - if minItem == nil || maxItem == nil { - return 0, 0 - } - - min := minItem.(*limitedBroadcast).transmits - max := maxItem.(*limitedBroadcast).transmits - - return min, max -} - -// GetBroadcasts is used to get a number of broadcasts, up to a byte limit -// and applying a per-message overhead as provided. -func (q *TransmitLimitedQueue) GetBroadcasts(overhead, limit int) [][]byte { - q.mu.Lock() - defer q.mu.Unlock() - - // Fast path the default case - if q.lenLocked() == 0 { - return nil - } - - mult := q.RetransmitMult - if q.RetransmitMultGetter != nil { - mult = q.RetransmitMultGetter() - } - transmitLimit := retransmitLimit(mult, q.NumNodes()) - - var ( - bytesUsed int - toSend [][]byte - reinsert []*limitedBroadcast - ) - - // Visit fresher items first, but only look at stuff that will fit. - // We'll go tier by tier, grabbing the largest items first. - minTr, maxTr := q.getTransmitRange() - for transmits := minTr; transmits <= maxTr; /*do not advance automatically*/ { - free := int64(limit - bytesUsed - overhead) - if free <= 0 { - break // bail out early - } - - // Search for the least element on a given tier (by transmit count) as - // defined in the limitedBroadcast.Less function that will fit into our - // remaining space. - greaterOrEqual := &limitedBroadcast{ - transmits: transmits, - msgLen: free, - id: math.MaxInt64, - } - lessThan := &limitedBroadcast{ - transmits: transmits + 1, - msgLen: math.MaxInt64, - id: math.MaxInt64, - } - var keep *limitedBroadcast - q.tq.AscendRange(greaterOrEqual, lessThan, func(item btree.Item) bool { - cur := item.(*limitedBroadcast) - // Check if this is within our limits - if int64(len(cur.b.Message())) > free { - // If this happens it's a bug in the datastructure or - // surrounding use doing something like having len(Message()) - // change over time. There's enough going on here that it's - // probably sane to just skip it and move on for now. - return true - } - keep = cur - return false - }) - if keep == nil { - // No more items of an appropriate size in the tier. - transmits++ - continue - } - - msg := keep.b.Message() - - // Add to slice to send - bytesUsed += overhead + len(msg) - toSend = append(toSend, msg) - - // Check if we should stop transmission - q.deleteItem(keep) - if keep.transmits+1 >= transmitLimit { - keep.b.Finished() - } else { - // We need to bump this item down to another transmit tier, but - // because it would be in the same direction that we're walking the - // tiers, we will have to delay the reinsertion until we are - // finished our search. Otherwise we'll possibly re-add the message - // when we ascend to the next tier. - keep.transmits++ - reinsert = append(reinsert, keep) - } - } - - for _, cur := range reinsert { - q.addItem(cur) - } - - return toSend -} - -// NumQueued returns the number of queued messages -func (q *TransmitLimitedQueue) NumQueued() int { - q.mu.Lock() - defer q.mu.Unlock() - return q.lenLocked() -} - -// lenLocked returns the length of the overall queue datastructure. You must -// hold the mutex. -func (q *TransmitLimitedQueue) lenLocked() int { - if q.tq == nil { - return 0 - } - return q.tq.Len() -} - -// Reset clears all the queued messages. Should only be used for tests. -func (q *TransmitLimitedQueue) Reset() { - q.mu.Lock() - defer q.mu.Unlock() - - q.walkReadOnlyLocked(false, func(cur *limitedBroadcast) bool { - cur.b.Finished() - return true - }) - - q.tq = nil - q.tm = nil - q.idGen = 0 -} - -// Prune will retain the maxRetain latest messages, and the rest -// will be discarded. This can be used to prevent unbounded queue sizes -func (q *TransmitLimitedQueue) Prune(maxRetain int) { - q.mu.Lock() - defer q.mu.Unlock() - - // Do nothing if queue size is less than the limit - for q.tq.Len() > maxRetain { - item := q.tq.Max() - if item == nil { - break - } - cur := item.(*limitedBroadcast) - cur.b.Finished() - q.deleteItem(cur) - } -} diff --git a/toolkit/memberlist/queue_test.go b/toolkit/memberlist/queue_test.go deleted file mode 100644 index dcf3f245..00000000 --- a/toolkit/memberlist/queue_test.go +++ /dev/null @@ -1,228 +0,0 @@ -package memberlist - -import ( - "testing" - - "github.com/google/btree" - "github.com/stretchr/testify/require" -) - -func TestLimitedBroadcastLess(t *testing.T) { - cases := []struct { - Name string - A *limitedBroadcast // lesser - B *limitedBroadcast - }{ - { - "diff-transmits", - &limitedBroadcast{transmits: 0, msgLen: 10, id: 100}, - &limitedBroadcast{transmits: 1, msgLen: 10, id: 100}, - }, - { - "same-transmits--diff-len", - &limitedBroadcast{transmits: 0, msgLen: 12, id: 100}, - &limitedBroadcast{transmits: 0, msgLen: 10, id: 100}, - }, - { - "same-transmits--same-len--diff-id", - &limitedBroadcast{transmits: 0, msgLen: 12, id: 100}, - &limitedBroadcast{transmits: 0, msgLen: 12, id: 90}, - }, - } - - for _, c := range cases { - t.Run(c.Name, func(t *testing.T) { - a, b := c.A, c.B - - require.True(t, a.Less(b)) - - tree := btree.New(32) - - tree.ReplaceOrInsert(b) - tree.ReplaceOrInsert(a) - - min := tree.Min().(*limitedBroadcast) - require.Equal(t, a.transmits, min.transmits) - require.Equal(t, a.msgLen, min.msgLen) - require.Equal(t, a.id, min.id) - - max := tree.Max().(*limitedBroadcast) - require.Equal(t, b.transmits, max.transmits) - require.Equal(t, b.msgLen, max.msgLen) - require.Equal(t, b.id, max.id) - }) - } -} - -func TestTransmitLimited_Queue(t *testing.T) { - q := &TransmitLimitedQueue{RetransmitMult: 1, NumNodes: func() int { return 1 }} - q.QueueBroadcast(&memberlistBroadcast{"test", nil, nil}) - q.QueueBroadcast(&memberlistBroadcast{"foo", nil, nil}) - q.QueueBroadcast(&memberlistBroadcast{"bar", nil, nil}) - - if q.NumQueued() != 3 { - t.Fatalf("bad len") - } - dump := q.orderedView(true) - if dump[0].b.(*memberlistBroadcast).node != "test" { - t.Fatalf("missing test") - } - if dump[1].b.(*memberlistBroadcast).node != "foo" { - t.Fatalf("missing foo") - } - if dump[2].b.(*memberlistBroadcast).node != "bar" { - t.Fatalf("missing bar") - } - - // Should invalidate previous message - q.QueueBroadcast(&memberlistBroadcast{"test", nil, nil}) - - if q.NumQueued() != 3 { - t.Fatalf("bad len") - } - dump = q.orderedView(true) - if dump[0].b.(*memberlistBroadcast).node != "foo" { - t.Fatalf("missing foo") - } - if dump[1].b.(*memberlistBroadcast).node != "bar" { - t.Fatalf("missing bar") - } - if dump[2].b.(*memberlistBroadcast).node != "test" { - t.Fatalf("missing test") - } -} - -func TestTransmitLimited_GetBroadcasts(t *testing.T) { - q := &TransmitLimitedQueue{RetransmitMult: 3, NumNodes: func() int { return 10 }} - - // 18 bytes per message - q.QueueBroadcast(&memberlistBroadcast{"test", []byte("1. this is a test."), nil}) - q.QueueBroadcast(&memberlistBroadcast{"foo", []byte("2. this is a test."), nil}) - q.QueueBroadcast(&memberlistBroadcast{"bar", []byte("3. this is a test."), nil}) - q.QueueBroadcast(&memberlistBroadcast{"baz", []byte("4. this is a test."), nil}) - - // 2 byte overhead per message, should get all 4 messages - all := q.GetBroadcasts(2, 80) - require.Equal(t, 4, len(all), "missing messages: %v", prettyPrintMessages(all)) - - // 3 byte overhead, should only get 3 messages back - partial := q.GetBroadcasts(3, 80) - require.Equal(t, 3, len(partial), "missing messages: %v", prettyPrintMessages(partial)) -} - -func TestTransmitLimited_GetBroadcasts_Limit(t *testing.T) { - q := &TransmitLimitedQueue{RetransmitMult: 1, NumNodes: func() int { return 10 }} - - require.Equal(t, int64(0), q.idGen, "the id generator seed starts at zero") - require.Equal(t, 2, retransmitLimit(q.RetransmitMult, q.NumNodes()), "sanity check transmit limits") - - // 18 bytes per message - q.QueueBroadcast(&memberlistBroadcast{"test", []byte("1. this is a test."), nil}) - q.QueueBroadcast(&memberlistBroadcast{"foo", []byte("2. this is a test."), nil}) - q.QueueBroadcast(&memberlistBroadcast{"bar", []byte("3. this is a test."), nil}) - q.QueueBroadcast(&memberlistBroadcast{"baz", []byte("4. this is a test."), nil}) - - require.Equal(t, int64(4), q.idGen, "we handed out 4 IDs") - - // 3 byte overhead, should only get 3 messages back - partial1 := q.GetBroadcasts(3, 80) - require.Equal(t, 3, len(partial1), "missing messages: %v", prettyPrintMessages(partial1)) - - require.Equal(t, int64(4), q.idGen, "id generator doesn't reset until empty") - - partial2 := q.GetBroadcasts(3, 80) - require.Equal(t, 3, len(partial2), "missing messages: %v", prettyPrintMessages(partial2)) - - require.Equal(t, int64(4), q.idGen, "id generator doesn't reset until empty") - - // Only two not expired - partial3 := q.GetBroadcasts(3, 80) - require.Equal(t, 2, len(partial3), "missing messages: %v", prettyPrintMessages(partial3)) - - require.Equal(t, int64(0), q.idGen, "id generator resets on empty") - - // Should get nothing - partial5 := q.GetBroadcasts(3, 80) - require.Equal(t, 0, len(partial5), "missing messages: %v", prettyPrintMessages(partial5)) - - require.Equal(t, int64(0), q.idGen, "id generator resets on empty") -} - -func prettyPrintMessages(msgs [][]byte) []string { - var out []string - for _, msg := range msgs { - out = append(out, "'"+string(msg)+"'") - } - return out -} - -func TestTransmitLimited_Prune(t *testing.T) { - q := &TransmitLimitedQueue{RetransmitMult: 1, NumNodes: func() int { return 10 }} - - ch1 := make(chan struct{}, 1) - ch2 := make(chan struct{}, 1) - - // 18 bytes per message - q.QueueBroadcast(&memberlistBroadcast{"test", []byte("1. this is a test."), ch1}) - q.QueueBroadcast(&memberlistBroadcast{"foo", []byte("2. this is a test."), ch2}) - q.QueueBroadcast(&memberlistBroadcast{"bar", []byte("3. this is a test."), nil}) - q.QueueBroadcast(&memberlistBroadcast{"baz", []byte("4. this is a test."), nil}) - - // Keep only 2 - q.Prune(2) - - require.Equal(t, 2, q.NumQueued()) - - // Should notify the first two - select { - case <-ch1: - default: - t.Fatalf("expected invalidation") - } - select { - case <-ch2: - default: - t.Fatalf("expected invalidation") - } - - dump := q.orderedView(true) - - if dump[0].b.(*memberlistBroadcast).node != "bar" { - t.Fatalf("missing bar") - } - if dump[1].b.(*memberlistBroadcast).node != "baz" { - t.Fatalf("missing baz") - } -} - -func TestTransmitLimited_ordering(t *testing.T) { - q := &TransmitLimitedQueue{RetransmitMult: 1, NumNodes: func() int { return 10 }} - - insert := func(name string, transmits int) { - q.queueBroadcast(&memberlistBroadcast{name, []byte(name), make(chan struct{})}, transmits) - } - - insert("node0", 0) - insert("node1", 10) - insert("node2", 3) - insert("node3", 4) - insert("node4", 7) - - dump := q.orderedView(true) - - if dump[0].transmits != 10 { - t.Fatalf("bad val %v, %d", dump[0].b.(*memberlistBroadcast).node, dump[0].transmits) - } - if dump[1].transmits != 7 { - t.Fatalf("bad val %v, %d", dump[7].b.(*memberlistBroadcast).node, dump[7].transmits) - } - if dump[2].transmits != 4 { - t.Fatalf("bad val %v, %d", dump[2].b.(*memberlistBroadcast).node, dump[2].transmits) - } - if dump[3].transmits != 3 { - t.Fatalf("bad val %v, %d", dump[3].b.(*memberlistBroadcast).node, dump[3].transmits) - } - if dump[4].transmits != 0 { - t.Fatalf("bad val %v, %d", dump[4].b.(*memberlistBroadcast).node, dump[4].transmits) - } -} diff --git a/toolkit/memberlist/security.go b/toolkit/memberlist/security.go deleted file mode 100644 index 22e87bd5..00000000 --- a/toolkit/memberlist/security.go +++ /dev/null @@ -1,199 +0,0 @@ -package memberlist - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "fmt" - "io" -) - -/* -Encrypted messages are prefixed with an encryptionVersion byte -that is used for us to be able to properly encode/decode. We -currently support the following versions: - - 0 - AES-GCM 128, using PKCS7 padding - 1 - AES-GCM 128, no padding. Padding not needed, caused bloat. -*/ -type encryptionVersion uint8 - -const ( - minEncryptionVersion encryptionVersion = 0 - maxEncryptionVersion encryptionVersion = 1 -) - -const ( - versionSize = 1 - nonceSize = 12 - tagSize = 16 - maxPadOverhead = 16 - blockSize = aes.BlockSize -) - -// pkcs7encode is used to pad a byte buffer to a specific block size using -// the PKCS7 algorithm. "Ignores" some bytes to compensate for IV -func pkcs7encode(buf *bytes.Buffer, ignore, blockSize int) { - n := buf.Len() - ignore - more := blockSize - (n % blockSize) - for i := 0; i < more; i++ { - buf.WriteByte(byte(more)) - } -} - -// pkcs7decode is used to decode a buffer that has been padded -func pkcs7decode(buf []byte, blockSize int) []byte { - if len(buf) == 0 { - panic("Cannot decode a PKCS7 buffer of zero length") - } - n := len(buf) - last := buf[n-1] - n -= int(last) - return buf[:n] -} - -// encryptOverhead returns the maximum possible overhead of encryption by version -func encryptOverhead(vsn encryptionVersion) int { - switch vsn { - case 0: - return 45 // Version: 1, IV: 12, Padding: 16, Tag: 16 - case 1: - return 29 // Version: 1, IV: 12, Tag: 16 - default: - panic("unsupported version") - } -} - -// encryptedLength is used to compute the buffer size needed -// for a message of given length -func encryptedLength(vsn encryptionVersion, inp int) int { - // If we are on version 1, there is no padding - if vsn >= 1 { - return versionSize + nonceSize + inp + tagSize - } - - // Determine the padding size - padding := blockSize - (inp % blockSize) - - // Sum the extra parts to get total size - return versionSize + nonceSize + inp + padding + tagSize -} - -// encryptPayload is used to encrypt a message with a given key. -// We make use of AES-128 in GCM mode. New byte buffer is the version, -// nonce, ciphertext and tag -func encryptPayload(vsn encryptionVersion, key []byte, msg []byte, data []byte, dst *bytes.Buffer) error { - // Get the AES block cipher - aesBlock, err := aes.NewCipher(key) - if err != nil { - return err - } - - // Get the GCM cipher mode - gcm, err := cipher.NewGCM(aesBlock) - if err != nil { - return err - } - - // Grow the buffer to make room for everything - offset := dst.Len() - dst.Grow(encryptedLength(vsn, len(msg))) - - // Write the encryption version - dst.WriteByte(byte(vsn)) - - // Add a random nonce - _, err = io.CopyN(dst, rand.Reader, nonceSize) - if err != nil { - return err - } - afterNonce := dst.Len() - - // Ensure we are correctly padded (only version 0) - if vsn == 0 { - io.Copy(dst, bytes.NewReader(msg)) - pkcs7encode(dst, offset+versionSize+nonceSize, aes.BlockSize) - } - - // Encrypt message using GCM - slice := dst.Bytes()[offset:] - nonce := slice[versionSize : versionSize+nonceSize] - - // Message source depends on the encryption version. - // Version 0 uses padding, version 1 does not - var src []byte - if vsn == 0 { - src = slice[versionSize+nonceSize:] - } else { - src = msg - } - out := gcm.Seal(nil, nonce, src, data) - - // Truncate the plaintext, and write the cipher text - dst.Truncate(afterNonce) - dst.Write(out) - return nil -} - -// decryptMessage performs the actual decryption of ciphertext. This is in its -// own function to allow it to be called on all keys easily. -func decryptMessage(key, msg []byte, data []byte) ([]byte, error) { - // Get the AES block cipher - aesBlock, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - // Get the GCM cipher mode - gcm, err := cipher.NewGCM(aesBlock) - if err != nil { - return nil, err - } - - // Decrypt the message - nonce := msg[versionSize : versionSize+nonceSize] - ciphertext := msg[versionSize+nonceSize:] - plain, err := gcm.Open(nil, nonce, ciphertext, data) - if err != nil { - return nil, err - } - - // Success! - return plain, nil -} - -// decryptPayload is used to decrypt a message with a given key, -// and verify it's contents. Any padding will be removed, and a -// slice to the plaintext is returned. Decryption is done IN PLACE! -func decryptPayload(keys [][]byte, msg []byte, data []byte) ([]byte, error) { - // Ensure we have at least one byte - if len(msg) == 0 { - return nil, fmt.Errorf("Cannot decrypt empty payload") - } - - // Verify the version - vsn := encryptionVersion(msg[0]) - if vsn > maxEncryptionVersion { - return nil, fmt.Errorf("Unsupported encryption version %d", msg[0]) - } - - // Ensure the length is sane - if len(msg) < encryptedLength(vsn, 0) { - return nil, fmt.Errorf("Payload is too small to decrypt: %d", len(msg)) - } - - for _, key := range keys { - plain, err := decryptMessage(key, msg, data) - if err == nil { - // Remove the PKCS7 padding for vsn 0 - if vsn == 0 { - return pkcs7decode(plain, aes.BlockSize), nil - } else { - return plain, nil - } - } - } - - return nil, fmt.Errorf("No installed keys could decrypt the message") -} diff --git a/toolkit/memberlist/security_test.go b/toolkit/memberlist/security_test.go deleted file mode 100644 index 15fa4aa8..00000000 --- a/toolkit/memberlist/security_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package memberlist - -import ( - "bytes" - "reflect" - "testing" -) - -func TestPKCS7(t *testing.T) { - for i := 0; i <= 255; i++ { - // Make a buffer of size i - buf := []byte{} - for j := 0; j < i; j++ { - buf = append(buf, byte(i)) - } - - // Copy to bytes buffer - inp := bytes.NewBuffer(nil) - inp.Write(buf) - - // Pad this out - pkcs7encode(inp, 0, 16) - - // Unpad - dec := pkcs7decode(inp.Bytes(), 16) - - // Ensure equivilence - if !reflect.DeepEqual(buf, dec) { - t.Fatalf("mismatch: %v %v", buf, dec) - } - } - -} - -func TestEncryptDecrypt_V0(t *testing.T) { - encryptDecryptVersioned(0, t) -} - -func TestEncryptDecrypt_V1(t *testing.T) { - encryptDecryptVersioned(1, t) -} - -func encryptDecryptVersioned(vsn encryptionVersion, t *testing.T) { - k1 := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - plaintext := []byte("this is a plain text message") - extra := []byte("random data") - - var buf bytes.Buffer - err := encryptPayload(vsn, k1, plaintext, extra, &buf) - if err != nil { - t.Fatalf("err: %v", err) - } - - expLen := encryptedLength(vsn, len(plaintext)) - if buf.Len() != expLen { - t.Fatalf("output length is unexpected %d %d %d", len(plaintext), buf.Len(), expLen) - } - - msg, err := decryptPayload([][]byte{k1}, buf.Bytes(), extra) - if err != nil { - t.Fatalf("err: %v", err) - } - - cmp := bytes.Compare(msg, plaintext) - if cmp != 0 { - t.Errorf("len %d %v", len(msg), msg) - t.Errorf("len %d %v", len(plaintext), plaintext) - t.Fatalf("encrypt/decrypt failed! %d '%s' '%s'", cmp, msg, plaintext) - } -} diff --git a/toolkit/memberlist/state.go b/toolkit/memberlist/state.go deleted file mode 100644 index 82acf6b6..00000000 --- a/toolkit/memberlist/state.go +++ /dev/null @@ -1,1438 +0,0 @@ -package memberlist - -import ( - "bytes" - "fmt" - "math" - "math/rand" - "net" - "strings" - "sync/atomic" - "time" - - "github.com/shirou/gopsutil/cpu" - - metrics "github.com/armon/go-metrics" -) - -type NodeStateType int - -const ( - StateAlive NodeStateType = iota - StateSuspect - StateDead - StateLeft -) - -// Node represents a node in the cluster. -type Node struct { - Name string - Addr string - Port uint16 - Meta []byte // Metadata from the delegate for this node. - State NodeStateType // State of the node. - PMin uint8 // Minimum protocol version this understands - PMax uint8 // Maximum protocol version this understands - PCur uint8 // Current version node is speaking - DMin uint8 // Min protocol version for the delegate to understand - DMax uint8 // Max protocol version for the delegate to understand - DCur uint8 // Current version delegate is speaking - Weight int // node weight for load balancing -} - -// Address returns the host:port form of a node's address, suitable for use -// with a transport. -func (n *Node) Address() string { - return joinHostPort(n.Addr, n.Port) -} - -// FullAddress returns the node name and host:port form of a node's address, -// suitable for use with a transport. -func (n *Node) FullAddress() Address { - return Address{ - Addr: joinHostPort(n.Addr, n.Port), - Name: n.Name, - } -} - -// String returns the node name -func (n *Node) String() string { - return n.Name -} - -// NodeState is used to manage our state view of another node -type nodeState struct { - Node - Incarnation uint32 // Last known incarnation number - State NodeStateType // Current state - StateChange time.Time // Time last state change happened - Weight int // node weight for load balancing - WeightAt int64 // UTC timestamp which node weight calculated at -} - -func NewNodeState(node Node, state NodeStateType) *nodeState { - return &nodeState{Node: node, State: state} -} - -// Address returns the host:port form of a node's address, suitable for use -// with a transport. -func (n *nodeState) Address() string { - return n.Node.Address() -} - -// FullAddress returns the node name and host:port form of a node's address, -// suitable for use with a transport. -func (n *nodeState) FullAddress() Address { - return n.Node.FullAddress() -} - -func (n *nodeState) DeadOrLeft() bool { - return n.State == StateDead || n.State == StateLeft -} - -// ackHandler is used to register handlers for incoming acks and nacks. -type ackHandler struct { - ackFn func([]byte, time.Time) - nackFn func() - timer *time.Timer -} - -// NoPingResponseError is used to indicate a 'ping' packet was -// successfully issued but no response was received -type NoPingResponseError struct { - node string -} - -func (f NoPingResponseError) Error() string { - return fmt.Sprintf("No response from node %s", f.node) -} - -// Schedule is used to ensure the Tick is performed periodically. This -// function is safe to call multiple times. If the memberlist is already -// scheduled, then it won't do anything. -func (m *Memberlist) schedule() { - m.tickerLock.Lock() - defer m.tickerLock.Unlock() - - // If we already have tickers, then don't do anything, since we're - // scheduled - if len(m.tickers) > 0 { - return - } - - // Create the stop tick channel, a blocking channel. We close this - // when we should stop the tickers. - stopCh := make(chan struct{}) - - // Create a new probeTicker - if m.config.ProbeInterval > 0 { - t := time.NewTicker(m.config.ProbeInterval) - go m.triggerFuncDynamic(func() time.Duration { - return m.config.ProbeInterval - }, t, stopCh, m.probe) - m.tickers = append(m.tickers, t) - } - - // Create a push pull ticker if needed - if m.config.PushPullInterval > 0 { - go m.pushPullTrigger(stopCh) - } - - // Create a gossip ticker if needed - if m.config.GossipInterval > 0 && m.config.GossipNodes > 0 { - t := time.NewTicker(m.config.GossipInterval) - go m.triggerFuncDynamic(func() time.Duration { - return m.config.GossipInterval - }, t, stopCh, m.gossip) - m.tickers = append(m.tickers, t) - } - - // Create node weight ticker if needed - if m.config.WeightInterval > 0 { - t := time.NewTicker(m.config.WeightInterval) - go m.triggerFunc(m.config.WeightInterval, t.C, stopCh, m.weight) - m.tickers = append(m.tickers, t) - } - - // If we made any tickers, then record the stopTick channel for - // later. - if len(m.tickers) > 0 { - m.stopTick = stopCh - } -} - -// triggerFunc is used to trigger a function call each time a -// message is received until a stop tick arrives. -func (m *Memberlist) triggerFunc(stagger time.Duration, C <-chan time.Time, stop <-chan struct{}, f func()) { - // Use a random stagger to avoid syncronizing - randStagger := time.Duration(uint64(rand.Int63()) % uint64(stagger)) - select { - case <-time.After(randStagger): - case <-stop: - return - } - for { - select { - case <-C: - f() - case <-stop: - return - } - } -} - -func (m *Memberlist) triggerFuncDynamic(getter func() time.Duration, t *time.Ticker, stop <-chan struct{}, f func()) { - stagger := getter() - randStagger := time.Duration(uint64(rand.Int63()) % uint64(stagger)) - select { - case <-time.After(randStagger): - case <-stop: - return - } - for { - select { - case <-t.C: - t.Reset(getter()) - f() - case <-stop: - return - } - } -} - -// pushPullTrigger is used to periodically trigger a push/pull until -// a stop tick arrives. We don't use triggerFunc since the push/pull -// timer is dynamically scaled based on cluster size to avoid network -// saturation -func (m *Memberlist) pushPullTrigger(stop <-chan struct{}) { - interval := m.config.PushPullInterval - - // Use a random stagger to avoid syncronizing - randStagger := time.Duration(uint64(rand.Int63()) % uint64(interval)) - select { - case <-time.After(randStagger): - case <-stop: - return - } - - // Tick using a dynamic timer - for { - tickTime := pushPullScale(m.config.PushPullInterval, m.estNumNodes()) - select { - case <-time.After(tickTime): - m.pushPull() - case <-stop: - return - } - } -} - -// Deschedule is used to stop the background maintenance. This is safe -// to call multiple times. -func (m *Memberlist) deschedule() { - m.tickerLock.Lock() - defer m.tickerLock.Unlock() - - // If we have no tickers, then we aren't scheduled. - if len(m.tickers) == 0 { - return - } - - // Close the stop channel so all the ticker listeners stop. - close(m.stopTick) - - // Explicitly stop all the tickers themselves so they don't take - // up any more resources, and get rid of the list. - for _, t := range m.tickers { - t.Stop() - } - m.tickers = nil -} - -// Tick is used to perform a single round of failure detection and gossip -func (m *Memberlist) probe() { - // Track the number of indexes we've considered probing - numCheck := 0 -START: - m.nodeLock.RLock() - - // Make sure we don't wrap around infinitely - if numCheck >= len(m.nodes) { - m.nodeLock.RUnlock() - return - } - - // Handle the wrap around case - if m.probeIndex >= len(m.nodes) { - m.nodeLock.RUnlock() - m.resetNodes() - m.probeIndex = 0 - numCheck++ - goto START - } - - // Determine if we should probe this node - skip := false - var node nodeState - - node = *m.nodes[m.probeIndex] - if node.Name == m.config.Name { - skip = true - } else if node.DeadOrLeft() { - skip = true - } - - // Potentially skip - m.nodeLock.RUnlock() - m.probeIndex++ - if skip { - numCheck++ - goto START - } - - // Probe the specific node - m.probeNode(&node) -} - -// probeNodeByAddr just safely calls probeNode given only the address of the node (for tests) -func (m *Memberlist) probeNodeByAddr(addr string) { - m.nodeLock.RLock() - n := m.nodeMap[addr] - m.nodeLock.RUnlock() - - m.probeNode(n) -} - -// failedRemote checks the error and decides if it indicates a failure on the -// other end. -func failedRemote(err error) bool { - switch t := err.(type) { - case *net.OpError: - if strings.HasPrefix(t.Net, "tcp") { - switch t.Op { - case "dial", "read", "write": - return true - } - } - } - return false -} - -// probeNode handles a single round of failure checking on a node. -func (m *Memberlist) probeNode(node *nodeState) { - defer metrics.MeasureSince([]string{"memberlist", "probeNode"}, time.Now()) - - // We use our health awareness to scale the overall probe interval, so we - // slow down if we detect problems. The ticker that calls us can handle - // us running over the base interval, and will skip missed ticks. - probeInterval := m.awareness.ScaleTimeout(m.config.ProbeInterval) - if probeInterval > m.config.ProbeInterval { - metrics.IncrCounter([]string{"memberlist", "degraded", "probe"}, 1) - } - - // Prepare a ping message and setup an ack handler. - selfAddr, selfPort := m.getAdvertise() - ping := ping{ - SeqNo: m.nextSeqNo(), - Node: node.Name, - SourceAddr: selfAddr, - SourcePort: selfPort, - SourceNode: m.config.Name, - } - ackCh := make(chan ackMessage, m.config.IndirectChecks+1) - nackCh := make(chan struct{}, m.config.IndirectChecks+1) - m.setProbeChannels(ping.SeqNo, ackCh, nackCh, probeInterval) - - // Mark the sent time here, which should be after any pre-processing but - // before system calls to do the actual send. This probably over-reports - // a bit, but it's the best we can do. We had originally put this right - // after the I/O, but that would sometimes give negative RTT measurements - // which was not desirable. - sent := time.Now() - - // Send a ping to the node. If this node looks like it's suspect or dead, - // also tack on a suspect message so that it has a chance to refute as - // soon as possible. - deadline := sent.Add(probeInterval) - addr := node.Address() - - // Arrange for our self-awareness to get updated. - var awarenessDelta int - defer func() { - m.awareness.ApplyDelta(awarenessDelta) - }() - if node.State == StateAlive { - if err := m.encodeAndSendMsg(node.FullAddress(), pingMsg, &ping); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send ping: %s", err) - if failedRemote(err) { - goto HANDLE_REMOTE_FAILURE - } else { - if _, ok := err.(*net.DNSError); ok { - // Update our self-awareness based on the results of this failed probe. - // If we don't have peers who will send nacks then we penalize for any - // failed probe as a simple health metric. If we do have peers to nack - // verify, then we can use that as a more sophisticated measure of self- - // health because we assume them to be working, and they can help us - // decide if the probed node was really dead or if it was something wrong - // with ourselves. - awarenessDelta = 1 - s := suspect{Incarnation: node.Incarnation, Node: node.Name, From: m.config.Name} - m.suspectNode(&s) - } - return - } - } - } else { - var msgs [][]byte - if buf, err := encode(pingMsg, &ping); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to encode ping message: %s", err) - return - } else { - msgs = append(msgs, buf.Bytes()) - } - s := suspect{Incarnation: node.Incarnation, Node: node.Name, From: m.config.Name} - if buf, err := encode(suspectMsg, &s); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to encode suspect message: %s", err) - return - } else { - msgs = append(msgs, buf.Bytes()) - } - - compound := makeCompoundMessage(msgs) - if err := m.rawSendMsgPacket(node.FullAddress(), &node.Node, compound.Bytes()); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send compound ping and suspect message to %s: %s", addr, err) - if failedRemote(err) { - goto HANDLE_REMOTE_FAILURE - } else { - return - } - } - } - - // Arrange for our self-awareness to get updated. At this point we've - // sent the ping, so any return statement means the probe succeeded - // which will improve our health until we get to the failure scenarios - // at the end of this function, which will alter this delta variable - // accordingly. - awarenessDelta = -1 - - // Wait for response or round-trip-time. - select { - case v := <-ackCh: - if v.Complete == true { - rtt := v.Timestamp.Sub(sent) - m.logger.Printf("[DEBUG] memberlist: ping remote node %s success in %s", node.Node.Name, rtt.String()) - if m.config.Ping != nil { - m.config.Ping.NotifyPingComplete(&node.Node, rtt, v.Payload) - } - return - } - - // As an edge case, if we get a timeout, we need to re-enqueue it - // here to break out of the select below. - if v.Complete == false { - ackCh <- v - } - case <-time.After(m.config.ProbeTimeout): - // Note that we don't scale this timeout based on awareness and - // the health score. That's because we don't really expect waiting - // longer to help get UDP through. Since health does extend the - // probe interval it will give the TCP fallback more time, which - // is more active in dealing with lost packets, and it gives more - // time to wait for indirect acks/nacks. - m.logger.Printf("[DEBUG] memberlist: Failed ping: %s (timeout reached)", node.Name) - } - -HANDLE_REMOTE_FAILURE: - // Get some random live nodes. - m.nodeLock.RLock() - kNodes := kRandomNodes(m.config.IndirectChecks, m.nodes, func(n *nodeState) bool { - return n.Name == m.config.Name || - n.Name == node.Name || - n.State != StateAlive - }) - m.nodeLock.RUnlock() - - // Attempt an indirect ping. - expectedNacks := 0 - selfAddr, selfPort = m.getAdvertise() - ind := indirectPingReq{ - SeqNo: ping.SeqNo, - Target: node.Addr, - Port: node.Port, - Node: node.Name, - SourceAddr: selfAddr, - SourcePort: selfPort, - SourceNode: m.config.Name, - } - for _, peer := range kNodes { - // We only expect nack to be sent from peers who understand - // version 4 of the protocol. - if ind.Nack = peer.PMax >= 4; ind.Nack { - expectedNacks++ - } - - if err := m.encodeAndSendMsg(peer.FullAddress(), indirectPingMsg, &ind); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send indirect ping: %s", err) - } - } - - // Also make an attempt to contact the node directly over TCP. This - // helps prevent confused clients who get isolated from UDP traffic - // but can still speak TCP (which also means they can possibly report - // misinformation to other nodes via anti-entropy), avoiding flapping in - // the cluster. - // - // This is a little unusual because we will attempt a TCP ping to any - // member who understands version 3 of the protocol, regardless of - // which protocol version we are speaking. That's why we've included a - // config option to turn this off if desired. - fallbackCh := make(chan bool, 1) - - disableTcpPings := m.config.DisableTcpPings || - (m.config.DisableTcpPingsForNode != nil && m.config.DisableTcpPingsForNode(node.Name)) - if (!disableTcpPings) && (node.PMax >= 3) { - go func() { - defer close(fallbackCh) - didContact, err := m.sendPingAndWaitForAck(node.FullAddress(), ping, deadline) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed fallback ping: %s", err) - } else { - fallbackCh <- didContact - } - }() - } else { - close(fallbackCh) - } - - // Wait for the acks or timeout. Note that we don't check the fallback - // channel here because we want to issue a warning below if that's the - // *only* way we hear back from the peer, so we have to let this time - // out first to allow the normal UDP-based acks to come in. - select { - case v := <-ackCh: - if v.Complete == true { - return - } - } - - // Finally, poll the fallback channel. The timeouts are set such that - // the channel will have something or be closed without having to wait - // any additional time here. - for didContact := range fallbackCh { - if didContact { - m.logger.Printf("[WARN] memberlist: Was able to connect to %s but other probes failed, network may be misconfigured", node.Name) - return - } - } - // Update our self-awareness based on the results of this failed probe. - // If we don't have peers who will send nacks then we penalize for any - // failed probe as a simple health metric. If we do have peers to nack - // verify, then we can use that as a more sophisticated measure of self- - // health because we assume them to be working, and they can help us - // decide if the probed node was really dead or if it was something wrong - // with ourselves. - awarenessDelta = 0 - if expectedNacks > 0 { - if nackCount := len(nackCh); nackCount < expectedNacks { - awarenessDelta += (expectedNacks - nackCount) - } - } else { - awarenessDelta += 1 - } - - // No acks received from target, suspect it as failed. - m.logger.Printf("[DEBUG] memberlist: Suspect %s has failed, no acks received", node.Name) - s := suspect{Incarnation: node.Incarnation, Node: node.Name, From: m.config.Name} - m.suspectNode(&s) -} - -// Ping initiates a ping to the node with the specified name. -func (m *Memberlist) Ping(node string, addr net.Addr) (time.Duration, error) { - // Prepare a ping message and setup an ack handler. - selfAddr, selfPort := m.getAdvertise() - ping := ping{ - SeqNo: m.nextSeqNo(), - Node: node, - SourceAddr: selfAddr, - SourcePort: selfPort, - SourceNode: m.config.Name, - } - ackCh := make(chan ackMessage, m.config.IndirectChecks+1) - m.setProbeChannels(ping.SeqNo, ackCh, nil, m.config.ProbeInterval) - - a := Address{Addr: addr.String(), Name: node} - - // Send a ping to the node. - if err := m.encodeAndSendMsg(a, pingMsg, &ping); err != nil { - return 0, err - } - - // Mark the sent time here, which should be after any pre-processing and - // system calls to do the actual send. This probably under-reports a bit, - // but it's the best we can do. - sent := time.Now() - - // Wait for response or timeout. - select { - case v := <-ackCh: - if v.Complete == true { - return v.Timestamp.Sub(sent), nil - } - case <-time.After(m.config.ProbeTimeout): - // Timeout, return an error below. - } - - m.logger.Printf("[DEBUG] memberlist: Failed UDP ping: %v (timeout reached)", node) - return 0, NoPingResponseError{ping.Node} -} - -// resetNodes is used when the tick wraps around. It will reap the -// dead nodes and shuffle the node list. -func (m *Memberlist) resetNodes() { - m.nodeLock.Lock() - defer m.nodeLock.Unlock() - - // Move dead nodes, but respect gossip to the dead interval - deadIdx := moveDeadNodes(m.nodes, m.config.GossipToTheDeadTime) - - // Deregister the dead nodes - for i := deadIdx; i < len(m.nodes); i++ { - delete(m.nodeMap, m.nodes[i].Name) - m.nodes[i] = nil - } - - // Trim the nodes to exclude the dead nodes - m.nodes = m.nodes[0:deadIdx] - - // Update numNodes after we've trimmed the dead nodes - atomic.StoreUint32(&m.numNodes, uint32(deadIdx)) - - // Shuffle live nodes - shuffleNodes(m.nodes) -} - -// gossip is invoked every GossipInterval period to broadcast our gossip -// messages to a few random nodes. -func (m *Memberlist) gossip() { - defer metrics.MeasureSince([]string{"memberlist", "gossip"}, time.Now()) - - // Get some random live, suspect, or recently dead nodes - m.nodeLock.RLock() - kNodes := kRandomNodes(m.config.GossipNodes, m.nodes, func(n *nodeState) bool { - if n.Name == m.config.Name { - return true - } - - switch n.State { - case StateAlive, StateSuspect: - return false - - case StateDead: - return time.Since(n.StateChange) > m.config.GossipToTheDeadTime - - default: - return true - } - }) - m.nodeLock.RUnlock() - - // Compute the bytes available - bytesAvail := m.config.UDPBufferSize - compoundHeaderOverhead - if m.config.EncryptionEnabled() { - bytesAvail -= encryptOverhead(m.encryptionVersion()) - } - - for _, node := range kNodes { - // Get any pending broadcasts - msgs := m.getBroadcasts(compoundOverhead, bytesAvail) - if len(msgs) == 0 { - return - } - - addr := node.Address() - if len(msgs) == 1 { - // Send single message as is - if err := m.rawSendMsgPacket(node.FullAddress(), &node, msgs[0]); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err) - } - } else { - // Otherwise create and send a compound message - compound := makeCompoundMessage(msgs) - if err := m.rawSendMsgPacket(node.FullAddress(), &node, compound.Bytes()); err != nil { - m.logger.Printf("[ERR] memberlist: Failed to send gossip to %s: %s", addr, err) - } - } - } -} - -// weight is invoked every WeightInterval period to calculate local node weight and -// enqueue a message carrying the result -func (m *Memberlist) weight() { - defer metrics.MeasureSince([]string{"memberlist", "weight"}, time.Now()) - - // Weight = (AwarenessMaxMultiplier - AwarenessScore) * 0.5 + AwarenessMaxMultiplier * CPUIdlePercent * 0.5 - percent, err := cpu.Percent(0, false) - if err != nil { - m.logger.Printf("[ERR] memberlist: Failed to get cpu busy percent: %s", err) - return - } - cpuIdlePercent := 100 - percent[0] - result := int(math.Round(float64(m.config.AwarenessMaxMultiplier-m.awareness.GetHealthScore())*0.6 + - float64(m.config.AwarenessMaxMultiplier)*cpuIdlePercent/100*0.4)) - - w := weight{Incarnation: m.incarnation, Node: m.config.Name, From: m.config.Name, Weight: result, WeightAt: time.Now().UTC().UnixNano() / 1000000} - m.encodeWeightMsgAndBroadcast(m.config.Name, w) - m.logger.Printf("[DEBUG] memberlist: enqueued latest weight of local node %s: %d", m.config.Name, result) -} - -// pushPull is invoked periodically to randomly perform a complete state -// exchange. Used to ensure a high level of convergence, but is also -// reasonably expensive as the entire state of this node is exchanged -// with the other node. -func (m *Memberlist) pushPull() { - // Get a random live node - m.nodeLock.RLock() - nodes := kRandomNodes(1, m.nodes, func(n *nodeState) bool { - return n.Name == m.config.Name || - n.State != StateAlive - }) - m.nodeLock.RUnlock() - - // If no nodes, bail - if len(nodes) == 0 { - return - } - node := nodes[0] - - // Attempt a push pull - if err := m.pushPullNode(node.FullAddress(), false); err != nil { - m.logger.Printf("[ERR] memberlist: Push/Pull with %s failed: %s", node.Name, err) - } -} - -// pushPullNode does a complete state exchange with a specific node. -func (m *Memberlist) pushPullNode(a Address, join bool) error { - defer metrics.MeasureSince([]string{"memberlist", "pushPullNode"}, time.Now()) - - // Attempt to send and receive with the node - remote, userState, err := m.sendAndReceiveState(a, join) - if err != nil { - return err - } - - if err := m.mergeRemoteState(join, remote, userState); err != nil { - return err - } - return nil -} - -// verifyProtocol verifies that all the remote nodes can speak with our -// nodes and vice versa on both the core protocol as well as the -// delegate protocol level. -// -// The verification works by finding the maximum minimum and -// minimum maximum understood protocol and delegate versions. In other words, -// it finds the common denominator of protocol and delegate version ranges -// for the entire cluster. -// -// After this, it goes through the entire cluster (local and remote) and -// verifies that everyone's speaking protocol versions satisfy this range. -// If this passes, it means that every node can understand each other. -func (m *Memberlist) verifyProtocol(remote []pushNodeState) error { - m.nodeLock.RLock() - defer m.nodeLock.RUnlock() - - // Maximum minimum understood and minimum maximum understood for both - // the protocol and delegate versions. We use this to verify everyone - // can be understood. - var maxpmin, minpmax uint8 - var maxdmin, mindmax uint8 - minpmax = math.MaxUint8 - mindmax = math.MaxUint8 - - for _, rn := range remote { - // If the node isn't alive, then skip it - if rn.State != StateAlive { - continue - } - - // Skip nodes that don't have versions set, it just means - // their version is zero. - if len(rn.Vsn) == 0 { - continue - } - - if rn.Vsn[0] > maxpmin { - maxpmin = rn.Vsn[0] - } - - if rn.Vsn[1] < minpmax { - minpmax = rn.Vsn[1] - } - - if rn.Vsn[3] > maxdmin { - maxdmin = rn.Vsn[3] - } - - if rn.Vsn[4] < mindmax { - mindmax = rn.Vsn[4] - } - } - - for _, n := range m.nodes { - // Ignore non-alive nodes - if n.State != StateAlive { - continue - } - - if n.PMin > maxpmin { - maxpmin = n.PMin - } - - if n.PMax < minpmax { - minpmax = n.PMax - } - - if n.DMin > maxdmin { - maxdmin = n.DMin - } - - if n.DMax < mindmax { - mindmax = n.DMax - } - } - - // Now that we definitively know the minimum and maximum understood - // version that satisfies the whole cluster, we verify that every - // node in the cluster satisifies this. - for _, n := range remote { - var nPCur, nDCur uint8 - if len(n.Vsn) > 0 { - nPCur = n.Vsn[2] - nDCur = n.Vsn[5] - } - - if nPCur < maxpmin || nPCur > minpmax { - return fmt.Errorf( - "Node '%s' protocol version (%d) is incompatible: [%d, %d]", - n.Name, nPCur, maxpmin, minpmax) - } - - if nDCur < maxdmin || nDCur > mindmax { - return fmt.Errorf( - "Node '%s' delegate protocol version (%d) is incompatible: [%d, %d]", - n.Name, nDCur, maxdmin, mindmax) - } - } - - for _, n := range m.nodes { - nPCur := n.PCur - nDCur := n.DCur - - if nPCur < maxpmin || nPCur > minpmax { - return fmt.Errorf( - "Node '%s' protocol version (%d) is incompatible: [%d, %d]", - n.Name, nPCur, maxpmin, minpmax) - } - - if nDCur < maxdmin || nDCur > mindmax { - return fmt.Errorf( - "Node '%s' delegate protocol version (%d) is incompatible: [%d, %d]", - n.Name, nDCur, maxdmin, mindmax) - } - } - - return nil -} - -// nextSeqNo returns a usable sequence number in a thread safe way -func (m *Memberlist) nextSeqNo() uint32 { - return atomic.AddUint32(&m.sequenceNum, 1) -} - -// nextIncarnation returns the next incarnation number in a thread safe way -func (m *Memberlist) nextIncarnation() uint32 { - return atomic.AddUint32(&m.incarnation, 1) -} - -// skipIncarnation adds the positive offset to the incarnation number. -func (m *Memberlist) skipIncarnation(offset uint32) uint32 { - return atomic.AddUint32(&m.incarnation, offset) -} - -// estNumNodes is used to get the current estimate of the number of nodes -func (m *Memberlist) estNumNodes() int { - return int(atomic.LoadUint32(&m.numNodes)) -} - -type ackMessage struct { - Complete bool - Payload []byte - Timestamp time.Time -} - -// setProbeChannels is used to attach the ackCh to receive a message when an ack -// with a given sequence number is received. The `complete` field of the message -// will be false on timeout. Any nack messages will cause an empty struct to be -// passed to the nackCh, which can be nil if not needed. -func (m *Memberlist) setProbeChannels(seqNo uint32, ackCh chan ackMessage, nackCh chan struct{}, timeout time.Duration) { - // Create handler functions for acks and nacks - ackFn := func(payload []byte, timestamp time.Time) { - select { - case ackCh <- ackMessage{true, payload, timestamp}: - default: - } - } - nackFn := func() { - select { - case nackCh <- struct{}{}: - default: - } - } - - // Add the handlers - ah := &ackHandler{ackFn, nackFn, nil} - m.ackLock.Lock() - m.ackHandlers[seqNo] = ah - m.ackLock.Unlock() - - // Setup a reaping routing - ah.timer = time.AfterFunc(timeout, func() { - m.ackLock.Lock() - delete(m.ackHandlers, seqNo) - m.ackLock.Unlock() - select { - case ackCh <- ackMessage{false, nil, time.Now()}: - default: - } - }) -} - -// setAckHandler is used to attach a handler to be invoked when an ack with a -// given sequence number is received. If a timeout is reached, the handler is -// deleted. This is used for indirect pings so does not configure a function -// for nacks. -func (m *Memberlist) setAckHandler(seqNo uint32, ackFn func([]byte, time.Time), timeout time.Duration) { - // Add the handler - ah := &ackHandler{ackFn, nil, nil} - m.ackLock.Lock() - m.ackHandlers[seqNo] = ah - m.ackLock.Unlock() - - // Setup a reaping routing - ah.timer = time.AfterFunc(timeout, func() { - m.ackLock.Lock() - delete(m.ackHandlers, seqNo) - m.ackLock.Unlock() - }) -} - -// Invokes an ack handler if any is associated, and reaps the handler immediately -func (m *Memberlist) invokeAckHandler(ack ackResp, timestamp time.Time) { - m.ackLock.Lock() - ah, ok := m.ackHandlers[ack.SeqNo] - delete(m.ackHandlers, ack.SeqNo) - m.ackLock.Unlock() - if !ok { - return - } - ah.timer.Stop() - ah.ackFn(ack.Payload, timestamp) -} - -// Invokes nack handler if any is associated. -func (m *Memberlist) invokeNackHandler(nack nackResp) { - m.ackLock.Lock() - ah, ok := m.ackHandlers[nack.SeqNo] - m.ackLock.Unlock() - if !ok || ah.nackFn == nil { - return - } - ah.nackFn() -} - -// refute gossips an alive message in response to incoming information that we -// are suspect or dead. It will make sure the incarnation number beats the given -// accusedInc value, or you can supply 0 to just get the next incarnation number. -// This alters the node state that's passed in so this MUST be called while the -// nodeLock is held. -func (m *Memberlist) refute(me *nodeState, accusedInc uint32) { - // Make sure the incarnation number beats the accusation. - inc := m.nextIncarnation() - if accusedInc >= inc { - inc = m.skipIncarnation(accusedInc - inc + 1) - } - me.Incarnation = inc - - // Decrease our health because we are being asked to refute a problem. - m.awareness.ApplyDelta(1) - - // Format and broadcast an alive message. - a := alive{ - Incarnation: inc, - Node: me.Name, - Addr: me.Addr, - Port: me.Port, - Meta: me.Meta, - Vsn: []uint8{ - me.PMin, me.PMax, me.PCur, - me.DMin, me.DMax, me.DCur, - }, - } - m.encodeAndBroadcast(me.Addr, aliveMsg, a) -} - -// aliveNode is invoked by the network layer when we get a message about a -// live node. -func (m *Memberlist) aliveNode(a *alive, notify chan struct{}, bootstrap bool) { - m.nodeLock.Lock() - defer m.nodeLock.Unlock() - state, ok := m.nodeMap[a.Node] - - // It is possible that during a Leave(), there is already an aliveMsg - // in-queue to be processed but blocked by the locks above. If we let - // that aliveMsg process, it'll cause us to re-join the cluster. This - // ensures that we don't. - if m.hasLeft() && a.Node == m.config.Name { - return - } - - if len(a.Vsn) >= 3 { - pMin := a.Vsn[0] - pMax := a.Vsn[1] - pCur := a.Vsn[2] - if pMin == 0 || pMax == 0 || pMin > pMax { - m.logger.Printf("[WARN] memberlist: Ignoring an alive message for '%s' (%v:%d) because protocol version(s) are wrong: %d <= %d <= %d should be >0", a.Node, a.Addr, a.Port, pMin, pCur, pMax) - return - } - } - - // Invoke the Alive delegate if any. This can be used to filter out - // alive messages based on custom logic. For example, using a cluster name. - // Using a merge delegate is not enough, as it is possible for passive - // cluster merging to still occur. - if m.config.Alive != nil { - if len(a.Vsn) < 6 { - m.logger.Printf("[WARN] memberlist: ignoring alive message for '%s' (%v:%d) because Vsn is not present", - a.Node, a.Addr, a.Port) - return - } - node := &Node{ - Name: a.Node, - Addr: a.Addr, - Port: a.Port, - Meta: a.Meta, - PMin: a.Vsn[0], - PMax: a.Vsn[1], - PCur: a.Vsn[2], - DMin: a.Vsn[3], - DMax: a.Vsn[4], - DCur: a.Vsn[5], - } - if err := m.config.Alive.NotifyAlive(node); err != nil { - m.logger.Printf("[WARN] memberlist: ignoring alive message for '%s': %s", - a.Node, err) - return - } - } - - // Check if we've never seen this node before, and if not, then - // store this node in our node map. - var updatesNode bool - if !ok { - errCon := m.config.AddrAllowed(a.Addr) - if errCon != nil { - m.logger.Printf("[WARN] memberlist: Rejected node %s (%v): %s", a.Node, a.Addr, errCon) - return - } - state = &nodeState{ - Node: Node{ - Name: a.Node, - Addr: a.Addr, - Port: a.Port, - Meta: a.Meta, - }, - State: StateDead, - } - if len(a.Vsn) > 5 { - state.PMin = a.Vsn[0] - state.PMax = a.Vsn[1] - state.PCur = a.Vsn[2] - state.DMin = a.Vsn[3] - state.DMax = a.Vsn[4] - state.DCur = a.Vsn[5] - } - - // Add to map - m.nodeMap[a.Node] = state - - // Get a random offset. This is important to ensure - // the failure detection bound is low on average. If all - // nodes did an append, failure detection bound would be - // very high. - n := len(m.nodes) - offset := randomOffset(n) - - // Add at the end and swap with the node at the offset - m.nodes = append(m.nodes, state) - m.nodes[offset], m.nodes[n] = m.nodes[n], m.nodes[offset] - - // Update numNodes after we've added a new node - atomic.AddUint32(&m.numNodes, 1) - } else { - // Check if this address is different from the existing node unless the old node is dead. - if state.Addr != a.Addr || state.Port != a.Port { - errCon := m.config.AddrAllowed(a.Addr) - if errCon != nil { - m.logger.Printf("[WARN] memberlist: Rejected IP update from %v to %v for node %s: %s", a.Node, state.Addr, a.Addr, errCon) - return - } - // If DeadNodeReclaimTime is configured, check if enough time has elapsed since the node died. - canReclaim := (m.config.DeadNodeReclaimTime > 0 && - time.Since(state.StateChange) > m.config.DeadNodeReclaimTime) - - // Allow the address to be updated if a dead node is being replaced. - if state.State == StateLeft || (state.State == StateDead && canReclaim) { - m.logger.Printf("[INFO] memberlist: Updating address for left or failed node %s from %v:%d to %v:%d", - state.Name, state.Addr, state.Port, a.Addr, a.Port) - updatesNode = true - } else { - m.logger.Printf("[ERR] memberlist: Conflicting address for %s. Mine: %v:%d Theirs: %v:%d Old state: %v", - state.Name, state.Addr, state.Port, a.Addr, a.Port, state.State) - - // Inform the conflict delegate if provided - if m.config.Conflict != nil { - other := Node{ - Name: a.Node, - Addr: a.Addr, - Port: a.Port, - Meta: a.Meta, - } - m.config.Conflict.NotifyConflict(&state.Node, &other) - } - return - } - } - } - - // Bail if the incarnation number is older, and this is not about us - isLocalNode := state.Name == m.config.Name - if a.Incarnation <= state.Incarnation && !isLocalNode && !updatesNode { - return - } - - // Bail if strictly less and this is about us - if a.Incarnation < state.Incarnation && isLocalNode { - return - } - - // Clear out any suspicion timer that may be in effect. - delete(m.nodeTimers, a.Node) - - // Store the old state and meta data - oldState := state.State - oldMeta := state.Meta - - // If this is us we need to refute, otherwise re-broadcast - if !bootstrap && isLocalNode { - // Compute the version vector - versions := []uint8{ - state.PMin, state.PMax, state.PCur, - state.DMin, state.DMax, state.DCur, - } - - // If the Incarnation is the same, we need special handling, since it - // possible for the following situation to happen: - // 1) Start with configuration C, join cluster - // 2) Hard fail / Kill / Shutdown - // 3) Restart with configuration C', join cluster - // - // In this case, other nodes and the local node see the same incarnation, - // but the values may not be the same. For this reason, we always - // need to do an equality check for this Incarnation. In most cases, - // we just ignore, but we may need to refute. - // - if a.Incarnation == state.Incarnation && - bytes.Equal(a.Meta, state.Meta) && - bytes.Equal(a.Vsn, versions) { - return - } - m.refute(state, a.Incarnation) - m.logger.Printf("[WARN] memberlist: Refuting an alive message for '%s' (%v:%d) meta:(%v VS %v), vsn:(%v VS %v)", a.Node, a.Addr, a.Port, a.Meta, state.Meta, a.Vsn, versions) - } else { - m.encodeBroadcastNotify(a.Node, aliveMsg, a, notify) - - // Update protocol versions if it arrived - if len(a.Vsn) > 0 { - state.PMin = a.Vsn[0] - state.PMax = a.Vsn[1] - state.PCur = a.Vsn[2] - state.DMin = a.Vsn[3] - state.DMax = a.Vsn[4] - state.DCur = a.Vsn[5] - } - - // Update the state and incarnation number - state.Incarnation = a.Incarnation - state.Meta = a.Meta - state.Addr = a.Addr - state.Port = a.Port - if state.State != StateAlive { - state.State = StateAlive - state.StateChange = time.Now() - } - } - - // Update metrics - metrics.IncrCounter([]string{"memberlist", "msg", "alive"}, 1) - - // Notify the delegate of any relevant updates - if m.config.Events != nil { - if oldState == StateDead || oldState == StateLeft { - // if Dead/Left -> Alive, notify of join - state.Node.State = state.State - m.config.Events.NotifyJoin(&state.Node) - } else if oldState == StateSuspect { - state.Node.State = state.State - m.config.Events.NotifySuspectSateChange(&state.Node) - } else if !bytes.Equal(oldMeta, state.Meta) { - // if Meta changed, trigger an update notification - m.config.Events.NotifyUpdate(&state.Node) - } - } -} - -// suspectNode is invoked by the network layer when we get a message -// about a suspect node -func (m *Memberlist) suspectNode(s *suspect) { - m.nodeLock.Lock() - defer m.nodeLock.Unlock() - state, ok := m.nodeMap[s.Node] - - // If we've never heard about this node before, ignore it - if !ok { - return - } - - // Ignore old incarnation numbers - if s.Incarnation < state.Incarnation { - return - } - - // See if there's a suspicion timer we can confirm. If the info is new - // to us we will go ahead and re-gossip it. This allows for multiple - // independent confirmations to flow even when a node probes a node - // that's already suspect. - if timer, ok := m.nodeTimers[s.Node]; ok { - if timer.Confirm(s.From) { - m.encodeAndBroadcast(s.Node, suspectMsg, s) - } - return - } - - // Ignore non-alive nodes - if state.State != StateAlive { - return - } - - // If this is us we need to refute, otherwise re-broadcast - if state.Name == m.config.Name { - m.refute(state, s.Incarnation) - m.logger.Printf("[WARN] memberlist: Refuting a suspect message (from: %s)", s.From) - return // Do not mark ourself suspect - } else { - m.encodeAndBroadcast(s.Node, suspectMsg, s) - } - - // Update metrics - metrics.IncrCounter([]string{"memberlist", "msg", "suspect"}, 1) - - // Update the state - state.Incarnation = s.Incarnation - state.State = StateSuspect - changeTime := time.Now() - state.StateChange = changeTime - - // Setup a suspicion timer. Given that we don't have any known phase - // relationship with our peers, we set up k such that we hit the nominal - // timeout two probe intervals short of what we expect given the suspicion - // multiplier. - k := m.config.SuspicionMult - 2 - - // If there aren't enough nodes to give the expected confirmations, just - // set k to 0 to say that we don't expect any. Note we subtract 2 from n - // here to take out ourselves and the node being probed. - n := m.estNumNodes() - if n-2 < k { - k = 0 - } - - // Compute the timeouts based on the size of the cluster. - min := suspicionTimeout(m.config.SuspicionMult, n, m.config.ProbeInterval) - max := time.Duration(m.config.SuspicionMaxTimeoutMult) * min - fn := func(numConfirmations int) { - var d *dead - - m.nodeLock.Lock() - state, ok := m.nodeMap[s.Node] - timeout := ok && state.State == StateSuspect && state.StateChange == changeTime - if timeout { - d = &dead{Incarnation: state.Incarnation, Node: state.Name, From: m.config.Name} - } - m.nodeLock.Unlock() - - if timeout { - if k > 0 && numConfirmations < k { - metrics.IncrCounter([]string{"memberlist", "degraded", "timeout"}, 1) - } - - m.logger.Printf("[INFO] memberlist: Marking %s as failed, suspect timeout reached (%d peer confirmations)", - state.Name, numConfirmations) - - m.deadNode(d) - } - } - m.nodeTimers[s.Node] = newSuspicion(s.From, k, min, max, fn) - if m.config.Events != nil { - state.Node.State = state.State - m.config.Events.NotifySuspectSateChange(&state.Node) - } -} - -// deadNode is invoked by the network layer when we get a message -// about a dead node -func (m *Memberlist) deadNode(d *dead) { - m.nodeLock.Lock() - defer m.nodeLock.Unlock() - state, ok := m.nodeMap[d.Node] - - // If we've never heard about this node before, ignore it - if !ok { - return - } - - // Ignore old incarnation numbers - if d.Incarnation < state.Incarnation { - return - } - - // Clear out any suspicion timer that may be in effect. - delete(m.nodeTimers, d.Node) - - // Ignore if node is already dead - if state.DeadOrLeft() { - return - } - - // Check if this is us - if state.Name == m.config.Name { - // If we are not leaving we need to refute - if !m.hasLeft() { - m.refute(state, d.Incarnation) - m.logger.Printf("[WARN] memberlist: Refuting a dead message (from: %s)", d.From) - return // Do not mark ourself dead - } - - // If we are leaving, we broadcast and wait - m.encodeBroadcastNotify(d.Node, deadMsg, d, m.leaveBroadcast) - } else { - m.encodeAndBroadcast(d.Node, deadMsg, d) - } - - // Update metrics - metrics.IncrCounter([]string{"memberlist", "msg", "dead"}, 1) - - // Update the state - state.Incarnation = d.Incarnation - - // If the dead message was send by the node itself, mark it is left - // instead of dead. - if d.Node == d.From { - state.State = StateLeft - } else { - state.State = StateDead - } - state.StateChange = time.Now() - - // Notify of death - if m.config.Events != nil { - m.config.Events.NotifyLeave(&state.Node) - } -} - -// weightNode is invoked by the network layer when we get a message -// about node weight -func (m *Memberlist) weightNode(s *weight) { - m.nodeLock.Lock() - defer m.nodeLock.Unlock() - state, ok := m.nodeMap[s.Node] - - // If we've never heard about this node before, ignore it - if !ok { - return - } - - // Ignore old incarnation numbers - if s.Incarnation < state.Incarnation { - return - } - - // Ignore non-alive nodes or this is about us - if state.State != StateAlive || state.Name == m.config.Name { - return - } - - // Ignore old weight messages - if s.WeightAt <= state.WeightAt { - return - } - - m.encodeWeightMsgAndBroadcast(s.Node, s) - - // Update metrics - metrics.IncrCounter([]string{"memberlist", "msg", "weight"}, 1) - - // Update the state - old := state.Weight - state.Weight = s.Weight - state.WeightAt = s.WeightAt - if state.Weight != old { - if m.config.Events != nil { - state.Node.Weight = state.Weight - m.config.Events.NotifyWeight(&state.Node) - } - m.logger.Printf("[DEBUG] memberlist: updated weight (calculated at %s) of node %s from %d to %d", - time.Unix(s.WeightAt/1000, (s.WeightAt%1000)*1000000).Local().Format("2006-01-02T15:04:05-0700"), state.Name, old, state.Weight) - } -} - -// mergeState is invoked by the network layer when we get a Push/Pull -// state transfer -func (m *Memberlist) mergeState(remote []pushNodeState) { - for _, r := range remote { - switch r.State { - case StateAlive: - a := alive{ - Incarnation: r.Incarnation, - Node: r.Name, - Addr: r.Addr, - Port: r.Port, - Meta: r.Meta, - Vsn: r.Vsn, - } - m.aliveNode(&a, nil, false) - - case StateLeft: - d := dead{Incarnation: r.Incarnation, Node: r.Name, From: r.Name} - m.deadNode(&d) - case StateDead: - // If the remote node believes a node is dead, we prefer to - // suspect that node instead of declaring it dead instantly - fallthrough - case StateSuspect: - s := suspect{Incarnation: r.Incarnation, Node: r.Name, From: m.config.Name} - m.suspectNode(&s) - } - } -} diff --git a/toolkit/memberlist/state_test.go b/toolkit/memberlist/state_test.go deleted file mode 100644 index 16ea0ca4..00000000 --- a/toolkit/memberlist/state_test.go +++ /dev/null @@ -1,2443 +0,0 @@ -package memberlist - -import ( - "fmt" - "log" - "net" - "os" - "sync" - "sync/atomic" - "testing" - "time" -) - -var bindLock sync.Mutex -var bindNum byte = 10 - -func getBindAddrNet(network byte) net.IP { - bindLock.Lock() - defer bindLock.Unlock() - - //result := net.IPv4(127, 0, network, bindNum) - //bindNum++ - //if bindNum > 255 { - // bindNum = 10 - //} - - result := net.IPv4(127, 0, 0, 1) - - return result -} - -func getBindAddr() net.IP { - return getBindAddrNet(0) -} - -func HostMemberlist(host string, t *testing.T, f func(*Config)) *Memberlist { - t.Helper() - - c := DefaultLANConfig() - c.Name = host - c.BindAddr = host - c.BindPort = 0 // choose a free port - c.Logger = log.New(os.Stderr, host, log.LstdFlags) - if f != nil { - f(c) - } - - m, err := NewMemberlist(c) - if err != nil { - t.Fatalf("failed to get memberlist: %s", err) - } - return m -} - -func TestMemberList_Probe(t *testing.T) { - addr1 := getBindAddr() - addr2 := getBindAddr() - - m1 := HostMemberlist(addr1.String(), t, func(c *Config) { - c.ProbeTimeout = time.Millisecond - c.ProbeInterval = 10 * time.Millisecond - c.BindPort = 56102 - c.AdvertisePort = 56102 - c.Name = "c1" - }) - defer m1.Shutdown() - - m2 := HostMemberlist(addr2.String(), t, func(c *Config) { - c.BindPort = 56101 - c.AdvertisePort = 56101 - c.Name = "c2" - }) - defer m2.Shutdown() - - a1 := alive{ - Node: m1.config.Name, - Addr: addr1.String(), - Port: uint16(m1.config.BindPort), - Incarnation: 1, - Vsn: m1.config.BuildVsnArray(), - } - m1.aliveNode(&a1, nil, true) - a2 := alive{ - Node: m2.config.Name, - Addr: addr2.String(), - Port: uint16(m2.config.BindPort), - Incarnation: 1, - Vsn: m2.config.BuildVsnArray(), - } - m1.aliveNode(&a2, nil, false) - - // should ping addr2 - m1.probe() - - // Should not be marked suspect - //n := m1.nodeMap[m2.config.Name] - //if n.State != StateAlive { - // t.Fatalf("Expect node to be alive") - //} - // - //// Should increment seqno - //if m1.sequenceNum != 1 { - // t.Fatalf("bad seqno %v", m2.sequenceNum) - //} -} - -func TestMemberList_ProbeNode_Suspect(t *testing.T) { - addr1 := getBindAddr() - addr2 := getBindAddr() - addr3 := getBindAddr() - addr4 := getBindAddr() - ip1 := addr1 - ip2 := addr2 - ip3 := addr3 - ip4 := addr4 - - m1 := HostMemberlist(addr1.String(), t, func(c *Config) { - c.ProbeTimeout = time.Millisecond - c.ProbeInterval = 10 * time.Millisecond - c.BindPort = 56100 - c.AdvertisePort = 56100 - c.Name = "c1" - }) - defer m1.Shutdown() - - m2 := HostMemberlist(addr2.String(), t, func(c *Config) { - c.BindPort = 56099 - c.AdvertisePort = 56099 - c.Name = "c2" - }) - defer m2.Shutdown() - m3 := HostMemberlist(addr3.String(), t, func(c *Config) { - c.BindPort = 56098 - c.AdvertisePort = 56098 - c.Name = "c3" - }) - defer m3.Shutdown() - a1 := alive{Node: m1.config.Name, Addr: ip1.String(), Port: m1.advertisePort, Incarnation: 1, Vsn: m1.config.BuildVsnArray()} - m1.aliveNode(&a1, nil, true) - a2 := alive{Node: m2.config.Name, Addr: ip2.String(), Port: m2.advertisePort, Incarnation: 1, Vsn: m2.config.BuildVsnArray()} - m1.aliveNode(&a2, nil, false) - a3 := alive{Node: m3.config.Name, Addr: ip3.String(), Port: m3.advertisePort, Incarnation: 1, Vsn: m3.config.BuildVsnArray()} - m1.aliveNode(&a3, nil, false) - a4 := alive{Node: "c4", Addr: ip4.String(), Port: uint16(56097), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} - m1.aliveNode(&a4, nil, false) - - n := m1.nodeMap["c4"] - m1.probeNode(n) - - // Should be marked suspect. - if n.State != StateSuspect { - t.Fatalf("Expect node to be suspect") - } - time.Sleep(10 * time.Millisecond) - - // One of the peers should have attempted an indirect probe. - if s2, s3 := atomic.LoadUint32(&m2.sequenceNum), atomic.LoadUint32(&m3.sequenceNum); s2 != 1 && s3 != 1 { - t.Fatalf("bad seqnos, expected both to be 1: %v, %v", s2, s3) - } -} - -func TestMemberList_ProbeNode_Suspect_Dogpile(t *testing.T) { - freePorts := []int{ - 56096, - 56095, - 56094, - 56093, - 56092, - 56091, - 56090, - 56089, - 56088, - } - nodes := []string{ - "c1", - "c2", - "c3", - "c4", - "c5", - "c6", - "c7", - "c8", - "c9", - } - cases := []struct { - name string - numPeers int - confirmations int - expected time.Duration - nodeName string - bindPort int - }{ - {"n=2, k=3 (max timeout disabled)", 1, 0, 500 * time.Millisecond, "c1", 56096}, - {"n=3, k=3", 2, 0, 500 * time.Millisecond, "c2", 56095}, - {"n=4, k=3", 3, 0, 500 * time.Millisecond, "c3", 56094}, - {"n=5, k=3 (max timeout starts to take effect)", 4, 0, 1000 * time.Millisecond, "c4", 56093}, - {"n=6, k=3", 5, 0, 1000 * time.Millisecond, "c5", 56092}, - {"n=6, k=3 (confirmations start to lower timeout)", 5, 1, 750 * time.Millisecond, "c6", 56091}, - {"n=6, k=3", 5, 2, 604 * time.Millisecond, "c7", 56090}, - {"n=6, k=3 (timeout driven to nominal value)", 5, 3, 500 * time.Millisecond, "c8", 56089}, - {"n=6, k=3", 5, 4, 500 * time.Millisecond, "c9", 56088}, - } - - for i, c := range cases { - var ports []int - ports = append(ports, freePorts[:i]...) - ports = append(ports, freePorts[i+1:]...) - var peernames []string - peernames = append(peernames, nodes[:i]...) - peernames = append(peernames, nodes[i+1:]...) - t.Run(c.name, func(t *testing.T) { - // Create the main memberlist under test. - addr := getBindAddr() - - m := HostMemberlist(addr.String(), t, func(conf *Config) { - conf.ProbeTimeout = time.Millisecond - conf.ProbeInterval = 100 * time.Millisecond - conf.SuspicionMult = 5 - conf.SuspicionMaxTimeoutMult = 2 - conf.BindPort = c.bindPort - conf.AdvertisePort = c.bindPort - conf.Name = c.nodeName - }) - defer m.Shutdown() - - a := alive{Node: addr.String(), Addr: addr.String(), Port: uint16(m.config.BindPort), Incarnation: 1, Vsn: m.config.BuildVsnArray()} - m.aliveNode(&a, nil, true) - - // Make all but one peer be an real, alive instance. - var peers []*Memberlist - for j := 0; j < c.numPeers-1; j++ { - peerAddr := getBindAddr() - - peer := HostMemberlist(peerAddr.String(), t, func(c *Config) { - c.BindPort = ports[j] - c.AdvertisePort = ports[j] - c.Name = peernames[j] - }) - defer peer.Shutdown() - - peers = append(peers, peer) - - a = alive{Node: peer.config.Name, Addr: peerAddr.String(), Port: peer.advertisePort, Incarnation: 1, Vsn: m.config.BuildVsnArray()} - m.aliveNode(&a, nil, false) - } - - // Just use a bogus address for the last peer so it doesn't respond - // to pings, but tell the memberlist it's alive. - badPeerAddr := getBindAddr() - badPeerName := "c10" - a = alive{Node: badPeerName, Addr: badPeerAddr.String(), Port: uint16(56087), Incarnation: 1, Vsn: m.config.BuildVsnArray()} - m.aliveNode(&a, nil, false) - - // Force a probe, which should start us into the suspect state. - m.probeNodeByAddr(badPeerName) - - if m.getNodeState(badPeerName) != StateSuspect { - t.Fatalf("case %d: expected node to be suspect", i) - } - - // Add the requested number of confirmations. - for j := 0; j < c.confirmations; j++ { - from := fmt.Sprintf("peer%d", j) - s := suspect{Node: badPeerName, Incarnation: 1, From: from} - m.suspectNode(&s) - } - - // Wait until right before the timeout and make sure the timer - // hasn't fired. - fudge := 25 * time.Millisecond - time.Sleep(c.expected - fudge) - - if m.getNodeState(badPeerName) != StateSuspect { - t.Fatalf("case %d: expected node to still be suspect", i) - } - - // Wait through the timeout and a little after to make sure the - // timer fires. - time.Sleep(2 * fudge) - - if m.getNodeState(badPeerName) != StateDead { - t.Fatalf("case %d: expected node to be dead", i) - } - }) - } -} - -/* -func TestMemberList_ProbeNode_FallbackTCP(t *testing.T) { - addr1 := getBindAddr() - addr2 := getBindAddr() - addr3 := getBindAddr() - addr4 := getBindAddr() - ip1 := addr1 - ip2 := addr2 - ip3 := addr3 - ip4 := addr4 - - var probeTimeMax time.Duration - m1 := HostMemberlist(addr1.String(), t, func(c *Config) { - c.ProbeTimeout = 10 * time.Millisecond - c.ProbeInterval = 200 * time.Millisecond - probeTimeMax = c.ProbeInterval + 20*time.Millisecond - }) - defer m1.Shutdown() - - bindPort := m1.config.BindPort - - m2 := HostMemberlist(addr2.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m2.Shutdown() - - m3 := HostMemberlist(addr3.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m3.Shutdown() - - m4 := HostMemberlist(addr4.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m4.Shutdown() - - a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a1, nil, true) - a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a2, nil, false) - a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a3, nil, false) - - // Make sure m4 is configured with the same protocol version as m1 so - // the TCP fallback behavior is enabled. - a4 := alive{ - Node: addr4.String(), - Addr: ip4.String(), - Port: uint16(bindPort), - Incarnation: 1, - Vsn: []uint8{ - ProtocolVersionMin, - ProtocolVersionMax, - m1.config.ProtocolVersion, - m1.config.DelegateProtocolMin, - m1.config.DelegateProtocolMax, - m1.config.DelegateProtocolVersion, - }, - } - m1.aliveNode(&a4, nil, false) - - // Isolate m4 from UDP traffic by re-opening its listener on the wrong - // port. This should force the TCP fallback path to be used. - var err error - if err = m4.udpListener.Close(); err != nil { - t.Fatalf("err: %v", err) - } - udpAddr := &net.UDPAddr{IP: ip4.String(), Port: 9999} - if m4.udpListener, err = net.ListenUDP("udp", udpAddr); err != nil { - t.Fatalf("err: %v", err) - } - - // Have node m1 probe m4. - n := m1.nodeMap[addr4.String()] - startProbe := time.Now() - m1.probeNode(n) - probeTime := time.Now().Sub(startProbe) - - // Should be marked alive because of the TCP fallback ping. - if n.State != stateAlive { - t.Fatalf("expect node to be alive") - } - - // Make sure TCP activity completed in a timely manner. - if probeTime > probeTimeMax { - t.Fatalf("took to long to probe, %9.6f", probeTime.Seconds()) - } - - // Confirm at least one of the peers attempted an indirect probe. - time.Sleep(probeTimeMax) - if m2.sequenceNum != 1 && m3.sequenceNum != 1 { - t.Fatalf("bad seqnos %v, %v", m2.sequenceNum, m3.sequenceNum) - } - - // Now shutdown all inbound TCP traffic to make sure the TCP fallback - // path properly fails when the node is really unreachable. - if err = m4.tcpListener.Close(); err != nil { - t.Fatalf("err: %v", err) - } - tcpAddr := &net.TCPAddr{IP: ip4.String(), Port: 9999} - if m4.tcpListener, err = net.ListenTCP("tcp", tcpAddr); err != nil { - t.Fatalf("err: %v", err) - } - - // Probe again, this time there should be no contact. - startProbe = time.Now() - m1.probeNode(n) - probeTime = time.Now().Sub(startProbe) - - // Node should be reported suspect. - if n.State != stateSuspect { - t.Fatalf("expect node to be suspect") - } - - // Make sure TCP activity didn't cause us to wait too long before - // timing out. - if probeTime > probeTimeMax { - t.Fatalf("took to long to probe, %9.6f", probeTime.Seconds()) - } - - // Confirm at least one of the peers attempted an indirect probe. - time.Sleep(probeTimeMax) - if m2.sequenceNum != 2 && m3.sequenceNum != 2 { - t.Fatalf("bad seqnos %v, %v", m2.sequenceNum, m3.sequenceNum) - } -} - -func TestMemberList_ProbeNode_FallbackTCP_Disabled(t *testing.T) { - addr1 := getBindAddr() - addr2 := getBindAddr() - addr3 := getBindAddr() - addr4 := getBindAddr() - ip1 := addr1 - ip2 := addr2 - ip3 := addr3 - ip4 := addr4 - - var probeTimeMax time.Duration - m1 := HostMemberlist(addr1.String(), t, func(c *Config) { - c.ProbeTimeout = 10 * time.Millisecond - c.ProbeInterval = 200 * time.Millisecond - probeTimeMax = c.ProbeInterval + 20*time.Millisecond - }) - defer m1.Shutdown() - - bindPort := m1.config.BindPort - - m2 := HostMemberlist(addr2.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m2.Shutdown() - - m3 := HostMemberlist(addr3.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m3.Shutdown() - - m4 := HostMemberlist(addr4.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m4.Shutdown() - - a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a1, nil, true) - a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a2, nil, false) - a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a3, nil, false) - - // Make sure m4 is configured with the same protocol version as m1 so - // the TCP fallback behavior is enabled. - a4 := alive{ - Node: addr4.String(), - Addr: ip4.String(), - Port: uint16(bindPort), - Incarnation: 1, - Vsn: []uint8{ - ProtocolVersionMin, - ProtocolVersionMax, - m1.config.ProtocolVersion, - m1.config.DelegateProtocolMin, - m1.config.DelegateProtocolMax, - m1.config.DelegateProtocolVersion, - }, - } - m1.aliveNode(&a4, nil, false) - - // Isolate m4 from UDP traffic by re-opening its listener on the wrong - // port. This should force the TCP fallback path to be used. - var err error - if err = m4.udpListener.Close(); err != nil { - t.Fatalf("err: %v", err) - } - udpAddr := &net.UDPAddr{IP: ip4.String(), Port: 9999} - if m4.udpListener, err = net.ListenUDP("udp", udpAddr); err != nil { - t.Fatalf("err: %v", err) - } - - // Disable the TCP pings using the config mechanism. - m1.config.DisableTcpPings = true - - // Have node m1 probe m4. - n := m1.nodeMap[addr4.String()] - startProbe := time.Now() - m1.probeNode(n) - probeTime := time.Now().Sub(startProbe) - - // Node should be reported suspect. - if n.State != stateSuspect { - t.Fatalf("expect node to be suspect") - } - - // Make sure TCP activity didn't cause us to wait too long before - // timing out. - if probeTime > probeTimeMax { - t.Fatalf("took to long to probe, %9.6f", probeTime.Seconds()) - } - - // Confirm at least one of the peers attempted an indirect probe. - time.Sleep(probeTimeMax) - if m2.sequenceNum != 1 && m3.sequenceNum != 1 { - t.Fatalf("bad seqnos %v, %v", m2.sequenceNum, m3.sequenceNum) - } -} - -func TestMemberList_ProbeNode_FallbackTCP_OldProtocol(t *testing.T) { - addr1 := getBindAddr() - addr2 := getBindAddr() - addr3 := getBindAddr() - addr4 := getBindAddr() - ip1 := addr1 - ip2 := addr2 - ip3 := addr3 - ip4 := addr4 - - var probeTimeMax time.Duration - m1 := HostMemberlist(addr1.String(), t, func(c *Config) { - c.ProbeTimeout = 10 * time.Millisecond - c.ProbeInterval = 200 * time.Millisecond - probeTimeMax = c.ProbeInterval + 20*time.Millisecond - }) - defer m1.Shutdown() - - bindPort := m1.config.BindPort - - m2 := HostMemberlist(addr2.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m2.Shutdown() - - m3 := HostMemberlist(addr3.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m3.Shutdown() - - m4 := HostMemberlist(addr4.String(), t, func(c *Config) { - c.BindPort = bindPort - }) - defer m4.Shutdown() - - a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a1, nil, true) - a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a2, nil, false) - a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1} - m1.aliveNode(&a3, nil, false) - - // Set up m4 so that it doesn't understand a version of the protocol - // that supports TCP pings. - a4 := alive{ - Node: addr4.String(), - Addr: ip4.String(), - Port: uint16(bindPort), - Incarnation: 1, - Vsn: []uint8{ - ProtocolVersionMin, - ProtocolVersion2Compatible, - ProtocolVersion2Compatible, - m1.config.DelegateProtocolMin, - m1.config.DelegateProtocolMax, - m1.config.DelegateProtocolVersion, - }, - } - m1.aliveNode(&a4, nil, false) - - // Isolate m4 from UDP traffic by re-opening its listener on the wrong - // port. This should force the TCP fallback path to be used. - var err error - if err = m4.udpListener.Close(); err != nil { - t.Fatalf("err: %v", err) - } - udpAddr := &net.UDPAddr{IP: ip4.String(), Port: 9999} - if m4.udpListener, err = net.ListenUDP("udp", udpAddr); err != nil { - t.Fatalf("err: %v", err) - } - - // Have node m1 probe m4. - n := m1.nodeMap[addr4.String()] - startProbe := time.Now() - m1.probeNode(n) - probeTime := time.Now().Sub(startProbe) - - // Node should be reported suspect. - if n.State != stateSuspect { - t.Fatalf("expect node to be suspect") - } - - // Make sure TCP activity didn't cause us to wait too long before - // timing out. - if probeTime > probeTimeMax { - t.Fatalf("took to long to probe, %9.6f", probeTime.Seconds()) - } - - // Confirm at least one of the peers attempted an indirect probe. - time.Sleep(probeTimeMax) - if m2.sequenceNum != 1 && m3.sequenceNum != 1 { - t.Fatalf("bad seqnos %v, %v", m2.sequenceNum, m3.sequenceNum) - } -} -*/ -// -//func TestMemberList_ProbeNode_Awareness_Degraded(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// addr3 := getBindAddr() -// addr4 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// ip3 := addr3 -// ip4 := addr4 -// -// var probeTimeMin time.Duration -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// probeTimeMin = 2*c.ProbeInterval - 50*time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// }) -// defer m2.Shutdown() -// -// m3 := HostMemberlist(addr3.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// }) -// defer m3.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m2.config.BuildVsnArray()} -// m1.aliveNode(&a2, nil, false) -// a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m3.config.BuildVsnArray()} -// m1.aliveNode(&a3, nil, false) -// -// vsn4 := []uint8{ -// ProtocolVersionMin, ProtocolVersionMax, ProtocolVersionMin, -// 1, 1, 1, -// } -// // Node 4 never gets started. -// a4 := alive{Node: addr4.String(), Addr: ip4.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: vsn4} -// m1.aliveNode(&a4, nil, false) -// -// // Start the health in a degraded state. -// m1.awareness.ApplyDelta(1) -// if score := m1.GetHealthScore(); score != 1 { -// t.Fatalf("bad: %d", score) -// } -// -// // Have node m1 probe m4. -// n := m1.nodeMap[addr4.String()] -// startProbe := time.Now() -// m1.probeNode(n) -// probeTime := time.Now().Sub(startProbe) -// -// // Node should be reported suspect. -// if n.State != StateSuspect { -// t.Fatalf("expect node to be suspect") -// } -// -// // Make sure we timed out approximately on time (note that we accounted -// // for the slowed-down failure detector in the probeTimeMin calculation. -// if probeTime < probeTimeMin { -// t.Fatalf("probed too quickly, %9.6f", probeTime.Seconds()) -// } -// -// // Confirm at least one of the peers attempted an indirect probe. -// if m2.sequenceNum != 1 && m3.sequenceNum != 1 { -// t.Fatalf("bad seqnos %v, %v", m2.sequenceNum, m3.sequenceNum) -// } -// -// // We should have gotten all the nacks, so our score should remain the -// // same, since we didn't get a successful probe. -// if score := m1.GetHealthScore(); score != 1 { -// t.Fatalf("bad: %d", score) -// } -//} -// -//func TestMemberList_ProbeNode_Wrong_VSN(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// addr3 := getBindAddr() -// addr4 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// ip3 := addr3 -// ip4 := addr4 -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// }) -// defer m2.Shutdown() -// -// m3 := HostMemberlist(addr3.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// }) -// defer m3.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m2.config.BuildVsnArray()} -// m1.aliveNode(&a2, nil, false) -// a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m3.config.BuildVsnArray()} -// m1.aliveNode(&a3, nil, false) -// -// vsn4 := []uint8{ -// 0, 0, 0, -// 0, 0, 0, -// } -// // Node 4 never gets started. -// a4 := alive{Node: addr4.String(), Addr: ip4.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: vsn4} -// m1.aliveNode(&a4, nil, false) -// -// // Start the health in a degraded state. -// m1.awareness.ApplyDelta(1) -// if score := m1.GetHealthScore(); score != 1 { -// t.Fatalf("bad: %d", score) -// } -// -// // Have node m1 probe m4. -// n, ok := m1.nodeMap[addr4.String()] -// if ok || n != nil { -// t.Fatalf("expect node a4 to be not taken into account, because of its wrong version") -// } -//} -// -//func TestMemberList_ProbeNode_Awareness_Improved(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// }) -// defer m2.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m2.config.BuildVsnArray()} -// m1.aliveNode(&a2, nil, false) -// -// // Start the health in a degraded state. -// m1.awareness.ApplyDelta(1) -// if score := m1.GetHealthScore(); score != 1 { -// t.Fatalf("bad: %d", score) -// } -// -// // Have node m1 probe m2. -// n := m1.nodeMap[addr2.String()] -// m1.probeNode(n) -// -// // Node should be reported alive. -// if n.State != StateAlive { -// t.Fatalf("expect node to be suspect") -// } -// -// // Our score should have improved since we did a good probe. -// if score := m1.GetHealthScore(); score != 0 { -// t.Fatalf("bad: %d", score) -// } -//} -// -//func TestMemberList_ProbeNode_Awareness_MissedNack(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// addr3 := getBindAddr() -// addr4 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// ip3 := addr3 -// ip4 := addr4 -// -// var probeTimeMax time.Duration -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// probeTimeMax = c.ProbeInterval + 50*time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// }) -// defer m2.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a2, nil, false) -// -// vsn := m1.config.BuildVsnArray() -// // Node 3 and node 4 never get started. -// a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: vsn} -// m1.aliveNode(&a3, nil, false) -// a4 := alive{Node: addr4.String(), Addr: ip4.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: vsn} -// m1.aliveNode(&a4, nil, false) -// -// // Make sure health looks good. -// if score := m1.GetHealthScore(); score != 0 { -// t.Fatalf("bad: %d", score) -// } -// -// // Have node m1 probe m4. -// n := m1.nodeMap[addr4.String()] -// startProbe := time.Now() -// m1.probeNode(n) -// probeTime := time.Now().Sub(startProbe) -// -// // Node should be reported suspect. -// -// m1.nodeLock.Lock() -// if n.State != StateSuspect { -// t.Fatalf("expect node to be suspect") -// } -// m1.nodeLock.Unlock() -// -// // Make sure we timed out approximately on time. -// if probeTime > probeTimeMax { -// t.Fatalf("took to long to probe, %9.6f", probeTime.Seconds()) -// } -// -// // We should have gotten dinged for the missed nack. Note that the code under -// // test is waiting for probeTimeMax and then doing some other work before it -// // updates the awareness, so we need to wait some extra time. Rather than just -// // add longer and longer sleeps, we'll retry a few times. -// iretry.Run(t, func(r *iretry.R) { -// if score := m1.GetHealthScore(); score != 1 { -// r.Fatalf("expected health score to decrement on missed nack. want %d, "+ -// "got: %d", 1, score) -// } -// }) -//} -// -//func TestMemberList_ProbeNode_Awareness_OldProtocol(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// addr3 := getBindAddr() -// addr4 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// ip3 := addr3 -// ip4 := addr4 -// -// var probeTimeMax time.Duration -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = 10 * time.Millisecond -// c.ProbeInterval = 200 * time.Millisecond -// probeTimeMax = c.ProbeInterval + 20*time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// }) -// defer m2.Shutdown() -// -// m3 := HostMemberlist(addr3.String(), t, func(c *Config) { -// c.BindPort = bindPort -// }) -// defer m3.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a2, nil, false) -// a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a3, nil, false) -// -// // Node 4 never gets started. -// a4 := alive{Node: addr4.String(), Addr: ip4.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a4, nil, false) -// -// // Make sure health looks good. -// if score := m1.GetHealthScore(); score != 0 { -// t.Fatalf("bad: %d", score) -// } -// -// // Have node m1 probe m4. -// n := m1.nodeMap[addr4.String()] -// startProbe := time.Now() -// m1.probeNode(n) -// probeTime := time.Now().Sub(startProbe) -// -// // Node should be reported suspect. -// if n.State != StateSuspect { -// t.Fatalf("expect node to be suspect") -// } -// -// // Make sure we timed out approximately on time. -// if probeTime > probeTimeMax { -// t.Fatalf("took to long to probe, %9.6f", probeTime.Seconds()) -// } -// -// // Confirm at least one of the peers attempted an indirect probe. -// time.Sleep(probeTimeMax) -// if m2.sequenceNum != 1 && m3.sequenceNum != 1 { -// t.Fatalf("bad seqnos %v, %v", m2.sequenceNum, m3.sequenceNum) -// } -// -// // Since we are using the old protocol here, we should have gotten dinged -// // for a failed health check. -// if score := m1.GetHealthScore(); score != 1 { -// t.Fatalf("bad: %d", score) -// } -//} -// -//func TestMemberList_ProbeNode_Buddy(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = time.Millisecond -// c.ProbeInterval = 10 * time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// }) -// defer m2.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m2.config.BuildVsnArray()} -// -// m1.aliveNode(&a1, nil, true) -// m1.aliveNode(&a2, nil, false) -// m2.aliveNode(&a2, nil, true) -// -// // Force the state to suspect so we piggyback a suspect message with the ping. -// // We should see this get refuted later, and the ping will succeed. -// n := m1.nodeMap[addr2.String()] -// n.State = StateSuspect -// m1.probeNode(n) -// -// // Make sure a ping was sent. -// if m1.sequenceNum != 1 { -// t.Fatalf("bad seqno %v", m1.sequenceNum) -// } -// -// // Check a broadcast is queued. -// if num := m2.broadcasts.NumQueued(); num != 1 { -// t.Fatalf("expected only one queued message: %d", num) -// } -// -// // Should be alive msg. -// if messageType(m2.broadcasts.orderedView(true)[0].b.Message()[0]) != aliveMsg { -// t.Fatalf("expected queued alive msg") -// } -//} -// -//func TestMemberList_ProbeNode(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = time.Millisecond -// c.ProbeInterval = 10 * time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// }) -// defer m2.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a2, nil, false) -// -// n := m1.nodeMap[addr2.String()] -// m1.probeNode(n) -// -// // Should be marked alive -// if n.State != StateAlive { -// t.Fatalf("Expect node to be alive") -// } -// -// // Should increment seqno -// if m1.sequenceNum != 1 { -// t.Fatalf("bad seqno %v", m1.sequenceNum) -// } -//} -// -//func TestMemberList_Ping(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.ProbeTimeout = 1 * time.Second -// c.ProbeInterval = 10 * time.Second -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// }) -// defer m2.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1} -// m1.aliveNode(&a2, nil, false) -// -// // Do a legit ping. -// n := m1.nodeMap[addr2.String()] -// addr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(addr2.String(), strconv.Itoa(bindPort))) -// if err != nil { -// t.Fatalf("err: %v", err) -// } -// rtt, err := m1.Ping(n.Name, addr) -// if err != nil { -// t.Fatalf("err: %v", err) -// } -// if !(rtt > 0) { -// t.Fatalf("bad: %v", rtt) -// } -// -// // This ping has a bad node name so should timeout. -// _, err = m1.Ping("bad", addr) -// if _, ok := err.(NoPingResponseError); !ok || err == nil { -// t.Fatalf("bad: %v", err) -// } -//} -// -//func TestMemberList_ResetNodes(t *testing.T) { -// m := GetMemberlist(t, func(c *Config) { -// c.GossipToTheDeadTime = 100 * time.Millisecond -// }) -// defer m.Shutdown() -// -// a1 := alive{Node: "test1", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a1, nil, false) -// a2 := alive{Node: "test2", Addr: string([]byte{127, 0, 0, 2}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a2, nil, false) -// a3 := alive{Node: "test3", Addr: string([]byte{127, 0, 0, 3}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a3, nil, false) -// d := dead{Node: "test2", Incarnation: 1} -// m.deadNode(&d) -// -// m.resetNodes() -// if len(m.nodes) != 3 { -// t.Fatalf("Bad length") -// } -// if _, ok := m.nodeMap["test2"]; !ok { -// t.Fatalf("test2 should not be unmapped") -// } -// -// time.Sleep(200 * time.Millisecond) -// m.resetNodes() -// if len(m.nodes) != 2 { -// t.Fatalf("Bad length") -// } -// if _, ok := m.nodeMap["test2"]; ok { -// t.Fatalf("test2 should be unmapped") -// } -//} -// -//func TestMemberList_NextSeq(t *testing.T) { -// m := &Memberlist{} -// if m.nextSeqNo() != 1 { -// t.Fatalf("bad sequence no") -// } -// if m.nextSeqNo() != 2 { -// t.Fatalf("bad sequence no") -// } -//} -// -//func ackHandlerExists(t *testing.T, m *Memberlist, idx uint32) bool { -// t.Helper() -// -// m.ackLock.Lock() -// _, ok := m.ackHandlers[idx] -// m.ackLock.Unlock() -// -// return ok -//} -// -//func TestMemberList_setProbeChannels(t *testing.T) { -// m := &Memberlist{ackHandlers: make(map[uint32]*ackHandler)} -// -// ch := make(chan ackMessage, 1) -// m.setProbeChannels(0, ch, nil, 10*time.Millisecond) -// -// require.True(t, ackHandlerExists(t, m, 0), "missing handler") -// -// time.Sleep(20 * time.Millisecond) -// -// require.False(t, ackHandlerExists(t, m, 0), "non-reaped handler") -//} -// -//func TestMemberList_setAckHandler(t *testing.T) { -// m := &Memberlist{ackHandlers: make(map[uint32]*ackHandler)} -// -// f := func([]byte, time.Time) {} -// m.setAckHandler(0, f, 10*time.Millisecond) -// -// require.True(t, ackHandlerExists(t, m, 0), "missing handler") -// -// time.Sleep(20 * time.Millisecond) -// -// require.False(t, ackHandlerExists(t, m, 0), "non-reaped handler") -//} -// -//func TestMemberList_invokeAckHandler(t *testing.T) { -// m := &Memberlist{ackHandlers: make(map[uint32]*ackHandler)} -// -// // Does nothing -// m.invokeAckHandler(ackResp{}, time.Now()) -// -// var b bool -// f := func(payload []byte, timestamp time.Time) { b = true } -// m.setAckHandler(0, f, 10*time.Millisecond) -// -// // Should set b -// m.invokeAckHandler(ackResp{0, nil}, time.Now()) -// if !b { -// t.Fatalf("b not set") -// } -// -// require.False(t, ackHandlerExists(t, m, 0), "non-reaped handler") -//} -// -//func TestMemberList_invokeAckHandler_Channel_Ack(t *testing.T) { -// m := &Memberlist{ackHandlers: make(map[uint32]*ackHandler)} -// -// ack := ackResp{0, []byte{0, 0, 0}} -// -// // Does nothing -// m.invokeAckHandler(ack, time.Now()) -// -// ackCh := make(chan ackMessage, 1) -// nackCh := make(chan struct{}, 1) -// m.setProbeChannels(0, ackCh, nackCh, 10*time.Millisecond) -// -// // Should send message -// m.invokeAckHandler(ack, time.Now()) -// -// select { -// case v := <-ackCh: -// if v.Complete != true { -// t.Fatalf("Bad value") -// } -// if bytes.Compare(v.Payload, ack.Payload) != 0 { -// t.Fatalf("wrong payload. expected: %v; actual: %v", ack.Payload, v.Payload) -// } -// -// case <-nackCh: -// t.Fatalf("should not get a nack") -// -// default: -// t.Fatalf("message not sent") -// } -// -// require.False(t, ackHandlerExists(t, m, 0), "non-reaped handler") -//} -// -//func TestMemberList_invokeAckHandler_Channel_Nack(t *testing.T) { -// m := &Memberlist{ackHandlers: make(map[uint32]*ackHandler)} -// -// nack := nackResp{0} -// -// // Does nothing. -// m.invokeNackHandler(nack) -// -// ackCh := make(chan ackMessage, 1) -// nackCh := make(chan struct{}, 1) -// m.setProbeChannels(0, ackCh, nackCh, 10*time.Millisecond) -// -// // Should send message. -// m.invokeNackHandler(nack) -// -// select { -// case <-ackCh: -// t.Fatalf("should not get an ack") -// -// case <-nackCh: -// // Good. -// -// default: -// t.Fatalf("message not sent") -// } -// -// // Getting a nack doesn't reap the handler so that we can still forward -// // an ack up to the reap time, if we get one. -// require.True(t, ackHandlerExists(t, m, 0), "handler should not be reaped") -// -// ack := ackResp{0, []byte{0, 0, 0}} -// m.invokeAckHandler(ack, time.Now()) -// -// select { -// case v := <-ackCh: -// if v.Complete != true { -// t.Fatalf("Bad value") -// } -// if bytes.Compare(v.Payload, ack.Payload) != 0 { -// t.Fatalf("wrong payload. expected: %v; actual: %v", ack.Payload, v.Payload) -// } -// -// case <-nackCh: -// t.Fatalf("should not get a nack") -// -// default: -// t.Fatalf("message not sent") -// } -// -// require.False(t, ackHandlerExists(t, m, 0), "non-reaped handler") -//} -// -//func TestMemberList_AliveNode_NewNode(t *testing.T) { -// ch := make(chan NodeEvent, 1) -// m := GetMemberlist(t, func(c *Config) { -// c.Events = &ChannelEventDelegate{ch} -// }) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// if len(m.nodes) != 1 { -// t.Fatalf("should add node") -// } -// -// state, ok := m.nodeMap["test"] -// if !ok { -// t.Fatalf("should map node") -// } -// -// if state.Incarnation != 1 { -// t.Fatalf("bad incarnation") -// } -// if state.State != StateAlive { -// t.Fatalf("bad state") -// } -// if time.Now().Sub(state.StateChange) > time.Second { -// t.Fatalf("bad change delta") -// } -// -// // Check for a join message -// select { -// case e := <-ch: -// if e.Node.Name != "test" { -// t.Fatalf("bad node name") -// } -// default: -// t.Fatalf("no join message") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected queued message") -// } -//} -// -//func TestMemberList_AliveNode_SuspectNode(t *testing.T) { -// ch := make(chan NodeEvent, 1) -// ted := &toggledEventDelegate{ -// real: &ChannelEventDelegate{ch}, -// } -// m := GetMemberlist(t, func(c *Config) { -// c.Events = ted -// }) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// // Listen only after first join -// ted.Toggle(true) -// -// // Make suspect -// state := m.nodeMap["test"] -// state.State = StateSuspect -// state.StateChange = state.StateChange.Add(-time.Hour) -// -// // Old incarnation number, should not change -// m.aliveNode(&a, nil, false) -// if state.State != StateSuspect { -// t.Fatalf("update with old incarnation!") -// } -// -// // Should reset to alive now -// a.Incarnation = 2 -// m.aliveNode(&a, nil, false) -// if state.State != StateAlive { -// t.Fatalf("no update with new incarnation!") -// } -// -// if time.Now().Sub(state.StateChange) > time.Second { -// t.Fatalf("bad change delta") -// } -// -// // Check for a no join message -// select { -// case <-ch: -// t.Fatalf("got bad join message") -// default: -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected queued message") -// } -//} -// -//func TestMemberList_AliveNode_Idempotent(t *testing.T) { -// ch := make(chan NodeEvent, 1) -// ted := &toggledEventDelegate{ -// real: &ChannelEventDelegate{ch}, -// } -// m := GetMemberlist(t, func(c *Config) { -// c.Events = ted -// }) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// // Listen only after first join -// ted.Toggle(true) -// -// // Make suspect -// state := m.nodeMap["test"] -// stateTime := state.StateChange -// -// // Should reset to alive now -// a.Incarnation = 2 -// m.aliveNode(&a, nil, false) -// if state.State != StateAlive { -// t.Fatalf("non idempotent") -// } -// -// if stateTime != state.StateChange { -// t.Fatalf("should not change state") -// } -// -// // Check for a no join message -// select { -// case <-ch: -// t.Fatalf("got bad join message") -// default: -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected only one queued message") -// } -//} -// -//type toggledEventDelegate struct { -// mu sync.Mutex -// real EventDelegate -// enabled bool -//} -// -//func (d *toggledEventDelegate) Toggle(enabled bool) { -// d.mu.Lock() -// defer d.mu.Unlock() -// d.enabled = enabled -//} -// -//// NotifyJoin is invoked when a node is detected to have joined. -//// The Node argument must not be modified. -//func (d *toggledEventDelegate) NotifyJoin(n *Node) { -// d.mu.Lock() -// defer d.mu.Unlock() -// if d.enabled { -// d.real.NotifyJoin(n) -// } -//} -// -//// NotifyLeave is invoked when a node is detected to have left. -//// The Node argument must not be modified. -//func (d *toggledEventDelegate) NotifyLeave(n *Node) { -// d.mu.Lock() -// defer d.mu.Unlock() -// if d.enabled { -// d.real.NotifyLeave(n) -// } -//} -// -//// NotifyUpdate is invoked when a node is detected to have -//// updated, usually involving the meta data. The Node argument -//// must not be modified. -//func (d *toggledEventDelegate) NotifyUpdate(n *Node) { -// d.mu.Lock() -// defer d.mu.Unlock() -// if d.enabled { -// d.real.NotifyUpdate(n) -// } -//} -// -//func (d *toggledEventDelegate) NotifyWeight(n *Node) { -// d.mu.Lock() -// defer d.mu.Unlock() -// if d.enabled { -// d.real.NotifyWeight(n) -// } -//} -// -//func (d *toggledEventDelegate) NotifySuspectSateChange(n *Node) { -// d.mu.Lock() -// defer d.mu.Unlock() -// if d.enabled { -// d.real.NotifySuspectSateChange(n) -// } -//} -// -//// Serf Bug: GH-58, Meta data does not update -//func TestMemberList_AliveNode_ChangeMeta(t *testing.T) { -// ch := make(chan NodeEvent, 1) -// ted := &toggledEventDelegate{ -// real: &ChannelEventDelegate{ch}, -// } -// -// m := GetMemberlist(t, func(c *Config) { -// c.Events = ted -// }) -// defer m.Shutdown() -// -// a := alive{ -// Node: "test", -// Addr: string([]byte{127, 0, 0, 1}), -// Meta: []byte("val1"), -// Incarnation: 1, -// Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// // Listen only after first join -// ted.Toggle(true) -// -// // Make suspect -// state := m.nodeMap["test"] -// -// // Should reset to alive now -// a.Incarnation = 2 -// a.Meta = []byte("val2") -// m.aliveNode(&a, nil, false) -// -// // Check updates -// if bytes.Compare(state.Meta, a.Meta) != 0 { -// t.Fatalf("meta did not update") -// } -// -// // Check for a NotifyUpdate -// select { -// case e := <-ch: -// if e.Event != NodeUpdate { -// t.Fatalf("bad event: %v", e) -// } -// if !reflect.DeepEqual(*e.Node, state.Node) { -// t.Fatalf("expected %v, got %v", *e.Node, state.Node) -// } -// if bytes.Compare(e.Node.Meta, a.Meta) != 0 { -// t.Fatalf("meta did not update") -// } -// default: -// t.Fatalf("missing event!") -// } -// -//} -// -//func TestMemberList_AliveNode_Refute(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: m.config.Name, Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, true) -// -// // Clear queue -// m.broadcasts.Reset() -// -// // Conflicting alive -// s := alive{ -// Node: m.config.Name, -// Addr: string([]byte{127, 0, 0, 1}), -// Incarnation: 2, -// Meta: []byte("foo"), -// Vsn: m.config.BuildVsnArray(), -// } -// m.aliveNode(&s, nil, false) -// -// state := m.nodeMap[m.config.Name] -// if state.State != StateAlive { -// t.Fatalf("should still be alive") -// } -// if state.Meta != nil { -// t.Fatalf("meta should still be nil") -// } -// -// // Check a broad cast is queued -// if num := m.broadcasts.NumQueued(); num != 1 { -// t.Fatalf("expected only one queued message: %d", -// num) -// } -// -// // Should be alive mesg -// if messageType(m.broadcasts.orderedView(true)[0].b.Message()[0]) != aliveMsg { -// t.Fatalf("expected queued alive msg") -// } -//} -// -//func TestMemberList_AliveNode_Conflict(t *testing.T) { -// m := GetMemberlist(t, func(c *Config) { -// c.DeadNodeReclaimTime = 10 * time.Millisecond -// }) -// defer m.Shutdown() -// -// nodeName := "test" -// a := alive{Node: nodeName, Addr: string([]byte{127, 0, 0, 1}), Port: 8000, Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, true) -// -// // Clear queue -// m.broadcasts.Reset() -// -// // Conflicting alive -// s := alive{ -// Node: nodeName, -// Addr: string([]byte{127, 0, 0, 2}), -// Port: 9000, -// Incarnation: 2, -// Meta: []byte("foo"), -// Vsn: m.config.BuildVsnArray(), -// } -// m.aliveNode(&s, nil, false) -// -// state := m.nodeMap[nodeName] -// if state.State != StateAlive { -// t.Fatalf("should still be alive") -// } -// if state.Meta != nil { -// t.Fatalf("meta should still be nil") -// } -// if state.Addr == string([]byte{127, 0, 0, 2}) { -// t.Fatalf("address should not be updated") -// } -// if state.Port == 9000 { -// t.Fatalf("port should not be updated") -// } -// -// // Check a broad cast is queued -// if num := m.broadcasts.NumQueued(); num != 0 { -// t.Fatalf("expected 0 queued messages: %d", num) -// } -// -// // Change the node to dead -// d := dead{Node: nodeName, Incarnation: 2} -// m.deadNode(&d) -// m.broadcasts.Reset() -// -// state = m.nodeMap[nodeName] -// if state.State != StateDead { -// t.Fatalf("should be dead") -// } -// -// time.Sleep(m.config.DeadNodeReclaimTime) -// -// // New alive node -// s2 := alive{ -// Node: nodeName, -// Addr: string([]byte{127, 0, 0, 2}), -// Port: 9000, -// Incarnation: 3, -// Meta: []byte("foo"), -// Vsn: m.config.BuildVsnArray(), -// } -// m.aliveNode(&s2, nil, false) -// -// state = m.nodeMap[nodeName] -// if state.State != StateAlive { -// t.Fatalf("should still be alive") -// } -// if !bytes.Equal(state.Meta, []byte("foo")) { -// t.Fatalf("meta should be updated") -// } -// if state.Addr != string([]byte{127, 0, 0, 2}) { -// t.Fatalf("address should be updated") -// } -// if state.Port != 9000 { -// t.Fatalf("port should be updated") -// } -//} -// -//func TestMemberList_SuspectNode_NoNode(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// s := suspect{Node: "test", Incarnation: 1} -// m.suspectNode(&s) -// if len(m.nodes) != 0 { -// t.Fatalf("don't expect nodes") -// } -//} -// -//func TestMemberList_SuspectNode(t *testing.T) { -// m := GetMemberlist(t, func(c *Config) { -// c.ProbeInterval = time.Millisecond -// c.SuspicionMult = 1 -// }) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// m.changeNode("test", func(state *nodeState) { -// state.StateChange = state.StateChange.Add(-time.Hour) -// }) -// -// s := suspect{Node: "test", Incarnation: 1} -// m.suspectNode(&s) -// -// if m.getNodeState("test") != StateSuspect { -// t.Fatalf("Bad state") -// } -// -// change := m.getNodeStateChange("test") -// if time.Now().Sub(change) > time.Second { -// t.Fatalf("bad change delta") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected only one queued message") -// } -// -// // Check its a suspect message -// if messageType(m.broadcasts.orderedView(true)[0].b.Message()[0]) != suspectMsg { -// t.Fatalf("expected queued suspect msg") -// } -// -// // Wait for the timeout -// time.Sleep(10 * time.Millisecond) -// -// if m.getNodeState("test") != StateDead { -// t.Fatalf("Bad state") -// } -// -// newChange := m.getNodeStateChange("test") -// if time.Now().Sub(newChange) > time.Second { -// t.Fatalf("bad change delta") -// } -// if !newChange.After(change) { -// t.Fatalf("should increment time") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected only one queued message") -// } -// -// // Check its a suspect message -// if messageType(m.broadcasts.orderedView(true)[0].b.Message()[0]) != deadMsg { -// t.Fatalf("expected queued dead msg") -// } -//} -// -//func TestMemberList_SuspectNode_DoubleSuspect(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// state := m.nodeMap["test"] -// state.StateChange = state.StateChange.Add(-time.Hour) -// -// s := suspect{Node: "test", Incarnation: 1} -// m.suspectNode(&s) -// -// if state.State != StateSuspect { -// t.Fatalf("Bad state") -// } -// -// change := state.StateChange -// if time.Now().Sub(change) > time.Second { -// t.Fatalf("bad change delta") -// } -// -// // clear the broadcast queue -// m.broadcasts.Reset() -// -// // Suspect again -// m.suspectNode(&s) -// -// if state.StateChange != change { -// t.Fatalf("unexpected state change") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 0 { -// t.Fatalf("expected only one queued message") -// } -// -//} -// -//func TestMemberList_SuspectNode_OldSuspect(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 10, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// state := m.nodeMap["test"] -// state.StateChange = state.StateChange.Add(-time.Hour) -// -// // Clear queue -// m.broadcasts.Reset() -// -// s := suspect{Node: "test", Incarnation: 1} -// m.suspectNode(&s) -// -// if state.State != StateAlive { -// t.Fatalf("Bad state") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 0 { -// t.Fatalf("expected only one queued message") -// } -//} -// -//func TestMemberList_SuspectNode_Refute(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: m.config.Name, Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, true) -// -// // Clear queue -// m.broadcasts.Reset() -// -// // Make sure health is in a good state -// if score := m.GetHealthScore(); score != 0 { -// t.Fatalf("bad: %d", score) -// } -// -// s := suspect{Node: m.config.Name, Incarnation: 1} -// m.suspectNode(&s) -// -// state := m.nodeMap[m.config.Name] -// if state.State != StateAlive { -// t.Fatalf("should still be alive") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected only one queued message") -// } -// -// // Should be alive mesg -// if messageType(m.broadcasts.orderedView(true)[0].b.Message()[0]) != aliveMsg { -// t.Fatalf("expected queued alive msg") -// } -// -// // Health should have been dinged -// if score := m.GetHealthScore(); score != 1 { -// t.Fatalf("bad: %d", score) -// } -//} -// -//func TestMemberList_DeadNode_NoNode(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// d := dead{Node: "test", Incarnation: 1} -// m.deadNode(&d) -// if len(m.nodes) != 0 { -// t.Fatalf("don't expect nodes") -// } -//} -// -//func TestMemberList_DeadNodeLeft(t *testing.T) { -// ch := make(chan NodeEvent, 1) -// -// m := GetMemberlist(t, func(c *Config) { -// c.Events = &ChannelEventDelegate{ch} -// }) -// defer m.Shutdown() -// -// nodeName := "node1" -// s1 := alive{ -// Node: nodeName, -// Addr: string([]byte{127, 0, 0, 1}), -// Port: 8000, -// Incarnation: 1, -// Vsn: m.config.BuildVsnArray(), -// } -// m.aliveNode(&s1, nil, false) -// -// // Read the join event -// <-ch -// -// d := dead{Node: nodeName, From: nodeName, Incarnation: 1} -// m.deadNode(&d) -// -// // Read the dead event -// <-ch -// -// state := m.nodeMap[nodeName] -// if state.State != StateLeft { -// t.Fatalf("Bad state") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected only one queued message") -// } -// -// // Check its a dead message -// if messageType(m.broadcasts.orderedView(true)[0].b.Message()[0]) != deadMsg { -// t.Fatalf("expected queued dead msg") -// } -// -// // Clear queue -// // m.broadcasts.Reset() -// -// // New alive node -// s2 := alive{ -// Node: nodeName, -// Addr: string([]byte{127, 0, 0, 2}), -// Port: 9000, -// Incarnation: 3, -// Meta: []byte("foo"), -// Vsn: m.config.BuildVsnArray(), -// } -// m.aliveNode(&s2, nil, false) -// -// // Read the join event -// <-ch -// -// state = m.nodeMap[nodeName] -// if state.State != StateAlive { -// t.Fatalf("should still be alive") -// } -// if !bytes.Equal(state.Meta, []byte("foo")) { -// t.Fatalf("meta should be updated") -// } -// if state.Addr != string([]byte{127, 0, 0, 2}) { -// t.Fatalf("address should be updated") -// } -// if state.Port != 9000 { -// t.Fatalf("port should be updated") -// } -//} -// -//func TestMemberList_DeadNode(t *testing.T) { -// ch := make(chan NodeEvent, 1) -// -// m := GetMemberlist(t, func(c *Config) { -// c.Events = &ChannelEventDelegate{ch} -// }) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// // Read the join event -// <-ch -// -// state := m.nodeMap["test"] -// state.StateChange = state.StateChange.Add(-time.Hour) -// -// d := dead{Node: "test", Incarnation: 1} -// m.deadNode(&d) -// -// if state.State != StateDead { -// t.Fatalf("Bad state") -// } -// -// change := state.StateChange -// if time.Now().Sub(change) > time.Second { -// t.Fatalf("bad change delta") -// } -// -// select { -// case leave := <-ch: -// if leave.Event != NodeLeave || leave.Node.Name != "test" { -// t.Fatalf("bad node name") -// } -// default: -// t.Fatalf("no leave message") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected only one queued message") -// } -// -// // Check its a dead message -// if messageType(m.broadcasts.orderedView(true)[0].b.Message()[0]) != deadMsg { -// t.Fatalf("expected queued dead msg") -// } -//} -// -//func TestMemberList_DeadNode_Double(t *testing.T) { -// ch := make(chan NodeEvent, 1) -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// state := m.nodeMap["test"] -// state.StateChange = state.StateChange.Add(-time.Hour) -// -// d := dead{Node: "test", Incarnation: 1} -// m.deadNode(&d) -// -// // Clear queue -// m.broadcasts.Reset() -// -// // Notify after the first dead -// m.config.Events = &ChannelEventDelegate{ch} -// -// // Should do nothing -// d.Incarnation = 2 -// m.deadNode(&d) -// -// select { -// case <-ch: -// t.Fatalf("should not get leave") -// default: -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 0 { -// t.Fatalf("expected only one queued message") -// } -//} -// -//func TestMemberList_DeadNode_OldDead(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 10, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// state := m.nodeMap["test"] -// state.StateChange = state.StateChange.Add(-time.Hour) -// -// d := dead{Node: "test", Incarnation: 1} -// m.deadNode(&d) -// -// if state.State != StateAlive { -// t.Fatalf("Bad state") -// } -//} -// -//func TestMemberList_DeadNode_AliveReplay(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: "test", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 10, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, false) -// -// d := dead{Node: "test", Incarnation: 10} -// m.deadNode(&d) -// -// // Replay alive at same incarnation -// m.aliveNode(&a, nil, false) -// -// // Should remain dead -// state, ok := m.nodeMap["test"] -// if ok && state.State != StateDead { -// t.Fatalf("Bad state") -// } -//} -// -//func TestMemberList_DeadNode_Refute(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a := alive{Node: m.config.Name, Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a, nil, true) -// -// // Clear queue -// m.broadcasts.Reset() -// -// // Make sure health is in a good state -// if score := m.GetHealthScore(); score != 0 { -// t.Fatalf("bad: %d", score) -// } -// -// d := dead{Node: m.config.Name, Incarnation: 1} -// m.deadNode(&d) -// -// state := m.nodeMap[m.config.Name] -// if state.State != StateAlive { -// t.Fatalf("should still be alive") -// } -// -// // Check a broad cast is queued -// if m.broadcasts.NumQueued() != 1 { -// t.Fatalf("expected only one queued message") -// } -// -// // Should be alive mesg -// if messageType(m.broadcasts.orderedView(true)[0].b.Message()[0]) != aliveMsg { -// t.Fatalf("expected queued alive msg") -// } -// -// // We should have been dinged -// if score := m.GetHealthScore(); score != 1 { -// t.Fatalf("bad: %d", score) -// } -//} -// -//func TestMemberList_MergeState(t *testing.T) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// a1 := alive{Node: "test1", Addr: string([]byte{127, 0, 0, 1}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a1, nil, false) -// a2 := alive{Node: "test2", Addr: string([]byte{127, 0, 0, 2}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a2, nil, false) -// a3 := alive{Node: "test3", Addr: string([]byte{127, 0, 0, 3}), Incarnation: 1, Vsn: m.config.BuildVsnArray()} -// m.aliveNode(&a3, nil, false) -// -// s := suspect{Node: "test1", Incarnation: 1} -// m.suspectNode(&s) -// -// remote := []pushNodeState{ -// pushNodeState{ -// Name: "test1", -// Addr: string([]byte{127, 0, 0, 1}), -// Incarnation: 2, -// State: StateAlive, -// }, -// pushNodeState{ -// Name: "test2", -// Addr: string([]byte{127, 0, 0, 2}), -// Incarnation: 1, -// State: StateSuspect, -// }, -// pushNodeState{ -// Name: "test3", -// Addr: string([]byte{127, 0, 0, 3}), -// Incarnation: 1, -// State: StateDead, -// }, -// pushNodeState{ -// Name: "test4", -// Addr: string([]byte{127, 0, 0, 4}), -// Incarnation: 2, -// State: StateAlive, -// }, -// } -// -// // Listen for changes -// eventCh := make(chan NodeEvent, 1) -// m.config.Events = &ChannelEventDelegate{eventCh} -// -// // Merge remote state -// m.mergeState(remote) -// -// // Check the states -// state := m.nodeMap["test1"] -// if state.State != StateAlive || state.Incarnation != 2 { -// t.Fatalf("Bad state %v", state) -// } -// -// state = m.nodeMap["test2"] -// if state.State != StateSuspect || state.Incarnation != 1 { -// t.Fatalf("Bad state %v", state) -// } -// -// state = m.nodeMap["test3"] -// if state.State != StateSuspect { -// t.Fatalf("Bad state %v", state) -// } -// -// state = m.nodeMap["test4"] -// if state.State != StateAlive || state.Incarnation != 2 { -// t.Fatalf("Bad state %v", state) -// } -// -// // Check the channels -// select { -// case e := <-eventCh: -// if e.Event != NodeJoin || e.Node.Name != "test4" { -// t.Fatalf("bad node %v", e) -// } -// default: -// t.Fatalf("Expect join") -// } -// -// select { -// case e := <-eventCh: -// t.Fatalf("Unexpect event: %v", e) -// default: -// } -//} -// -//func TestMemberlist_Gossip(t *testing.T) { -// ch := make(chan NodeEvent, 3) -// -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// addr3 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// ip3 := addr3 -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// // Set the gossip interval fast enough to get a reasonable test, -// // but slow enough to avoid "sendto: operation not permitted" -// c.GossipInterval = 10 * time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.Events = &ChannelEventDelegate{ch} -// // Set the gossip interval fast enough to get a reasonable test, -// // but slow enough to avoid "sendto: operation not permitted" -// c.GossipInterval = 10 * time.Millisecond -// }) -// defer m2.Shutdown() -// -// m3 := HostMemberlist(addr2.String(), t, func(c *Config) { -// }) -// defer m3.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m2.config.BuildVsnArray()} -// m1.aliveNode(&a2, nil, false) -// a3 := alive{Node: addr3.String(), Addr: ip3.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m3.config.BuildVsnArray()} -// m1.aliveNode(&a3, nil, false) -// -// // Gossip should send all this to m2. Retry a few times because it's UDP and -// // timing and stuff makes this flaky without. -// retry(t, 15, 250*time.Millisecond, func(failf func(string, ...interface{})) { -// m1.gossip() -// -// time.Sleep(3 * time.Millisecond) -// -// if len(ch) < 3 { -// failf("expected 3 messages from gossip but only got %d", len(ch)) -// } -// }) -//} -// -//func TestMemberlist_GossipToDead(t *testing.T) { -// ch := make(chan NodeEvent, 2) -// -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.GossipInterval = time.Millisecond -// c.GossipToTheDeadTime = 100 * time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.Events = &ChannelEventDelegate{ch} -// }) -// -// defer m2.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m2.config.BuildVsnArray()} -// m1.aliveNode(&a2, nil, false) -// -// // Shouldn't send anything to m2 here, node has been dead for 2x the GossipToTheDeadTime -// m1.nodeMap[addr2.String()].State = StateDead -// m1.nodeMap[addr2.String()].StateChange = time.Now().Add(-200 * time.Millisecond) -// m1.gossip() -// -// select { -// case <-ch: -// t.Fatalf("shouldn't get gossip") -// case <-time.After(50 * time.Millisecond): -// } -// -// // Should gossip to m2 because its state has changed within GossipToTheDeadTime -// m1.nodeMap[addr2.String()].StateChange = time.Now().Add(-20 * time.Millisecond) -// -// retry(t, 5, 10*time.Millisecond, func(failf func(string, ...interface{})) { -// m1.gossip() -// -// time.Sleep(3 * time.Millisecond) -// -// if len(ch) < 2 { -// failf("expected 2 messages from gossip") -// } -// }) -//} -// -//func TestMemberlist_FailedRemote(t *testing.T) { -// type test struct { -// name string -// err error -// expected bool -// } -// tests := []test{ -// {"nil error", nil, false}, -// {"normal error", fmt.Errorf(""), false}, -// {"net.OpError for file", &net.OpError{Net: "file"}, false}, -// {"net.OpError for udp", &net.OpError{Net: "udp"}, false}, -// {"net.OpError for udp4", &net.OpError{Net: "udp4"}, false}, -// {"net.OpError for udp6", &net.OpError{Net: "udp6"}, false}, -// {"net.OpError for tcp", &net.OpError{Net: "tcp"}, false}, -// {"net.OpError for tcp4", &net.OpError{Net: "tcp4"}, false}, -// {"net.OpError for tcp6", &net.OpError{Net: "tcp6"}, false}, -// {"net.OpError for tcp with dial", &net.OpError{Net: "tcp", Op: "dial"}, true}, -// {"net.OpError for tcp with write", &net.OpError{Net: "tcp", Op: "write"}, true}, -// {"net.OpError for tcp with read", &net.OpError{Net: "tcp", Op: "read"}, true}, -// } -// -// for _, test := range tests { -// t.Run(test.name, func(t *testing.T) { -// actual := failedRemote(test.err) -// if actual != test.expected { -// t.Fatalf("expected %t, got %t", test.expected, actual) -// } -// }) -// } -//} -// -//func TestMemberlist_PushPull(t *testing.T) { -// addr1 := getBindAddr() -// addr2 := getBindAddr() -// ip1 := addr1 -// ip2 := addr2 -// -// ch := make(chan NodeEvent, 3) -// -// m1 := HostMemberlist(addr1.String(), t, func(c *Config) { -// c.GossipInterval = 10 * time.Second -// c.PushPullInterval = time.Millisecond -// }) -// defer m1.Shutdown() -// -// bindPort := m1.config.BindPort -// -// m2 := HostMemberlist(addr2.String(), t, func(c *Config) { -// c.BindPort = bindPort -// c.GossipInterval = 10 * time.Second -// c.Events = &ChannelEventDelegate{ch} -// }) -// defer m2.Shutdown() -// -// a1 := alive{Node: addr1.String(), Addr: ip1.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m1.config.BuildVsnArray()} -// m1.aliveNode(&a1, nil, true) -// a2 := alive{Node: addr2.String(), Addr: ip2.String(), Port: uint16(bindPort), Incarnation: 1, Vsn: m2.config.BuildVsnArray()} -// m1.aliveNode(&a2, nil, false) -// -// // Gossip should send all this to m2. It's UDP though so retry a few times -// retry(t, 5, 10*time.Millisecond, func(failf func(string, ...interface{})) { -// m1.pushPull() -// -// time.Sleep(3 * time.Millisecond) -// -// if len(ch) < 2 { -// failf("expected 2 messages from pushPull") -// } -// }) -//} -// -//func TestVerifyProtocol(t *testing.T) { -// cases := []struct { -// Anodes [][3]uint8 -// Bnodes [][3]uint8 -// expected bool -// }{ -// // Both running identical everything -// { -// Anodes: [][3]uint8{ -// {0, 0, 0}, -// }, -// Bnodes: [][3]uint8{ -// {0, 0, 0}, -// }, -// expected: true, -// }, -// -// // One can understand newer, but speaking same protocol -// { -// Anodes: [][3]uint8{ -// {0, 0, 0}, -// }, -// Bnodes: [][3]uint8{ -// {0, 1, 0}, -// }, -// expected: true, -// }, -// -// // One is speaking outside the range -// { -// Anodes: [][3]uint8{ -// {0, 0, 0}, -// }, -// Bnodes: [][3]uint8{ -// {1, 1, 1}, -// }, -// expected: false, -// }, -// -// // Transitively outside the range -// { -// Anodes: [][3]uint8{ -// {0, 1, 0}, -// {0, 2, 1}, -// }, -// Bnodes: [][3]uint8{ -// {1, 3, 1}, -// }, -// expected: false, -// }, -// -// // Multi-node -// { -// Anodes: [][3]uint8{ -// {0, 3, 2}, -// {0, 2, 0}, -// }, -// Bnodes: [][3]uint8{ -// {0, 2, 1}, -// {0, 5, 0}, -// }, -// expected: true, -// }, -// } -// -// for _, tc := range cases { -// aCore := make([][6]uint8, len(tc.Anodes)) -// aApp := make([][6]uint8, len(tc.Anodes)) -// for i, n := range tc.Anodes { -// aCore[i] = [6]uint8{n[0], n[1], n[2], 0, 0, 0} -// aApp[i] = [6]uint8{0, 0, 0, n[0], n[1], n[2]} -// } -// -// bCore := make([][6]uint8, len(tc.Bnodes)) -// bApp := make([][6]uint8, len(tc.Bnodes)) -// for i, n := range tc.Bnodes { -// bCore[i] = [6]uint8{n[0], n[1], n[2], 0, 0, 0} -// bApp[i] = [6]uint8{0, 0, 0, n[0], n[1], n[2]} -// } -// -// // Test core protocol verification -// testVerifyProtocolSingle(t, aCore, bCore, tc.expected) -// testVerifyProtocolSingle(t, bCore, aCore, tc.expected) -// -// // Test app protocol verification -// testVerifyProtocolSingle(t, aApp, bApp, tc.expected) -// testVerifyProtocolSingle(t, bApp, aApp, tc.expected) -// } -//} -// -//func testVerifyProtocolSingle(t *testing.T, A [][6]uint8, B [][6]uint8, expect bool) { -// m := GetMemberlist(t, nil) -// defer m.Shutdown() -// -// m.nodes = make([]*nodeState, len(A)) -// for i, n := range A { -// m.nodes[i] = &nodeState{ -// Node: Node{ -// PMin: n[0], -// PMax: n[1], -// PCur: n[2], -// DMin: n[3], -// DMax: n[4], -// DCur: n[5], -// }, -// } -// } -// -// remote := make([]pushNodeState, len(B)) -// for i, n := range B { -// remote[i] = pushNodeState{ -// Name: fmt.Sprintf("node %d", i), -// Vsn: []uint8{n[0], n[1], n[2], n[3], n[4], n[5]}, -// } -// } -// -// err := m.verifyProtocol(remote) -// if (err == nil) != expect { -// t.Fatalf("bad:\nA: %v\nB: %v\nErr: %s", A, B, err) -// } -//} diff --git a/toolkit/memberlist/suspicion.go b/toolkit/memberlist/suspicion.go deleted file mode 100644 index f8aa9e20..00000000 --- a/toolkit/memberlist/suspicion.go +++ /dev/null @@ -1,130 +0,0 @@ -package memberlist - -import ( - "math" - "sync/atomic" - "time" -) - -// suspicion manages the suspect timer for a node and provides an interface -// to accelerate the timeout as we get more independent confirmations that -// a node is suspect. -type suspicion struct { - // n is the number of independent confirmations we've seen. This must - // be updated using atomic instructions to prevent contention with the - // timer callback. - n int32 - - // k is the number of independent confirmations we'd like to see in - // order to drive the timer to its minimum value. - k int32 - - // min is the minimum timer value. - min time.Duration - - // max is the maximum timer value. - max time.Duration - - // start captures the timestamp when we began the timer. This is used - // so we can calculate durations to feed the timer during updates in - // a way the achieves the overall time we'd like. - start time.Time - - // timer is the underlying timer that implements the timeout. - timer *time.Timer - - // f is the function to call when the timer expires. We hold on to this - // because there are cases where we call it directly. - timeoutFn func() - - // confirmations is a map of "from" nodes that have confirmed a given - // node is suspect. This prevents double counting. - confirmations map[string]struct{} -} - -// newSuspicion returns a timer started with the max time, and that will drive -// to the min time after seeing k or more confirmations. The from node will be -// excluded from confirmations since we might get our own suspicion message -// gossiped back to us. The minimum time will be used if no confirmations are -// called for (k <= 0). -func newSuspicion(from string, k int, min time.Duration, max time.Duration, fn func(int)) *suspicion { - s := &suspicion{ - k: int32(k), - min: min, - max: max, - confirmations: make(map[string]struct{}), - } - - // Exclude the from node from any confirmations. - s.confirmations[from] = struct{}{} - - // Pass the number of confirmations into the timeout function for - // easy telemetry. - s.timeoutFn = func() { - fn(int(atomic.LoadInt32(&s.n))) - } - - // If there aren't any confirmations to be made then take the min - // time from the start. - timeout := max - if k < 1 { - timeout = min - } - s.timer = time.AfterFunc(timeout, s.timeoutFn) - - // Capture the start time right after starting the timer above so - // we should always err on the side of a little longer timeout if - // there's any preemption that separates this and the step above. - s.start = time.Now() - return s -} - -// remainingSuspicionTime takes the state variables of the suspicion timer and -// calculates the remaining time to wait before considering a node dead. The -// return value can be negative, so be prepared to fire the timer immediately in -// that case. -func remainingSuspicionTime(n, k int32, elapsed time.Duration, min, max time.Duration) time.Duration { - frac := math.Log(float64(n)+1.0) / math.Log(float64(k)+1.0) - raw := max.Seconds() - frac*(max.Seconds()-min.Seconds()) - timeout := time.Duration(math.Floor(1000.0*raw)) * time.Millisecond - if timeout < min { - timeout = min - } - - // We have to take into account the amount of time that has passed so - // far, so we get the right overall timeout. - return timeout - elapsed -} - -// Confirm registers that a possibly new peer has also determined the given -// node is suspect. This returns true if this was new information, and false -// if it was a duplicate confirmation, or if we've got enough confirmations to -// hit the minimum. -func (s *suspicion) Confirm(from string) bool { - // If we've got enough confirmations then stop accepting them. - if atomic.LoadInt32(&s.n) >= s.k { - return false - } - - // Only allow one confirmation from each possible peer. - if _, ok := s.confirmations[from]; ok { - return false - } - s.confirmations[from] = struct{}{} - - // Compute the new timeout given the current number of confirmations and - // adjust the timer. If the timeout becomes negative *and* we can cleanly - // stop the timer then we will call the timeout function directly from - // here. - n := atomic.AddInt32(&s.n, 1) - elapsed := time.Since(s.start) - remaining := remainingSuspicionTime(n, s.k, elapsed, s.min, s.max) - if s.timer.Stop() { - if remaining > 0 { - s.timer.Reset(remaining) - } else { - go s.timeoutFn() - } - } - return true -} diff --git a/toolkit/memberlist/suspicion_test.go b/toolkit/memberlist/suspicion_test.go deleted file mode 100644 index 1b5ca8a5..00000000 --- a/toolkit/memberlist/suspicion_test.go +++ /dev/null @@ -1,198 +0,0 @@ -package memberlist - -import ( - "testing" - "time" -) - -func TestSuspicion_remainingSuspicionTime(t *testing.T) { - cases := []struct { - n int32 - k int32 - elapsed time.Duration - min time.Duration - max time.Duration - expected time.Duration - }{ - {0, 3, 0, 2 * time.Second, 30 * time.Second, 30 * time.Second}, - {1, 3, 2 * time.Second, 2 * time.Second, 30 * time.Second, 14 * time.Second}, - {2, 3, 3 * time.Second, 2 * time.Second, 30 * time.Second, 4810 * time.Millisecond}, - {3, 3, 4 * time.Second, 2 * time.Second, 30 * time.Second, -2 * time.Second}, - {4, 3, 5 * time.Second, 2 * time.Second, 30 * time.Second, -3 * time.Second}, - {5, 3, 10 * time.Second, 2 * time.Second, 30 * time.Second, -8 * time.Second}, - } - for i, c := range cases { - remaining := remainingSuspicionTime(c.n, c.k, c.elapsed, c.min, c.max) - if remaining != c.expected { - t.Errorf("case %d: remaining %9.6f != expected %9.6f", i, remaining.Seconds(), c.expected.Seconds()) - } - } -} - -func TestSuspicion_Timer(t *testing.T) { - const k = 3 - const min = 500 * time.Millisecond - const max = 2 * time.Second - - type pair struct { - from string - newInfo bool - } - cases := []struct { - numConfirmations int - from string - confirmations []pair - expected time.Duration - }{ - { - 0, - "me", - []pair{}, - max, - }, - { - 1, - "me", - []pair{ - pair{"me", false}, - pair{"foo", true}, - }, - 1250 * time.Millisecond, - }, - { - 1, - "me", - []pair{ - pair{"me", false}, - pair{"foo", true}, - pair{"foo", false}, - pair{"foo", false}, - }, - 1250 * time.Millisecond, - }, - { - 2, - "me", - []pair{ - pair{"me", false}, - pair{"foo", true}, - pair{"bar", true}, - }, - 810 * time.Millisecond, - }, - { - 3, - "me", - []pair{ - pair{"me", false}, - pair{"foo", true}, - pair{"bar", true}, - pair{"baz", true}, - }, - min, - }, - { - 3, - "me", - []pair{ - pair{"me", false}, - pair{"foo", true}, - pair{"bar", true}, - pair{"baz", true}, - pair{"zoo", false}, - }, - min, - }, - } - for i, c := range cases { - ch := make(chan time.Duration, 1) - start := time.Now() - f := func(numConfirmations int) { - if numConfirmations != c.numConfirmations { - t.Errorf("case %d: bad %d != %d", i, numConfirmations, c.numConfirmations) - } - - ch <- time.Now().Sub(start) - } - - // Create the timer and add the requested confirmations. Wait - // the fudge amount to help make sure we calculate the timeout - // overall, and don't accumulate extra time. - s := newSuspicion(c.from, k, min, max, f) - fudge := 25 * time.Millisecond - for _, p := range c.confirmations { - time.Sleep(fudge) - if s.Confirm(p.from) != p.newInfo { - t.Fatalf("case %d: newInfo mismatch for %s", i, p.from) - } - } - - // Wait until right before the timeout and make sure the - // timer hasn't fired. - already := time.Duration(len(c.confirmations)) * fudge - time.Sleep(c.expected - already - fudge) - select { - case d := <-ch: - t.Fatalf("case %d: should not have fired (%9.6f)", i, d.Seconds()) - default: - } - - // Wait through the timeout and a little after and make sure it - // fires. - time.Sleep(2 * fudge) - select { - case <-ch: - default: - t.Fatalf("case %d: should have fired", i) - } - - // Confirm after to make sure it handles a negative remaining - // time correctly and doesn't fire again. - s.Confirm("late") - time.Sleep(c.expected + 2*fudge) - select { - case d := <-ch: - t.Fatalf("case %d: should not have fired (%9.6f)", i, d.Seconds()) - default: - } - } -} - -func TestSuspicion_Timer_ZeroK(t *testing.T) { - ch := make(chan struct{}, 1) - f := func(int) { - ch <- struct{}{} - } - - // This should select the min time since there are no expected - // confirmations to accelerate the timer. - s := newSuspicion("me", 0, 25*time.Millisecond, 30*time.Second, f) - if s.Confirm("foo") { - t.Fatalf("should not provide new information") - } - - select { - case <-ch: - case <-time.After(50 * time.Millisecond): - t.Fatalf("should have fired") - } -} - -func TestSuspicion_Timer_Immediate(t *testing.T) { - ch := make(chan struct{}, 1) - f := func(int) { - ch <- struct{}{} - } - - // This should underflow the timeout and fire immediately. - s := newSuspicion("me", 1, 100*time.Millisecond, 30*time.Second, f) - time.Sleep(200 * time.Millisecond) - s.Confirm("foo") - - // Wait a little while since the function gets called in a goroutine. - select { - case <-ch: - case <-time.After(25 * time.Millisecond): - t.Fatalf("should have fired") - } -} diff --git a/toolkit/memberlist/todo.md b/toolkit/memberlist/todo.md deleted file mode 100644 index 009c1d64..00000000 --- a/toolkit/memberlist/todo.md +++ /dev/null @@ -1,6 +0,0 @@ -# TODO -* Dynamic RTT discovery - * Compute 99th percentile for ping/ack - * Better lower bound for ping/ack, faster failure detection -* Dynamic MTU discovery - * Prevent lost updates, increases efficiency diff --git a/toolkit/memberlist/transport.go b/toolkit/memberlist/transport.go deleted file mode 100644 index 026ae477..00000000 --- a/toolkit/memberlist/transport.go +++ /dev/null @@ -1,121 +0,0 @@ -package memberlist - -import ( - "fmt" - "net" - "time" -) - -//go:generate mockgen -destination ./mock/mock_transport.go -package mock -source=./transport.go - -// Packet is used to provide some metadata about incoming packets from peers -// over a packet connection, as well as the packet payload. -type Packet struct { - // Buf has the raw contents of the packet. - Buf []byte - - // From has the address of the peer. This is an actual net.Addr so we - // can expose some concrete details about incoming packets. - From net.Addr - - // Timestamp is the time when the packet was received. This should be - // taken as close as possible to the actual receipt time to help make an - // accurate RTT measurement during probes. - Timestamp time.Time -} - -// Transport is used to abstract over communicating with other peers. The packet -// interface is assumed to be best-effort and the stream interface is assumed to -// be reliable. -type Transport interface { - // FinalAdvertiseAddr is given the user's configured values (which - // might be empty) and returns the desired IP and port to advertise to - // the rest of the cluster. - FinalAdvertiseAddr(ip string, port int) (string, int, error) - - // WriteTo is a packet-oriented interface that fires off the given - // payload to the given address in a connectionless fashion. This should - // return a time stamp that's as close as possible to when the packet - // was transmitted to help make accurate RTT measurements during probes. - // - // This is similar to net.PacketConn, though we didn't want to expose - // that full set of required methods to keep assumptions about the - // underlying plumbing to a minimum. We also treat the address here as a - // string, similar to Dial, so it's network neutral, so this usually is - // in the form of "host:port". - WriteTo(b []byte, addr string) (time.Time, error) - - // PacketCh returns a channel that can be read to receive incoming - // packets from other peers. How this is set up for listening is left as - // an exercise for the concrete transport implementations. - PacketCh() <-chan *Packet - - // DialTimeout is used to create a connection that allows us to perform - // two-way communication with a peer. This is generally more expensive - // than packet connections so is used for more infrequent operations - // such as anti-entropy or fallback probes if the packet-oriented probe - // failed. - DialTimeout(addr string, timeout time.Duration) (net.Conn, error) - - // StreamCh returns a channel that can be read to handle incoming stream - // connections from other peers. How this is set up for listening is - // left as an exercise for the concrete transport implementations. - StreamCh() <-chan net.Conn - - // Shutdown is called when memberlist is shutting down; this gives the - // transport a chance to clean up any listeners. - Shutdown() error -} - -type Address struct { - // Addr is a network address as a string, similar to Dial. This usually is - // in the form of "host:port". This is required. - Addr string - - // Name is the name of the node being addressed. This is optional but - // transports may require it. - Name string -} - -func (a *Address) String() string { - if a.Name != "" { - return fmt.Sprintf("%s (%s)", a.Name, a.Addr) - } - return a.Addr -} - -// IngestionAwareTransport is not used. -// -// Deprecated: IngestionAwareTransport is not used and may be removed in a future -// version. Define the interface locally instead of referencing this exported -// interface. -type IngestionAwareTransport interface { - IngestPacket(conn net.Conn, addr net.Addr, now time.Time, shouldClose bool) error - IngestStream(conn net.Conn) error -} - -type NodeAwareTransport interface { - Transport - WriteToAddress(b []byte, addr Address) (time.Time, error) - DialAddressTimeout(addr Address, timeout time.Duration) (net.Conn, error) -} - -type shimNodeAwareTransport struct { - Transport -} - -func NewshimNodeAwareTransport(t Transport) *shimNodeAwareTransport { - return &shimNodeAwareTransport{ - t, - } -} - -var _ NodeAwareTransport = (*shimNodeAwareTransport)(nil) - -func (t *shimNodeAwareTransport) WriteToAddress(b []byte, addr Address) (time.Time, error) { - return t.WriteTo(b, addr.Addr) -} - -func (t *shimNodeAwareTransport) DialAddressTimeout(addr Address, timeout time.Duration) (net.Conn, error) { - return t.DialTimeout(addr.Addr, timeout) -} diff --git a/toolkit/memberlist/transport_test.go b/toolkit/memberlist/transport_test.go deleted file mode 100644 index 1fcb50f0..00000000 --- a/toolkit/memberlist/transport_test.go +++ /dev/null @@ -1,101 +0,0 @@ -package memberlist_test - -import ( - "io" - "net" - "strings" - "sync/atomic" - "testing" - "time" - - "github.com/golang/mock/gomock" - . "github.com/smartystreets/goconvey/convey" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - memmock "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist/mock" - - "github.com/stretchr/testify/require" -) - -type testCountingWriter struct { - t *testing.T - numCalls *int32 -} - -func (tw testCountingWriter) Write(p []byte) (n int, err error) { - atomic.AddInt32(tw.numCalls, 1) - if !strings.Contains(string(p), "memberlist: Error accepting TCP connection") { - tw.t.Error("did not receive expected log message") - } - tw.t.Log("countingWriter:", string(p)) - return len(p), nil -} - -func TestAddress_String(t *testing.T) { - addr := &memberlist.Address{ - Addr: "localhost:7946", - Name: "testNode", - } - require.Equal(t, "testNode (localhost:7946)", addr.String()) - - addr = &memberlist.Address{ - Addr: "localhost:7946", - } - require.Equal(t, "localhost:7946", addr.String()) -} - -func Test_shimNodeAwareTransport_WriteToAddress(t *testing.T) { - Convey("", t, func() { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - nat := memmock.NewMockTransport(ctrl) - addr := memberlist.Address{ - Addr: "localhost:7946", - Name: "testNode", - } - now := time.Now() - msg := []byte("test message") - nat. - EXPECT(). - WriteTo(msg, addr.Addr). - AnyTimes(). - Return(now, nil) - - s := memberlist.NewshimNodeAwareTransport(nat) - sendAt, err := s.WriteToAddress(msg, addr) - So(err, ShouldBeNil) - So(sendAt, ShouldResemble, now) - }) -} - -type emptyReadNetConn struct { - net.Conn -} - -func (c *emptyReadNetConn) Read(b []byte) (n int, err error) { - return 0, io.EOF -} - -func (c *emptyReadNetConn) Close() error { - return nil -} - -func Test_shimNodeAwareTransport_DialAddressTimeout(t1 *testing.T) { - Convey("", t1, func() { - ctrl := gomock.NewController(t1) - defer ctrl.Finish() - nat := memmock.NewMockTransport(ctrl) - addr := memberlist.Address{ - Addr: "localhost:7946", - Name: "testNode", - } - nat. - EXPECT(). - DialTimeout(addr.Addr, 10*time.Second). - AnyTimes(). - Return(&emptyReadNetConn{}, nil) - - s := memberlist.NewshimNodeAwareTransport(nat) - _, err := s.DialAddressTimeout(addr, 10*time.Second) - So(err, ShouldBeNil) - }) -} diff --git a/toolkit/memberlist/util.go b/toolkit/memberlist/util.go deleted file mode 100644 index cfae4c9e..00000000 --- a/toolkit/memberlist/util.go +++ /dev/null @@ -1,309 +0,0 @@ -package memberlist - -import ( - "bytes" - "compress/lzw" - "encoding/binary" - "fmt" - "io" - "math" - "math/rand" - "net" - "strconv" - "strings" - "time" - - "github.com/hashicorp/go-msgpack/codec" - "github.com/sean-/seed" -) - -// pushPullScale is the minimum number of nodes -// before we start scaling the push/pull timing. The scale -// effect is the log2(Nodes) - log2(pushPullScale). This means -// that the 33rd node will cause us to double the interval, -// while the 65th will triple it. -const pushPullScaleThreshold = 32 - -const ( - // Constant litWidth 2-8 - lzwLitWidth = 8 -) - -func init() { - seed.Init() -} - -// Decode reverses the encode operation on a byte slice input -func decode(buf []byte, out interface{}) error { - r := bytes.NewReader(buf) - hd := codec.MsgpackHandle{} - dec := codec.NewDecoder(r, &hd) - return dec.Decode(out) -} - -// Encode writes an encoded object to a new bytes buffer -func encode(msgType messageType, in interface{}) (*bytes.Buffer, error) { - buf := bytes.NewBuffer(nil) - buf.WriteByte(uint8(msgType)) - hd := codec.MsgpackHandle{} - enc := codec.NewEncoder(buf, &hd) - err := enc.Encode(in) - return buf, err -} - -// Returns a random offset between 0 and n -func randomOffset(n int) int { - if n == 0 { - return 0 - } - return int(rand.Uint32() % uint32(n)) -} - -// suspicionTimeout computes the timeout that should be used when -// a node is suspected -func suspicionTimeout(suspicionMult, n int, interval time.Duration) time.Duration { - nodeScale := math.Max(1.0, math.Log10(math.Max(1.0, float64(n)))) - // multiply by 1000 to keep some precision because time.Duration is an int64 type - timeout := time.Duration(suspicionMult) * time.Duration(nodeScale*1000) * interval / 1000 - return timeout -} - -// retransmitLimit computes the limit of retransmissions -func retransmitLimit(retransmitMult, n int) int { - nodeScale := math.Ceil(math.Log10(float64(n + 1))) - limit := retransmitMult * int(nodeScale) - return limit -} - -// shuffleNodes randomly shuffles the input nodes using the Fisher-Yates shuffle -func shuffleNodes(nodes []*nodeState) { - n := len(nodes) - rand.Shuffle(n, func(i, j int) { - nodes[i], nodes[j] = nodes[j], nodes[i] - }) -} - -// pushPushScale is used to scale the time interval at which push/pull -// syncs take place. It is used to prevent network saturation as the -// cluster size grows -func pushPullScale(interval time.Duration, n int) time.Duration { - // Don't scale until we cross the threshold - if n <= pushPullScaleThreshold { - return interval - } - - multiplier := math.Ceil(math.Log2(float64(n))-math.Log2(pushPullScaleThreshold)) + 1.0 - return time.Duration(multiplier) * interval -} - -// moveDeadNodes moves dead and left nodes that that have not changed during the gossipToTheDeadTime interval -// to the end of the slice and returns the index of the first moved node. -func moveDeadNodes(nodes []*nodeState, gossipToTheDeadTime time.Duration) int { - numDead := 0 - n := len(nodes) - for i := 0; i < n-numDead; i++ { - if !nodes[i].DeadOrLeft() { - continue - } - - // Respect the gossip to the dead interval - if time.Since(nodes[i].StateChange) <= gossipToTheDeadTime { - continue - } - - // Move this node to the end - nodes[i], nodes[n-numDead-1] = nodes[n-numDead-1], nodes[i] - numDead++ - i-- - } - return n - numDead -} - -// kRandomNodes is used to select up to k random Nodes, excluding any nodes where -// the exclude function returns true. It is possible that less than k nodes are -// returned. -func kRandomNodes(k int, nodes []*nodeState, exclude func(*nodeState) bool) []Node { - n := len(nodes) - kNodes := make([]Node, 0, k) -OUTER: - // Probe up to 3*n times, with large n this is not necessary - // since k << n, but with small n we want search to be - // exhaustive - for i := 0; i < 3*n && len(kNodes) < k; i++ { - // Get random nodeState - idx := randomOffset(n) - state := nodes[idx] - - // Give the filter a shot at it. - if exclude != nil && exclude(state) { - continue OUTER - } - - // Check if we have this node already - for j := 0; j < len(kNodes); j++ { - if state.Node.Name == kNodes[j].Name { - continue OUTER - } - } - - // Append the node - kNodes = append(kNodes, state.Node) - } - return kNodes -} - -// makeCompoundMessage takes a list of messages and generates -// a single compound message containing all of them -func makeCompoundMessage(msgs [][]byte) *bytes.Buffer { - // Create a local buffer - buf := bytes.NewBuffer(nil) - - // Write out the type - buf.WriteByte(uint8(compoundMsg)) - - // Write out the number of message - buf.WriteByte(uint8(len(msgs))) - - // Add the message lengths - for _, m := range msgs { - binary.Write(buf, binary.BigEndian, uint16(len(m))) - } - - // Append the messages - for _, m := range msgs { - buf.Write(m) - } - - return buf -} - -// decodeCompoundMessage splits a compound message and returns -// the slices of individual messages. Also returns the number -// of truncated messages and any potential error -func decodeCompoundMessage(buf []byte) (trunc int, parts [][]byte, err error) { - if len(buf) < 1 { - err = fmt.Errorf("missing compound length byte") - return - } - numParts := int(buf[0]) - buf = buf[1:] - - // Check we have enough bytes - if len(buf) < numParts*2 { - err = fmt.Errorf("truncated len slice") - return - } - - // Decode the lengths - lengths := make([]uint16, numParts) - for i := 0; i < numParts; i++ { - lengths[i] = binary.BigEndian.Uint16(buf[i*2 : i*2+2]) - } - buf = buf[numParts*2:] - - // Split each message - for idx, msgLen := range lengths { - if len(buf) < int(msgLen) { - trunc = numParts - idx - return - } - - // Extract the slice, seek past on the buffer - slice := buf[:msgLen] - buf = buf[msgLen:] - parts = append(parts, slice) - } - return -} - -// compressPayload takes an opaque input buffer, compresses it -// and wraps it in a compress{} message that is encoded. -func compressPayload(inp []byte) (*bytes.Buffer, error) { - var buf bytes.Buffer - compressor := lzw.NewWriter(&buf, lzw.LSB, lzwLitWidth) - - _, err := compressor.Write(inp) - if err != nil { - return nil, err - } - - // Ensure we flush everything out - if err := compressor.Close(); err != nil { - return nil, err - } - - // Create a compressed message - c := compress{ - Algo: lzwAlgo, - Buf: buf.Bytes(), - } - return encode(compressMsg, &c) -} - -// decompressPayload is used to unpack an encoded compress{} -// message and return its payload uncompressed -func decompressPayload(msg []byte) ([]byte, error) { - // Decode the message - var c compress - if err := decode(msg, &c); err != nil { - return nil, err - } - return decompressBuffer(&c) -} - -// decompressBuffer is used to decompress the buffer of -// a single compress message, handling multiple algorithms -func decompressBuffer(c *compress) ([]byte, error) { - // Verify the algorithm - if c.Algo != lzwAlgo { - return nil, fmt.Errorf("Cannot decompress unknown algorithm %d", c.Algo) - } - - // Create a uncompressor - uncomp := lzw.NewReader(bytes.NewReader(c.Buf), lzw.LSB, lzwLitWidth) - defer uncomp.Close() - - // Read all the data - var b bytes.Buffer - _, err := io.Copy(&b, uncomp) - if err != nil { - return nil, err - } - - // Return the uncompressed bytes - return b.Bytes(), nil -} - -// joinHostPort returns the host:port form of an address, for use with a -// transport. -func joinHostPort(host string, port uint16) string { - return net.JoinHostPort(host, strconv.Itoa(int(port))) -} - -// hasPort is given a string of the form "host", "host:port", "ipv6::address", -// or "[ipv6::address]:port", and returns true if the string includes a port. -func hasPort(s string) bool { - // IPv6 address in brackets. - if strings.LastIndex(s, "[") == 0 { - return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") - } - - // Otherwise the presence of a single colon determines if there's a port - // since IPv6 addresses outside of brackets (count > 1) can't have a - // port. - return strings.Count(s, ":") == 1 -} - -// ensurePort makes sure the given string has a port number on it, otherwise it -// appends the given port as a default. -func ensurePort(s string, port int) string { - if hasPort(s) { - return s - } - - // If this is an IPv6 address, the join call will add another set of - // brackets, so we have to trim before we add the default port. - s = strings.Trim(s, "[]") - s = net.JoinHostPort(s, strconv.Itoa(port)) - return s -} diff --git a/toolkit/memberlist/util_test.go b/toolkit/memberlist/util_test.go deleted file mode 100644 index 4bd6dadb..00000000 --- a/toolkit/memberlist/util_test.go +++ /dev/null @@ -1,372 +0,0 @@ -package memberlist - -import ( - "fmt" - "reflect" - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestUtil_PortFunctions(t *testing.T) { - tests := []struct { - addr string - hasPort bool - ensurePort string - }{ - {"1.2.3.4", false, "1.2.3.4:8301"}, - {"1.2.3.4:1234", true, "1.2.3.4:1234"}, - {"2600:1f14:e22:1501:f9a:2e0c:a167:67e8", false, "[2600:1f14:e22:1501:f9a:2e0c:a167:67e8]:8301"}, - {"[2600:1f14:e22:1501:f9a:2e0c:a167:67e8]", false, "[2600:1f14:e22:1501:f9a:2e0c:a167:67e8]:8301"}, - {"[2600:1f14:e22:1501:f9a:2e0c:a167:67e8]:1234", true, "[2600:1f14:e22:1501:f9a:2e0c:a167:67e8]:1234"}, - {"localhost", false, "localhost:8301"}, - {"localhost:1234", true, "localhost:1234"}, - {"hashicorp.com", false, "hashicorp.com:8301"}, - {"hashicorp.com:1234", true, "hashicorp.com:1234"}, - } - for _, tt := range tests { - t.Run(tt.addr, func(t *testing.T) { - if got, want := hasPort(tt.addr), tt.hasPort; got != want { - t.Fatalf("got %v want %v", got, want) - } - if got, want := ensurePort(tt.addr, 8301), tt.ensurePort; got != want { - t.Fatalf("got %v want %v", got, want) - } - }) - } -} - -func TestEncodeDecode(t *testing.T) { - msg := &ping{SeqNo: 100} - buf, err := encode(pingMsg, msg) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - var out ping - if err := decode(buf.Bytes()[1:], &out); err != nil { - t.Fatalf("unexpected err: %s", err) - } - if msg.SeqNo != out.SeqNo { - t.Fatalf("bad sequence no") - } -} - -func TestRandomOffset(t *testing.T) { - vals := make(map[int]struct{}) - for i := 0; i < 100; i++ { - offset := randomOffset(2 << 30) - if _, ok := vals[offset]; ok { - t.Fatalf("got collision") - } - vals[offset] = struct{}{} - } -} - -func TestRandomOffset_Zero(t *testing.T) { - offset := randomOffset(0) - if offset != 0 { - t.Fatalf("bad offset") - } -} - -func TestSuspicionTimeout(t *testing.T) { - timeouts := map[int]time.Duration{ - 5: 1000 * time.Millisecond, - 10: 1000 * time.Millisecond, - 50: 1698 * time.Millisecond, - 100: 2000 * time.Millisecond, - 500: 2698 * time.Millisecond, - 1000: 3000 * time.Millisecond, - } - for n, expected := range timeouts { - timeout := suspicionTimeout(3, n, time.Second) / 3 - if timeout != expected { - t.Fatalf("bad: %v, %v", expected, timeout) - } - } -} - -func TestSuspicionTimeout2(t *testing.T) { - timeout := suspicionTimeout(6, 6, 5*time.Second) - fmt.Println(timeout) -} - -func TestRetransmitLimit(t *testing.T) { - lim := retransmitLimit(3, 0) - if lim != 0 { - t.Fatalf("bad val %v", lim) - } - lim = retransmitLimit(3, 1) - if lim != 3 { - t.Fatalf("bad val %v", lim) - } - lim = retransmitLimit(3, 99) - if lim != 6 { - t.Fatalf("bad val %v", lim) - } - lim = retransmitLimit(4, 15) - if lim != 8 { - t.Fatalf("bad val %v", lim) - } -} - -func TestShuffleNodes(t *testing.T) { - orig := []*nodeState{ - &nodeState{ - State: StateDead, - }, - &nodeState{ - State: StateAlive, - }, - &nodeState{ - State: StateAlive, - }, - &nodeState{ - State: StateDead, - }, - &nodeState{ - State: StateAlive, - }, - &nodeState{ - State: StateAlive, - }, - &nodeState{ - State: StateDead, - }, - &nodeState{ - State: StateAlive, - }, - } - nodes := make([]*nodeState, len(orig)) - copy(nodes[:], orig[:]) - - if !reflect.DeepEqual(nodes, orig) { - t.Fatalf("should match") - } - - shuffleNodes(nodes) -} - -func TestPushPullScale(t *testing.T) { - sec := time.Second - for i := 0; i <= 32; i++ { - if s := pushPullScale(sec, i); s != sec { - t.Fatalf("Bad time scale: %v", s) - } - } - for i := 33; i <= 64; i++ { - if s := pushPullScale(sec, i); s != 2*sec { - t.Fatalf("Bad time scale: %v", s) - } - } - for i := 65; i <= 128; i++ { - if s := pushPullScale(sec, i); s != 3*sec { - t.Fatalf("Bad time scale: %v", s) - } - } -} - -func TestMoveDeadNodes(t *testing.T) { - nodes := []*nodeState{ - &nodeState{ - State: StateDead, - StateChange: time.Now().Add(-20 * time.Second), - }, - &nodeState{ - State: StateAlive, - StateChange: time.Now().Add(-20 * time.Second), - }, - // This dead node should not be moved, as its state changed - // less than the specified GossipToTheDead time ago - &nodeState{ - State: StateDead, - StateChange: time.Now().Add(-10 * time.Second), - }, - &nodeState{ - State: StateAlive, - StateChange: time.Now().Add(-20 * time.Second), - }, - &nodeState{ - State: StateDead, - StateChange: time.Now().Add(-20 * time.Second), - }, - &nodeState{ - State: StateAlive, - StateChange: time.Now().Add(-20 * time.Second), - }, - } - - idx := moveDeadNodes(nodes, (15 * time.Second)) - if idx != 4 { - t.Fatalf("bad index") - } - for i := 0; i < idx; i++ { - switch i { - case 2: - // Recently dead node remains at index 2, - // since nodes are swapped out to move to end. - if nodes[i].State != StateDead { - t.Fatalf("Bad state %d", i) - } - default: - if nodes[i].State != StateAlive { - t.Fatalf("Bad state %d", i) - } - } - } - for i := idx; i < len(nodes); i++ { - if nodes[i].State != StateDead { - t.Fatalf("Bad state %d", i) - } - } -} - -func TestKRandomNodes(t *testing.T) { - nodes := []*nodeState{} - for i := 0; i < 90; i++ { - // Half the nodes are in a bad state - state := StateAlive - switch i % 3 { - case 0: - state = StateAlive - case 1: - state = StateSuspect - case 2: - state = StateDead - } - nodes = append(nodes, &nodeState{ - Node: Node{ - Name: fmt.Sprintf("test%d", i), - }, - State: state, - }) - } - - filterFunc := func(n *nodeState) bool { - if n.Name == "test0" || n.State != StateAlive { - return true - } - return false - } - - s1 := kRandomNodes(3, nodes, filterFunc) - s2 := kRandomNodes(3, nodes, filterFunc) - s3 := kRandomNodes(3, nodes, filterFunc) - - if reflect.DeepEqual(s1, s2) { - t.Fatalf("unexpected equal") - } - if reflect.DeepEqual(s1, s3) { - t.Fatalf("unexpected equal") - } - if reflect.DeepEqual(s2, s3) { - t.Fatalf("unexpected equal") - } - - for _, s := range [][]Node{s1, s2, s3} { - if len(s) != 3 { - t.Fatalf("bad len") - } - for _, n := range s { - if n.Name == "test0" { - t.Fatalf("Bad name") - } - if n.State != StateAlive { - t.Fatalf("Bad state") - } - } - } -} - -func TestMakeCompoundMessage(t *testing.T) { - msg := &ping{SeqNo: 100} - buf, err := encode(pingMsg, msg) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - msgs := [][]byte{buf.Bytes(), buf.Bytes(), buf.Bytes()} - compound := makeCompoundMessage(msgs) - - if compound.Len() != 3*buf.Len()+3*compoundOverhead+compoundHeaderOverhead { - t.Fatalf("bad len") - } -} - -func TestDecodeCompoundMessage(t *testing.T) { - msg := &ping{SeqNo: 100} - buf, err := encode(pingMsg, msg) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - msgs := [][]byte{buf.Bytes(), buf.Bytes(), buf.Bytes()} - compound := makeCompoundMessage(msgs) - - trunc, parts, err := decodeCompoundMessage(compound.Bytes()[1:]) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - if trunc != 0 { - t.Fatalf("should not truncate") - } - if len(parts) != 3 { - t.Fatalf("bad parts") - } - for _, p := range parts { - if len(p) != buf.Len() { - t.Fatalf("bad part len") - } - } -} - -func TestDecodeCompoundMessage_NumberOfPartsOverflow(t *testing.T) { - buf := []byte{0x80} - _, _, err := decodeCompoundMessage(buf) - require.Error(t, err) - require.Equal(t, err.Error(), "truncated len slice") -} - -func TestDecodeCompoundMessage_Trunc(t *testing.T) { - msg := &ping{SeqNo: 100} - buf, err := encode(pingMsg, msg) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - msgs := [][]byte{buf.Bytes(), buf.Bytes(), buf.Bytes()} - compound := makeCompoundMessage(msgs) - - trunc, parts, err := decodeCompoundMessage(compound.Bytes()[1:38]) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - if trunc != 1 { - t.Fatalf("truncate: %d", trunc) - } - if len(parts) != 2 { - t.Fatalf("bad parts") - } - for _, p := range parts { - if len(p) != buf.Len() { - t.Fatalf("bad part len") - } - } -} - -func TestCompressDecompressPayload(t *testing.T) { - buf, err := compressPayload([]byte("testing")) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - decomp, err := decompressPayload(buf.Bytes()[1:]) - if err != nil { - t.Fatalf("unexpected err: %s", err) - } - - if !reflect.DeepEqual(decomp, []byte("testing")) { - t.Fatalf("bad payload: %v", decomp) - } -} diff --git a/toolkit/memberlist/weightbroadcast.go b/toolkit/memberlist/weightbroadcast.go deleted file mode 100644 index 49a36933..00000000 --- a/toolkit/memberlist/weightbroadcast.go +++ /dev/null @@ -1,43 +0,0 @@ -package memberlist - -/* -The broadcast mechanism works by maintaining a sorted list of messages to be -sent out. When a message is to be broadcast, the retransmit count -is set to zero and appended to the queue. The retransmit count serves -as the "priority", ensuring that newer messages get sent first. Once -a message hits the retransmit limit, it is removed from the queue. - -Additionally, older entries can be invalidated by new messages that -are contradictory. For example, if we send "{suspect M1 inc: 1}, -then a following {alive M1 inc: 2} will invalidate that message -*/ - -type weightBroadcast struct { - node string - msg []byte -} - -func NewWeightBroadcast(node string, msg []byte) *weightBroadcast { - return &weightBroadcast{ - node, - msg, - } -} - -func (b *weightBroadcast) Invalidates(other Broadcast) bool { - // Check if that broadcast is a weight type - mb, ok := other.(*weightBroadcast) - if !ok { - return false - } - - // Invalidates any message about the same node - return b.node == mb.node -} - -func (b *weightBroadcast) Message() []byte { - return b.msg -} - -func (b *weightBroadcast) Finished() { -} diff --git a/toolkit/memberlist/weightbroadcast_test.go b/toolkit/memberlist/weightbroadcast_test.go deleted file mode 100644 index a67b4121..00000000 --- a/toolkit/memberlist/weightbroadcast_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package memberlist_test - -import ( - "testing" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist" - memmock "github.com/unionj-cloud/go-doudou/v2/toolkit/memberlist/mock" -) - -func Test_weightBroadcast_Invalidates(t *testing.T) { - msg1 := memberlist.NewWeightBroadcast("testNode", []byte("test weight message1")) - ok := msg1.Invalidates(memberlist.NewWeightBroadcast("testNode", []byte("test weight message2"))) - require.True(t, ok) - - ctrl := gomock.NewController(t) - defer ctrl.Finish() - b := memmock.NewMockBroadcast(ctrl) - ok = msg1.Invalidates(b) - require.False(t, ok) - - require.Equal(t, "test weight message1", string(msg1.Message())) - msg1.Finished() -} diff --git a/toolkit/numberutils/numberutils.go b/toolkit/numberutils/numberutils.go deleted file mode 100644 index 00cb70fb..00000000 --- a/toolkit/numberutils/numberutils.go +++ /dev/null @@ -1,63 +0,0 @@ -package numberutils - -import ( - "fmt" - "sort" - - "github.com/shopspring/decimal" -) - -type Percentage struct { - Value int - Percent float64 - PercentFormatted string - Data interface{} -} - -type decimalPercentage struct { - Percentage *Percentage - Percent decimal.Decimal - Remainder decimal.Decimal -} - -// LargestRemainder https://en.wikipedia.org/wiki/Largest_remainder_method -func LargestRemainder(percentages []Percentage, places int32) { - if len(percentages) == 0 { - return - } - decimalPercentages := make([]decimalPercentage, len(percentages)) - for i := range percentages { - decimalPercentages[i] = decimalPercentage{ - Percentage: &percentages[i], - } - } - var sum int - for _, item := range decimalPercentages { - sum += item.Percentage.Value - } - if sum > 0 { - for i, item := range decimalPercentages { - raw := decimal.NewFromFloat(float64(item.Percentage.Value*100) / float64(sum)) - decimalPercentages[i].Percent = raw.RoundFloor(places) - decimalPercentages[i].Remainder = raw.Sub(decimal.NewFromFloat(percentages[i].Percent)) - } - var curSum decimal.Decimal - for _, item := range decimalPercentages { - curSum = curSum.Add(item.Percent) - } - offset := decimal.New(1, -places) - limit := decimal.NewFromInt(100) - for curSum.LessThan(limit) { - sort.Slice(decimalPercentages, func(i, j int) bool { - return decimalPercentages[j].Remainder.LessThan(decimalPercentages[i].Remainder) - }) - decimalPercentages[0].Percent = decimalPercentages[0].Percent.Add(offset) - decimalPercentages[0].Remainder = decimal.Decimal{} - curSum = curSum.Add(offset) - } - } - for _, item := range decimalPercentages { - item.Percentage.Percent, _ = item.Percent.Float64() - item.Percentage.PercentFormatted = fmt.Sprintf("%."+fmt.Sprint(places)+"f%%", item.Percentage.Percent) - } -} diff --git a/toolkit/numberutils/numberutils_test.go b/toolkit/numberutils/numberutils_test.go deleted file mode 100644 index 4ffba8ad..00000000 --- a/toolkit/numberutils/numberutils_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package numberutils_test - -import ( - "fmt" - "testing" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/numberutils" -) - -func TestLargestRemainder(t *testing.T) { - input := []numberutils.Percentage{ - { - Value: 10, - Data: "a", - }, - { - Value: 12, - Data: "b", - }, - { - Value: 7, - Data: "c", - }, - } - numberutils.LargestRemainder(input, 3) - for _, item := range input { - fmt.Printf("%v\t%v\t%v\t%s\n", item.Data, item.Value, item.Percent, item.PercentFormatted) - } -} - -func TestLargestRemainderZeroSum(t *testing.T) { - input := []numberutils.Percentage{ - { - Value: 1, - Data: "a", - }, - { - Value: 0, - Data: "b", - }, - { - Value: 0, - Data: "c", - }, - } - numberutils.LargestRemainder(input, 3) - for _, item := range input { - fmt.Printf("%v\t%v\t%v\t%s\n", item.Data, item.Value, item.Percent, item.PercentFormatted) - } -} diff --git a/toolkit/openapi/v3/helper.go b/toolkit/openapi/v3/helper.go deleted file mode 100644 index ada97bad..00000000 --- a/toolkit/openapi/v3/helper.go +++ /dev/null @@ -1,356 +0,0 @@ -package v3 - -import ( - "encoding/json" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "strings" - "unicode" - - "github.com/getkin/kin-openapi/openapi2" - "github.com/getkin/kin-openapi/openapi2conv" - "github.com/getkin/kin-openapi/openapi3" - "github.com/go-resty/resty/v2" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/copier" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -// Schemas from components of OpenAPI3.0 json document -var Schemas = make(map[string]Schema) - -var Enums = make(map[string]astutils.EnumMeta) - -// SchemaNames schema names from components of OpenAPI3.0 json document -// also struct names from vo package -var SchemaNames []string - -// SchemaOf reference https://golang.org/pkg/builtin/ -// type bool -// type byte -// type complex128 -// type complex64 -// type error -// type float32 -// type float64 -// type int -// type int16 -// type int32 -// type int64 -// type int8 -// type rune -// type string -// type uint -// type uint16 -// type uint32 -// type uint64 -// type uint8 -// type uintptr -func SchemaOf(field astutils.FieldMeta) *Schema { - ft := field.Type - if IsVarargs(ft) { - ft = ToSlice(ft) - } - ft = strings.TrimLeft(ft, "*") - switch ft { - case "int", "int8", "int16", "int32", "uint", "uint8", "uint16", "uint32", "byte", "rune", "complex64", "complex128": - return Int - case "int64", "uint64", "uintptr": - return Int64 - case "bool": - return Bool - case "string", "error", "[]rune", "[]byte": - return String - case "float32": - return Float32 - case "float64": - return Float64 - case "multipart.FileHeader", "v3.FileModel": - return File - case "time.Time", "customtypes.Time": - return Time - case "decimal.Decimal": // simple treat decimal.Decimal as string - return Decimal - default: - return handleDefaultCase(ft) - } -} - -func handleDefaultCase(ft string) *Schema { - if strings.HasPrefix(ft, "map[") { - elem := ft[strings.Index(ft, "]")+1:] - return &Schema{ - Type: ObjectT, - AdditionalProperties: SchemaOf(astutils.FieldMeta{ - Type: elem, - }), - XMapType: ft, - } - } - if strings.HasPrefix(ft, "[") { - elem := ft[strings.Index(ft, "]")+1:] - return &Schema{ - Type: ArrayT, - Items: SchemaOf(astutils.FieldMeta{ - Type: elem, - }), - } - } - re := regexp.MustCompile(`anonystructÂŦ(.*)Âŧ`) - if re.MatchString(ft) { - result := re.FindStringSubmatch(ft) - var structmeta astutils.StructMeta - json.Unmarshal([]byte(result[1]), &structmeta) - schema := NewSchema(structmeta) - return &schema - } - var title string - if !strings.Contains(ft, ".") { - title = ft - } - if stringutils.IsEmpty(title) { - title = ft[strings.LastIndex(ft, ".")+1:] - } - if stringutils.IsNotEmpty(title) { - if unicode.IsUpper(rune(title[0])) { - if sliceutils.StringContains(SchemaNames, title) { - return &Schema{ - Ref: "#/components/schemas/" + title, - } - } - } - if enumMeta, ok := Enums[title]; ok { - enumSchema := &Schema{ - Type: StringT, - Enum: sliceutils.StringSlice2InterfaceSlice(enumMeta.Values), - } - if len(enumMeta.Values) > 0 { - enumSchema.Default = enumMeta.Values[0] - } - return enumSchema - } - } - return Any -} - -var castFuncMap = map[string]string{ - "bool": "ToBool", - "float64": "ToFloat64", - "float32": "ToFloat32", - "int64": "ToInt64", - "int32": "ToInt32", - "int16": "ToInt16", - "int8": "ToInt8", - "int": "ToInt", - "uint": "ToUint", - "uint8": "ToUint8", - "uint16": "ToUint16", - "uint32": "ToUint32", - "uint64": "ToUint64", - "error": "ToError", - "decimal.Decimal": "ToDecimal", - "[]byte": "ToByteSlice", - "[]rune": "ToRuneSlice", - "[]interface{}": "ToInterfaceSlice", - "[]bool": "ToBoolSlice", - "[]int": "ToIntSlice", - "[]float64": "ToFloat64Slice", - "[]float32": "ToFloat32Slice", - "[]int64": "ToInt64Slice", - "[]int32": "ToInt32Slice", - "[]int16": "ToInt16Slice", - "[]int8": "ToInt8Slice", - "[]uint": "ToUintSlice", - "[]uint8": "ToUint8Slice", - "[]uint16": "ToUint16Slice", - "[]uint32": "ToUint32Slice", - "[]uint64": "ToUint64Slice", - "[]error": "ToErrorSlice", - "[]decimal.Decimal": "ToDecimalSlice", - "[][]byte": "ToByteSliceSlice", - "[][]rune": "ToRuneSliceSlice", -} - -func IsSupport(t string) bool { - if IsVarargs(t) { - t = ToSlice(t) - } - _, exists := castFuncMap[strings.TrimLeft(t, "*")] - return exists -} - -func IsOptional(t string) bool { - return strings.HasPrefix(t, "*") || strings.HasPrefix(t, "...") -} - -func IsSlice(t string) bool { - return strings.Contains(t, "[") || strings.HasPrefix(t, "...") -} - -func IsVarargs(t string) bool { - return strings.HasPrefix(t, "...") -} - -func ToSlice(t string) string { - return "[]" + strings.TrimPrefix(t, "...") -} - -func CastFunc(t string) string { - if IsVarargs(t) { - t = ToSlice(t) - } - return castFuncMap[strings.TrimLeft(t, "*")] -} - -// CopySchema as SchemaOf returns pointer, so deepcopy the schema the pointer points -func CopySchema(field astutils.FieldMeta) Schema { - var schema Schema - err := copier.DeepCopy(SchemaOf(field), &schema) - if err != nil { - panic(err) - } - return schema -} - -func RefAddDoc(schema *Schema, doc string) { - if stringutils.IsNotEmpty(schema.Ref) { - title := strings.TrimPrefix(schema.Ref, "#/components/schemas/") - temp := Schemas[title] - temp.Description = strings.Join([]string{doc, temp.Description}, "\n") - Schemas[title] = temp - } else { - schema.Description = doc - } -} - -// NewSchema new schema from astutils.StructMeta -func NewSchema(structmeta astutils.StructMeta) Schema { - properties := make(map[string]*Schema) - var required []string - for _, field := range structmeta.Fields { - fschema := CopySchema(field) - RefAddDoc(&fschema, strings.Join(field.Comments, "\n")) - properties[field.DocName] = &fschema - if !strings.HasPrefix(field.Type, "*") { - required = append(required, field.DocName) - } - } - return Schema{ - Title: structmeta.Name, - Type: ObjectT, - Properties: properties, - Description: strings.Join(structmeta.Comments, "\n"), - Required: required, - } -} - -// IsBuiltin check whether field is built-in type https://pkg.go.dev/builtin or not -func IsBuiltin(field astutils.FieldMeta) bool { - simples := []interface{}{Int, Int64, Bool, String, Float32, Float64} - types := []interface{}{IntegerT, StringT, BooleanT, NumberT} - pschema := SchemaOf(field) - if sliceutils.Contains(simples, pschema) || (sliceutils.Contains(types, pschema.Type) && pschema.Format != BinaryF) { - return true - } - if pschema.Type == ArrayT && (sliceutils.Contains(simples, pschema.Items) || (sliceutils.Contains(types, pschema.Items.Type) && pschema.Items.Format != BinaryF)) { - return true - } - return false -} - -// IsEnum check whether field is enum -func IsEnum(field astutils.FieldMeta) bool { - pschema := SchemaOf(field) - return len(pschema.Enum) > 0 || (pschema.Type == ArrayT && len(pschema.Items.Enum) > 0) -} - -// IsStruct check whether field is struct type -func IsStruct(field astutils.FieldMeta) bool { - return stringutils.IsNotEmpty(SchemaOf(field).Ref) -} - -// ElementType get element type string from slice -func ElementType(t string) string { - if IsVarargs(t) { - return strings.TrimPrefix(t, "...") - } - return t[strings.Index(t, "]")+1:] -} - -func LoadAPI(file string) API { - var ( - docfile *os.File - err error - docraw []byte - api API - ) - if strings.HasPrefix(file, "http") { - link := file - client := resty.New() - client.SetRedirectPolicy(resty.FlexibleRedirectPolicy(15)) - root, _ := os.Getwd() - client.SetOutputDirectory(root) - filename := ".openapi3" - _, err := client.R(). - SetOutput(filename). - Get(link) - if err != nil { - panic(err) - } - file = filepath.Join(root, filename) - defer os.Remove(file) - } - if docfile, err = os.Open(file); err != nil { - panic(err) - } - defer docfile.Close() - if docraw, err = ioutil.ReadAll(docfile); err != nil { - panic(err) - } - if err = json.Unmarshal(docraw, &api); err != nil { - panic(err) - } - if stringutils.IsEmpty(api.Openapi) { - var doc openapi2.T - if err = json.Unmarshal(docraw, &doc); err != nil { - panic(err) - } - if stringutils.IsEmpty(doc.Swagger) { - panic("not support") - } - var doc1 *openapi3.T - doc1, err = openapi2conv.ToV3(&doc) - if err != nil { - panic(err) - } - doc1Json, _ := json.Marshal(doc1) - root, _ := os.Getwd() - spec := filepath.Join(root, "swaggerV2ToV3"+filepath.Ext(file)) - os.WriteFile(spec, doc1Json, os.ModePerm) - copier.DeepCopy(doc1, &api) - } - return api -} - -func ToOptional(t string) string { - if !strings.HasPrefix(t, "*") { - return "*" + t - } - return t -} - -func IsEnumType(methods []astutils.MethodMeta) bool { - methodMap := make(map[string]struct{}) - for _, item := range methods { - methodMap[item.String()] = struct{}{} - } - for _, item := range IEnumMethods { - if _, ok := methodMap[item]; !ok { - return false - } - } - return true -} diff --git a/toolkit/openapi/v3/helper_test.go b/toolkit/openapi/v3/helper_test.go deleted file mode 100644 index 8b7621e6..00000000 --- a/toolkit/openapi/v3/helper_test.go +++ /dev/null @@ -1,280 +0,0 @@ -package v3 - -import ( - "go/ast" - "go/parser" - "go/token" - "strings" - "testing" - - . "github.com/smartystreets/goconvey/convey" - "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/pathutils" -) - -func Test_isSupport(t *testing.T) { - type args struct { - t string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "1", - args: args{ - t: "float32", - }, - want: true, - }, - { - name: "2", - args: args{ - t: "[]int64", - }, - want: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := IsSupport(tt.args.t); got != tt.want { - t.Errorf("isSupport() = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_castFunc(t *testing.T) { - type args struct { - t string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "1", - args: args{ - t: "uint64", - }, - want: "ToUint64", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := CastFunc(tt.args.t); got != tt.want { - t.Errorf("castFunc() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestSchemaOf(t *testing.T) { - Convey("SchemaOf", t, func() { - So(SchemaOf(astutils.FieldMeta{ - Name: "avatar", - Type: "v3.FileModel", - IsExport: true, - }), ShouldEqual, File) - - So(SchemaOf(astutils.FieldMeta{ - Name: "name", - Type: "string", - IsExport: true, - }), ShouldEqual, String) - - So(SchemaOf(astutils.FieldMeta{ - Name: "age", - Type: "int", - IsExport: true, - }), ShouldEqual, Int) - - So(SchemaOf(astutils.FieldMeta{ - Name: "id", - Type: "int64", - IsExport: true, - }), ShouldEqual, Int64) - - So(SchemaOf(astutils.FieldMeta{ - Name: "married", - Type: "bool", - IsExport: true, - }), ShouldEqual, Bool) - - So(SchemaOf(astutils.FieldMeta{ - Name: "score", - Type: "float32", - IsExport: true, - }), ShouldEqual, Float32) - - So(SchemaOf(astutils.FieldMeta{ - Name: "average", - Type: "float64", - IsExport: true, - }), ShouldEqual, Float64) - - So(SchemaOf(astutils.FieldMeta{ - Name: "params", - Type: "...int", - IsExport: true, - }).Type, ShouldEqual, ArrayT) - - So(SchemaOf(astutils.FieldMeta{ - Name: "data", - Type: "map[string]string", - IsExport: true, - }).Type, ShouldEqual, ObjectT) - - So(SchemaOf(astutils.FieldMeta{ - Name: "anony", - Type: "anonystructÂŦ{\"Name\":\"\",\"Fields\":[{\"Name\":\"Name\",\"Type\":\"string\",\"Tag\":\"\",\"Comments\":null,\"IsExport\":true,\"DocName\":\"Name\"},{\"Name\":\"Addr\",\"Type\":\"anonystructÂŦ{\\\"Name\\\":\\\"\\\",\\\"Fields\\\":[{\\\"Name\\\":\\\"Zip\\\",\\\"Type\\\":\\\"string\\\",\\\"Tag\\\":\\\"\\\",\\\"Comments\\\":null,\\\"IsExport\\\":true,\\\"DocName\\\":\\\"Zip\\\"},{\\\"Name\\\":\\\"Block\\\",\\\"Type\\\":\\\"string\\\",\\\"Tag\\\":\\\"\\\",\\\"Comments\\\":null,\\\"IsExport\\\":true,\\\"DocName\\\":\\\"Block\\\"},{\\\"Name\\\":\\\"Full\\\",\\\"Type\\\":\\\"string\\\",\\\"Tag\\\":\\\"\\\",\\\"Comments\\\":null,\\\"IsExport\\\":true,\\\"DocName\\\":\\\"Full\\\"}],\\\"Comments\\\":null,\\\"Methods\\\":null,\\\"IsExport\\\":false}Âŧ\",\"Tag\":\"\",\"Comments\":null,\"IsExport\":true,\"DocName\":\"Addr\"}],\"Comments\":null,\"Methods\":null,\"IsExport\":false}Âŧ", - IsExport: true, - }).Type, ShouldEqual, ObjectT) - - SchemaNames = []string{"User"} - So(SchemaOf(astutils.FieldMeta{ - Name: "user", - Type: "User", - IsExport: true, - }).Ref, ShouldEqual, "#/components/schemas/User") - - So(SchemaOf(astutils.FieldMeta{ - Name: "user", - Type: "vo.User", - IsExport: true, - }).Ref, ShouldEqual, "#/components/schemas/User") - - Enums = map[string]astutils.EnumMeta{ - "KeyboardLayout": { - Name: "KeyboardLayout", - Values: []string{ - "UNKNOWN", - "QWERTZ", - }, - }, - } - So(SchemaOf(astutils.FieldMeta{ - Name: "layout", - Type: "KeyboardLayout", - IsExport: true, - }).Enum, ShouldResemble, []interface{}{ - "UNKNOWN", - "QWERTZ", - }) - - So(SchemaOf(astutils.FieldMeta{ - Name: "any", - Type: "Any", - IsExport: true, - }), ShouldEqual, Any) - }) -} - -func TestRefAddDoc(t *testing.T) { - Convey("Description should be equal to doc", t, func() { - SchemaNames = []string{"User"} - schema := SchemaOf(astutils.FieldMeta{ - Name: "user", - Type: "User", - IsExport: true, - }) - doc := "This is a struct for user field" - RefAddDoc(schema, doc) - So(strings.TrimSpace(Schemas["User"].Description), ShouldEqual, doc) - }) -} - -func TestIsBuiltin(t *testing.T) { - Convey("Test IsBuiltIn", t, func() { - So(IsBuiltin(astutils.FieldMeta{ - Name: "age", - Type: "int", - IsExport: true, - }), ShouldBeTrue) - - So(IsBuiltin(astutils.FieldMeta{ - Name: "books", - Type: "[]string", - IsExport: true, - }), ShouldBeTrue) - - So(IsBuiltin(astutils.FieldMeta{ - Name: "data", - Type: "map[string]string", - IsExport: true, - }), ShouldBeFalse) - }) -} - -func TestIsEnum(t *testing.T) { - Convey("Test IsEnum", t, func() { - So(IsEnum(astutils.FieldMeta{ - Name: "age", - Type: "int", - IsExport: true, - }), ShouldBeFalse) - - Enums = map[string]astutils.EnumMeta{ - "KeyboardLayout": { - Name: "KeyboardLayout", - Values: []string{ - "UNKNOWN", - "QWERTZ", - }, - }, - } - So(IsEnum(astutils.FieldMeta{ - Name: "layout", - Type: "KeyboardLayout", - IsExport: true, - }), ShouldBeTrue) - }) -} - -func TestElementType(t *testing.T) { - Convey("Test ElementType", t, func() { - So(ElementType("[]int"), ShouldEqual, "int") - So(ElementType("...int"), ShouldEqual, "int") - }) -} - -func TestIsOptional(t *testing.T) { - Convey("Test IsOptional", t, func() { - So(IsOptional("*[]int"), ShouldBeTrue) - So(IsOptional("...int"), ShouldBeTrue) - So(IsOptional("int"), ShouldBeFalse) - }) -} - -func TestIsSlice(t *testing.T) { - Convey("Test IsOptional", t, func() { - So(IsSlice("*[]int"), ShouldBeTrue) - So(IsSlice("...int"), ShouldBeTrue) - So(IsSlice("int"), ShouldBeFalse) - }) -} - -func TestEnum(t *testing.T) { - file := pathutils.Abs("testdata/enum.go") - fset := token.NewFileSet() - root, err := parser.ParseFile(fset, file, nil, parser.ParseComments) - if err != nil { - panic(err) - } - sc := astutils.NewEnumCollector(astutils.ExprString) - ast.Walk(sc, root) - enumMap := make(map[string]astutils.EnumMeta) - for k, v := range sc.Methods { - if IsEnumType(v) { - em := astutils.EnumMeta{ - Name: k, - Values: sc.Consts[k], - } - enumMap[k] = em - } - } - require.Equal(t, 1, len(enumMap)) -} diff --git a/toolkit/openapi/v3/model.go b/toolkit/openapi/v3/model.go deleted file mode 100644 index d6c9045b..00000000 --- a/toolkit/openapi/v3/model.go +++ /dev/null @@ -1,379 +0,0 @@ -package v3 - -import ( - "io" -) - -// Contact https://spec.openapis.org/oas/v3.0.3#contact-object -type Contact struct { - Email string `json:"email,omitempty"` -} - -// License https://spec.openapis.org/oas/v3.0.3#license-object -type License struct { - Name string `json:"name,omitempty"` - URL string `json:"url,omitempty"` -} - -// Info https://spec.openapis.org/oas/v3.0.3#info-object -type Info struct { - Title string `json:"title,omitempty"` - Description string `json:"description,omitempty"` - TermsOfService string `json:"termsOfService,omitempty"` - Contact *Contact `json:"contact,omitempty"` - License *License `json:"license,omitempty"` - Version string `json:"version,omitempty"` -} - -// Server https://spec.openapis.org/oas/v3.0.3#server-object -type Server struct { - URL string `json:"url,omitempty"` -} - -// ExternalDocs https://spec.openapis.org/oas/v3.0.3#external-documentation-object -type ExternalDocs struct { - Description string `json:"description,omitempty"` - URL string `json:"url,omitempty"` -} - -// Tag https://spec.openapis.org/oas/v3.0.3#tag-object -type Tag struct { - Name string `json:"name,omitempty"` - Description string `json:"description,omitempty"` - ExternalDocs *ExternalDocs `json:"externalDocs,omitempty"` -} - -// In represents parameter position -type In string - -const ( - // InQuery query string parameter - InQuery In = "query" - // InPath TODO not implemented yet - InPath In = "path" - // InHeader TODO not implemented yet - InHeader In = "header" - // InCookie TODO not implemented yet - InCookie In = "cookie" -) - -// Example https://spec.openapis.org/oas/v3.0.3#example-object -type Example struct { - // TODO -} - -// Encoding https://spec.openapis.org/oas/v3.0.3#encoding-object -type Encoding struct { - // TODO -} - -// MediaType https://spec.openapis.org/oas/v3.0.3#media-type-object -type MediaType struct { - Schema *Schema `json:"schema,omitempty"` - Example interface{} `json:"example,omitempty"` - Examples map[string]Example `json:"examples,omitempty"` - Encoding map[string]Encoding `json:"encoding,omitempty"` -} - -// Content REQUIRED. The content of the request body. The key is a media type or [media type range]appendix-D) -// and the value describes it. For requests that match multiple keys, only the most specific key is applicable. -// e.g. text/plain overrides text/* -type Content struct { - TextPlain *MediaType `json:"text/plain,omitempty"` - JSON *MediaType `json:"application/json,omitempty"` - FormURL *MediaType `json:"application/x-www-form-urlencoded,omitempty"` - Stream *MediaType `json:"application/octet-stream,omitempty"` - FormData *MediaType `json:"multipart/form-data,omitempty"` - Default *MediaType `json:"*/*,omitempty"` -} - -// Parameter https://spec.openapis.org/oas/v3.0.3#parameter-object -type Parameter struct { - Name string `json:"name,omitempty"` - In In `json:"in,omitempty"` - Description string `json:"description,omitempty"` - Required bool `json:"required,omitempty"` - Deprecated bool `json:"deprecated,omitempty"` - Example interface{} `json:"example,omitempty"` - Schema *Schema `json:"schema,omitempty"` - Style string `json:"style,omitempty"` - Explode bool `json:"explode,omitempty"` - AllowReserved bool `json:"allowReserved,omitempty"` - Content *Content `json:"content,omitempty"` - AllowEmptyValue bool `json:"allowEmptyValue,omitempty"` -} - -// RequestBody https://spec.openapis.org/oas/v3.0.3#request-body-object -type RequestBody struct { - Description string `json:"description,omitempty"` - Content *Content `json:"content,omitempty"` - Required bool `json:"required,omitempty"` - Ref string `json:"$ref,omitempty"` -} - -// Header https://spec.openapis.org/oas/v3.0.3#header-object -type Header struct { - Ref string `json:"$ref,omitempty"` - Description string `json:"description,omitempty"` - Required bool `json:"required,omitempty"` - Deprecated bool `json:"deprecated,omitempty"` - Example interface{} `json:"example,omitempty"` - Schema *Schema `json:"schema,omitempty"` -} - -// Link https://spec.openapis.org/oas/v3.0.3#link-object -type Link struct { - // TODO -} - -// Response https://spec.openapis.org/oas/v3.0.3#response-object -type Response struct { - Description string `json:"description"` - Content *Content `json:"content,omitempty"` - // TODO - Headers map[string]Header `json:"headers,omitempty"` - Links map[string]Link `json:"links,omitempty"` - Ref string `json:"$ref,omitempty"` -} - -// Responses https://spec.openapis.org/oas/v3.0.3#responses-object -type Responses struct { - Resp200 *Response `json:"200,omitempty"` - Resp400 *Response `json:"400,omitempty"` - Resp401 *Response `json:"401,omitempty"` - Resp403 *Response `json:"403,omitempty"` - Resp404 *Response `json:"404,omitempty"` - Resp405 *Response `json:"405,omitempty"` - Default *Response `json:"default,omitempty"` -} - -// Callback https://spec.openapis.org/oas/v3.0.3#callback-object -type Callback struct { - // TODO -} - -// Security not implemented yet -type Security struct { - // TODO -} - -// Operation https://spec.openapis.org/oas/v3.0.3#operation-object -type Operation struct { - Tags []string `json:"tags,omitempty"` - Summary string `json:"summary,omitempty"` - Description string `json:"description,omitempty"` - OperationID string `json:"operationId,omitempty"` - Parameters []Parameter `json:"parameters,omitempty"` - RequestBody *RequestBody `json:"requestBody,omitempty"` - Responses *Responses `json:"responses,omitempty"` - Deprecated bool `json:"deprecated,omitempty"` - ExternalDocs *ExternalDocs `json:"externalDocs,omitempty"` - Callbacks map[string]Callback `json:"callbacks,omitempty"` - Security []Security `json:"security,omitempty"` - Servers []Server `json:"servers,omitempty"` -} - -// Path https://spec.openapis.org/oas/v3.0.3#path-item-object -type Path struct { - Get *Operation `json:"get,omitempty"` - Post *Operation `json:"post,omitempty"` - Put *Operation `json:"put,omitempty"` - Delete *Operation `json:"delete,omitempty"` - // TODO - Parameters []Parameter `json:"parameters,omitempty"` -} - -// SecurityScheme https://spec.openapis.org/oas/v3.0.3#security-scheme-object -type SecurityScheme struct { - // TODO -} - -// Discriminator https://spec.openapis.org/oas/v3.0.3#discriminator-object -type Discriminator struct { - PropertyName string `json:"propertyName,omitempty"` - Mapping map[string]string `json:"mapping,omitempty"` -} - -// Schema https://spec.openapis.org/oas/v3.0.3#schema-object -type Schema struct { - Ref string `json:"$ref,omitempty"` - Title string `json:"title,omitempty"` - Type Type `json:"type,omitempty"` - Properties map[string]*Schema `json:"properties,omitempty"` - Format Format `json:"format,omitempty"` - Items *Schema `json:"items,omitempty"` - Description string `json:"description,omitempty"` - Default interface{} `json:"default,omitempty"` - Example interface{} `json:"example,omitempty"` - Deprecated bool `json:"deprecated,omitempty"` - Discriminator *Discriminator `json:"discriminator,omitempty"` - Nullable bool `json:"nullable,omitempty"` - Maximum interface{} `json:"maximum,omitempty"` - Minimum interface{} `json:"minimum,omitempty"` - ExclusiveMaximum interface{} `json:"exclusiveMaximum,omitempty"` - ExclusiveMinimum interface{} `json:"exclusiveMinimum,omitempty"` - MaxLength int `json:"maxLength,omitempty"` - MinLength int `json:"minLength,omitempty"` - Required []string `json:"required,omitempty"` - Enum []interface{} `json:"enum,omitempty"` - AllOf []*Schema `json:"allOf,omitempty"` - OneOf []*Schema `json:"oneOf,omitempty"` - AnyOf []*Schema `json:"anyOf,omitempty"` - Not []*Schema `json:"not,omitempty"` - // AdditionalProperties *Schema or bool - AdditionalProperties interface{} `json:"additionalProperties,omitempty"` - Pattern interface{} `json:"pattern,omitempty"` - XMapType string `json:"x-map-type,omitempty"` -} - -// Components https://spec.openapis.org/oas/v3.0.3#components-object -type Components struct { - Schemas map[string]Schema `json:"schemas,omitempty"` - RequestBodies map[string]RequestBody `json:"requestBodies,omitempty"` - Responses map[string]Response `json:"responses,omitempty"` - // TODO - Parameters map[string]Parameter `json:"parameters,omitempty"` - // TODO - Examples map[string]Example `json:"examples,omitempty"` - // TODO - Headers map[string]Header `json:"headers,omitempty"` - // TODO - SecuritySchemes map[string]SecurityScheme `json:"securitySchemes,omitempty"` - // TODO - Links map[string]Link `json:"links,omitempty"` - // TODO - Callbacks map[string]Callback `json:"callbacks,omitempty"` -} - -// API https://spec.openapis.org/oas/v3.0.3#openapi-object -type API struct { - Openapi string `json:"openapi,omitempty"` - Info *Info `json:"info,omitempty"` - Servers []Server `json:"servers,omitempty"` - Tags []Tag `json:"tags,omitempty"` - Paths map[string]Path `json:"paths,omitempty"` - Components *Components `json:"components,omitempty"` - ExternalDocs *ExternalDocs `json:"externalDocs,omitempty"` -} - -// Type represents types in OpenAPI3.0 spec -type Type string - -const ( - // IntegerT integer - IntegerT Type = "integer" - // StringT string - StringT Type = "string" - // BooleanT boolean - BooleanT Type = "boolean" - // NumberT number - NumberT Type = "number" - // ObjectT object - ObjectT Type = "object" - // ArrayT array - ArrayT Type = "array" -) - -// Format represents format in OpenAPI3.0 spec -type Format string - -const ( - // Int32F int32 - Int32F Format = "int32" - // Int64F int64 - Int64F Format = "int64" - // FloatF float - FloatF Format = "float" - // DoubleF double - DoubleF Format = "double" - // DateTimeF date-time - DateTimeF Format = "date-time" - // BinaryF binary - BinaryF Format = "binary" - DecimalF Format = "decimal" -) - -var ( - // Any constant schema for object - Any = &Schema{ - Type: ObjectT, - } - // Int constant schema for int - Int = &Schema{ - Type: IntegerT, - Format: Int32F, - } - // Int64 constant schema for int64 - Int64 = &Schema{ - Type: IntegerT, - Format: Int64F, - } - // String constant schema for string - String = &Schema{ - Type: StringT, - } - // Time constant schema for time - Time = &Schema{ - Type: StringT, - Format: DateTimeF, - } - // Bool constant schema for bool - Bool = &Schema{ - Type: BooleanT, - } - // Float32 constant schema for float32 - Float32 = &Schema{ - Type: NumberT, - Format: FloatF, - } - // Float64 constant schema for float64 - Float64 = &Schema{ - Type: NumberT, - Format: DoubleF, - } - // File constant schema for file - File = &Schema{ - Type: StringT, - Format: BinaryF, - } - // FileArray constant schema for file slice - FileArray = &Schema{ - Type: ArrayT, - Items: File, - } - Decimal = &Schema{ - Type: StringT, - Format: DecimalF, - } -) - -type FileModel struct { - Filename string - Reader io.ReadCloser -} - -func (f *FileModel) Close() error { - return f.Reader.Close() -} - -type IEnum interface { - StringSetter(value string) - StringGetter() string - UnmarshalJSON(bytes []byte) error - MarshalJSON() ([]byte, error) -} - -var IEnumMethods = []string{ - "func StringSetter(value string)", - "func StringGetter() string", - "func UnmarshalJSON(bytes []byte) error", - "func MarshalJSON() ([]byte, error)", -} - -type ExampleType int - -const ( - UNKNOWN_EXAMPLE ExampleType = iota - JSON_EXAMPLE - TEXT_EXAMPLE -) diff --git a/toolkit/openapi/v3/testdata/enum.go b/toolkit/openapi/v3/testdata/enum.go deleted file mode 100644 index c3d61206..00000000 --- a/toolkit/openapi/v3/testdata/enum.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import "encoding/json" - -//go:generate go-doudou name --file $GOFILE -o - -type KeyboardLayout int - -const ( - UNKNOWN KeyboardLayout = iota - QWERTZ = 300 - - AZERTY int64 = 400 - QWERTY - ddd = "abc" -) - -func (k *KeyboardLayout) StringSetter(value string) { - switch value { - case "UNKNOWN": - *k = UNKNOWN - case "QWERTY": - *k = QWERTY - case "QWERTZ": - *k = QWERTZ - case "AZERTY": - *k = AZERTY - default: - *k = UNKNOWN - } -} - -func (k *KeyboardLayout) StringGetter() string { - switch *k { - case UNKNOWN: - return "UNKNOWN" - case QWERTY: - return "QWERTY" - case QWERTZ: - return "QWERTZ" - case AZERTY: - return "AZERTY" - default: - return "UNKNOWN" - } -} - -func (k *KeyboardLayout) UnmarshalJSON(bytes []byte) error { - var _k string - err := json.Unmarshal(bytes, &_k) - if err != nil { - return err - } - k.StringSetter(_k) - return nil -} - -func (k KeyboardLayout) MarshalJSON() ([]byte, error) { - return json.Marshal(k.StringGetter()) -} - -type Keyboard struct { - Layout *KeyboardLayout `json:"layout,omitempty"` - Backlit bool `json:"backlit,omitempty"` -} diff --git a/toolkit/pagination/gorm/LICENSE b/toolkit/pagination/gorm/LICENSE deleted file mode 100644 index 746ea061..00000000 --- a/toolkit/pagination/gorm/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 morkid - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/toolkit/pagination/gorm/README.md b/toolkit/pagination/gorm/README.md deleted file mode 100644 index b93105e7..00000000 --- a/toolkit/pagination/gorm/README.md +++ /dev/null @@ -1,877 +0,0 @@ -# paginate - Gorm Pagination - -[![Go Reference](https://pkg.go.dev/badge/github.com/morkid/paginate.svg)](https://pkg.go.dev/github.com/morkid/paginate) -[![CircleCI](https://circleci.com/gh/morkid/paginate.svg?style=svg)](https://circleci.com/gh/morkid/paginate) -[![Github Actions](https://github.com/morkid/paginate/workflows/Go/badge.svg)](https://github.com/morkid/paginate/actions) -[![Build Status](https://travis-ci.com/morkid/paginate.svg?branch=master)](https://travis-ci.com/morkid/paginate) -[![Go Report Card](https://goreportcard.com/badge/github.com/morkid/paginate)](https://goreportcard.com/report/github.com/morkid/paginate) -[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/morkid/paginate)](https://github.com/morkid/paginate/releases) - -Simple way to paginate [Gorm](https://github.com/go-gorm/gorm) result. **paginate** is compatible with [net/http](https://golang.org/pkg/net/http/) and [fasthttp](https://github.com/valyala/fasthttp). This library also supports many frameworks are based on net/http or fasthttp. - -## Table Of Contents -- [Installation](#installation) -- [Configuration](#configuration) -- [Paginate using http request](#paginate-using-http-request) -- [Example usage](#example-usage) - - [net/http](#nethttp-example) - - [Fasthttp](#fasthttp-example) - - [Mux Router](#mux-router-example) - - [Fiber](#fiber-example) - - [Echo](#echo-example) - - [Gin](#gin-example) - - [Martini](#martini-example) - - [Beego](#beego-example) - - [jQuery DataTable Integration](#jquery-datatable-integration) - - [jQuery Select2 Integration](#jquery-select2-integration) -- [Filter format](#filter-format) -- [Customize default configuration](#customize-default-configuration) -- [Override results](#override-results) -- [Field Selector](#field-selector) -- [Dynamic Field Selector](#dynamic-field-selector) -- [Speed up response with cache](#speed-up-response-with-cache) - - [In Memory Cache](#in-memory-cache) - - [Disk Cache](#disk-cache) - - [Redis Cache](#redis-cache) - - [Elasticsearch Cache](#elasticsearch-cache) - - [Custom cache](#custom-cache) - - [Clean up cache](#clean-up-cache) -- [Limitations](#limitations) -- [License](#license) - -## Installation - -```bash -go get -u github.com/morkid/paginate -``` - -## Configuration - -```go -var db *gorm.DB = ... -var req *http.Request = ... -// or -// var req *fasthttp.Request - -model := db.Where("id > ?", 1).Model(&Article{}) -pg := paginate.New() -page := pg.Response(model, req, &[]Article{}) -// or -page := pg.With(model).Request(req).Response(&[]Article{}) - -log.Println(page.Total) -log.Println(page.Items) -log.Println(page.First) -log.Println(page.Last) - -``` -you can customize config with `paginate.Config` struct. -```go -pg := paginate.New(&paginate.Config{ - DefaultSize: 50, -}) -``` -see more about [customize default configuration](#customize-default-configuration). - -> Note that `Response` was marked as a deprecated function. Please use `With` instead. -> Old: `pg.Response(model, req, &[]Article{})`, -> New: `pg.With(model).Request(req).Response(&[]Article{})` - -## Paginate using http request -example paging, sorting and filtering: -1. `http://localhost:3000/?size=10&page=0&sort=-name` - produces: - ```sql - SELECT * FROM user ORDER BY name DESC LIMIT 10 OFFSET 0 - ``` - `JSON` response: - ```js - { - // result items - "items": [ - { - "id": 1, - "name": "john", - "age": 20 - } - ], - "page": 0, // current selected page - "size": 10, // current limit or size per page - "max_page": 0, // maximum page - "total_pages": 1, // total pages - "total": 1, // total matches including next page - "visible": 1, // total visible on current page - "last": true, // if response is first page - "first": true // if response is last page - } - ``` -2. `http://localhost:3000/?size=10&page=1&sort=-name,id` - produces: - ```sql - SELECT * FROM user ORDER BY name DESC, id ASC LIMIT 10 OFFSET 10 - ``` -3. `http://localhost:3000/?filters=["name","john"]` - produces: - ```sql - SELECT * FROM user WHERE name = 'john' LIMIT 10 OFFSET 0 - ``` -4. `http://localhost:3000/?filters=["name","like","john"]` - produces: - ```sql - SELECT * FROM user WHERE name LIKE '%john%' LIMIT 10 OFFSET 0 - ``` -5. `http://localhost:3000/?filters=["age","between",[20, 25]]` - produces: - ```sql - SELECT * FROM user WHERE ( age BETWEEN 20 AND 25 ) LIMIT 10 OFFSET 0 - ``` -6. `http://localhost:3000/?filters=[["name","like","john%25"],["OR"],["age","between",[20, 25]]]` - produces: - ```sql - SELECT * FROM user WHERE ( - (name LIKE '%john\%%' ESCAPE '\') OR (age BETWEEN (20 AND 25)) - ) LIMIT 10 OFFSET 0 - ``` -7. `http://localhost:3000/?filters=[[["name","like","john"],["AND"],["name","not like","doe"]],["OR"],["age","between",[20, 25]]]` - produces: - ```sql - SELECT * FROM user WHERE ( - ( - (name LIKE '%john%') - AND - (name NOT LIKE '%doe%') - ) - OR - (age BETWEEN (20 AND 25)) - ) LIMIT 10 OFFSET 0 - ``` -8. `http://localhost:3000/?filters=["name","IS NOT",null]` - produces: - ```sql - SELECT * FROM user WHERE name IS NOT NULL LIMIT 10 OFFSET 0 - ``` -9. Using `POST` method: - ```bash - curl -X POST \ - -H 'Content-type: application/json' \ - -d '{"page":"1","size":"20","sort":"-name","filters":["name","john"]}' \ - http://localhost:3000/ - ``` - -## Example usage - -### NetHTTP Example - -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - model := db.Joins("User").Model(&Article{}) - paginated := pg.Response(model, r, &[]Article{}) - j, _ := json.Marshal(paginated) - w.Header().Set("Content-type", "application/json") - w.Write(j) - }) - - log.Fatal(http.ListenAndServe(":3000", nil)) -} -``` - -### Fasthttp Example - -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - - fasthttp.ListenAndServe(":3000", func(ctx *fasthttp.RequestCtx) { - model := db.Joins("User").Model(&Article{}) - paginated := pg.Response(model, &ctx.Request, &[]Article{}) - j, _ := json.Marshal(paginated) - ctx.SetContentType("application/json") - ctx.SetBody(j) - }) -} -``` - -### Mux Router Example -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - app := mux.NewRouter() - app.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { - model := db.Joins("User").Model(&Article{}) - paginated := pg.Response(model, req, &[]Article{}) - j, _ := json.Marshal(paginated) - w.Header().Set("Content-type", "application/json") - w.Write(j) - }).Methods("GET") - http.Handle("/", app) - http.ListenAndServe(":3000", nil) -} -``` - -### Fiber example - -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - app := fiber.New() - app.Get("/", func(c *fiber.Ctx) error { - model := db.Joins("User").Model(&Article{}) - return c.JSON(pg.Response(model, c.Request(), &[]Article{})) - }) - - app.Listen(":3000") -} -``` - -### Echo example - -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - app := echo.New() - app.GET("/", func(c echo.Context) error { - model := db.Joins("User").Model(&Article{}) - return c.JSON(200, pg.Response(model, c.Request(), &[]Article{})) - }) - - app.Logger.Fatal(app.Start(":3000")) -} -``` - -### Gin Example - -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - app := gin.Default() - app.GET("/", func(c *gin.Context) { - model := db.Joins("User").Model(&Article{}) - c.JSON(200, pg.Response(model, c.Request, &[]Article{})) - }) - app.Run(":3000") -} - -``` - -### Martini Example - -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - app := martini.Classic() - app.Use(render.Renderer()) - app.Get("/", func(req *http.Request, r render.Render) { - model := db.Joins("User").Model(&Article{}) - r.JSON(200, pg.Response(model, req, &[]Article{})) - }) - app.Run() -} -``` -### Beego Example - -```go -package main - -import ( - "github.com/morkid/paginate" - ... -) - -func main() { - // var db *gorm.DB - pg := paginate.New() - web.Get("/", func(c *context.Context) { - model := db.Joins("User").Model(&Article{}) - c.Output.JSON( - pg.Response(model, c.Request, &[]Article{}), false, false) - }) - web.Run(":3000") -} -``` - -### jQuery DataTable Integration - -```js -var logicalOperator = "OR" - -$('#myTable').DataTable({ - - columns: [ - { - title: "Author", - data: "user.name" - }, { - title: "Title", - data: "title" - } - ], - - processing: true, - - serverSide: true, - - ajax: { - cache: true, - url: "http://localhost:3000/articles", - dataSrc: function(json) { - json.recordsTotal = json.visible - json.recordsFiltered = json.total - return json.items - }, - data: function(params) { - var custom = { - page: !params.start ? 0 : Math.round(params.start / params.length), - size: params.length - } - - if (params.order.length > 0) { - var sorts = [] - for (var o in params.order) { - var order = params.order[o] - if (params.columns[order.column].orderable != false) { - var sort = order.dir != 'desc' ? '' : '-' - sort += params.columns[order.column].data - sorts.push(sort) - } - } - custom.sort = sorts.join() - } - - if (params.search.value) { - var columns = [] - for (var c in params.columns) { - var col = params.columns[c] - if (col.searchable == false) { - continue - } - columns.push(JSON.stringify([col.data, "like", encodeURIComponent(params.search.value.toLowerCase())])) - } - custom.filters = '[' + columns.join(',["' + logicalOperator + '"],') + ']' - } - - return custom - } - }, -}) -``` - -### jQuery Select2 Integration - -```js -$('#mySelect').select2({ - ajax: { - url: "http://localhost:3000/users", - processResults: function(json) { - json.items.forEach(function(item) { - item.text = item.name - }) - // optional - if (json.first) json.items.unshift({id: 0, text: 'All'}) - - return { - results: json.items, - pagination: { - more: json.last == false - } - } - }, - data: function(params) { - var filters = [ - ["name", "like", params.term] - ] - - return { - filters: params.term ? JSON.stringify(filters) : "", - sort: "name", - page: params.page && params.page - 1 ? params.page - 1 : 0 - } - }, - } -}) -``` - - -## Filter format - -The format of filter param is a json encoded of multidimensional array. -Maximum array members is three, first index is `column_name`, second index is `operator` and third index is `values`, you can also pass array to values. - -```js -// Format: -["column_name", "operator", "values"] - -// Example: -["age", "=", 20] -// Shortcut: -["age", 20] - -// Produces: -// WHERE age = 20 -``` - -Single array member is known as **Logical Operator**. -```js -// Example -[["age", "=", 20],["or"],["age", "=", 25]] - -// Produces: -// WHERE age = 20 OR age = 25 -``` - -You are allowed to send array inside a value. -```js -["age", "between", [20, 30] ] -// Produces: -// WHERE age BETWEEN 20 AND 30 - -["age", "not in", [20, 21, 22, 23, 24, 25, 26, 26] ] -// Produces: -// WHERE age NOT IN(20, 21, 22, 23, 24, 25, 26, 26) -``` - -You can filter nested condition with deep array. -```js -[ - [ - ["age", ">", 20], - ["and"] - ["age", "<", 30] - ], - ["and"], - ["name", "like", "john"], - ["and"], - ["name", "like", "doe"] -] -// Produces: -// WHERE ( (age > 20 AND age < 20) and name like '%john%' and name like '%doe%' ) -``` - -For `null` value, you can send string `"null"` or `null` value, *(lower)* -```js -// Wrong request -[ "age", "is", NULL ] -[ "age", "is", Null ] -[ "age", "is not", NULL ] -[ "age", "is not", Null ] - -// Right request -[ "age", "is", "NULL" ] -[ "age", "is", "Null" ] -[ "age", "is", "null" ] -[ "age", "is", null ] -[ "age", null ] -[ "age", "is not", "NULL" ] -[ "age", "is not", "Null" ] -[ "age", "is not", "null" ] -[ "age", "is not", null ] -``` - -## Customize default configuration - -You can customize the default configuration with `paginate.Config` struct. - -```go -pg := paginate.New(&paginate.Config{ - DefaultSize: 50, -}) -``` - -Config | Type | Default | Description ------------------- | ---------- | --------------------- | ------------- -Operator | `string` | `OR` | Default conditional operator if no operator specified.
For example
`GET /user?filters=[["name","like","jo"],["age",">",20]]`,
produces
`SELECT * FROM user where name like '%jo' OR age > 20` -FieldWrapper | `string` | `LOWER(%s)` | FieldWrapper for `LIKE` operator *(for postgres default is: `LOWER((%s)::text)`)* -DefaultSize | `int64` | `10` | Default size or limit per page -SmartSearch | `bool` | `false` | Enable smart search *(Experimental feature)* -CustomParamEnabled | `bool` | `false` | Enable custom request parameter -FieldSelectorEnabled | `bool` | `false` | Enable partial response with specific fields. Comma separated per field. eg: `?fields=title,user.name` -SortParams | `[]string` | `[]string{"sort"}` | if `CustomParamEnabled` is `true`,
you can set the `SortParams` with custom parameter names.
For example: `[]string{"sorting", "ordering", "other_alternative_param"}`.
The following requests will capture same result
`?sorting=-name`
or `?ordering=-name`
or `?other_alternative_param=-name`
or `?sort=-name` -PageParams | `[]string` | `[]string{"page"}` | if `CustomParamEnabled` is `true`,
you can set the `PageParams` with custom parameter names.
For example:
`[]string{"number", "num", "other_alternative_param"}`.
The following requests will capture same result `?number=0`
or `?num=0`
or `?other_alternative_param=0`
or `?page=0` -SizeParams | `[]string` | `[]string{"size"}` | if `CustomParamEnabled` is `true`,
you can set the `SizeParams` with custom parameter names.
For example:
`[]string{"limit", "max", "other_alternative_param"}`.
The following requests will capture same result `?limit=50`
or `?limit=50`
or `?other_alternative_param=50`
or `?max=50` -OrderParams | `[]string` | `[]string{"order"}` | if `CustomParamEnabled` is `true`,
you can set the `OrderParams` with custom parameter names.
For example:
`[]string{"order", "direction", "other_alternative_param"}`.
The following requests will capture same result `?order=desc`
or `?direction=desc`
or `?other_alternative_param=desc` -FilterParams | `[]string` | `[]string{"filters"}` | if `CustomParamEnabled` is `true`,
you can set the `FilterParams` with custom parameter names.
For example:
`[]string{"search", "find", "other_alternative_param"}`.
The following requests will capture same result
`?search=["name","john"]`
or `?find=["name","john"]`
or `?other_alternative_param=["name","john"]`
or `?filters=["name","john"]` -FieldsParams | `[]string` | `[]string{"fields"}` | if `FieldSelectorEnabled` and `CustomParamEnabled` is `true`,
you can set the `FieldsParams` with custom parameter names.
For example:
`[]string{"fields", "columns", "other_alternative_param"}`.
The following requests will capture same result `?fields=title,user.name`
or `?columns=title,user.name`
or `?other_alternative_param=title,user.name` -CacheAdapter | `*gocache.AdapterInterface` | `nil` | the cache adapter, see more about [cache config](#speed-up-response-with-cache). - -## Override results - -You can override result with custom function. - -```go -// var db = *gorm.DB -// var httpRequest ... net/http or fasthttp instance -// Example override function -override := func(article *Article) { - if article.UserID > 0 { - article.Title = fmt.Sprintf( - "%s written by %s", article.Title, article.User.Name) - } -} - -var articles []Article -model := db.Joins("User").Model(&Article{}) - -pg := paginate.New() -result := pg.Response(model, httpRequest, &articles) -for index := range articles { - override(&articles[index]) -} - -log.Println(result.Items) - -``` - -## Field selector -To implement a custom field selector, struct properties must have a json tag with omitempty. - -```go -// real gorm model -type User { - gorm.Model - Name string `json:"name"` - Age int64 `json:"age"` -} - -// fake gorm model -type UserNullable { - ID *string `json:"id,omitempty"` - CreatedAt *time.Time `json:"created_at,omitempty"` - UpdatedAt *time.Time `json:"updated_at,omitempty"` - Name *string `json:"name,omitempty"` - Age *int64 `json:"age,omitempty"` -} -``` - -```go -// usage -nameAndIDOnly := []string{"name","id"} -model := db.Model(&User{}) - -page := pg.With(model). - Request(req). - Fields(nameAndIDOnly). - Response([]&UserNullable{}) -``` - -```javascript -// response -{ - "items": [ - { - "id": 1, - "name": "John" - } - ], - ... -} -``` -## Dynamic field selector -If the request contains query parameter `fields` (eg: `?fieilds=name,id`), then the response will show only `name` and `id`. To activate this feature, please set `FieldSelectorEnabled` to `true`. -```go -config := paginate.Config{ - FieldSelectorEnabled: true, -} - -pg := paginate.New(config) -``` - -## Speed up response with cache -You can speed up results without looking database directly with cache adapter. See more about [cache adapter](https://github.com/morkid/gocache). - -### In memory cache -in memory cache is not recommended for production environment: -```go -import ( - "github.com/morkid/gocache" - ... -) - -func main() { - ... - adapterConfig := gocache.InMemoryCacheConfig{ - ExpiresIn: 1 * time.Hour, - } - pg := paginate.New(&paginate.Config{ - CacheAdapter: gocache.NewInMemoryCache(adapterConfig), - }) - - page := pg.With(model). - Request(req). - Cache("article"). // set cache name - Response(&[]Article{}) - ... -} -``` - -### Disk cache -Disk cache will create a file for every single request. You can use disk cache if you don't care about inode. -```go -import ( - "github.com/morkid/gocache" - ... -) - -func main() { - adapterConfig := gocache.DiskCacheConfig{ - Directory: "/writable/path/to/my-cache-dir", - ExpiresIn: 1 * time.Hour, - } - pg := paginate.New(&paginate.Config{ - CacheAdapter: gocache.NewDiskCache(adapterConfig), - }) - - page := pg.With(model). - Request(req). - Cache("article"). // set cache name - Response(&[]Article{}) - ... -} -``` - -### Redis cache -Redis cache require [redis client](https://github.com/go-redis/redis) for golang. -```go -import ( - cache "github.com/morkid/gocache-redis/v8" - "github.com/go-redis/redis/v8" - ... -) - -func main() { - client := redis.NewClient(&redis.Options{ - Addr: "localhost:6379", - Password: "", - DB: 0, - }) - - adapterConfig := cache.RedisCacheConfig{ - Client: client, - ExpiresIn: 1 * time.Hour, - } - pg := paginate.New(&paginate.Config{ - CacheAdapter: cache.NewRedisCache(adapterConfig), - }) - - page := pg.With(model). - Request(req). - Cache("article"). - Response(&[]Article{}) - ... -} -``` -> if your code already adopts another redis client, you can implement the [redis adapter](https://github.com/morkid/gocache-redis) according to its version. See more about [redis adapter](https://github.com/morkid/gocache-redis). - -### Elasticsearch cache -Elasticsearch cache require official [elasticsearch client](https://github.com/elastic/go-elasticsearch) for golang. -```go -import ( - cache "github.com/morkid/gocache-elasticsearch/v7" - "github.com/elastic/go-elasticsearch/v7" - ... -) - -func main() { - config := elasticsearch.Config{ - Addresses: []string{ - "http://localhost:9200", - }, - } - es, err := elasticsearch.NewClient(config) - if nil != err { - panic(err) - } - - adapterConfig := cache.ElasticCacheConfig{ - Client: es, - Index: "exampleproject", - ExpiresIn: 1 * time.Hour, - } - pg := paginate.New(&paginate.Config{ - CacheAdapter: cache.NewElasticCache(adapterConfig), - }) - - page := pg.With(model). - Request(req). - Cache("article"). - Response(&[]Article{}) - ... -} -``` -> if your code already adopts another elasticsearch client, you can implement the [elasticsearch adapter](https://github.com/morkid/gocache-elasticsearch) according to its version. See more about [elasticsearch adapter](https://github.com/morkid/gocache-elasticsearch). - -### Custom cache -Create your own cache adapter by implementing [gocache AdapterInterface](https://github.com/morkid/gocache/blob/master/gocache.go). See more about [cache adapter](https://github.com/morkid/gocache). -```go -// AdapterInterface interface -type AdapterInterface interface { - // Set cache with key - Set(key string, value string) error - // Get cache by key - Get(key string) (string, error) - // IsValid check if cache is valid - IsValid(key string) bool - // Clear clear cache by key - Clear(key string) error - // ClearPrefix clear cache by key prefix - ClearPrefix(keyPrefix string) error - // Clear all cache - ClearAll() error -} -``` - -### Clean up cache -Clear cache by cache name -```go -pg.ClearCache("article") -``` -Clear multiple cache -```go -pg.ClearCache("cache1", "cache2", "cache3") -``` - -Clear all cache -```go -pg.ClearAllCache() -``` - - -## Limitations - -Paginate doesn't support has many relationship. You can make API with separated endpoints for parent and child: -```javascript -GET /users - -{ - "items": [ - { - "id": 1, - "name": "john", - "age": 20, - "addresses": [...] // doesn't support - } - ], - ... -} -``` - -Best practice: - -```javascript -GET /users -{ - "items": [ - { - "id": 1, - "name": "john", - "age": 20 - } - ], - ... -} - -GET /users/1/addresses -{ - "items": [ - { - "id": 1, - "name": "home", - "street": "home street" - "user": { - "id": 1, - "name": "john", - "age": 20 - } - } - ], - ... -} -``` - -Paginate doesn't support for customized json or table field name. -Make sure your struct properties have same name with gorm column and json property before you expose them. - -Example bad configuration: - -```go - -type User struct { - gorm.Model - UserName string `gorm:"column:nickname" json:"name"` - UserAddress string `gorm:"column:user_address" json:"address"` -} - -// request: GET /path/to/endpoint?sort=-name,address -// response: "items": [] with sql error (column name not found) -``` - -Best practice: -```go -type User struct { - gorm.Model - Name string `gorm:"column:name" json:"name"` - Address string `gorm:"column:address" json:"address"` -} - -``` - -## License - -Published under the [MIT License](https://github.com/morkid/paginate/blob/master/LICENSE). \ No newline at end of file diff --git a/toolkit/pagination/gorm/paginate.go b/toolkit/pagination/gorm/paginate.go deleted file mode 100644 index 7501cbb7..00000000 --- a/toolkit/pagination/gorm/paginate.go +++ /dev/null @@ -1,801 +0,0 @@ -package gorm - -import ( - "crypto/md5" - "fmt" - "log" - "math" - "github.com/goccy/go-reflect" - "regexp" - "strconv" - "strings" - - "github.com/bytedance/sonic" - "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - - "github.com/morkid/gocache" - "github.com/wubin1989/gorm" -) - -var json = sonic.ConfigDefault - -// ResponseContext interface -type ResponseContext interface { - Cache(string) ResponseContext - Fields([]string) ResponseContext - Distinct([]string) ResponseContext - Response(interface{}) Page - BuildWhereClause() (string, []interface{}) - Error() error -} - -// RequestContext interface -type RequestContext interface { - Request(IParameter) ResponseContext -} - -// Pagination gorm paginate struct -type Pagination struct { - Config *Config -} - -// With func -func (p *Pagination) With(stmt *gorm.DB) RequestContext { - return reqContext{ - Statement: stmt, - Pagination: p, - } -} - -// ClearCache clear cache contains prefix -func (p Pagination) ClearCache(keyPrefixes ...string) { - if len(keyPrefixes) > 0 && nil != p.Config && nil != p.Config.CacheAdapter { - adapter := *p.Config.CacheAdapter - for i := range keyPrefixes { - if err := adapter.ClearPrefix(keyPrefixes[i]); nil != err { - log.Println(err) - } - } - } -} - -// ClearAllCache clear all existing cache -func (p Pagination) ClearAllCache() { - if nil != p.Config && nil != p.Config.CacheAdapter { - adapter := *p.Config.CacheAdapter - if err := adapter.ClearAll(); nil != err { - log.Println(err) - } - } -} - -type reqContext struct { - Statement *gorm.DB - Pagination *Pagination -} - -func (r reqContext) Request(parameter IParameter) ResponseContext { - var response ResponseContext = &resContext{ - Statement: r.Statement, - Parameter: parameter, - Pagination: r.Pagination, - } - - return response -} - -type resContext struct { - Pagination *Pagination - Statement *gorm.DB - Parameter IParameter - cachePrefix string - fieldList []string - customSelect string - distinct bool - error error -} - -func (r *resContext) Error() error { - return r.error -} - -func (r *resContext) Cache(prefix string) ResponseContext { - r.cachePrefix = prefix - return r -} - -func (r *resContext) Fields(fields []string) ResponseContext { - r.fieldList = fields - return r -} - -// CustomSelect currently used for distinct on clause -func (r *resContext) Distinct(fields []string) ResponseContext { - r.fieldList = fields - r.distinct = true - return r -} - -func (r *resContext) Response(res interface{}) Page { - p := r.Pagination - query := r.Statement - p.Config = defaultConfig(p.Config) - p.Config.Statement = query.Statement - if p.Config.DefaultSize == 0 { - p.Config.DefaultSize = 10 - } - - if p.Config.FieldWrapper == "" && p.Config.ValueWrapper == "" { - defaultWrapper := "LOWER(%s)" - wrappers := map[string]string{ - "sqlite": defaultWrapper, - "mysql": defaultWrapper, - "postgres": "LOWER((%s)::text)", - } - p.Config.FieldWrapper = defaultWrapper - if wrapper, ok := wrappers[query.Dialector.Name()]; ok { - p.Config.FieldWrapper = wrapper - } - } - - page := Page{} - pr, err := parseRequest(r.Parameter, *p.Config) - if err != nil { - r.error = err - return page - } - causes := createCauses(pr) - cKey := "" - var adapter gocache.AdapterInterface - var hasAdapter bool = false - - if nil != p.Config.CacheAdapter { - cKey = createCacheKey(r.cachePrefix, pr) - adapter = *p.Config.CacheAdapter - hasAdapter = true - if cKey != "" && adapter.IsValid(cKey) { - if cache, err := adapter.Get(cKey); nil == err { - if err := p.Config.JSONUnmarshal([]byte(cache), &page); nil == err { - return page - } - } - } - } - - dbs := query.Statement.DB.Session(&gorm.Session{NewDB: true}) - var selects []string - if len(r.fieldList) > 0 { - if len(pr.Fields) > 0 && p.Config.FieldSelectorEnabled { - for i := range pr.Fields { - for j := range r.fieldList { - if r.fieldList[j] == pr.Fields[i] { - fname := query.Statement.Quote("s." + fieldName(pr.Fields[i])) - if !contains(selects, fname) { - selects = append(selects, fname) - } - break - } - } - } - } else { - for i := range r.fieldList { - fname := query.Statement.Quote("s." + fieldName(r.fieldList[i])) - if !contains(selects, fname) { - selects = append(selects, fname) - } - } - } - } else if len(pr.Fields) > 0 && p.Config.FieldSelectorEnabled { - for i := range pr.Fields { - fname := query.Statement.Quote("s." + fieldName(pr.Fields[i])) - if !contains(selects, fname) { - selects = append(selects, fname) - } - } - } - - result := dbs. - Unscoped(). - Table("(?) AS s", query) - - if len(selects) > 0 { - if r.distinct { - result = result.Distinct(selects) - } else { - result = result.Select(selects) - } - } - - if len(causes.Params) > 0 || len(causes.WhereString) > 0 { - result = result.Where(causes.WhereString, causes.Params...) - } - - dbs = query.Statement.DB.Session(&gorm.Session{NewDB: true}) - result = dbs. - Unscoped(). - Table("(?) AS s1", result) - - if pr.Page >= 0 { - result = result.Count(&page.Total). - Limit(int(causes.Limit)). - Offset(int(causes.Offset)) - } - if result.Error != nil { - r.error = result.Error - return page - } - - if nil != query.Statement.Preloads { - for table, args := range query.Statement.Preloads { - result = result.Preload(table, args...) - } - } - if len(causes.Sorts) > 0 { - for _, sort := range causes.Sorts { - result = result.Order(sort.Column + " " + sort.Direction) - } - } - - rs := result.Find(res) - if result.Error != nil { - r.error = result.Error - return page - } - - page.Items, _ = sliceutils.ConvertAny2Interface(res) - f := float64(page.Total) / float64(causes.Limit) - if math.Mod(f, 1.0) > 0 { - f = f + 1 - } - page.TotalPages = int64(f) - page.Page = int64(pr.Page) - page.Size = int64(pr.Size) - page.MaxPage = 0 - page.Visible = rs.RowsAffected - if page.TotalPages > 0 { - page.MaxPage = page.TotalPages - 1 - } - if page.TotalPages < 1 { - page.TotalPages = 1 - } - if page.Total < 1 { - page.MaxPage = 0 - page.TotalPages = 0 - } - page.First = causes.Offset < 1 - page.Last = page.MaxPage == page.Page - - if hasAdapter && cKey != "" { - if cache, err := p.Config.JSONMarshal(page); nil == err { - if err := adapter.Set(cKey, string(cache)); err != nil { - log.Println(err) - } - } - } - - return page -} - -func (r *resContext) BuildWhereClause() (statement string, args []interface{}) { - p := r.Pagination - query := r.Statement - p.Config = defaultConfig(p.Config) - p.Config.Statement = query.Statement - if p.Config.DefaultSize == 0 { - p.Config.DefaultSize = 10 - } - - if p.Config.FieldWrapper == "" && p.Config.ValueWrapper == "" { - defaultWrapper := "LOWER(%s)" - wrappers := map[string]string{ - "sqlite": defaultWrapper, - "mysql": defaultWrapper, - "postgres": "LOWER((%s)::text)", - } - p.Config.FieldWrapper = defaultWrapper - if wrapper, ok := wrappers[query.Dialector.Name()]; ok { - p.Config.FieldWrapper = wrapper - } - } - - pr, err := parseRequest(r.Parameter, *p.Config) - if err != nil { - r.error = err - return "", nil - } - causes := createCauses(pr) - return causes.WhereString, causes.Params -} - -// New Pagination instance -func New(params ...interface{}) *Pagination { - if len(params) >= 1 { - var config *Config - for _, param := range params { - c, isConfig := param.(*Config) - if isConfig { - config = c - continue - } - } - - return &Pagination{Config: defaultConfig(config)} - } - - return &Pagination{Config: defaultConfig(nil)} -} - -// parseRequest func -func parseRequest(param IParameter, config Config) (pageRequest, error) { - pr := pageRequest{ - Config: *defaultConfig(&config), - } - err := parsingQueryString(param, &pr) - if err != nil { - return pageRequest{}, err - } - return pr, nil -} - -// createFilters func -func createFilters(filterParams interface{}, p *pageRequest) error { - s, ok2 := filterParams.(string) - if reflect.ValueOf(filterParams).Kind() == reflect.Slice { - f, err := sliceutils.ConvertAny2Interface(filterParams) - if err != nil { - return errors.WithStack(err) - } - p.Filters = arrayToFilter(f, p.Config) - p.Filters.Fields = p.Fields - } else if ok2 { - iface := []interface{}{} - if e := p.Config.JSONUnmarshal([]byte(s), &iface); nil == e && len(iface) > 0 { - p.Filters = arrayToFilter(iface, p.Config) - } - p.Filters.Fields = p.Fields - } - return nil -} - -// createCauses func -func createCauses(p pageRequest) requestQuery { - query := requestQuery{} - wheres, params := generateWhereCauses(p.Filters, p.Config) - sorts := []sortOrder{} - - for _, so := range p.Sorts { - so.Column = fieldName(so.Column) - if nil != p.Config.Statement { - so.Column = p.Config.Statement.Quote(so.Column) - } - sorts = append(sorts, so) - } - - query.Limit = p.Size - query.Offset = p.Page * p.Size - query.Wheres = wheres - query.WhereString = strings.Join(wheres, " ") - query.Sorts = sorts - query.Params = params - - return query -} - -func parsingQueryString(param IParameter, p *pageRequest) error { - p.Size = param.GetSize() - - if p.Size == 0 { - if p.Config.DefaultSize > 0 { - p.Size = p.Config.DefaultSize - } else { - p.Size = 10 - } - } - - p.Page = param.GetPage() - - if param.GetSort() != "" { - sorts := strings.Split(param.GetSort(), ",") - for _, col := range sorts { - if col == "" { - continue - } - - so := sortOrder{ - Column: col, - Direction: "ASC", - } - if strings.ToUpper(param.GetOrder()) == "DESC" { - so.Direction = "DESC" - } - - if string(col[0]) == "-" { - so.Column = string(col[1:]) - so.Direction = "DESC" - } - - p.Sorts = append(p.Sorts, so) - } - } - - if param.GetFields() != "" { - re := regexp.MustCompile(`[^A-z0-9_\.,]+`) - if fields := strings.Split(param.GetFields(), ","); len(fields) > 0 { - for i := range fields { - fieldByte := re.ReplaceAll([]byte(fields[i]), []byte("")) - if field := string(fieldByte); field != "" { - p.Fields = append(p.Fields, field) - } - } - } - } - - return createFilters(param.GetFilters(), p) -} - -//gocyclo:ignore -func arrayToFilter(arr []interface{}, config Config) pageFilters { - filters := pageFilters{ - Single: false, - } - - operatorEscape := regexp.MustCompile(`[^A-z=\<\>\-\+\^/\*%&! ]+`) - arrayLen := len(arr) - - if len(arr) > 0 { - subFilters := []pageFilters{} - for k, i := range arr { - iface, ok := i.([]interface{}) - if ok && !filters.Single { - subFilters = append(subFilters, arrayToFilter(iface, config)) - } else if arrayLen == 1 { - operator, ok := i.(string) - if ok { - operator = operatorEscape.ReplaceAllString(operator, "") - filters.Operator = strings.ToUpper(operator) - filters.IsOperator = true - filters.Single = true - } - } else if arrayLen == 2 { - if k == 0 { - if column, ok := i.(string); ok { - filters.Column = column - filters.Operator = "=" - filters.Single = true - } - } else if k == 1 { - filters.Value = i - if nil == i { - filters.Operator = "IS" - } - } - } else if arrayLen == 3 { - if k == 0 { - if column, ok := i.(string); ok { - filters.Column = column - filters.Single = true - } - } else if k == 1 { - if operator, ok := i.(string); ok { - operator = operatorEscape.ReplaceAllString(operator, "") - filters.Operator = strings.ToUpper(operator) - filters.Single = true - } - } else if k == 2 { - switch filters.Operator { - case "LIKE", "ILIKE", "NOT LIKE", "NOT ILIKE": - escapeString := "" - escapePattern := `(%|\\)` - if nil != config.Statement { - driverName := config.Statement.Dialector.Name() - switch driverName { - case "sqlite", "sqlserver", "postgres": - escapeString = `\` - filters.ValueSuffix = "ESCAPE '\\'" - case "mysql": - escapeString = `\` - filters.ValueSuffix = `ESCAPE '\\'` - } - } - value := fmt.Sprintf("%v", i) - re := regexp.MustCompile(escapePattern) - value = string(re.ReplaceAll([]byte(value), []byte(escapeString+`$1`))) - if config.SmartSearch { - re := regexp.MustCompile(`[\s]+`) - byt := re.ReplaceAll([]byte(value), []byte("%")) - value = string(byt) - } - filters.Value = fmt.Sprintf("%s%s%s", "%", value, "%") - default: - filters.Value = i - } - } - } - } - if len(subFilters) > 0 { - separatedSubFilters := []pageFilters{} - hasOperator := false - defaultOperator := config.Operator - if "" == defaultOperator { - defaultOperator = "OR" - } - for k, s := range subFilters { - if s.IsOperator && len(subFilters) == (k+1) { - break - } - if !hasOperator && !s.IsOperator && k > 0 { - separatedSubFilters = append(separatedSubFilters, pageFilters{ - Operator: defaultOperator, - IsOperator: true, - Single: true, - }) - } - hasOperator = s.IsOperator - separatedSubFilters = append(separatedSubFilters, s) - } - filters.Value = separatedSubFilters - filters.Single = false - } - } - - return filters -} - -//gocyclo:ignore -func generateWhereCauses(f pageFilters, config Config) ([]string, []interface{}) { - wheres := []string{} - params := []interface{}{} - - if !f.Single && !f.IsOperator { - ifaces, ok := f.Value.([]pageFilters) - if ok && len(ifaces) > 0 { - wheres = append(wheres, "(") - hasOpen := false - for _, i := range ifaces { - subs, isSub := i.Value.([]pageFilters) - regular, isNotSub := i.Value.(pageFilters) - if isSub && len(subs) > 0 { - wheres = append(wheres, "(") - for _, s := range subs { - subWheres, subParams := generateWhereCauses(s, config) - wheres = append(wheres, subWheres...) - params = append(params, subParams...) - } - wheres = append(wheres, ")") - } else if isNotSub { - subWheres, subParams := generateWhereCauses(regular, config) - wheres = append(wheres, subWheres...) - params = append(params, subParams...) - } else { - if !hasOpen && !i.IsOperator { - wheres = append(wheres, "(") - hasOpen = true - } - subWheres, subParams := generateWhereCauses(i, config) - wheres = append(wheres, subWheres...) - params = append(params, subParams...) - } - } - if hasOpen { - wheres = append(wheres, ")") - } - wheres = append(wheres, ")") - } - } else if f.Single { - if f.IsOperator { - wheres = append(wheres, f.Operator) - } else { - fname := fieldName(f.Column) - if nil != config.Statement { - fname = config.Statement.Quote(fname) - } - switch f.Operator { - case "IS", "IS NOT": - if nil == f.Value { - wheres = append(wheres, fname, f.Operator, "NULL") - } else { - if strValue, isStr := f.Value.(string); isStr && strings.ToLower(strValue) == "null" { - wheres = append(wheres, fname, f.Operator, "NULL") - } else { - wheres = append(wheres, fname, f.Operator, "?") - params = append(params, f.Value) - } - } - case "BETWEEN": - if values, ok := f.Value.([]interface{}); ok && len(values) >= 2 { - wheres = append(wheres, "(", fname, f.Operator, "? AND ?", ")") - params = append(params, valueFixer(values[0]), valueFixer(values[1])) - } - case "IN", "NOT IN": - if values, ok := f.Value.([]interface{}); ok { - wheres = append(wheres, fname, f.Operator, "?") - params = append(params, valueFixer(values)) - } - case "LIKE", "NOT LIKE", "ILIKE", "NOT ILIKE": - if config.FieldWrapper != "" { - fname = fmt.Sprintf(config.FieldWrapper, fname) - } - wheres = append(wheres, fname, f.Operator, "?") - if f.ValueSuffix != "" { - wheres = append(wheres, f.ValueSuffix) - } - value, isStrValue := f.Value.(string) - if isStrValue { - if config.ValueWrapper != "" { - value = fmt.Sprintf(config.ValueWrapper, value) - } else { - value = strings.ToLower(value) - } - params = append(params, value) - } else { - params = append(params, f.Value) - } - default: - wheres = append(wheres, fname, f.Operator, "?") - params = append(params, valueFixer(f.Value)) - } - } - } - - return wheres, params -} - -func valueFixer(n interface{}) interface{} { - var values []interface{} - if rawValues, ok := n.([]interface{}); ok { - for i := range rawValues { - values = append(values, valueFixer(rawValues[i])) - } - - return values - } - if nil != n && reflect.TypeOf(n).Name() == "float64" { - strValue := fmt.Sprintf("%v", n) - if match, e := regexp.Match(`^[0-9]+$`, []byte(strValue)); nil == e && match { - v, err := strconv.ParseInt(strValue, 10, 64) - if nil == err { - return v - } - } - } - - return n -} - -func contains(source []string, value string) bool { - found := false - for i := range source { - if source[i] == value { - found = true - break - } - } - - return found -} - -func FieldAs(tableName, colName string) string { - return fmt.Sprintf("%s_%s", strings.ToLower(tableName), strings.ToLower(colName)) -} - -func GetLowerColNameFromAlias(alias, tableName string) string { - return strings.TrimPrefix(alias, strings.ToLower(tableName)+"_") -} - -func fieldName(field string) string { - if strings.HasPrefix(field, `"`) && strings.HasSuffix(field, `"`) { - return field - } - return `"` + strings.ToLower(field) + `"` -} - -// Config for customize pagination result -type Config struct { - Operator string - FieldWrapper string - ValueWrapper string - DefaultSize int64 - SmartSearch bool - Statement *gorm.Statement `json:"-"` - CustomParamEnabled bool - SortParams []string - PageParams []string - OrderParams []string - SizeParams []string - FilterParams []string - FieldsParams []string - FieldSelectorEnabled bool - CacheAdapter *gocache.AdapterInterface `json:"-"` - JSONMarshal func(v interface{}) ([]byte, error) `json:"-"` - JSONUnmarshal func(data []byte, v interface{}) error `json:"-"` -} - -// pageFilters struct -type pageFilters struct { - Column string - Operator string - Value interface{} - ValuePrefix string - ValueSuffix string - Single bool - IsOperator bool - Fields []string -} - -// Page result wrapper -type Page struct { - Items []interface{} `json:"items"` - Page int64 `json:"page"` - Size int64 `json:"size"` - MaxPage int64 `json:"max_page"` - TotalPages int64 `json:"total_pages"` - Total int64 `json:"total"` - Last bool `json:"last"` - First bool `json:"first"` - Visible int64 `json:"visible"` -} - -type IParameter interface { - GetPage() int64 - GetSize() int64 - GetSort() string - GetOrder() string - GetFields() string - GetFilters() interface{} - IParameterInstance() -} - -// query struct -type requestQuery struct { - WhereString string - Wheres []string - Params []interface{} - Sorts []sortOrder - Limit int64 - Offset int64 -} - -// pageRequest struct -type pageRequest struct { - Size int64 - Page int64 - Sorts []sortOrder - Filters pageFilters - Config Config `json:"-"` - Fields []string -} - -// sortOrder struct -type sortOrder struct { - Column string - Direction string -} - -func createCacheKey(cachePrefix string, pr pageRequest) string { - key := "" - if bte, err := pr.Config.JSONMarshal(pr); nil == err && cachePrefix != "" { - key = fmt.Sprintf("%s%x", cachePrefix, md5.Sum(bte)) - } - - return key -} - -func defaultConfig(c *Config) *Config { - if nil == c { - return &Config{ - JSONMarshal: json.Marshal, - JSONUnmarshal: json.Unmarshal, - } - } - - if nil == c.JSONMarshal { - c.JSONMarshal = json.Marshal - } - - if nil == c.JSONUnmarshal { - c.JSONUnmarshal = json.Unmarshal - } - - return c -} diff --git a/toolkit/pagination/gorm/paginate_test.go b/toolkit/pagination/gorm/paginate_test.go deleted file mode 100644 index 801f887b..00000000 --- a/toolkit/pagination/gorm/paginate_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package gorm - -import ( - "fmt" - "testing" - - "github.com/DATA-DOG/go-sqlmock" - "github.com/wubin1989/gorm" - "github.com/wubin1989/postgres" -) - -type Parameter struct { - Page int64 `json:"page" form:"page"` - Size int64 `json:"size" form:"size"` - Sort string `json:"sort" form:"sort"` - Order string `json:"order" form:"order"` - Fields string `json:"fields" form:"fields"` - Filters string `json:"filters" form:"filters"` -} - -func (receiver Parameter) GetPage() int64 { - return receiver.Page -} - -func (receiver Parameter) GetSize() int64 { - return receiver.Size -} - -func (receiver Parameter) GetSort() string { - return receiver.Sort -} - -func (receiver Parameter) GetOrder() string { - return receiver.Order -} - -func (receiver Parameter) GetFields() string { - return receiver.Fields -} - -func (receiver Parameter) GetFilters() interface{} { - return receiver.Filters -} - -func (receiver Parameter) IParameterInstance() { - -} - -func Test_resContext_BuildWhereClause(t *testing.T) { - pg := New(&Config{ - FieldSelectorEnabled: true, - }) - filters := make([][]interface{}, 0) - filters = append(filters, []interface{}{ - "sys_role_id", - "=", - 123, - }) - filters = append(filters, []interface{}{ - "and", - }) - filters = append(filters, []interface{}{ - "deleted_at", - "is", - "null", - }) - filterContent, _ := json.Marshal(filters) - mockDB, _, _ := sqlmock.New() - dialector := postgres.New(postgres.Config{ - Conn: mockDB, - DriverName: "postgres", - }) - db, _ := gorm.Open(dialector, &gorm.Config{}) - resCxt := pg.With(db).Request(Parameter{ - Page: 0, - Size: 0, - Sort: "", - Order: "", - Fields: "", - Filters: string(filterContent), - }) - statement, args := resCxt.BuildWhereClause() - if resCxt.Error() != nil { - panic(resCxt.Error()) - } - fmt.Println(statement) - fmt.Println(args) -} diff --git a/toolkit/pathutils/pathutils.go b/toolkit/pathutils/pathutils.go deleted file mode 100644 index ab851e75..00000000 --- a/toolkit/pathutils/pathutils.go +++ /dev/null @@ -1,34 +0,0 @@ -package pathutils - -import ( - "os" - "path/filepath" - "runtime" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -// Abs converts relative path to absolute path -func Abs(rel string) string { - _, fileName, _, _ := runtime.Caller(1) - return filepath.Join(filepath.Dir(fileName), rel) -} - -// FixPath fixes path -func FixPath(dir string, fallback string) (string, error) { - var ( - wd string - ret string - ) - if stringutils.IsEmpty(dir) { - wd, _ = os.Getwd() - ret = filepath.Join(wd, fallback) - return ret, nil - } - if !filepath.IsAbs(dir) { - wd, _ = os.Getwd() - ret = filepath.Join(wd, dir) - return ret, nil - } - return dir, nil -} diff --git a/toolkit/pathutils/pathutils_test.go b/toolkit/pathutils/pathutils_test.go deleted file mode 100644 index f3aaf2f3..00000000 --- a/toolkit/pathutils/pathutils_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package pathutils - -import ( - "strings" - "testing" -) - -func TestAbs(t *testing.T) { - type args struct { - rel string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - rel: "testfiles", - }, - want: "", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := Abs(tt.args.rel); len(got) == 0 { - t.Errorf("Abs() got nothing") - } - }) - } -} - -func TestFixPath(t *testing.T) { - type args struct { - dir string - fallback string - } - tests := []struct { - name string - args args - want string - wantErr bool - }{ - { - args: args{ - dir: "testfiles", - fallback: "fallback", - }, - want: "", - wantErr: false, - }, - { - args: args{ - dir: "", - fallback: "fallback", - }, - want: "fallback", - wantErr: false, - }, - { - args: args{ - dir: "/absolute/path", - fallback: "", - }, - want: "/absolute/path", - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := FixPath(tt.args.dir, tt.args.fallback) - if (err != nil) != tt.wantErr { - t.Errorf("FixPath() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !strings.HasSuffix(got, tt.want) { - t.Errorf("FixPath() got = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/toolkit/pipeconn/pipe_listener.go b/toolkit/pipeconn/pipe_listener.go deleted file mode 100644 index a9af0374..00000000 --- a/toolkit/pipeconn/pipe_listener.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2020 StackRox Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package pipeconn - -import ( - "context" - "errors" - "net" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/concurrency" -) - -const ( - // Network is the network reported by a pipe's address. - Network = "pipe" -) - -var ( - // ErrClosed indicates that a call to Accept() failed because the listener was closed - ErrClosed = errors.New("listener was closed") - - // ErrAlreadyClosed indicates that a call to Close() failed because the listener had already been closed. - ErrAlreadyClosed = errors.New("already closed") - - pipeAddr = func() net.Addr { - c1, c2 := net.Pipe() - addr := c1.RemoteAddr() - _ = c1.Close() - _ = c2.Close() - return addr - }() -) - -// DialContextFunc is a function for dialing a pipe listener. -type DialContextFunc func(context.Context) (net.Conn, error) - -type pipeListener struct { - closed concurrency.Signal - serverConnsC chan net.Conn -} - -// NewPipeListener returns a net.Listener that accepts connections which are local pipe connections (i.e., via -// net.Pipe()). It also returns a function that implements a context-aware dial. -func NewPipeListener() (net.Listener, DialContextFunc) { - lis := &pipeListener{ - closed: concurrency.NewSignal(), - serverConnsC: make(chan net.Conn), - } - - return lis, lis.DialContext -} - -func (l *pipeListener) Accept() (net.Conn, error) { - if l.closed.IsDone() { - return nil, ErrClosed - } - select { - case conn := <-l.serverConnsC: - return conn, nil - case <-l.closed.Done(): - return nil, ErrClosed - } -} - -func (l *pipeListener) DialContext(ctx context.Context) (net.Conn, error) { - if l.closed.IsDone() { - return nil, ErrClosed - } - - serverConn, clientConn := net.Pipe() - - select { - case l.serverConnsC <- serverConn: - return clientConn, nil - case <-l.closed.Done(): - return nil, ErrClosed - case <-ctx.Done(): - return nil, ctx.Err() - } -} - -func (l *pipeListener) Addr() net.Addr { - return pipeAddr -} - -func (l *pipeListener) Close() error { - if !l.closed.Signal() { - return ErrAlreadyClosed - } - return nil -} diff --git a/toolkit/pipeconn/pipe_listener_test.go b/toolkit/pipeconn/pipe_listener_test.go deleted file mode 100644 index ad94a952..00000000 --- a/toolkit/pipeconn/pipe_listener_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2020 StackRox Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package pipeconn - -import ( - "context" - "encoding/binary" - "io" - "net" - "sync" - "sync/atomic" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func u32BE(v uint32) []byte { - var enc [4]byte - binary.BigEndian.PutUint32(enc[:], v) - return enc[:] -} - -func TestNetwork(t *testing.T) { - t.Parallel() - - assert.Equal(t, Network, pipeAddr.Network()) -} - -func TestPipeListener_Connections(t *testing.T) { - t.Parallel() - - lis, dialCtx := NewPipeListener() - - var clientSum uint32 - var wg sync.WaitGroup - for i := 0; i < 10; i++ { - wg.Add(1) - go func(idx int) { - defer wg.Done() - - conn, err := dialCtx(context.Background()) - require.NoError(t, err) - - sum := uint32(idx) - _, err = conn.Write(u32BE(sum)) - assert.NoError(t, err) - - var buf [4]byte - _, err = io.ReadFull(conn, buf[:]) - assert.NoError(t, err) - sum += binary.BigEndian.Uint32(buf[:]) - - _, err = conn.Write(u32BE(sum)) - assert.NoError(t, err) - - assert.NoError(t, conn.Close()) - - atomic.AddUint32(&clientSum, sum) - }(i) - } - - var serverSum uint32 - for i := 0; i < 10; i++ { - conn, err := lis.Accept() - require.NoError(t, err) - - wg.Add(1) - go func(idx int, conn net.Conn) { - defer wg.Done() - - sum := uint32(idx) - - var buf [4]byte - _, err := io.ReadFull(conn, buf[:]) - assert.NoError(t, err) - sum += binary.BigEndian.Uint32(buf[:]) - - _, err = conn.Write(u32BE(uint32(idx))) - assert.NoError(t, err) - - _, err = io.ReadFull(conn, buf[:]) - assert.NoError(t, err) - assert.Equal(t, sum, binary.BigEndian.Uint32(buf[:])) - - atomic.AddUint32(&serverSum, sum) - - n, err := io.ReadFull(conn, buf[:]) - assert.Zero(t, n) - assert.Equal(t, io.EOF, err) - }(i, conn) - } - - wg.Wait() - assert.Equal(t, serverSum, clientSum) -} - -func TestPipeListener_Close(t *testing.T) { - t.Parallel() - - lis, dialCtx := NewPipeListener() - - assert.NoError(t, lis.Close()) - - conn, err := lis.Accept() - assert.Nil(t, conn) - assert.Equal(t, ErrClosed, err) - - conn, err = dialCtx(context.Background()) - assert.Nil(t, conn) - assert.Equal(t, ErrClosed, err) - - assert.Equal(t, ErrAlreadyClosed, lis.Close()) -} diff --git a/toolkit/protobuf/v3/message.go b/toolkit/protobuf/v3/message.go deleted file mode 100644 index b0ab7520..00000000 --- a/toolkit/protobuf/v3/message.go +++ /dev/null @@ -1,364 +0,0 @@ -package v3 - -import ( - "encoding/json" - "fmt" - "github.com/goccy/go-reflect" - "github.com/lithammer/shortuuid/v4" - log "github.com/sirupsen/logrus" - "regexp" - "strings" - "unicode" - - "github.com/iancoleman/strcase" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -var re = regexp.MustCompile(`json:"(.*?)"`) - -var _ ProtobufType = (*Enum)(nil) -var _ ProtobufType = (*Message)(nil) - -type ProtobufType interface { - GetName() string - String() string - Inner() bool -} - -var MessageStore = make(map[string]Message) - -var EnumStore = make(map[string]Enum) - -var ImportStore = make(map[string]struct{}) - -var MessageNames []string - -type EnumField struct { - Name string - Number int -} - -func (receiver ProtoGenerator) newEnumField(field string, index int) EnumField { - return EnumField{ - Name: strings.ToUpper(strcase.ToSnake(field)), - Number: index, - } -} - -type Enum struct { - Name string - Fields []EnumField -} - -func (e Enum) Inner() bool { - return false -} - -func (e Enum) String() string { - return e.Name -} - -func (e Enum) GetName() string { - return e.Name -} - -func (receiver ProtoGenerator) NewEnum(enumMeta astutils.EnumMeta) Enum { - var fields []EnumField - for i, field := range enumMeta.Values { - fields = append(fields, receiver.newEnumField(field, i)) - } - return Enum{ - Name: strcase.ToCamel(enumMeta.Name), - Fields: fields, - } -} - -// Message represents protobuf message definition -type Message struct { - Name string - Fields []Field - Comments []string - IsInner bool - IsScalar bool - IsMap bool - IsRepeated bool - IsTopLevel bool - // IsImported denotes the message will be imported from third-party, such as from google/protobuf - IsImported bool -} - -func (m Message) Inner() bool { - return m.IsInner -} - -func (m Message) GetName() string { - return m.Name -} - -func (m Message) String() string { - switch { - case reflect.DeepEqual(m, Any): - return "anypb.Any" - case reflect.DeepEqual(m, Struct): - return "structpb.Struct" - case reflect.DeepEqual(m, Value): - return "structpb.Value" - case reflect.DeepEqual(m, ListValue): - return "structpb.ListValue" - case reflect.DeepEqual(m, Empty): - return "emptypb.Empty" - default: - return m.Name - } -} - -// NewMessage returns message instance from astutils.StructMeta -func (receiver ProtoGenerator) NewMessage(structmeta astutils.StructMeta) Message { - var fields []Field - for i, field := range structmeta.Fields { - fields = append(fields, receiver.newField(field, i+1)) - } - return Message{ - Name: strcase.ToCamel(structmeta.Name), - Fields: fields, - Comments: structmeta.Comments, - IsTopLevel: true, - } -} - -// Field represents protobuf message field definition -type Field struct { - Name string - Type ProtobufType - Number int - Comments []string - JsonName string -} - -func (receiver ProtoGenerator) newField(field astutils.FieldMeta, index int) Field { - t := receiver.MessageOf(field.Type) - if t.Inner() { - message := t.(Message) - message.Name = strcase.ToCamel(field.Name) - t = message - } - var fieldName string - if stringutils.IsNotEmpty(field.Tag) && re.MatchString(field.Tag) { - jsonName := re.FindStringSubmatch(field.Tag)[1] - fieldName = strings.Split(jsonName, ",")[0] - if fieldName == "-" { - fieldName = receiver.fieldNamingFunc(field.Name) - } - } else { - fieldName = receiver.fieldNamingFunc(field.Name) - } - return Field{ - Name: fieldName, - Type: t, - Number: index, - Comments: field.Comments, - JsonName: fieldName, - } -} - -var ( - Double = Message{ - Name: "double", - IsScalar: true, - } - Float = Message{ - Name: "float", - IsScalar: true, - } - Int32 = Message{ - Name: "int32", - IsScalar: true, - } - Int64 = Message{ - Name: "int64", - IsScalar: true, - } - Uint32 = Message{ - Name: "uint32", - IsScalar: true, - } - Uint64 = Message{ - Name: "uint64", - IsScalar: true, - } - Bool = Message{ - Name: "bool", - IsScalar: true, - } - String = Message{ - Name: "string", - IsScalar: true, - } - Bytes = Message{ - Name: "bytes", - IsScalar: true, - } - Any = Message{ - Name: "google.protobuf.Any", - IsTopLevel: true, - IsImported: true, - } - Struct = Message{ - Name: "google.protobuf.Struct", - IsTopLevel: true, - IsImported: true, - } - Value = Message{ - Name: "google.protobuf.Value", - IsTopLevel: true, - IsImported: true, - } - ListValue = Message{ - Name: "google.protobuf.ListValue", - IsTopLevel: true, - IsImported: true, - } - Empty = Message{ - Name: "google.protobuf.Empty", - IsTopLevel: true, - IsImported: true, - } - Time = Message{ - Name: "google.protobuf.Timestamp", - IsScalar: true, - } -) - -func (receiver ProtoGenerator) MessageOf(ft string) ProtobufType { - if astutils.IsVarargs(ft) { - ft = astutils.ToSlice(ft) - } - ft = strings.TrimLeft(ft, "*") - switch ft { - case "int", "int8", "int16", "int32", "byte", "rune", "complex64", "complex128": - return Int32 - case "uint", "uint8", "uint16", "uint32": - return Uint32 - case "int64": - return Int64 - case "uint64", "uintptr": - return Uint64 - case "bool": - return Bool - case "string", "error", "[]rune", "decimal.Decimal": - return String - case "[]byte", "v3.FileModel", "os.File": - return Bytes - case "float32": - return Float - case "float64": - return Double - case "time.Time", "gorm.DeletedAt", "customtypes.Time": - //ImportStore["google/protobuf/timestamp.proto"] = struct{}{} - //return Time - return String - default: - return receiver.handleDefaultCase(ft) - } -} - -var anonystructre *regexp.Regexp - -func init() { - anonystructre = regexp.MustCompile(`anonystructÂŦ(.*)Âŧ`) -} - -func (receiver ProtoGenerator) handleDefaultCase(ft string) ProtobufType { - var title string - if ft == "map[string]interface{}" { - ImportStore["google/protobuf/struct.proto"] = struct{}{} - return Struct - } - if ft == "[]interface{}" { - ImportStore["google/protobuf/struct.proto"] = struct{}{} - return ListValue - } - if strings.HasPrefix(ft, "map[") { - elem := ft[strings.Index(ft, "]")+1:] - key := ft[4:strings.Index(ft, "]")] - keyMessage := receiver.MessageOf(key) - if reflect.DeepEqual(keyMessage, Float) || reflect.DeepEqual(keyMessage, Double) || reflect.DeepEqual(keyMessage, Bytes) { - log.Error("floating point types and bytes cannot be key_type of maps, please refer to https://developers.google.com/protocol-buffers/docs/proto3#maps") - goto ANY - } - elemMessage := receiver.MessageOf(elem) - if strings.HasPrefix(elemMessage.GetName(), "map<") { - log.Error("the value_type cannot be another map, please refer to https://developers.google.com/protocol-buffers/docs/proto3#maps") - goto ANY - } - return Message{ - Name: fmt.Sprintf("map<%s, %s>", keyMessage.GetName(), elemMessage.GetName()), - IsMap: true, - } - } - if strings.HasPrefix(ft, "[") { - elem := ft[strings.Index(ft, "]")+1:] - elemMessage := receiver.MessageOf(elem) - if strings.HasPrefix(elemMessage.GetName(), "map<") { - log.Error("map fields cannot be repeated, please refer to https://developers.google.com/protocol-buffers/docs/proto3#maps") - goto ANY - } - messageName := elemMessage.GetName() - if strings.Contains(elemMessage.GetName(), "repeated ") { - messageName = messageName[strings.LastIndex(messageName, ".")+1:] - messageName = "Nested" + strcase.ToCamel(messageName) - fieldName := receiver.fieldNamingFunc(messageName) - MessageStore[messageName] = Message{ - Name: messageName, - Fields: []Field{ - { - Name: fieldName, - Type: elemMessage, - Number: 1, - JsonName: fieldName, - }, - }, - IsInner: true, - } - } - return Message{ - Name: fmt.Sprintf("repeated %s", messageName), - IsRepeated: true, - } - } - if anonystructre.MatchString(ft) { - result := anonystructre.FindStringSubmatch(ft) - var structmeta astutils.StructMeta - json.Unmarshal([]byte(result[1]), &structmeta) - message := receiver.NewMessage(structmeta) - message.IsInner = true - message.IsTopLevel = false - message.Name = "Anonystruct" + shortuuid.NewWithNamespace(result[1]) - MessageStore[message.Name] = message - return message - } - if !strings.Contains(ft, ".") { - title = ft - } - if stringutils.IsEmpty(title) { - title = ft[strings.LastIndex(ft, ".")+1:] - } - if stringutils.IsNotEmpty(title) { - if unicode.IsUpper(rune(title[0])) { - if sliceutils.StringContains(MessageNames, title) { - return Message{ - Name: strcase.ToCamel(title), - IsTopLevel: true, - } - } - } - if e, ok := EnumStore[title]; ok { - return e - } - } -ANY: - ImportStore["google/protobuf/struct.proto"] = struct{}{} - return Value -} diff --git a/toolkit/protobuf/v3/service.go b/toolkit/protobuf/v3/service.go deleted file mode 100644 index bb52a9f1..00000000 --- a/toolkit/protobuf/v3/service.go +++ /dev/null @@ -1,210 +0,0 @@ -package v3 - -import ( - "fmt" - "github.com/goccy/go-reflect" - "github.com/pkg/errors" - "github.com/samber/lo" - "github.com/unionj-cloud/go-doudou/v2/toolkit/executils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "strings" - "time" - - "github.com/iancoleman/strcase" - "github.com/unionj-cloud/go-doudou/v2/toolkit/astutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" - "github.com/unionj-cloud/go-doudou/v2/version" -) - -type ProtoGenerator struct { - fieldNamingFunc func(string) string - Structs []astutils.StructMeta - annotatedOnly bool - protocCmd string -} - -type ProtoGeneratorOption func(*ProtoGenerator) - -func WithProtocCmd(cmd string) ProtoGeneratorOption { - return func(p *ProtoGenerator) { - p.protocCmd = cmd - } -} - -func WithFieldNamingFunc(fn func(string) string) ProtoGeneratorOption { - return func(p *ProtoGenerator) { - p.fieldNamingFunc = fn - } -} - -func WithAnnotatedOnly(annotatedOnly bool) ProtoGeneratorOption { - return func(p *ProtoGenerator) { - p.annotatedOnly = annotatedOnly - } -} - -func NewProtoGenerator(options ...ProtoGeneratorOption) ProtoGenerator { - var p ProtoGenerator - p.Structs = make([]astutils.StructMeta, 0) - for _, opt := range options { - opt(&p) - } - return p -} - -const Syntax = "proto3" - -type Service struct { - Name string - Package string - GoPackage string - Syntax string - // go-doudou version - Version string - ProtoVer string - Rpcs []Rpc - Messages []Message - Enums []Enum - Comments []string - Imports []string -} - -func (receiver ProtoGenerator) NewService(name, goPackage string) Service { - return Service{ - Name: strcase.ToCamel(name) + "Service", - Package: strcase.ToSnake(name), - GoPackage: goPackage, - Syntax: Syntax, - Version: version.Release, - ProtoVer: fmt.Sprintf("v%s", time.Now().Local().Format(constants.FORMAT10)), - } -} - -type StreamType int - -const ( - biStream = iota + 1 - clientStream - serverStream -) - -type Rpc struct { - Name string - Request Message - Response Message - Comments []string - StreamType StreamType -} - -func (receiver ProtoGenerator) NewRpc(method astutils.MethodMeta) *Rpc { - if receiver.annotatedOnly { - if lo.CountBy(method.Comments, func(item string) bool { - return strings.Contains(item, "@grpc") - }) == 0 { - return nil - } - } - rpcName := strcase.ToCamel(method.Name) + "Rpc" - rpcRequest := receiver.newRequest(rpcName, method.Params) - if reflect.DeepEqual(rpcRequest, Empty) { - ImportStore["google/protobuf/empty.proto"] = struct{}{} - } - if !strings.HasPrefix(rpcRequest.Name, "stream ") && !rpcRequest.IsImported { - if _, ok := MessageStore[rpcRequest.Name]; !ok { - MessageStore[rpcRequest.Name] = rpcRequest - } - } - rpcResponse := receiver.newResponse(rpcName, method.Results) - if reflect.DeepEqual(rpcResponse, Empty) { - ImportStore["google/protobuf/empty.proto"] = struct{}{} - } - if !strings.HasPrefix(rpcResponse.Name, "stream ") && !rpcResponse.IsImported { - if _, ok := MessageStore[rpcResponse.Name]; !ok { - MessageStore[rpcResponse.Name] = rpcResponse - } - } - var st StreamType - if strings.HasPrefix(rpcRequest.Name, "stream ") && strings.HasPrefix(rpcResponse.Name, "stream ") { - st = biStream - } else if strings.HasPrefix(rpcRequest.Name, "stream ") { - st = clientStream - } else if strings.HasPrefix(rpcResponse.Name, "stream ") { - st = serverStream - } - return &Rpc{ - Name: rpcName, - Request: rpcRequest, - Response: rpcResponse, - Comments: method.Comments, - StreamType: st, - } -} - -func (receiver ProtoGenerator) newRequest(rpcName string, params []astutils.FieldMeta) Message { - if len(params) == 0 { - return Empty - } - if len(params) == 1 && params[0].Type == "context.Context" { - return Empty - } - if params[0].Type == "context.Context" { - params = params[1:] - } - if len(params) == 1 { - if m, ok := receiver.MessageOf(params[0].Type).(Message); ok && m.IsTopLevel { - if strings.HasPrefix(params[0].Name, "stream") { - m.Name = "stream " + m.Name - } - return m - } - } - var fields []Field - for i, field := range params { - fields = append(fields, receiver.newField(field, i+1)) - } - return Message{ - Name: strcase.ToCamel(rpcName + "Request"), - Fields: fields, - IsTopLevel: true, - } -} - -func (receiver ProtoGenerator) newResponse(rpcName string, params []astutils.FieldMeta) Message { - if len(params) == 0 { - return Empty - } - if len(params) == 1 && params[0].Type == "error" { - return Empty - } - if params[len(params)-1].Type == "error" { - params = params[:len(params)-1] - } - if len(params) == 1 { - if m, ok := receiver.MessageOf(params[0].Type).(Message); ok && m.IsTopLevel { - if strings.HasPrefix(params[0].Name, "stream") { - m.Name = "stream " + m.Name - } - return m - } - } - var fields []Field - for i, field := range params { - fields = append(fields, receiver.newField(field, i+1)) - } - return Message{ - Name: strcase.ToCamel(rpcName + "Response"), - Fields: fields, - IsTopLevel: true, - } -} - -// Generate depends on protoc-gen-go-json plugin, so run go install github.com/mfridman/protoc-gen-go-json@v1.4.0 first. -func (receiver ProtoGenerator) Generate(protoFile string, runner executils.Runner) error { - if stringutils.IsEmpty(receiver.protocCmd) { - return errors.New("Command cannot be empty") - } - // default: protoc --proto_path=. --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative --go-json_out=. --go-json_opt=paths=source_relative transport/grpc/usersvc.proto - args := strings.Split(receiver.protocCmd, " ") - args = append(args, protoFile) - return runner.Run(args[0], args[1:]...) -} diff --git a/toolkit/random/rand.go b/toolkit/random/rand.go deleted file mode 100644 index 12fc7113..00000000 --- a/toolkit/random/rand.go +++ /dev/null @@ -1,12 +0,0 @@ -package random - -import ( - "math/rand" - "time" -) - -// RandInt generates random int between min and max -func RandInt(min int, max int) int { - r := rand.New(rand.NewSource(time.Now().UnixNano())) - return r.Intn(max-min) + min -} diff --git a/toolkit/reflectutils/reflectutils.go b/toolkit/reflectutils/reflectutils.go deleted file mode 100644 index 1c439d4f..00000000 --- a/toolkit/reflectutils/reflectutils.go +++ /dev/null @@ -1,16 +0,0 @@ -package reflectutils - -import "github.com/goccy/go-reflect" - -// ValueOf returns underlying value of interface data -func ValueOf(data interface{}) reflect.Value { - return ValueOfValue(reflect.ValueOf(data)) -} - -// ValueOfValue returns underlying value of reflect.Value data -func ValueOfValue(data reflect.Value) reflect.Value { - if data.Kind() == reflect.Ptr { - return data.Elem() - } - return data -} diff --git a/toolkit/sliceutils/sliceutils.go b/toolkit/sliceutils/sliceutils.go deleted file mode 100644 index 53ccdacd..00000000 --- a/toolkit/sliceutils/sliceutils.go +++ /dev/null @@ -1,139 +0,0 @@ -package sliceutils - -import ( - "github.com/goccy/go-reflect" - - "github.com/pkg/errors" -) - -// StringSlice2InterfaceSlice converts string slice to interface slice -func StringSlice2InterfaceSlice(strSlice []string) []interface{} { - ret := make([]interface{}, len(strSlice)) - for i, v := range strSlice { - ret[i] = v - } - return ret -} - -// InterfaceSlice2StringSlice converts interface slice to string slice -func InterfaceSlice2StringSlice(strSlice []interface{}) []string { - ret := make([]string, len(strSlice)) - for i, v := range strSlice { - ret[i] = v.(string) - } - return ret -} - -// Contains asserts src contains test -func Contains(src []interface{}, test interface{}) bool { - for _, item := range src { - if item == test { - return true - } - } - return false -} - -// ContainsDeep asserts src contains test using reflect.DeepEqual -func ContainsDeep(src []interface{}, test interface{}) bool { - for _, item := range src { - if reflect.DeepEqual(item, test) { - return true - } - } - return false -} - -// StringContains asserts src contains test -func StringContains(src []string, test string) bool { - for _, item := range src { - if item == test { - return true - } - } - return false -} - -// StringFilter filters string slice by callback function fn -// If fn returns true, the item will be appended to result -func StringFilter(src []string, fn func(item string) bool) []string { - var ret []string - for _, item := range src { - if fn(item) { - ret = append(ret, item) - } - } - return ret -} - -// IndexOf returns index of element in string slice data -func IndexOf(element string, data []string) int { - for k, v := range data { - if element == v { - return k - } - } - return -1 //not found. -} - -// IndexOfAny returns index of element in slice data -func IndexOfAny(target interface{}, anySlice interface{}) (int, error) { - if reflect.TypeOf(anySlice).Kind() != reflect.Slice { - return -1, errors.New("not slice") - } - data := reflect.ValueOf(anySlice) - for i := 0; i < data.Len(); i++ { - elem := data.Index(i) - if elem.Interface() == target { - return i, nil - } - } - return -1, nil //not found. -} - -// IsEmpty assert src is an empty slice -func IsEmpty(src interface{}) bool { - if slice, ok := TakeSliceArg(src); ok { - return slice == nil || len(slice) == 0 - } - panic("not slice") -} - -// TakeSliceArg https://ahmet.im/blog/golang-take-slices-of-any-type-as-input-parameter/ -func TakeSliceArg(arg interface{}) (out []interface{}, ok bool) { - slice, success := takeArg(arg, reflect.Slice) - if !success { - ok = false - return - } - c := slice.Len() - out = make([]interface{}, c) - for i := 0; i < c; i++ { - out[i] = slice.Index(i).Interface() - } - return out, true -} - -func takeArg(arg interface{}, kind reflect.Kind) (val reflect.Value, ok bool) { - val = reflect.ValueOf(arg) - if val.Kind() == kind { - ok = true - } - return -} - -// ConvertAny2Interface converts interface src to interface slice -func ConvertAny2Interface(src interface{}) ([]interface{}, error) { - data := reflect.ValueOf(src) - if data.Type().Kind() == reflect.Ptr { - data = data.Elem() - } - if data.Type().Kind() != reflect.Slice { - return nil, errors.New("Src not slice") - } - ret := make([]interface{}, data.Len()) - for i := 0; i < data.Len(); i++ { - ret[i] = data.Index(i).Interface() - } - return ret, nil -} diff --git a/toolkit/sliceutils/sliceutils_test.go b/toolkit/sliceutils/sliceutils_test.go deleted file mode 100644 index 74ecde77..00000000 --- a/toolkit/sliceutils/sliceutils_test.go +++ /dev/null @@ -1,471 +0,0 @@ -package sliceutils - -import ( - "github.com/goccy/go-reflect" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" -) - -func TestContains(t *testing.T) { - type args struct { - src []interface{} - test interface{} - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "1", - args: args{ - src: []interface{}{"a", "2", "c"}, - test: "2", - }, - want: true, - }, - { - name: "1", - args: args{ - src: []interface{}{"a", "2", "c"}, - test: "3", - }, - want: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := Contains(tt.args.src, tt.args.test); got != tt.want { - t.Errorf("Contains() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestInterfaceSlice2StringSlice(t *testing.T) { - type args struct { - strSlice []interface{} - } - tests := []struct { - name string - args args - want []string - }{ - { - name: "2", - args: args{ - strSlice: []interface{}{"a", "n"}, - }, - want: []string{"a", "n"}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := InterfaceSlice2StringSlice(tt.args.strSlice); !reflect.DeepEqual(got, tt.want) { - t.Errorf("InterfaceSlice2StringSlice() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIndexOfAny(t *testing.T) { - type args struct { - target interface{} - anySlice interface{} - } - tests := []struct { - name string - args args - want int - wantErr bool - }{ - { - name: "", - args: args{ - target: "a", - anySlice: []string{ - "b", "m", "a", "K", - }, - }, - want: 2, - wantErr: false, - }, - { - name: "", - args: args{ - target: "a", - anySlice: "abc", - }, - want: -1, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := IndexOfAny(tt.args.target, tt.args.anySlice) - if (err != nil) != tt.wantErr { - t.Errorf("IndexOfAny() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("IndexOfAny() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIndexOfAnyInt(t *testing.T) { - type args struct { - target interface{} - anySlice interface{} - } - tests := []struct { - name string - args args - want int - wantErr bool - }{ - { - name: "4", - args: args{ - target: 3, - anySlice: []int{ - 2, 5, 1, 6, 3, 8, 9, - }, - }, - want: 4, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := IndexOfAny(tt.args.target, tt.args.anySlice) - if (err != nil) != tt.wantErr { - t.Errorf("IndexOfAny() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("IndexOfAny() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIndexOfAnyNotContain(t *testing.T) { - type args struct { - target interface{} - anySlice interface{} - } - tests := []struct { - name string - args args - want int - wantErr bool - }{ - { - name: "4", - args: args{ - target: 3, - anySlice: []int{ - 2, 5, 1, 6, 11, 8, 9, - }, - }, - want: -1, - wantErr: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := IndexOfAny(tt.args.target, tt.args.anySlice) - if (err != nil) != tt.wantErr { - t.Errorf("IndexOfAny() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("IndexOfAny() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestConvertAny2Interface(t *testing.T) { - type args struct { - src interface{} - } - tests := []struct { - name string - args args - want []interface{} - wantErr bool - }{ - { - name: "", - args: args{ - src: []int{1, 2, 3}, - }, - want: []interface{}{1, 2, 3}, - wantErr: false, - }, - { - name: "", - args: args{ - src: "abc", - }, - want: nil, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ConvertAny2Interface(tt.args.src) - if (err != nil) != tt.wantErr { - t.Errorf("ConvertAny2Interface() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ConvertAny2Interface() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestStringSlice2InterfaceSlice(t *testing.T) { - type args struct { - strSlice []string - } - tests := []struct { - name string - args args - want []interface{} - }{ - { - name: "", - args: args{ - strSlice: []string{"a", "b", "c"}, - }, - want: []interface{}{"a", "b", "c"}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := StringSlice2InterfaceSlice(tt.args.strSlice); !reflect.DeepEqual(got, tt.want) { - t.Errorf("StringSlice2InterfaceSlice() = %v, want %v", got, tt.want) - } - }) - } -} - -type containsDeepStruct struct { - Name string - Age int -} - -func TestContainsDeep(t *testing.T) { - type args struct { - src []interface{} - test interface{} - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "1", - args: args{ - src: []interface{}{ - containsDeepStruct{ - Name: "Jack", - Age: 10, - }, - containsDeepStruct{ - Name: "Rose", - Age: 18, - }, - containsDeepStruct{ - Name: "David", - Age: 14, - }, - }, - test: containsDeepStruct{ - Name: "David", - Age: 14, - }, - }, - want: true, - }, - { - name: "2", - args: args{ - src: []interface{}{ - containsDeepStruct{ - Name: "Jack", - Age: 10, - }, - containsDeepStruct{ - Name: "Rose", - Age: 18, - }, - containsDeepStruct{ - Name: "David", - Age: 14, - }, - }, - test: containsDeepStruct{ - Name: "Lily", - Age: 14, - }, - }, - want: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ContainsDeep(tt.args.src, tt.args.test); got != tt.want { - t.Errorf("ContainsDeep() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestStringContains(t *testing.T) { - type args struct { - src []string - test string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "1", - args: args{ - src: []string{"a", "b", "c"}, - test: "b", - }, - want: true, - }, - { - name: "2", - args: args{ - src: []string{"a", "b", "c"}, - test: "d", - }, - want: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := StringContains(tt.args.src, tt.args.test); got != tt.want { - t.Errorf("StringContains() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIndexOf(t *testing.T) { - type args struct { - element string - data []string - } - tests := []struct { - name string - args args - want int - }{ - { - name: "", - args: args{ - element: "c", - data: []string{"a", "b", "c"}, - }, - want: 2, - }, - { - name: "", - args: args{ - element: "d", - data: []string{"a", "b", "c"}, - }, - want: -1, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := IndexOf(tt.args.element, tt.args.data); got != tt.want { - t.Errorf("IndexOf() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIsEmpty(t *testing.T) { - type args struct { - src interface{} - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "", - args: args{ - src: []interface{}{}, - }, - want: true, - }, - { - name: "", - args: args{ - src: []interface{}{1}, - }, - want: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := IsEmpty(tt.args.src); got != tt.want { - t.Errorf("IsEmpty() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIsEmptyP(t *testing.T) { - assert.Panics(t, func() { - IsEmpty(1) - }) -} - -func TestStringFilter(t *testing.T) { - type args struct { - src []string - fn func(item string) bool - } - tests := []struct { - name string - args args - want []string - }{ - { - name: "", - args: args{ - src: []string{"a", "2", "c"}, - fn: func(item string) bool { - _, err := cast.ToIntE(item) - return err == nil - }, - }, - want: []string{"2"}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - assert.Equalf(t, tt.want, StringFilter(tt.args.src, tt.args.fn), "StringFilter(%v, %v)", tt.args.src, tt.args.fn) - }) - } -} diff --git a/toolkit/sqlext/.env b/toolkit/sqlext/.env deleted file mode 100644 index 44d2b9d1..00000000 --- a/toolkit/sqlext/.env +++ /dev/null @@ -1,6 +0,0 @@ -DB_HOST=localhost -DB_PORT=3306 -DB_USER=root -DB_PASSWD=1234 -DB_SCHEMA=test -DB_CHARSET=utf8mb4 \ No newline at end of file diff --git a/toolkit/sqlext/arithsymbol/arithsymbol.go b/toolkit/sqlext/arithsymbol/arithsymbol.go deleted file mode 100644 index f1ff5265..00000000 --- a/toolkit/sqlext/arithsymbol/arithsymbol.go +++ /dev/null @@ -1,27 +0,0 @@ -package arithsymbol - -// ArithSymbol is alias type of string for arithmetic operators -type ArithSymbol string - -const ( - // Eq equal - Eq ArithSymbol = "=" - // Ne not equal - Ne ArithSymbol = "!=" - // Gt greater than - Gt ArithSymbol = ">" - // Lt less than - Lt ArithSymbol = "<" - // Gte greater than and equal - Gte ArithSymbol = ">=" - // Lte less than and equal - Lte ArithSymbol = "<=" - // Is e.g. is null - Is ArithSymbol = "is" - // Not e.g. is not null - Not ArithSymbol = "is not" - // In contained by a slice - In ArithSymbol = "in" - NotIn ArithSymbol = "not in" - Like ArithSymbol = "like" -) diff --git a/toolkit/sqlext/logger/logger.go b/toolkit/sqlext/logger/logger.go deleted file mode 100644 index 2b3703e9..00000000 --- a/toolkit/sqlext/logger/logger.go +++ /dev/null @@ -1,92 +0,0 @@ -package logger - -import ( - "context" - "fmt" - "os" - "strings" - - "github.com/ascarter/requestid" - "github.com/opentracing/opentracing-go" - "github.com/pkg/errors" - "github.com/rs/zerolog" - "github.com/uber/jaeger-client-go" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cast" - "github.com/unionj-cloud/go-doudou/v2/toolkit/reflectutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" - "github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger" -) - -type SqlLogger struct { - Logger zerolog.Logger -} - -func (receiver SqlLogger) Enable() bool { - return cast.ToBoolOrDefault(os.Getenv("GDD_SQL_LOG_ENABLE"), false) -} - -func (receiver SqlLogger) Log(ctx context.Context, query string, args ...interface{}) { - if !receiver.Enable() { - return - } - receiver.LogWithErr(ctx, nil, nil, query, args...) -} - -type SqlLoggerOption func(logger *SqlLogger) - -func WithLogger(logger zerolog.Logger) SqlLoggerOption { - return func(sqlLogger *SqlLogger) { - sqlLogger.Logger = logger - } -} - -func NewSqlLogger(opts ...SqlLoggerOption) SqlLogger { - sqlLogger := SqlLogger{ - Logger: zlogger.Logger, - } - for _, item := range opts { - item(&sqlLogger) - } - return sqlLogger -} - -func PopulatedSql(query string, args ...interface{}) string { - var sb strings.Builder - sb.WriteString(strings.Join(strings.Fields(query), " ")) - for _, arg := range args { - value := reflectutils.ValueOf(arg) - if value.IsValid() { - sb.WriteString(fmt.Sprint(value.Interface())) - } else { - sb.WriteString(fmt.Sprint(arg)) - } - } - return strings.ReplaceAll(sb.String(), "''", "null") -} - -func (receiver SqlLogger) LogWithErr(ctx context.Context, err error, hit *bool, query string, args ...interface{}) { - if !receiver.Enable() { - return - } - var sb strings.Builder - if reqId, ok := requestid.FromContext(ctx); ok && stringutils.IsNotEmpty(reqId) { - sb.WriteString(fmt.Sprintf("RequestID: %s\t", reqId)) - } - span := opentracing.SpanFromContext(ctx) - if span != nil { - if jspan, ok := span.(*jaeger.Span); ok { - sb.WriteString(fmt.Sprintf("TraceID: %s\t", jspan.SpanContext().TraceID().String())) - } else { - sb.WriteString(fmt.Sprintf("TraceID: %s\t", span)) - } - } - sb.WriteString(fmt.Sprintf("SQL: %s", PopulatedSql(query, args...))) - if hit != nil { - sb.WriteString(fmt.Sprintf("\tHIT: %t", *hit)) - } - if err != nil { - sb.WriteString(fmt.Sprintf("\tERR: %s", errors.Wrap(err, caller.NewCaller().String()))) - } - receiver.Logger.Info().Msgf(sb.String()) -} diff --git a/toolkit/sqlext/logger/logger_test.go b/toolkit/sqlext/logger/logger_test.go deleted file mode 100644 index c2885b70..00000000 --- a/toolkit/sqlext/logger/logger_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package logger_test - -import ( - "context" - "os" - "testing" - - "github.com/ascarter/requestid" - "github.com/google/uuid" - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/mocktracer" - "github.com/unionj-cloud/go-doudou/v2/framework/tracing" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/logger" -) - -func TestMain(m *testing.M) { - os.Setenv("GDD_SERVICE_NAME", "TestSqlLogger") - os.Setenv("GDD_SQL_LOG_ENABLE", "true") - - tracer, closer := tracing.Init() - defer closer.Close() - opentracing.SetGlobalTracer(tracer) - - m.Run() -} - -func TestSqlLogger_Log(t *testing.T) { - type fields struct { - ctx func() context.Context - } - type args struct { - query string - args []interface{} - } - tests := []struct { - name string - fields fields - args args - }{ - { - name: "", - fields: fields{ - ctx: func() context.Context { - return requestid.NewContext(context.Background(), uuid.NewString()) - }, - }, - args: args{ - query: "select * from ddl_user where (`school` = 'Shanxi Univ.' and `delete_at` is null) order by `create_at` desc limit ?,?", - args: []interface{}{0, 2}, - }, - }, - { - name: "", - fields: fields{ - ctx: func() context.Context { - _, ctx := opentracing.StartSpanFromContext(requestid.NewContext(context.Background(), uuid.NewString()), "TestSqlLogger") - return ctx - }, - }, - args: args{ - query: "select * from ddl_user where (`school` = 'Shanxi Univ.' and `delete_at` is null) order by `create_at` desc limit ?", - args: []interface{}{20}, - }, - }, - { - name: "", - fields: fields{ - ctx: func() context.Context { - return opentracing.ContextWithSpan(context.Background(), mocktracer.New().StartSpan("TestSqlLogger")) - }, - }, - args: args{ - query: "select * from ddl_user where (`school` = ? and `delete_at` is null) order by `create_at` desc", - args: []interface{}{"Shanxi Univ."}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - receiver := logger.NewSqlLogger() - receiver.Log(tt.fields.ctx(), tt.args.query, tt.args.args...) - }) - } -} diff --git a/toolkit/sqlext/logicsymbol/logicsymbol.go b/toolkit/sqlext/logicsymbol/logicsymbol.go deleted file mode 100644 index 3216aa37..00000000 --- a/toolkit/sqlext/logicsymbol/logicsymbol.go +++ /dev/null @@ -1,15 +0,0 @@ -package logicsymbol - -// LogicSymbol define logic operators -type LogicSymbol string - -const ( - // And logic - And LogicSymbol = "and" - // Or logic - Or LogicSymbol = "or" - // Append logic - Append LogicSymbol = " " - // End is similar with Append except that End does not add parentheses - End LogicSymbol = "" -) diff --git a/toolkit/sqlext/query/query.go b/toolkit/sqlext/query/query.go deleted file mode 100644 index 08b6a7e4..00000000 --- a/toolkit/sqlext/query/query.go +++ /dev/null @@ -1,429 +0,0 @@ -package query - -import ( - "fmt" - "github.com/goccy/go-reflect" - "strings" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/arithsymbol" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/logicsymbol" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/sortenum" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -// Base sql expression -type Base interface { - Sql() (string, []interface{}) - //NamedSql() (string, []interface{}) -} - -// Q used for building sql expression -type Q interface { - Base - And(q Base) Where - Or(q Base) Where - Append(q Base) Where - End(q Base) Where -} - -// Criteria wrap a group of column, value and operator such as name = 20 -type Criteria struct { - // table alias - talias string - col string - val interface{} - asym arithsymbol.ArithSymbol -} - -// Sql implement Base interface, return sql expression -func (c Criteria) Sql() (string, []interface{}) { - if c.asym == arithsymbol.In || c.asym == arithsymbol.NotIn { - var args []interface{} - var sb strings.Builder - sb.WriteString(fmt.Sprintf("`%s` %s (", c.col, c.asym)) - - var vals []string - switch reflect.TypeOf(c.val).Kind() { - case reflect.Slice: - data := reflect.ValueOf(c.val) - for i := 0; i < data.Len(); i++ { - vals = append(vals, "?") - args = append(args, data.Index(i).Interface()) - } - default: - vals = append(vals, "?") - args = append(args, c.val) - } - - sb.WriteString(strings.Join(vals, ",")) - sb.WriteString(")") - - return sb.String(), args - } - if stringutils.IsNotEmpty(c.talias) { - if c.asym == arithsymbol.Is || c.asym == arithsymbol.Not { - return fmt.Sprintf("%s.`%s` %s null", c.talias, c.col, c.asym), nil - } - return fmt.Sprintf("%s.`%s` %s ?", c.talias, c.col, c.asym), []interface{}{c.val} - } - if c.asym == arithsymbol.Is || c.asym == arithsymbol.Not { - return fmt.Sprintf("`%s` %s null", c.col, c.asym), nil - } - return fmt.Sprintf("`%s` %s ?", c.col, c.asym), []interface{}{c.val} -} - -// C new a Criteria -func C() Criteria { - return Criteria{} -} - -func (c Criteria) ToWhere() Where { - w := Where{ - children: make([]Base, 0), - } - w.children = append(w.children, c, String("")) - w.lsym = logicsymbol.End - return w -} - -// Col set column name -func (c Criteria) Col(col string) Criteria { - if strings.Contains(col, ".") { - i := strings.Index(col, ".") - c.talias = col[:i] - c.col = col[i+1:] - } else { - c.col = col - } - return c -} - -// Eq set = operator and column value -func (c Criteria) Eq(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.Eq - return c -} - -// Ne set != operator and column value -func (c Criteria) Ne(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.Ne - return c -} - -// Gt set > operator and column value -func (c Criteria) Gt(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.Gt - return c -} - -// Lt set < operator and column value -func (c Criteria) Lt(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.Lt - return c -} - -// Gte set >= operator and column value -func (c Criteria) Gte(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.Gte - return c -} - -// Lte set <= operator and column value -func (c Criteria) Lte(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.Lte - return c -} - -// IsNull set is null -func (c Criteria) IsNull() Criteria { - c.asym = arithsymbol.Is - return c -} - -// IsNotNull set is not null -func (c Criteria) IsNotNull() Criteria { - c.asym = arithsymbol.Not - return c -} - -// In set in operator and column value, val should be a slice type value -func (c Criteria) In(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.In - return c -} - -// NotIn set not in operator and column value, val should be a slice type value -func (c Criteria) NotIn(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.NotIn - return c -} - -// Like set like operator and column value, val should be a slice type value -func (c Criteria) Like(val interface{}) Criteria { - c.val = val - c.asym = arithsymbol.Like - return c -} - -// And concat another sql expression builder with And -func (c Criteria) And(cri Base) Where { - w := Where{ - children: make([]Base, 0), - } - w.children = append(w.children, c, cri) - w.lsym = logicsymbol.And - return w -} - -// Or concat another sql expression builder with Or -func (c Criteria) Or(cri Base) Where { - w := Where{ - children: make([]Base, 0), - } - w.children = append(w.children, c, cri) - w.lsym = logicsymbol.Or - return w -} - -// Append concat another sql expression builder with Append -func (c Criteria) Append(cri Base) Where { - w := Where{ - children: make([]Base, 0), - } - w.children = append(w.children, c, cri) - w.lsym = logicsymbol.Append - return w -} - -// End does nothing for Criteria same as Append empty -func (c Criteria) End(q Base) Where { - w := Where{ - children: make([]Base, 0), - } - w.children = append(w.children, c, q) - w.lsym = logicsymbol.End - return w -} - -// Where concat children clauses with one of logic operators And, Or, Append -type Where struct { - lsym logicsymbol.LogicSymbol - children []Base -} - -func (w Where) IsEmpty() bool { - return len(w.children) == 0 -} - -// Sql implement Base interface, return string sql expression -func (w Where) Sql() (string, []interface{}) { - if len(w.children) == 0 { - return "", nil - } - var args []interface{} - w0, args0 := w.children[0].Sql() - args = append(args, args0...) - w1, args1 := w.children[1].Sql() - args = append(args, args1...) - switch w.lsym { - case logicsymbol.And, logicsymbol.Or: - if stringutils.IsNotEmpty(w0) && stringutils.IsNotEmpty(w1) { - return fmt.Sprintf("(%s %s %s)", w0, w.lsym, w1), args - } else { - if stringutils.IsNotEmpty(w0) { - return w0, args - } else if stringutils.IsNotEmpty(w1) { - return w1, args - } else { - return "", nil - } - } - case logicsymbol.Append: - if stringutils.IsNotEmpty(w0) && stringutils.IsNotEmpty(w1) { - return fmt.Sprintf("(%s%s%s)", w0, w.lsym, w1), args - } else { - if stringutils.IsNotEmpty(w0) { - return w0, args - } else if stringutils.IsNotEmpty(w1) { - return w1, args - } else { - return "", nil - } - } - case logicsymbol.End: - fallthrough - default: - if stringutils.IsEmpty(w1) { - return w0, args - } - return fmt.Sprintf("%s %s", w0, w1), args - } -} - -// And concat another sql expression builder with And -func (w Where) And(whe Base) Where { - parentW := Where{ - children: make([]Base, 0), - } - parentW.children = append(parentW.children, w, whe) - parentW.lsym = logicsymbol.And - return parentW -} - -// Or concat another sql expression builder with Or -func (w Where) Or(whe Base) Where { - parentW := Where{ - children: make([]Base, 0), - } - parentW.children = append(parentW.children, w, whe) - parentW.lsym = logicsymbol.Or - return parentW -} - -// Append concat another sql expression builder with Append -func (w Where) Append(whe Base) Where { - parentW := Where{ - children: make([]Base, 0), - } - parentW.children = append(parentW.children, w, whe) - if _, ok := whe.(Page); ok { - parentW.lsym = logicsymbol.End - } else { - parentW.lsym = logicsymbol.Append - } - return parentW -} - -func (w Where) End(q Base) Where { - parentW := Where{ - children: make([]Base, 0), - } - parentW.children = append(parentW.children, w, q) - parentW.lsym = logicsymbol.End - return parentW -} - -// Order by Col Sort -type Order struct { - Col string - Sort sortenum.Sort -} - -// Page a sql expression builder for order by clause -type Page struct { - Orders []Order - Offset int - Size int -} - -// P new a Page -func P() Page { - return Page{ - Orders: make([]Order, 0), - } -} - -func NewPage(pageNo, pageSize int, orders ...Order) Page { - if pageNo <= 0 { - pageNo = 1 - } - offset := 0 - if pageSize > 0 { - offset = (pageNo - 1) * pageSize - } - return Page{ - Offset: offset, - Size: pageSize, - Orders: orders, - } -} - -// Order append an Order -func (p Page) Order(o Order) Page { - p.Orders = append(p.Orders, o) - return p -} - -// Limit set Offset and Size -func (p Page) Limit(offset, size int) Page { - p.Offset = offset - p.Size = size - return p -} - -// Sql implement Base interface, order by age desc limit 2,1 -func (p Page) Sql() (string, []interface{}) { - var sb strings.Builder - var args []interface{} - if len(p.Orders) > 0 { - sb.WriteString("order by ") - - for i, order := range p.Orders { - if i > 0 { - sb.WriteString(",") - } - var ( - alias string - col string - ) - if strings.Contains(order.Col, ".") { - idx := strings.Index(order.Col, ".") - alias = order.Col[:idx] - col = order.Col[idx+1:] - } else { - col = order.Col - } - if stringutils.IsNotEmpty(alias) { - sb.WriteString(fmt.Sprintf("%s.`%s` %s", alias, col, order.Sort)) - } else { - sb.WriteString(fmt.Sprintf("`%s` %s", col, order.Sort)) - } - } - } - - sb.WriteString(" ") - - if p.Size > 0 { - sb.WriteString("limit ?,?") - args = append(args, p.Offset, p.Size) - } - - return strings.TrimSpace(sb.String()), args -} - -// PageRet wrap page query result -type PageRet struct { - Items interface{} - PageNo int - PageSize int - Total int - HasNext bool -} - -// NewPageRet new a PageRet -func NewPageRet(page Page) PageRet { - pageNo := 1 - if page.Size > 0 { - pageNo = page.Offset/page.Size + 1 - } - return PageRet{ - PageNo: pageNo, - PageSize: page.Size, - } -} - -// String is an alias of string -type String string - -// Sql implements Base -func (s String) Sql() (string, []interface{}) { - return string(s), nil -} diff --git a/toolkit/sqlext/query/query_test.go b/toolkit/sqlext/query/query_test.go deleted file mode 100644 index 972339e5..00000000 --- a/toolkit/sqlext/query/query_test.go +++ /dev/null @@ -1,150 +0,0 @@ -package query - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/sortenum" -) - -func ExampleCriteria() { - - query := C().Col("name").Eq("wubin").Or(C().Col("school").Eq("havard")).And(C().Col("age").Eq(18)) - fmt.Println(query.Sql()) - - query = C().Col("name").Eq("wubin").Or(C().Col("school").Eq("havard")).And(C().Col("delete_at").IsNotNull()) - fmt.Println(query.Sql()) - - query = C().Col("name").Eq("wubin").Or(C().Col("school").In("havard")).And(C().Col("delete_at").IsNotNull()) - fmt.Println(query.Sql()) - - query = C().Col("name").Eq("wubin").Or(C().Col("school").In([]string{"havard", "beijing unv"})).And(C().Col("delete_at").IsNotNull()) - fmt.Println(query.Sql()) - - query = C().Col("name").Eq("wubin").Or(C().Col("age").In([]int{5, 10})).And(C().Col("delete_at").IsNotNull()) - fmt.Println(query.Sql()) - - query = C().Col("name").Ne("wubin").Or(C().Col("create_at").Lt("now()")) - fmt.Println(query.Sql()) - - page := Page{ - Orders: []Order{ - { - Col: "create_at", - Sort: sortenum.Desc, - }, - }, - Offset: 20, - Size: 10, - } - page = page.Order(Order{ - Col: "score", - Sort: sortenum.Asc, - }) - page = page.Limit(30, 5) - fmt.Println(page.Sql()) - pageRet := NewPageRet(page) - fmt.Println(pageRet.PageNo) - - fmt.Println(P().Order(Order{ - Col: "score", - Sort: sortenum.Asc, - }).Limit(20, 10).Sql()) - - // Output: - //((`name` = ? or `school` = ?) and `age` = ?) [wubin havard 18] - //((`name` = ? or `school` = ?) and `delete_at` is not null) [wubin havard] - //((`name` = ? or `school` in (?)) and `delete_at` is not null) [wubin havard] - //((`name` = ? or `school` in (?,?)) and `delete_at` is not null) [wubin havard beijing unv] - //((`name` = ? or `age` in (?,?)) and `delete_at` is not null) [wubin 5 10] - //(`name` != ? or `create_at` < ?) [wubin now()] - //order by `create_at` desc,`score` asc limit ?,? [30 5] - //7 - //order by `score` asc limit ?,? [20 10] -} - -func TestCriteriaAppend(t *testing.T) { - sqlStatement := C().Col("name").Eq("wubin").Or(C().Col("school").Eq("havard")). - And(C().Col("age").Eq(18)). - Or(C().Col("score").Gte(90).And(C().Col("height").Gt(160).And(C().Col("height").Lte(170). - Append(String("and favourite = 'Go'"))))) - str, _ := sqlStatement.Sql() - require.Equal(t, "(((`name` = ? or `school` = ?) and `age` = ?) or (`score` >= ? and (`height` > ? and (`height` <= ? and favourite = 'Go'))))", str) -} - -func TestWhereAppend(t *testing.T) { - sqlStatement := C().Col("name").Eq("wubin").Or(C().Col("school").Eq("havard")). - And(C().Col("age").Eq(18)). - Or(C().Col("score").Gte(90). - And(C().Col("height").Gt(160).And(C().Col("height").Lte(170))). - Append(String("and favourite = 'Go'"))) - str, _ := sqlStatement.Sql() - require.Equal(t, "(((`name` = ? or `school` = ?) and `age` = ?) or ((`score` >= ? and (`height` > ? and `height` <= ?)) and favourite = 'Go'))", str) -} - -func ExampleEnd() { - page := P().Order(Order{ - Col: "create_at", - Sort: sortenum.Desc, - }).Limit(0, 1) - var where Q - where = C().Col("project_id").Eq(1) - where = where.And(C().Col("delete_at").IsNull()) - where = where.End(page) - fmt.Println(where.Sql()) - - where = C().Col("project_id").Eq(1) - where = where.And(C().Col("delete_at").IsNull()) - where = where.End(String("for update")) - fmt.Println(where.Sql()) - - where = C().Col("cc.project_id").Eq(1) - where = where.And(C().Col("cc.delete_at").IsNull()) - where = where.End(String("for update")) - fmt.Println(where.Sql()) - - where = C().Col("cc.survey_id").Eq("abc"). - And(C().Col("cc.year").Eq(2021)). - And(C().Col("cc.month").Eq(10)). - And(C().Col("cc.stat_type").Eq(2)).End(String("for update")) - fmt.Println(where.Sql()) - - where = C().Col("cc.name").Like("%ba%") - fmt.Println(where.Sql()) - - page = P().Order(Order{ - Col: "user.create_at", - Sort: sortenum.Desc, - }).Limit(0, 1) - where = C().Col("project_id").Eq(1) - where = where.And(C().Col("delete_at").IsNull()) - where = where.End(page) - fmt.Println(where.Sql()) - - where = C().Col("delete_at").IsNull().And(C().Col("op_code").NotIn([]int{1, 2, 3})) - fmt.Println(where.Sql()) - - // Output: - //(`project_id` = ? and `delete_at` is null) order by `create_at` desc limit ?,? [1 0 1] - //(`project_id` = ? and `delete_at` is null) for update [1] - //(cc.`project_id` = ? and cc.`delete_at` is null) for update [1] - //(((cc.`survey_id` = ? and cc.`year` = ?) and cc.`month` = ?) and cc.`stat_type` = ?) for update [abc 2021 10 2] - //cc.`name` like ? [%ba%] - //(`project_id` = ? and `delete_at` is null) order by user.`create_at` desc limit ?,? [1 0 1] - //(`delete_at` is null and `op_code` not in (?,?,?)) [1 2 3] -} - -func TestWhereAppend2(t *testing.T) { - var where Q - where = C().Col("left_number").Gt(0).Or(C().Col("left_number").Lt(0)) - where = where.And(C().Col("name").Ne("感č°Ē参äļŽ")) - where = where.And(C().Col("delete_at").IsNull()) - page := P().Order(Order{ - Col: "order", - Sort: sortenum.Desc, - }).Limit(0, 10) - where = where.Append(page) - str, _ := where.Sql() - require.Equal(t, "(((`left_number` > ? or `left_number` < ?) and `name` != ?) and `delete_at` is null) order by `order` desc limit ?,?", str) -} diff --git a/toolkit/sqlext/sortenum/sortenum.go b/toolkit/sqlext/sortenum/sortenum.go deleted file mode 100644 index c5dbcf6e..00000000 --- a/toolkit/sqlext/sortenum/sortenum.go +++ /dev/null @@ -1,11 +0,0 @@ -package sortenum - -// Sort string alias for asc and desc -type Sort string - -const ( - // Asc constant value for asc - Asc Sort = "asc" - // Desc constant value for desc - Desc Sort = "desc" -) diff --git a/toolkit/sqlext/testdata/domain/base.go b/toolkit/sqlext/testdata/domain/base.go deleted file mode 100644 index 2bdceb0e..00000000 --- a/toolkit/sqlext/testdata/domain/base.go +++ /dev/null @@ -1,9 +0,0 @@ -package domain - -import "time" - -type Base struct { - CreateAt *time.Time `dd:"default:CURRENT_TIMESTAMP"` - UpdateAt *time.Time `dd:"default:CURRENT_TIMESTAMP;extra:ON UPDATE CURRENT_TIMESTAMP"` - DeleteAt *time.Time -} diff --git a/toolkit/sqlext/testdata/domain/order.go b/toolkit/sqlext/testdata/domain/order.go deleted file mode 100644 index 1bd0250b..00000000 --- a/toolkit/sqlext/testdata/domain/order.go +++ /dev/null @@ -1,10 +0,0 @@ -package domain - -//dd:table -type Order struct { - ID int `dd:"pk;auto"` - Amount int64 - UserId int `dd:"type:int;fk:ddl_user,id,fk_ddl_user,ON DELETE CASCADE ON UPDATE NO ACTION"` - - Base -} diff --git a/toolkit/sqlext/testdata/domain/user.go b/toolkit/sqlext/testdata/domain/user.go deleted file mode 100644 index 30ea4595..00000000 --- a/toolkit/sqlext/testdata/domain/user.go +++ /dev/null @@ -1,25 +0,0 @@ -package domain - -import "time" - -//dd:table -type User struct { - ID int `dd:"pk;auto"` - Name string `dd:"index:name_phone_idx,2;default:'jack'"` - Phone string `dd:"index:name_phone_idx,1;default:'13552053960';extra:comment '手朚号'"` - Age int `dd:"index;unsigned"` - No int `dd:"type:int;unique"` - UniqueCol int `dd:"type:int;unique:unique_col_idx,1"` - UniqueCol2 int `dd:"type:int;unique:unique_col_idx,2"` - School string `dd:"null;default:'harvard';extra:comment 'å­Ķæ Ą'"` - IsStudent bool - Rule string `dd:"type:varchar(255);unique;extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™ïžŒåŒđ配įš„é“ūæŽĨ采į”ĻčŊĨcssč§„åˆ™æĨįˆŽ'"` - RuleType string `dd:"type:varchar(45);extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™įąŧ型æ”Ŋ持prefix前įž€åŒđ配和regexæ­Ģ则åŒđ配'"` - - ArriveAt *time.Time `dd:"type:datetime;extra:comment '到čī§æ—ķé—ī'"` - Status int8 `dd:"type:tinyint(4);extra:comment '0čŋ›čĄŒäļ­ -1åŪŒįŧ“ -2取æķˆ'"` - - Base -} diff --git a/toolkit/sqlext/testdata/domain2/base.go b/toolkit/sqlext/testdata/domain2/base.go deleted file mode 100644 index 2bdceb0e..00000000 --- a/toolkit/sqlext/testdata/domain2/base.go +++ /dev/null @@ -1,9 +0,0 @@ -package domain - -import "time" - -type Base struct { - CreateAt *time.Time `dd:"default:CURRENT_TIMESTAMP"` - UpdateAt *time.Time `dd:"default:CURRENT_TIMESTAMP;extra:ON UPDATE CURRENT_TIMESTAMP"` - DeleteAt *time.Time -} diff --git a/toolkit/sqlext/testdata/domain2/book.go b/toolkit/sqlext/testdata/domain2/book.go deleted file mode 100644 index 5912ca42..00000000 --- a/toolkit/sqlext/testdata/domain2/book.go +++ /dev/null @@ -1,10 +0,0 @@ -package domain - -//dd:table -type Book struct { - ID int `dd:"pk;auto"` - UserId int `dd:"type:int;fk:ddl_publisher,id,fk_user,ON DELETE CASCADE ON UPDATE NO ACTION"` - PublisherId int - - Base -} diff --git a/toolkit/sqlext/testdata/domain2/publisher.go b/toolkit/sqlext/testdata/domain2/publisher.go deleted file mode 100644 index 8ff3faf2..00000000 --- a/toolkit/sqlext/testdata/domain2/publisher.go +++ /dev/null @@ -1,9 +0,0 @@ -package domain - -//dd:table -type Publisher struct { - ID int `dd:"pk;auto"` - Name string - - Base -} diff --git a/toolkit/sqlext/testdata/domain2/user.go b/toolkit/sqlext/testdata/domain2/user.go deleted file mode 100644 index 30ea4595..00000000 --- a/toolkit/sqlext/testdata/domain2/user.go +++ /dev/null @@ -1,25 +0,0 @@ -package domain - -import "time" - -//dd:table -type User struct { - ID int `dd:"pk;auto"` - Name string `dd:"index:name_phone_idx,2;default:'jack'"` - Phone string `dd:"index:name_phone_idx,1;default:'13552053960';extra:comment '手朚号'"` - Age int `dd:"index;unsigned"` - No int `dd:"type:int;unique"` - UniqueCol int `dd:"type:int;unique:unique_col_idx,1"` - UniqueCol2 int `dd:"type:int;unique:unique_col_idx,2"` - School string `dd:"null;default:'harvard';extra:comment 'å­Ķæ Ą'"` - IsStudent bool - Rule string `dd:"type:varchar(255);unique;extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™ïžŒåŒđ配įš„é“ūæŽĨ采į”ĻčŊĨcssč§„åˆ™æĨįˆŽ'"` - RuleType string `dd:"type:varchar(45);extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™įąŧ型æ”Ŋ持prefix前įž€åŒđ配和regexæ­Ģ则åŒđ配'"` - - ArriveAt *time.Time `dd:"type:datetime;extra:comment '到čī§æ—ķé—ī'"` - Status int8 `dd:"type:tinyint(4);extra:comment '0čŋ›čĄŒäļ­ -1åŪŒįŧ“ -2取æķˆ'"` - - Base -} diff --git a/toolkit/sqlext/testdata/domain3/base.go b/toolkit/sqlext/testdata/domain3/base.go deleted file mode 100644 index 2bdceb0e..00000000 --- a/toolkit/sqlext/testdata/domain3/base.go +++ /dev/null @@ -1,9 +0,0 @@ -package domain - -import "time" - -type Base struct { - CreateAt *time.Time `dd:"default:CURRENT_TIMESTAMP"` - UpdateAt *time.Time `dd:"default:CURRENT_TIMESTAMP;extra:ON UPDATE CURRENT_TIMESTAMP"` - DeleteAt *time.Time -} diff --git a/toolkit/sqlext/testdata/domain3/book.go b/toolkit/sqlext/testdata/domain3/book.go deleted file mode 100644 index ba4d29b4..00000000 --- a/toolkit/sqlext/testdata/domain3/book.go +++ /dev/null @@ -1,10 +0,0 @@ -package domain - -//dd:table -type Book struct { - ID int `dd:"pk;auto"` - UserId int `dd:"type:int"` - PublisherId int `dd:"fk:ddl_publisher,id,fk_publisher,ON DELETE CASCADE ON UPDATE NO ACTION"` - - Base -} diff --git a/toolkit/sqlext/testdata/domain3/publisher.go b/toolkit/sqlext/testdata/domain3/publisher.go deleted file mode 100644 index 8ff3faf2..00000000 --- a/toolkit/sqlext/testdata/domain3/publisher.go +++ /dev/null @@ -1,9 +0,0 @@ -package domain - -//dd:table -type Publisher struct { - ID int `dd:"pk;auto"` - Name string - - Base -} diff --git a/toolkit/sqlext/testdata/domain3/user.go b/toolkit/sqlext/testdata/domain3/user.go deleted file mode 100644 index 4539776e..00000000 --- a/toolkit/sqlext/testdata/domain3/user.go +++ /dev/null @@ -1,25 +0,0 @@ -package domain - -import "time" - -//dd:table -type User struct { - ID int `dd:"pk;auto"` - Name string `dd:"index:name_phone_idx,2;default:'jack'"` - Phone string `dd:"index:name_phone_idx,1;default:'13552053960';extra:comment '手朚号'"` - Age int `dd:"unsigned"` - No int `dd:"type:int;unique"` - UniqueCol int `dd:"type:int;unique:unique_col_idx,1"` - UniqueCol2 int `dd:"type:int;unique:unique_col_idx,2"` - School string `dd:"null;default:'harvard';extra:comment 'å­Ķæ Ą'"` - IsStudent bool - Rule string `dd:"type:varchar(255);unique;extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™ïžŒåŒđ配įš„é“ūæŽĨ采į”ĻčŊĨcssč§„åˆ™æĨįˆŽ'"` - RuleType string `dd:"type:varchar(45);extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™įąŧ型æ”Ŋ持prefix前įž€åŒđ配和regexæ­Ģ则åŒđ配'"` - - ArriveAt *time.Time `dd:"type:datetime;extra:comment '到čī§æ—ķé—ī'"` - Status int8 `dd:"type:tinyint(4);extra:comment '0čŋ›čĄŒäļ­ -1åŪŒįŧ“ -2取æķˆ'"` - - Base -} diff --git a/toolkit/sqlext/testdata/domain4/base.go b/toolkit/sqlext/testdata/domain4/base.go deleted file mode 100644 index 2bdceb0e..00000000 --- a/toolkit/sqlext/testdata/domain4/base.go +++ /dev/null @@ -1,9 +0,0 @@ -package domain - -import "time" - -type Base struct { - CreateAt *time.Time `dd:"default:CURRENT_TIMESTAMP"` - UpdateAt *time.Time `dd:"default:CURRENT_TIMESTAMP;extra:ON UPDATE CURRENT_TIMESTAMP"` - DeleteAt *time.Time -} diff --git a/toolkit/sqlext/testdata/domain4/book.go b/toolkit/sqlext/testdata/domain4/book.go deleted file mode 100644 index 01aaf6b7..00000000 --- a/toolkit/sqlext/testdata/domain4/book.go +++ /dev/null @@ -1,10 +0,0 @@ -package domain - -//dd:table -type Book struct { - ID int `dd:"pk;auto"` - UserId int `dd:"type:int;fk:ddl_user,id,fk_user,ON DELETE CASCADE ON UPDATE NO ACTION"` - PublisherId int - - Base -} diff --git a/toolkit/sqlext/testdata/domain4/publisher.go b/toolkit/sqlext/testdata/domain4/publisher.go deleted file mode 100644 index 8ff3faf2..00000000 --- a/toolkit/sqlext/testdata/domain4/publisher.go +++ /dev/null @@ -1,9 +0,0 @@ -package domain - -//dd:table -type Publisher struct { - ID int `dd:"pk;auto"` - Name string - - Base -} diff --git a/toolkit/sqlext/testdata/domain4/user.go b/toolkit/sqlext/testdata/domain4/user.go deleted file mode 100644 index 21d5c755..00000000 --- a/toolkit/sqlext/testdata/domain4/user.go +++ /dev/null @@ -1,25 +0,0 @@ -package domain - -import "time" - -//dd:table -type User struct { - ID int `dd:"pk;auto"` - Name string `dd:"index:name_phone_idx,2;default:'jack'"` - Phone string `dd:"default:'13552053960';extra:comment '手朚号'"` - Age int `dd:"unsigned"` - No int `dd:"type:int;unique"` - UniqueCol int `dd:"type:int;unique:unique_col_idx,1"` - UniqueCol2 int `dd:"type:int;unique:unique_col_idx,2"` - School string `dd:"null;index:name_phone_idx,1;default:'harvard';extra:comment 'å­Ķæ Ą'"` - IsStudent bool - Rule string `dd:"type:varchar(255);unique;extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™ïžŒåŒđ配įš„é“ūæŽĨ采į”ĻčŊĨcssč§„åˆ™æĨįˆŽ'"` - RuleType string `dd:"type:varchar(45);extra:comment 'é“ūæŽĨåŒđé…č§„åˆ™įąŧ型æ”Ŋ持prefix前įž€åŒđ配和regexæ­Ģ则åŒđ配'"` - - ArriveAt *time.Time `dd:"type:datetime;extra:comment '到čī§æ—ķé—ī'"` - Status int8 `dd:"type:tinyint(4);extra:comment '0čŋ›čĄŒäļ­ -1åŪŒįŧ“ -2取æķˆ'"` - - Base -} diff --git a/toolkit/sqlext/testdata/go.mod b/toolkit/sqlext/testdata/go.mod deleted file mode 100644 index 7b243b9e..00000000 --- a/toolkit/sqlext/testdata/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module testdata - -go 1.15 diff --git a/toolkit/sqlext/wrapper/wrapper.go b/toolkit/sqlext/wrapper/wrapper.go deleted file mode 100644 index a1f7205c..00000000 --- a/toolkit/sqlext/wrapper/wrapper.go +++ /dev/null @@ -1,250 +0,0 @@ -package wrapper - -import ( - "context" - "database/sql" - "time" - - "github.com/jmoiron/sqlx" - "github.com/lithammer/shortuuid/v4" - "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/cache" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" - "github.com/unionj-cloud/go-doudou/v2/toolkit/sqlext/logger" -) - -// DB wraps sqlx.Tx and sqlx.DB https://github.com/jmoiron/sqlx/issues/344#issuecomment-318372779 -type DB interface { - Querier - BeginTxx(ctx context.Context, opts *sql.TxOptions) (GddTx, error) - Close() error -} - -// Tx transaction -type Tx interface { - Querier - Commit() error - Rollback() error -} - -// Querier common operations for sqlx.Tx and sqlx.DB -type Querier interface { - NamedExecContext(ctx context.Context, query string, arg interface{}) (sql.Result, error) - ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) - GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error - Rebind(query string) string - BindNamed(query string, arg interface{}) (string, []interface{}, error) - SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error - //RefreshCache() -} - -// GddDB wraps sqlx.DB -type GddDB struct { - *sqlx.DB - logger logger.SqlLogger - cacheStore *cache.Cache - redisKeyTTL time.Duration -} - -type GddDBOption func(*GddDB) - -func WithLogger(logger logger.SqlLogger) GddDBOption { - return func(g *GddDB) { - g.logger = logger - } -} - -func WithCache(store *cache.Cache) GddDBOption { - return func(g *GddDB) { - g.cacheStore = store - } -} - -func WithRedisKeyTTL(ttl time.Duration) GddDBOption { - return func(g *GddDB) { - g.redisKeyTTL = ttl - } -} - -func NewGddDB(db *sqlx.DB, options ...GddDBOption) GddDB { - g := &GddDB{ - DB: db, - logger: logger.NewSqlLogger(), - redisKeyTTL: time.Hour, - } - for _, opt := range options { - opt(g) - } - return *g -} - -func (g GddDB) NamedExecContext(ctx context.Context, query string, arg interface{}) (ret sql.Result, err error) { - var ( - q string - args []interface{} - ) - defer func() { - g.logger.LogWithErr(ctx, err, nil, q, args...) - }() - q, args, err = g.DB.BindNamed(query, arg) - err = errors.Wrap(err, caller.NewCaller().String()) - if err != nil { - return nil, err - } - ret, err = g.DB.NamedExecContext(ctx, query, arg) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} - -func (g GddDB) ExecContext(ctx context.Context, query string, args ...interface{}) (ret sql.Result, err error) { - defer func() { - g.logger.LogWithErr(ctx, err, nil, query, args...) - }() - ret, err = g.DB.ExecContext(ctx, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} - -func (g GddDB) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) { - hit := true - defer func() { - g.logger.LogWithErr(ctx, err, &hit, query, args...) - }() - if g.cacheStore != nil { - err = g.cacheStore.Once(&cache.Item{ - Key: shortuuid.NewWithNamespace(logger.PopulatedSql(query, args...)), - Value: dest, - TTL: g.redisKeyTTL, - Do: func(*cache.Item) (interface{}, error) { - hit = false - err = g.DB.GetContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return dest, err - }, - }) - return - } - hit = false - err = g.DB.GetContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} - -func (g GddDB) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) { - hit := true - defer func() { - g.logger.LogWithErr(ctx, err, &hit, query, args...) - }() - if g.cacheStore != nil { - err = g.cacheStore.Once(&cache.Item{ - Key: shortuuid.NewWithNamespace(logger.PopulatedSql(query, args...)), - Value: dest, - TTL: g.redisKeyTTL, - Do: func(*cache.Item) (interface{}, error) { - hit = false - err = g.DB.SelectContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return dest, err - }, - }) - return - } - hit = false - err = g.DB.SelectContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} - -// BeginTxx begins a transaction -func (g GddDB) BeginTxx(ctx context.Context, opts *sql.TxOptions) (GddTx, error) { - tx, err := g.DB.BeginTxx(ctx, opts) - if err != nil { - return GddTx{}, err - } - return GddTx{tx, g.logger, g.cacheStore, g.redisKeyTTL}, nil -} - -// GddTx wraps sqlx.Tx -type GddTx struct { - *sqlx.Tx - logger logger.SqlLogger - cacheStore *cache.Cache - redisKeyTTL time.Duration -} - -func (g GddTx) NamedExecContext(ctx context.Context, query string, arg interface{}) (ret sql.Result, err error) { - var ( - q string - args []interface{} - ) - defer func() { - g.logger.LogWithErr(ctx, err, nil, q, args...) - }() - q, args, err = g.Tx.BindNamed(query, arg) - err = errors.Wrap(err, caller.NewCaller().String()) - if err != nil { - return nil, err - } - ret, err = g.Tx.NamedExecContext(ctx, query, arg) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} - -func (g GddTx) ExecContext(ctx context.Context, query string, args ...interface{}) (ret sql.Result, err error) { - defer func() { - g.logger.LogWithErr(ctx, err, nil, query, args...) - }() - ret, err = g.Tx.ExecContext(ctx, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} - -func (g GddTx) GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) { - hit := true - defer func() { - g.logger.LogWithErr(ctx, err, &hit, query, args...) - }() - if g.cacheStore != nil { - err = g.cacheStore.Once(&cache.Item{ - Key: shortuuid.NewWithNamespace(logger.PopulatedSql(query, args...)), - Value: dest, - TTL: g.redisKeyTTL, - Do: func(*cache.Item) (interface{}, error) { - hit = false - err = g.Tx.GetContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return dest, err - }, - }) - return - } - hit = false - err = g.Tx.GetContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} - -func (g GddTx) SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) { - hit := true - defer func() { - g.logger.LogWithErr(ctx, err, &hit, query, args...) - }() - if g.cacheStore != nil { - err = g.cacheStore.Once(&cache.Item{ - Key: shortuuid.NewWithNamespace(logger.PopulatedSql(query, args...)), - Value: dest, - TTL: g.redisKeyTTL, - Do: func(*cache.Item) (interface{}, error) { - hit = false - err = g.Tx.SelectContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return dest, err - }, - }) - return - } - hit = false - err = g.Tx.SelectContext(ctx, dest, query, args...) - err = errors.Wrap(err, caller.NewCaller().String()) - return -} diff --git a/toolkit/stringutils/LICENSE b/toolkit/stringutils/LICENSE deleted file mode 100644 index ad734c93..00000000 --- a/toolkit/stringutils/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Ben Boyter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/toolkit/stringutils/README.md b/toolkit/stringutils/README.md deleted file mode 100644 index 4ea562a8..00000000 --- a/toolkit/stringutils/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# Go-string - -[![Go Report Card](https://goreportcard.com/badge/github.com/boyter/go-string)](https://goreportcard.com/report/github.com/boyter/go-string) -[![Str Count Badge](https://sloc.xyz/github/boyter/go-string/)](https://github.com/boyter/go-string/) - -Useful string utility functions for Go projects. Either because they are faster than the common Go version or do not exist in the standard library. - -You can find all details here https://pkg.go.dev/github.com/boyter/go-string - -Probably the most useful methods are IndexAll and IndexAllIgnoreCase which for string literal searches should be drop in replacements for regexp.FindAllIndex while totally avoiding the regular expression engine and as such being much faster. - -Some quick benchmarks using a simple program which opens a 550MB file and searches over it in memory. -Each search is done three times, the first using regexp.FindAllIndex and the second using IndexAllIgnoreCase. - -For this specific example the wall clock time to run is at least 10x less, but with the same matching results. - -``` -$ ./csperf Åŋecret 550MB -File length 576683100 - -FindAllIndex (regex ignore case) -Scan took 25.403231773s 16680 -Scan took 25.39742299s 16680 -Scan took 25.227218738s 16680 - -IndexAllIgnoreCase (custom) -Scan took 2.04013314s 16680 -Scan took 2.019360935s 16680 -Scan took 1.996732171s 16680 -``` - -The above example in code for you to copy - -``` -// Simple test comparison between various search methods -func main() { - arg1 := os.Args[1] - arg2 := os.Args[2] - - b, err := os.ReadFile(arg2) - if err != nil { - fmt.Print(err) - return - } - - fmt.Println("File length", len(b)) - - haystack := string(b) - - var start time.Time - var elapsed time.Duration - - fmt.Println("\nFindAllIndex (regex)") - r := regexp.MustCompile(regexp.QuoteMeta(arg1)) - for i := 0; i < 3; i++ { - start = time.Now() - all := r.FindAllIndex(b, -1) - elapsed = time.Since(start) - fmt.Println("Scan took", elapsed, len(all)) - } - - fmt.Println("\nIndexAll (custom)") - for i := 0; i < 3; i++ { - start = time.Now() - all := str.IndexAll(haystack, arg1, -1) - elapsed = time.Since(start) - fmt.Println("Scan took", elapsed, len(all)) - } - - r = regexp.MustCompile(`(?i)` + regexp.QuoteMeta(arg1)) - fmt.Println("\nFindAllIndex (regex ignore case)") - for i := 0; i < 3; i++ { - start = time.Now() - all := r.FindAllIndex(b, -1) - elapsed = time.Since(start) - fmt.Println("Scan took", elapsed, len(all)) - } - - fmt.Println("\nIndexAllIgnoreCase (custom)") - for i := 0; i < 3; i++ { - start = time.Now() - all := str.IndexAllIgnoreCase(haystack, arg1, -1) - elapsed = time.Since(start) - fmt.Println("Scan took", elapsed, len(all)) - } -} - -``` - -Note that it performs best with real documents and wost when searching over random data. Depending on what you are searching you may have a similar speed up or a marginal one. - -FindAllIndex has a similar speed up, - -``` -// BenchmarkFindAllIndex-8 2458844 480.0 ns/op -// BenchmarkIndexAll-8 14819680 79.6 ns/op -``` - -See the benchmarks for full proof where they test various edge cases. - -The other most useful method is HighlightString. HighlightString takes in some content and locations and then inserts in/out -strings which can be used for highlighting around matching terms. For example you could pass in `"test"` and have it return `"test"`. -The argument locations accepts output from regexp.FindAllIndex or the included `IndexAllIgnoreCase` or `IndexAll`. - -All code is dual-licenced as either MIT or Unlicence. Your choice when you use it. - -Note that as an Australian I cannot put this into the public domain, hence the choice most liberal licences I can find. diff --git a/toolkit/stringutils/UNLICENSE b/toolkit/stringutils/UNLICENSE deleted file mode 100644 index 00d2e135..00000000 --- a/toolkit/stringutils/UNLICENSE +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to \ No newline at end of file diff --git a/toolkit/stringutils/common.go b/toolkit/stringutils/common.go deleted file mode 100644 index f5742017..00000000 --- a/toolkit/stringutils/common.go +++ /dev/null @@ -1,137 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "strings" - "unicode" -) - -// RemoveStringDuplicates is a simple helper method that removes duplicates from -// any given str slice and then returns a nice duplicate free str slice -func RemoveStringDuplicates(elements []string) []string { - var encountered = map[string]bool{} - var result []string - - for v := range elements { - if !encountered[elements[v]] { - encountered[elements[v]] = true - result = append(result, elements[v]) - } - } - - return result -} - -// Contains checks the supplied slice of string for the existence -// of a string and returns true if found, and false otherwise -func Contains(elements []string, needle string) bool { - for _, v := range elements { - if needle == v { - return true - } - } - - return false -} - -// PermuteCase given a str returns a slice containing all possible case permutations -// of that str such that input of foo will return -// foo Foo fOo FOo foO FoO fOO FOO -// Note that very long inputs can produce an enormous amount of -// results in the returned slice OR result in an overflow and return nothing -func PermuteCase(input string) []string { - l := len(input) - max := 1 << l - - var combinations []string - - for i := 0; i < max; i++ { - s := "" - for idx, ch := range input { - if (i & (1 << idx)) == 0 { - s += strings.ToUpper(string(ch)) - } else { - s += strings.ToLower(string(ch)) - } - } - - combinations = append(combinations, s) - } - - return RemoveStringDuplicates(combinations) -} - -// PermuteCaseFolding given a str returns a slice containing all possible case permutations -// with characters being folded such that S will return S s Åŋ -func PermuteCaseFolding(input string) []string { - combinations := PermuteCase(input) - var combos []string - - for _, combo := range combinations { - for index, runeValue := range combo { - for _, p := range AllSimpleFold(runeValue) { - combos = append(combos, combo[:index]+string(p)+combo[index+len(string(runeValue)):]) - } - } - } - - return RemoveStringDuplicates(combos) -} - -// AllSimpleFold given an input rune return a rune slice containing -// all of the possible simple fold -func AllSimpleFold(input rune) []rune { - var res []rune - - // This works for getting all folded representations - // but feels totally wrong due to the bailout break. - // That said its simpler than a while with checks - // Investigate https://github.com/golang/go/blob/master/src/regexp/syntax/prog.go#L215 as a possible way to implement - for i := 0; i < 255; i++ { - input = unicode.SimpleFold(input) - if containsRune(res, input) { - break - } - res = append(res, input) - } - - return res -} - -func containsRune(elements []rune, needle rune) bool { - for _, v := range elements { - if needle == v { - return true - } - } - - return false -} - -// IsSpace checks bytes MUST which be UTF-8 encoded for a space -// List of spaces detected (same as unicode.IsSpace): -// '\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL), U+00A0 (NBSP). -// N.B only two bytes are required for these cases. If we decided -// to support spaces like '' then we'll need more bytes. -func IsSpace(firstByte, nextByte byte) bool { - switch { - case (9 <= firstByte) && (firstByte <= 13): // \t, \n, \f, \r - return true - case firstByte == 32: // SPACE - return true - case firstByte == 194: - if nextByte == 133 { // NEL - return true - } else if nextByte == 160 { // NBSP - return true - } - } - return false -} - -// StartOfRune a byte and returns true if its the start of a multibyte -// character or a single byte character otherwise false -func StartOfRune(b byte) bool { - return (b < (0b1 << 7)) || ((0b11 << 6) < b) -} diff --git a/toolkit/stringutils/common_test.go b/toolkit/stringutils/common_test.go deleted file mode 100644 index 355f3014..00000000 --- a/toolkit/stringutils/common_test.go +++ /dev/null @@ -1,161 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "testing" -) - -func TestRemoveStringDuplicates(t *testing.T) { - r := []string{"test", "test"} - - if len(RemoveStringDuplicates(r)) != 1 { - t.Error("Expected a single return") - } -} - -func TestPermuteCase(t *testing.T) { - permutations := PermuteCase("fo") - - if len(permutations) != 4 { - t.Error("Expected 4 returns") - } -} - -func TestPermuteCaseUnicode(t *testing.T) { - permutations := PermuteCase("ČšČū") - - if len(permutations) != 4 { - t.Error("Expected 4 returns") - } -} - -func TestPermuteCaseUnicodeNoFolding(t *testing.T) { - permutations := PermuteCase("Åŋ") - - if len(permutations) != 2 { - t.Error("Expected 2 returns") - } -} - -func TestAllSimpleFoldAsciiNumber(t *testing.T) { - folded := AllSimpleFold('1') - - if len(folded) != 1 { - t.Error("Should get 1 result") - } -} - -func TestAllSimpleFoldAsciiLetter(t *testing.T) { - folded := AllSimpleFold('z') - - if len(folded) != 2 { - t.Error("Should get 2 results") - } -} - -func TestAllSimpleFoldMultipleReturn(t *testing.T) { - folded := AllSimpleFold('Åŋ') - - if len(folded) != 3 { - t.Error("Should get 3 results") - } -} - -func TestAllSimpleFoldNotFullFold(t *testing.T) { - // ß (assuming I copied the lowercase one) - // can with full fold rules turn into SS - // https://www.w3.org/TR/charmod-norm/#definitionCaseFolding - // however in this case its a simple fold - // so we would not expect that - folded := AllSimpleFold('ß') - - if len(folded) != 2 { - t.Error("Should get 2 results") - } -} - -func TestPermuteCaseFoldingUnicodeNoFolding(t *testing.T) { - permutations := PermuteCaseFolding("Åŋ") - - if len(permutations) != 3 { - t.Error("Expected 3 returns") - } -} - -func TestPermuteCaseFolding(t *testing.T) { - folded := PermuteCaseFolding("nÅŋ") - - if len(folded) != 6 { - t.Error("Should get 6 results got", len(folded)) - } -} - -func TestPermuteCaseFoldingNumbers(t *testing.T) { - folded := PermuteCaseFolding("07123E1") - - if len(folded) != 2 { - t.Error("Should get 2 results got", len(folded)) - } -} - -func TestPermuteCaseFoldingComparison(t *testing.T) { - r1 := PermuteCase("groß") - r2 := PermuteCaseFolding("groß") - - if len(r1) >= len(r2) { - t.Error("Should not be of equal length") - } -} - -func TestIsSpace(t *testing.T) { - var cases = []struct { - b1, b2 byte - want bool - }{ - // True cases - {'\t', 'a', true}, - {'\n', 'a', true}, - {'\v', 'a', true}, - {'\f', 'a', true}, - {'\r', 'a', true}, - {' ', 'a', true}, - {'\xc2', '\x85', true}, // NEL - {'\xc2', '\xa0', true}, // NBSP - // False cases - {'a', '\t', false}, - {byte(234), 'a', false}, - {byte(8), ' ', false}, - {'\xc2', byte(84), false}, - {'\xc2', byte(9), false}, - } - - for _, c := range cases { - if got := IsSpace(c.b1, c.b2); got != c.want { - t.Error("Expected", c.want, "got", got, ":", c.b1, c.b2) - } - } -} - -func TestStartOfRune(t *testing.T) { - var cases = []struct { - bs []byte - idx int - want bool - }{ - {[]byte("yo"), 1, true}, - {[]byte("τoÏÎ―oς"), 0, true}, - {[]byte("τoÏÎ―oς"), 1, false}, - {[]byte("τoÏÎ―oς"), 2, true}, - {[]byte("🍚"), 0, true}, - {[]byte("🍚"), 1, false}, - {[]byte("🍚"), 2, false}, - {[]byte("🍚"), 3, false}, - } - - for _, c := range cases { - if got := StartOfRune(c.bs[c.idx]); got != c.want { - t.Error("[", string(c.bs), c.idx, "]", "Expected:", c.want, "got", got) - } - } -} diff --git a/toolkit/stringutils/constants_test.go b/toolkit/stringutils/constants_test.go deleted file mode 100644 index b83abf1f..00000000 --- a/toolkit/stringutils/constants_test.go +++ /dev/null @@ -1,14597 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -var prideAndPrejudice = ` -The Project Gutenberg EBook of Pride and Prejudice, by Jane Austen - -This eBook is for the use of anyone anywhere at no cost and with -almost no restrictions whatsoever. You may copy it, give it away or -re-use it under the terms of the Project Gutenberg License included -with this eBook or online at www.gutenberg.org - - -Title: Pride and Prejudice - -Author: Jane Austen - -Release Date: August 26, 2008 [EBook #1342] -Last Updated: November 12, 2019 - - -Language: English - -Character set encoding: UTF-8 - -*** START OF THIS PROJECT GUTENBERG EBOOK PRIDE AND PREJUDICE *** - - - - -Produced by Anonymous Volunteers, and David Widger - -THERE IS AN ILLUSTRATED EDITION OF THIS TITLE WHICH MAY VIEWED AT EBOOK -[# 42671 ] - -cover - - - - - Pride and Prejudice - - By Jane Austen - - CONTENTS - - Chapter 1 - - Chapter 2 - - Chapter 3 - - Chapter 4 - - Chapter 5 - - Chapter 6 - - Chapter 7 - - Chapter 8 - - Chapter 9 - - Chapter 10 - - Chapter 11 - - Chapter 12 - - Chapter 13 - - Chapter 14 - - Chapter 15 - - Chapter 16 - - Chapter 17 - - Chapter 18 - - Chapter 19 - - Chapter 20 - - Chapter 21 - - Chapter 22 - - Chapter 23 - - Chapter 24 - - Chapter 25 - - Chapter 26 - - Chapter 27 - - Chapter 28 - - Chapter 29 - - Chapter 30 - - Chapter 31 - - Chapter 32 - - Chapter 33 - - Chapter 34 - - Chapter 35 - - Chapter 36 - - Chapter 37 - - Chapter 38 - - Chapter 39 - - Chapter 40 - - Chapter 41 - - Chapter 42 - - Chapter 43 - - Chapter 44 - - Chapter 45 - - Chapter 46 - - Chapter 47 - - Chapter 48 - - Chapter 49 - - Chapter 50 - - Chapter 51 - - Chapter 52 - - Chapter 53 - - Chapter 54 - - Chapter 55 - - Chapter 56 - - Chapter 57 - - Chapter 58 - - Chapter 59 - - Chapter 60 - - Chapter 61 - - - - - Chapter 1 - - It is a truth universally acknowledged, that a single man in - possession of a good fortune, must be in want of a wife. - - However little known the feelings or views of such a man may be - on his first entering a neighbourhood, this truth is so well - fixed in the minds of the surrounding families, that he is - considered the rightful property of some one or other of their - daughters. - - “My dear Mr. Bennet,” said his lady to him one day, “have you - heard that Netherfield Park is let at last?” - - Mr. Bennet replied that he had not. - - “But it is,” returned she; “for Mrs. Long has just been here, and - she told me all about it.” - - Mr. Bennet made no answer. - - “Do you not want to know who has taken it?” cried his wife - impatiently. - - “_You_ want to tell me, and I have no objection to hearing it.” - - This was invitation enough. - - “Why, my dear, you must know, Mrs. Long says that Netherfield is - taken by a young man of large fortune from the north of England; - that he came down on Monday in a chaise and four to see the - place, and was so much delighted with it, that he agreed with Mr. - Morris immediately; that he is to take possession before - Michaelmas, and some of his servants are to be in the house by - the end of next week.” - - “What is his name?” - - “Bingley.” - - “Is he married or single?” - - “Oh! Single, my dear, to be sure! A single man of large fortune; - four or five thousand a year. What a fine thing for our girls!” - - “How so? How can it affect them?” - - “My dear Mr. Bennet,” replied his wife, “how can you be so - tiresome! You must know that I am thinking of his marrying one of - them.” - - “Is that his design in settling here?” - - “Design! Nonsense, how can you talk so! But it is very likely - that he _may_ fall in love with one of them, and therefore you - must visit him as soon as he comes.” - - “I see no occasion for that. You and the girls may go, or you may - send them by themselves, which perhaps will be still better, for - as you are as handsome as any of them, Mr. Bingley may like you - the best of the party.” - - “My dear, you flatter me. I certainly _have_ had my share of - beauty, but I do not pretend to be anything extraordinary now. - When a woman has five grown-up daughters, she ought to give over - thinking of her own beauty.” - - “In such cases, a woman has not often much beauty to think of.” - - “But, my dear, you must indeed go and see Mr. Bingley when he - comes into the neighbourhood.” - - “It is more than I engage for, I assure you.” - - “But consider your daughters. Only think what an establishment it - would be for one of them. Sir William and Lady Lucas are - determined to go, merely on that account, for in general, you - know, they visit no newcomers. Indeed you must go, for it will be - impossible for _us_ to visit him if you do not.” - - “You are over-scrupulous, surely. I dare say Mr. Bingley will be - very glad to see you; and I will send a few lines by you to - assure him of my hearty consent to his marrying whichever he - chooses of the girls; though I must throw in a good word for my - little Lizzy.” - - “I desire you will do no such thing. Lizzy is not a bit better - than the others; and I am sure she is not half so handsome as - Jane, nor half so good-humoured as Lydia. But you are always - giving _her_ the preference.” - - “They have none of them much to recommend them,” replied he; - “they are all silly and ignorant like other girls; but Lizzy has - something more of quickness than her sisters.” - - “Mr. Bennet, how can you abuse your own children in such a way? - You take delight in vexing me. You have no compassion for my poor - nerves.” - - “You mistake me, my dear. I have a high respect for your nerves. - They are my old friends. I have heard you mention them with - consideration these last twenty years at least.” - - “Ah, you do not know what I suffer.” - - “But I hope you will get over it, and live to see many young men - of four thousand a year come into the neighbourhood.” - - “It will be no use to us, if twenty such should come, since you - will not visit them.” - - “Depend upon it, my dear, that when there are twenty, I will - visit them all.” - - Mr. Bennet was so odd a mixture of quick parts, sarcastic humour, - reserve, and caprice, that the experience of three-and-twenty - years had been insufficient to make his wife understand his - character. _Her_ mind was less difficult to develop. She was a - woman of mean understanding, little information, and uncertain - temper. When she was discontented, she fancied herself nervous. - The business of her life was to get her daughters married; its - solace was visiting and news. - - - - - Chapter 2 - - Mr. Bennet was among the earliest of those who waited on Mr. - Bingley. He had always intended to visit him, though to the last - always assuring his wife that he should not go; and till the - evening after the visit was paid she had no knowledge of it. It - was then disclosed in the following manner. Observing his second - daughter employed in trimming a hat, he suddenly addressed her - with: - - “I hope Mr. Bingley will like it, Lizzy.” - - “We are not in a way to know _what_ Mr. Bingley likes,” said her - mother resentfully, “since we are not to visit.” - - “But you forget, mamma,” said Elizabeth, “that we shall meet him - at the assemblies, and that Mrs. Long promised to introduce him.” - - “I do not believe Mrs. Long will do any such thing. She has two - nieces of her own. She is a selfish, hypocritical woman, and I - have no opinion of her.” - - “No more have I,” said Mr. Bennet; “and I am glad to find that - you do not depend on her serving you.” - - Mrs. Bennet deigned not to make any reply, but, unable to contain - herself, began scolding one of her daughters. - - “Don’t keep coughing so, Kitty, for Heaven’s sake! Have a little - compassion on my nerves. You tear them to pieces.” - - “Kitty has no discretion in her coughs,” said her father; “she - times them ill.” - - “I do not cough for my own amusement,” replied Kitty fretfully. - “When is your next ball to be, Lizzy?” - - “To-morrow fortnight.” - - “Aye, so it is,” cried her mother, “and Mrs. Long does not come - back till the day before; so it will be impossible for her to - introduce him, for she will not know him herself.” - - “Then, my dear, you may have the advantage of your friend, and - introduce Mr. Bingley to _her_.” - - “Impossible, Mr. Bennet, impossible, when I am not acquainted - with him myself; how can you be so teasing?” - - “I honour your circumspection. A fortnight’s acquaintance is - certainly very little. One cannot know what a man really is by - the end of a fortnight. But if _we_ do not venture somebody else - will; and after all, Mrs. Long and her nieces must stand their - chance; and, therefore, as she will think it an act of kindness, - if you decline the office, I will take it on myself.” - - The girls stared at their father. Mrs. Bennet said only, - “Nonsense, nonsense!” - - “What can be the meaning of that emphatic exclamation?” cried he. - “Do you consider the forms of introduction, and the stress that - is laid on them, as nonsense? I cannot quite agree with you - _there_. What say you, Mary? For you are a young lady of deep - reflection, I know, and read great books and make extracts.” - - Mary wished to say something sensible, but knew not how. - - “While Mary is adjusting her ideas,” he continued, “let us return - to Mr. Bingley.” - - “I am sick of Mr. Bingley,” cried his wife. - - “I am sorry to hear _that_; but why did not you tell me that - before? If I had known as much this morning I certainly would not - have called on him. It is very unlucky; but as I have actually - paid the visit, we cannot escape the acquaintance now.” - - The astonishment of the ladies was just what he wished; that of - Mrs. Bennet perhaps surpassing the rest; though, when the first - tumult of joy was over, she began to declare that it was what she - had expected all the while. - - “How good it was in you, my dear Mr. Bennet! But I knew I should - persuade you at last. I was sure you loved your girls too well to - neglect such an acquaintance. Well, how pleased I am! and it is - such a good joke, too, that you should have gone this morning and - never said a word about it till now.” - - “Now, Kitty, you may cough as much as you choose,” said Mr. - Bennet; and, as he spoke, he left the room, fatigued with the - raptures of his wife. - - “What an excellent father you have, girls!” said she, when the - door was shut. “I do not know how you will ever make him amends - for his kindness; or me, either, for that matter. At our time of - life it is not so pleasant, I can tell you, to be making new - acquaintances every day; but for your sakes, we would do - anything. Lydia, my love, though you _are_ the youngest, I dare - say Mr. Bingley will dance with you at the next ball.” - - “Oh!” said Lydia stoutly, “I am not afraid; for though I _am_ the - youngest, I’m the tallest.” - - The rest of the evening was spent in conjecturing how soon he - would return Mr. Bennet’s visit, and determining when they should - ask him to dinner. - - - - - Chapter 3 - - Not all that Mrs. Bennet, however, with the assistance of her - five daughters, could ask on the subject, was sufficient to draw - from her husband any satisfactory description of Mr. Bingley. - They attacked him in various ways—with barefaced questions, - ingenious suppositions, and distant surmises; but he eluded the - skill of them all, and they were at last obliged to accept the - second-hand intelligence of their neighbour, Lady Lucas. Her - report was highly favourable. Sir William had been delighted with - him. He was quite young, wonderfully handsome, extremely - agreeable, and, to crown the whole, he meant to be at the next - assembly with a large party. Nothing could be more delightful! To - be fond of dancing was a certain step towards falling in love; - and very lively hopes of Mr. Bingley’s heart were entertained. - - “If I can but see one of my daughters happily settled at - Netherfield,” said Mrs. Bennet to her husband, “and all the - others equally well married, I shall have nothing to wish for.” - - In a few days Mr. Bingley returned Mr. Bennet’s visit, and sat - about ten minutes with him in his library. He had entertained - hopes of being admitted to a sight of the young ladies, of whose - beauty he had heard much; but he saw only the father. The ladies - were somewhat more fortunate, for they had the advantage of - ascertaining from an upper window that he wore a blue coat, and - rode a black horse. - - An invitation to dinner was soon afterwards dispatched; and - already had Mrs. Bennet planned the courses that were to do - credit to her housekeeping, when an answer arrived which deferred - it all. Mr. Bingley was obliged to be in town the following day, - and, consequently, unable to accept the honour of their - invitation, etc. Mrs. Bennet was quite disconcerted. She could - not imagine what business he could have in town so soon after his - arrival in Hertfordshire; and she began to fear that he might be - always flying about from one place to another, and never settled - at Netherfield as he ought to be. Lady Lucas quieted her fears a - little by starting the idea of his being gone to London only to - get a large party for the ball; and a report soon followed that - Mr. Bingley was to bring twelve ladies and seven gentlemen with - him to the assembly. The girls grieved over such a number of - ladies, but were comforted the day before the ball by hearing, - that instead of twelve he brought only six with him from - London—his five sisters and a cousin. And when the party entered - the assembly room it consisted of only five altogether—Mr. - Bingley, his two sisters, the husband of the eldest, and another - young man. - - Mr. Bingley was good-looking and gentlemanlike; he had a pleasant - countenance, and easy, unaffected manners. His sisters were fine - women, with an air of decided fashion. His brother-in-law, Mr. - Hurst, merely looked the gentleman; but his friend Mr. Darcy soon - drew the attention of the room by his fine, tall person, handsome - features, noble mien, and the report which was in general - circulation within five minutes after his entrance, of his having - ten thousand a year. The gentlemen pronounced him to be a fine - figure of a man, the ladies declared he was much handsomer than - Mr. Bingley, and he was looked at with great admiration for about - half the evening, till his manners gave a disgust which turned - the tide of his popularity; for he was discovered to be proud; to - be above his company, and above being pleased; and not all his - large estate in Derbyshire could then save him from having a most - forbidding, disagreeable countenance, and being unworthy to be - compared with his friend. - - Mr. Bingley had soon made himself acquainted with all the - principal people in the room; he was lively and unreserved, - danced every dance, was angry that the ball closed so early, and - talked of giving one himself at Netherfield. Such amiable - qualities must speak for themselves. What a contrast between him - and his friend! Mr. Darcy danced only once with Mrs. Hurst and - once with Miss Bingley, declined being introduced to any other - lady, and spent the rest of the evening in walking about the - room, speaking occasionally to one of his own party. His - character was decided. He was the proudest, most disagreeable man - in the world, and everybody hoped that he would never come there - again. Amongst the most violent against him was Mrs. Bennet, - whose dislike of his general behaviour was sharpened into - particular resentment by his having slighted one of her - daughters. - - Elizabeth Bennet had been obliged, by the scarcity of gentlemen, - to sit down for two dances; and during part of that time, Mr. - Darcy had been standing near enough for her to hear a - conversation between him and Mr. Bingley, who came from the dance - for a few minutes, to press his friend to join it. - - “Come, Darcy,” said he, “I must have you dance. I hate to see you - standing about by yourself in this stupid manner. You had much - better dance.” - - “I certainly shall not. You know how I detest it, unless I am - particularly acquainted with my partner. At such an assembly as - this it would be insupportable. Your sisters are engaged, and - there is not another woman in the room whom it would not be a - punishment to me to stand up with.” - - “I would not be so fastidious as you are,” cried Mr. Bingley, - “for a kingdom! Upon my honour, I never met with so many pleasant - girls in my life as I have this evening; and there are several of - them you see uncommonly pretty.” - - “_You_ are dancing with the only handsome girl in the room,” said - Mr. Darcy, looking at the eldest Miss Bennet. - - “Oh! She is the most beautiful creature I ever beheld! But there - is one of her sisters sitting down just behind you, who is very - pretty, and I dare say very agreeable. Do let me ask my partner - to introduce you.” - - “Which do you mean?” and turning round he looked for a moment at - Elizabeth, till catching her eye, he withdrew his own and coldly - said: “She is tolerable, but not handsome enough to tempt _me_; I - am in no humour at present to give consequence to young ladies - who are slighted by other men. You had better return to your - partner and enjoy her smiles, for you are wasting your time with - me.” - - Mr. Bingley followed his advice. Mr. Darcy walked off; and - Elizabeth remained with no very cordial feelings toward him. She - told the story, however, with great spirit among her friends; for - she had a lively, playful disposition, which delighted in - anything ridiculous. - - The evening altogether passed off pleasantly to the whole family. - Mrs. Bennet had seen her eldest daughter much admired by the - Netherfield party. Mr. Bingley had danced with her twice, and she - had been distinguished by his sisters. Jane was as much gratified - by this as her mother could be, though in a quieter way. - Elizabeth felt Jane’s pleasure. Mary had heard herself mentioned - to Miss Bingley as the most accomplished girl in the - neighbourhood; and Catherine and Lydia had been fortunate enough - never to be without partners, which was all that they had yet - learnt to care for at a ball. They returned, therefore, in good - spirits to Longbourn, the village where they lived, and of which - they were the principal inhabitants. They found Mr. Bennet still - up. With a book he was regardless of time; and on the present - occasion he had a good deal of curiosity as to the event of an - evening which had raised such splendid expectations. He had - rather hoped that his wife’s views on the stranger would be - disappointed; but he soon found out that he had a different story - to hear. - - “Oh, my dear Mr. Bennet,” as she entered the room, “we have had a - most delightful evening, a most excellent ball. I wish you had - been there. Jane was so admired, nothing could be like it. - Everybody said how well she looked; and Mr. Bingley thought her - quite beautiful, and danced with her twice! Only think of _that_, - my dear; he actually danced with her twice! and she was the only - creature in the room that he asked a second time. First of all, - he asked Miss Lucas. I was so vexed to see him stand up with her! - But, however, he did not admire her at all; indeed, nobody can, - you know; and he seemed quite struck with Jane as she was going - down the dance. So he inquired who she was, and got introduced, - and asked her for the two next. Then the two third he danced with - Miss King, and the two fourth with Maria Lucas, and the two fifth - with Jane again, and the two sixth with Lizzy, and the - _Boulanger_—” - - “If he had had any compassion for _me_,” cried her husband - impatiently, “he would not have danced half so much! For God’s - sake, say no more of his partners. Oh that he had sprained his - ankle in the first dance!” - - “Oh! my dear, I am quite delighted with him. He is so excessively - handsome! And his sisters are charming women. I never in my life - saw anything more elegant than their dresses. I dare say the lace - upon Mrs. Hurst’s gown—” - - Here she was interrupted again. Mr. Bennet protested against any - description of finery. She was therefore obliged to seek another - branch of the subject, and related, with much bitterness of - spirit and some exaggeration, the shocking rudeness of Mr. Darcy. - - “But I can assure you,” she added, “that Lizzy does not lose much - by not suiting _his_ fancy; for he is a most disagreeable, horrid - man, not at all worth pleasing. So high and so conceited that - there was no enduring him! He walked here, and he walked there, - fancying himself so very great! Not handsome enough to dance - with! I wish you had been there, my dear, to have given him one - of your set-downs. I quite detest the man.” - - - - - Chapter 4 - - When Jane and Elizabeth were alone, the former, who had been - cautious in her praise of Mr. Bingley before, expressed to her - sister just how very much she admired him. - - “He is just what a young man ought to be,” said she, “sensible, - good-humoured, lively; and I never saw such happy manners!—so - much ease, with such perfect good breeding!” - - “He is also handsome,” replied Elizabeth, “which a young man - ought likewise to be, if he possibly can. His character is - thereby complete.” - - “I was very much flattered by his asking me to dance a second - time. I did not expect such a compliment.” - - “Did not you? _I_ did for you. But that is one great difference - between us. Compliments always take _you_ by surprise, and _me_ - never. What could be more natural than his asking you again? He - could not help seeing that you were about five times as pretty as - every other woman in the room. No thanks to his gallantry for - that. Well, he certainly is very agreeable, and I give you leave - to like him. You have liked many a stupider person.” - - “Dear Lizzy!” - - “Oh! you are a great deal too apt, you know, to like people in - general. You never see a fault in anybody. All the world are good - and agreeable in your eyes. I never heard you speak ill of a - human being in your life.” - - “I would not wish to be hasty in censuring anyone; but I always - speak what I think.” - - “I know you do; and it is _that_ which makes the wonder. With - _your_ good sense, to be so honestly blind to the follies and - nonsense of others! Affectation of candour is common enough—one - meets with it everywhere. But to be candid without ostentation or - design—to take the good of everybody’s character and make it - still better, and say nothing of the bad—belongs to you alone. - And so you like this man’s sisters, too, do you? Their manners - are not equal to his.” - - “Certainly not—at first. But they are very pleasing women when - you converse with them. Miss Bingley is to live with her brother, - and keep his house; and I am much mistaken if we shall not find a - very charming neighbour in her.” - - Elizabeth listened in silence, but was not convinced; their - behaviour at the assembly had not been calculated to please in - general; and with more quickness of observation and less pliancy - of temper than her sister, and with a judgement too unassailed by - any attention to herself, she was very little disposed to approve - them. They were in fact very fine ladies; not deficient in good - humour when they were pleased, nor in the power of making - themselves agreeable when they chose it, but proud and conceited. - They were rather handsome, had been educated in one of the first - private seminaries in town, had a fortune of twenty thousand - pounds, were in the habit of spending more than they ought, and - of associating with people of rank, and were therefore in every - respect entitled to think well of themselves, and meanly of - others. They were of a respectable family in the north of - England; a circumstance more deeply impressed on their memories - than that their brother’s fortune and their own had been acquired - by trade. - - Mr. Bingley inherited property to the amount of nearly a hundred - thousand pounds from his father, who had intended to purchase an - estate, but did not live to do it. Mr. Bingley intended it - likewise, and sometimes made choice of his county; but as he was - now provided with a good house and the liberty of a manor, it was - doubtful to many of those who best knew the easiness of his - temper, whether he might not spend the remainder of his days at - Netherfield, and leave the next generation to purchase. - - His sisters were anxious for his having an estate of his own; - but, though he was now only established as a tenant, Miss Bingley - was by no means unwilling to preside at his table—nor was Mrs. - Hurst, who had married a man of more fashion than fortune, less - disposed to consider his house as her home when it suited her. - Mr. Bingley had not been of age two years, when he was tempted by - an accidental recommendation to look at Netherfield House. He did - look at it, and into it for half-an-hour—was pleased with the - situation and the principal rooms, satisfied with what the owner - said in its praise, and took it immediately. - - Between him and Darcy there was a very steady friendship, in - spite of great opposition of character. Bingley was endeared to - Darcy by the easiness, openness, and ductility of his temper, - though no disposition could offer a greater contrast to his own, - and though with his own he never appeared dissatisfied. On the - strength of Darcy’s regard, Bingley had the firmest reliance, and - of his judgement the highest opinion. In understanding, Darcy was - the superior. Bingley was by no means deficient, but Darcy was - clever. He was at the same time haughty, reserved, and - fastidious, and his manners, though well-bred, were not inviting. - In that respect his friend had greatly the advantage. Bingley was - sure of being liked wherever he appeared, Darcy was continually - giving offense. - - The manner in which they spoke of the Meryton assembly was - sufficiently characteristic. Bingley had never met with more - pleasant people or prettier girls in his life; everybody had been - most kind and attentive to him; there had been no formality, no - stiffness; he had soon felt acquainted with all the room; and, as - to Miss Bennet, he could not conceive an angel more beautiful. - Darcy, on the contrary, had seen a collection of people in whom - there was little beauty and no fashion, for none of whom he had - felt the smallest interest, and from none received either - attention or pleasure. Miss Bennet he acknowledged to be pretty, - but she smiled too much. - - Mrs. Hurst and her sister allowed it to be so—but still they - admired her and liked her, and pronounced her to be a sweet girl, - and one whom they would not object to know more of. Miss Bennet - was therefore established as a sweet girl, and their brother felt - authorized by such commendation to think of her as he chose. - - - - - Chapter 5 - - Within a short walk of Longbourn lived a family with whom the - Bennets were particularly intimate. Sir William Lucas had been - formerly in trade in Meryton, where he had made a tolerable - fortune, and risen to the honour of knighthood by an address to - the king during his mayoralty. The distinction had perhaps been - felt too strongly. It had given him a disgust to his business, - and to his residence in a small market town; and, in quitting - them both, he had removed with his family to a house about a mile - from Meryton, denominated from that period Lucas Lodge, where he - could think with pleasure of his own importance, and, unshackled - by business, occupy himself solely in being civil to all the - world. For, though elated by his rank, it did not render him - supercilious; on the contrary, he was all attention to everybody. - By nature inoffensive, friendly, and obliging, his presentation - at St. James’s had made him courteous. - - Lady Lucas was a very good kind of woman, not too clever to be a - valuable neighbour to Mrs. Bennet. They had several children. The - eldest of them, a sensible, intelligent young woman, about - twenty-seven, was Elizabeth’s intimate friend. - - That the Miss Lucases and the Miss Bennets should meet to talk - over a ball was absolutely necessary; and the morning after the - assembly brought the former to Longbourn to hear and to - communicate. - - “_You_ began the evening well, Charlotte,” said Mrs. Bennet with - civil self-command to Miss Lucas. “_You_ were Mr. Bingley’s first - choice.” - - “Yes; but he seemed to like his second better.” - - “Oh! you mean Jane, I suppose, because he danced with her twice. - To be sure that _did_ seem as if he admired her—indeed I rather - believe he _did_—I heard something about it—but I hardly know - what—something about Mr. Robinson.” - - “Perhaps you mean what I overheard between him and Mr. Robinson; - did not I mention it to you? Mr. Robinson’s asking him how he - liked our Meryton assemblies, and whether he did not think there - were a great many pretty women in the room, and _which_ he - thought the prettiest? and his answering immediately to the last - question: ‘Oh! the eldest Miss Bennet, beyond a doubt; there - cannot be two opinions on that point.’” - - “Upon my word! Well, that is very decided indeed—that does seem - as if—but, however, it may all come to nothing, you know.” - - “_My_ overhearings were more to the purpose than _yours_, Eliza,” - said Charlotte. “Mr. Darcy is not so well worth listening to as - his friend, is he?—poor Eliza!—to be only just _tolerable_.” - - “I beg you would not put it into Lizzy’s head to be vexed by his - ill-treatment, for he is such a disagreeable man, that it would - be quite a misfortune to be liked by him. Mrs. Long told me last - night that he sat close to her for half-an-hour without once - opening his lips.” - - “Are you quite sure, ma’am?—is not there a little mistake?” said - Jane. “I certainly saw Mr. Darcy speaking to her.” - - “Aye—because she asked him at last how he liked Netherfield, and - he could not help answering her; but she said he seemed quite - angry at being spoke to.” - - “Miss Bingley told me,” said Jane, “that he never speaks much, - unless among his intimate acquaintances. With _them_ he is - remarkably agreeable.” - - “I do not believe a word of it, my dear. If he had been so very - agreeable, he would have talked to Mrs. Long. But I can guess how - it was; everybody says that he is eat up with pride, and I dare - say he had heard somehow that Mrs. Long does not keep a carriage, - and had come to the ball in a hack chaise.” - - “I do not mind his not talking to Mrs. Long,” said Miss Lucas, - “but I wish he had danced with Eliza.” - - “Another time, Lizzy,” said her mother, “I would not dance with - _him_, if I were you.” - - “I believe, ma’am, I may safely promise you _never_ to dance with - him.” - - “His pride,” said Miss Lucas, “does not offend _me_ so much as - pride often does, because there is an excuse for it. One cannot - wonder that so very fine a young man, with family, fortune, - everything in his favour, should think highly of himself. If I - may so express it, he has a _right_ to be proud.” - - “That is very true,” replied Elizabeth, “and I could easily - forgive _his_ pride, if he had not mortified _mine_.” - - “Pride,” observed Mary, who piqued herself upon the solidity of - her reflections, “is a very common failing, I believe. By all - that I have ever read, I am convinced that it is very common - indeed; that human nature is particularly prone to it, and that - there are very few of us who do not cherish a feeling of - self-complacency on the score of some quality or other, real or - imaginary. Vanity and pride are different things, though the - words are often used synonymously. A person may be proud without - being vain. Pride relates more to our opinion of ourselves, - vanity to what we would have others think of us.” - - “If I were as rich as Mr. Darcy,” cried a young Lucas, who came - with his sisters, “I should not care how proud I was. I would - keep a pack of foxhounds, and drink a bottle of wine a day.” - - “Then you would drink a great deal more than you ought,” said - Mrs. Bennet; “and if I were to see you at it, I should take away - your bottle directly.” - - The boy protested that she should not; she continued to declare - that she would, and the argument ended only with the visit. - - - - - Chapter 6 - - The ladies of Longbourn soon waited on those of Netherfield. The - visit was soon returned in due form. Miss Bennet’s pleasing - manners grew on the goodwill of Mrs. Hurst and Miss Bingley; and - though the mother was found to be intolerable, and the younger - sisters not worth speaking to, a wish of being better acquainted - with _them_ was expressed towards the two eldest. By Jane, this - attention was received with the greatest pleasure, but Elizabeth - still saw superciliousness in their treatment of everybody, - hardly excepting even her sister, and could not like them; though - their kindness to Jane, such as it was, had a value as arising in - all probability from the influence of their brother’s admiration. - It was generally evident whenever they met, that he _did_ admire - her and to _her_ it was equally evident that Jane was yielding to - the preference which she had begun to entertain for him from the - first, and was in a way to be very much in love; but she - considered with pleasure that it was not likely to be discovered - by the world in general, since Jane united, with great strength - of feeling, a composure of temper and a uniform cheerfulness of - manner which would guard her from the suspicions of the - impertinent. She mentioned this to her friend Miss Lucas. - - “It may perhaps be pleasant,” replied Charlotte, “to be able to - impose on the public in such a case; but it is sometimes a - disadvantage to be so very guarded. If a woman conceals her - affection with the same skill from the object of it, she may lose - the opportunity of fixing him; and it will then be but poor - consolation to believe the world equally in the dark. There is so - much of gratitude or vanity in almost every attachment, that it - is not safe to leave any to itself. We can all _begin_ freely—a - slight preference is natural enough; but there are very few of us - who have heart enough to be really in love without encouragement. - In nine cases out of ten a woman had better show _more_ affection - than she feels. Bingley likes your sister undoubtedly; but he may - never do more than like her, if she does not help him on.” - - “But she does help him on, as much as her nature will allow. If - _I_ can perceive her regard for him, he must be a simpleton, - indeed, not to discover it too.” - - “Remember, Eliza, that he does not know Jane’s disposition as you - do.” - - “But if a woman is partial to a man, and does not endeavour to - conceal it, he must find it out.” - - “Perhaps he must, if he sees enough of her. But, though Bingley - and Jane meet tolerably often, it is never for many hours - together; and, as they always see each other in large mixed - parties, it is impossible that every moment should be employed in - conversing together. Jane should therefore make the most of every - half-hour in which she can command his attention. When she is - secure of him, there will be more leisure for falling in love as - much as she chooses.” - - “Your plan is a good one,” replied Elizabeth, “where nothing is - in question but the desire of being well married, and if I were - determined to get a rich husband, or any husband, I dare say I - should adopt it. But these are not Jane’s feelings; she is not - acting by design. As yet, she cannot even be certain of the - degree of her own regard nor of its reasonableness. She has known - him only a fortnight. She danced four dances with him at Meryton; - she saw him one morning at his own house, and has since dined - with him in company four times. This is not quite enough to make - her understand his character.” - - “Not as you represent it. Had she merely _dined_ with him, she - might only have discovered whether he had a good appetite; but - you must remember that four evenings have also been spent - together—and four evenings may do a great deal.” - - “Yes; these four evenings have enabled them to ascertain that - they both like Vingt-un better than Commerce; but with respect to - any other leading characteristic, I do not imagine that much has - been unfolded.” - - “Well,” said Charlotte, “I wish Jane success with all my heart; - and if she were married to him to-morrow, I should think she had - as good a chance of happiness as if she were to be studying his - character for a twelvemonth. Happiness in marriage is entirely a - matter of chance. If the dispositions of the parties are ever so - well known to each other or ever so similar beforehand, it does - not advance their felicity in the least. They always continue to - grow sufficiently unlike afterwards to have their share of - vexation; and it is better to know as little as possible of the - defects of the person with whom you are to pass your life.” - - “You make me laugh, Charlotte; but it is not sound. You know it - is not sound, and that you would never act in this way yourself.” - - Occupied in observing Mr. Bingley’s attentions to her sister, - Elizabeth was far from suspecting that she was herself becoming - an object of some interest in the eyes of his friend. Mr. Darcy - had at first scarcely allowed her to be pretty; he had looked at - her without admiration at the ball; and when they next met, he - looked at her only to criticise. But no sooner had he made it - clear to himself and his friends that she hardly had a good - feature in her face, than he began to find it was rendered - uncommonly intelligent by the beautiful expression of her dark - eyes. To this discovery succeeded some others equally mortifying. - Though he had detected with a critical eye more than one failure - of perfect symmetry in her form, he was forced to acknowledge her - figure to be light and pleasing; and in spite of his asserting - that her manners were not those of the fashionable world, he was - caught by their easy playfulness. Of this she was perfectly - unaware; to her he was only the man who made himself agreeable - nowhere, and who had not thought her handsome enough to dance - with. - - He began to wish to know more of her, and as a step towards - conversing with her himself, attended to her conversation with - others. His doing so drew her notice. It was at Sir William - Lucas’s, where a large party were assembled. - - “What does Mr. Darcy mean,” said she to Charlotte, “by listening - to my conversation with Colonel Forster?” - - “That is a question which Mr. Darcy only can answer.” - - “But if he does it any more I shall certainly let him know that I - see what he is about. He has a very satirical eye, and if I do - not begin by being impertinent myself, I shall soon grow afraid - of him.” - - On his approaching them soon afterwards, though without seeming - to have any intention of speaking, Miss Lucas defied her friend - to mention such a subject to him; which immediately provoking - Elizabeth to do it, she turned to him and said: - - “Did you not think, Mr. Darcy, that I expressed myself uncommonly - well just now, when I was teasing Colonel Forster to give us a - ball at Meryton?” - - “With great energy; but it is always a subject which makes a lady - energetic.” - - “You are severe on us.” - - “It will be _her_ turn soon to be teased,” said Miss Lucas. “I am - going to open the instrument, Eliza, and you know what follows.” - - “You are a very strange creature by way of a friend!—always - wanting me to play and sing before anybody and everybody! If my - vanity had taken a musical turn, you would have been invaluable; - but as it is, I would really rather not sit down before those who - must be in the habit of hearing the very best performers.” On - Miss Lucas’s persevering, however, she added, “Very well, if it - must be so, it must.” And gravely glancing at Mr. Darcy, “There - is a fine old saying, which everybody here is of course familiar - with: ‘Keep your breath to cool your porridge’; and I shall keep - mine to swell my song.” - - Her performance was pleasing, though by no means capital. After a - song or two, and before she could reply to the entreaties of - several that she would sing again, she was eagerly succeeded at - the instrument by her sister Mary, who having, in consequence of - being the only plain one in the family, worked hard for knowledge - and accomplishments, was always impatient for display. - - Mary had neither genius nor taste; and though vanity had given - her application, it had given her likewise a pedantic air and - conceited manner, which would have injured a higher degree of - excellence than she had reached. Elizabeth, easy and unaffected, - had been listened to with much more pleasure, though not playing - half so well; and Mary, at the end of a long concerto, was glad - to purchase praise and gratitude by Scotch and Irish airs, at the - request of her younger sisters, who, with some of the Lucases, - and two or three officers, joined eagerly in dancing at one end - of the room. - - Mr. Darcy stood near them in silent indignation at such a mode of - passing the evening, to the exclusion of all conversation, and - was too much engrossed by his thoughts to perceive that Sir - William Lucas was his neighbour, till Sir William thus began: - - “What a charming amusement for young people this is, Mr. Darcy! - There is nothing like dancing after all. I consider it as one of - the first refinements of polished society.” - - “Certainly, sir; and it has the advantage also of being in vogue - amongst the less polished societies of the world. Every savage - can dance.” - - Sir William only smiled. “Your friend performs delightfully,” he - continued after a pause, on seeing Bingley join the group; “and I - doubt not that you are an adept in the science yourself, Mr. - Darcy.” - - “You saw me dance at Meryton, I believe, sir.” - - “Yes, indeed, and received no inconsiderable pleasure from the - sight. Do you often dance at St. James’s?” - - “Never, sir.” - - “Do you not think it would be a proper compliment to the place?” - - “It is a compliment which I never pay to any place if I can avoid - it.” - - “You have a house in town, I conclude?” - - Mr. Darcy bowed. - - “I had once had some thought of fixing in town myself—for I am - fond of superior society; but I did not feel quite certain that - the air of London would agree with Lady Lucas.” - - He paused in hopes of an answer; but his companion was not - disposed to make any; and Elizabeth at that instant moving - towards them, he was struck with the action of doing a very - gallant thing, and called out to her: - - “My dear Miss Eliza, why are you not dancing? Mr. Darcy, you must - allow me to present this young lady to you as a very desirable - partner. You cannot refuse to dance, I am sure when so much - beauty is before you.” And, taking her hand, he would have given - it to Mr. Darcy who, though extremely surprised, was not - unwilling to receive it, when she instantly drew back, and said - with some discomposure to Sir William: - - “Indeed, sir, I have not the least intention of dancing. I - entreat you not to suppose that I moved this way in order to beg - for a partner.” - - Mr. Darcy, with grave propriety, requested to be allowed the - honour of her hand, but in vain. Elizabeth was determined; nor - did Sir William at all shake her purpose by his attempt at - persuasion. - - “You excel so much in the dance, Miss Eliza, that it is cruel to - deny me the happiness of seeing you; and though this gentleman - dislikes the amusement in general, he can have no objection, I am - sure, to oblige us for one half-hour.” - - “Mr. Darcy is all politeness,” said Elizabeth, smiling. - - “He is, indeed; but, considering the inducement, my dear Miss - Eliza, we cannot wonder at his complaisance—for who would object - to such a partner?” - - Elizabeth looked archly, and turned away. Her resistance had not - injured her with the gentleman, and he was thinking of her with - some complacency, when thus accosted by Miss Bingley: - - “I can guess the subject of your reverie.” - - “I should imagine not.” - - “You are considering how insupportable it would be to pass many - evenings in this manner—in such society; and indeed I am quite of - your opinion. I was never more annoyed! The insipidity, and yet - the noise—the nothingness, and yet the self-importance of all - those people! What would I give to hear your strictures on them!” - - “Your conjecture is totally wrong, I assure you. My mind was more - agreeably engaged. I have been meditating on the very great - pleasure which a pair of fine eyes in the face of a pretty woman - can bestow.” - - Miss Bingley immediately fixed her eyes on his face, and desired - he would tell her what lady had the credit of inspiring such - reflections. Mr. Darcy replied with great intrepidity: - - “Miss Elizabeth Bennet.” - - “Miss Elizabeth Bennet!” repeated Miss Bingley. “I am all - astonishment. How long has she been such a favourite?—and pray, - when am I to wish you joy?” - - “That is exactly the question which I expected you to ask. A - lady’s imagination is very rapid; it jumps from admiration to - love, from love to matrimony, in a moment. I knew you would be - wishing me joy.” - - “Nay, if you are serious about it, I shall consider the matter is - absolutely settled. You will be having a charming mother-in-law, - indeed; and, of course, she will always be at Pemberley with - you.” - - He listened to her with perfect indifference while she chose to - entertain herself in this manner; and as his composure convinced - her that all was safe, her wit flowed long. - - - - - Chapter 7 - - Mr. Bennet’s property consisted almost entirely in an estate of - two thousand a year, which, unfortunately for his daughters, was - entailed, in default of heirs male, on a distant relation; and - their mother’s fortune, though ample for her situation in life, - could but ill supply the deficiency of his. Her father had been - an attorney in Meryton, and had left her four thousand pounds. - - She had a sister married to a Mr. Phillips, who had been a clerk - to their father and succeeded him in the business, and a brother - settled in London in a respectable line of trade. - - The village of Longbourn was only one mile from Meryton; a most - convenient distance for the young ladies, who were usually - tempted thither three or four times a week, to pay their duty to - their aunt and to a milliner’s shop just over the way. The two - youngest of the family, Catherine and Lydia, were particularly - frequent in these attentions; their minds were more vacant than - their sisters’, and when nothing better offered, a walk to - Meryton was necessary to amuse their morning hours and furnish - conversation for the evening; and however bare of news the - country in general might be, they always contrived to learn some - from their aunt. At present, indeed, they were well supplied both - with news and happiness by the recent arrival of a militia - regiment in the neighbourhood; it was to remain the whole winter, - and Meryton was the headquarters. - - Their visits to Mrs. Phillips were now productive of the most - interesting intelligence. Every day added something to their - knowledge of the officers’ names and connections. Their lodgings - were not long a secret, and at length they began to know the - officers themselves. Mr. Phillips visited them all, and this - opened to his nieces a store of felicity unknown before. They - could talk of nothing but officers; and Mr. Bingley’s large - fortune, the mention of which gave animation to their mother, was - worthless in their eyes when opposed to the regimentals of an - ensign. - - After listening one morning to their effusions on this subject, - Mr. Bennet coolly observed: - - “From all that I can collect by your manner of talking, you must - be two of the silliest girls in the country. I have suspected it - some time, but I am now convinced.” - - Catherine was disconcerted, and made no answer; but Lydia, with - perfect indifference, continued to express her admiration of - Captain Carter, and her hope of seeing him in the course of the - day, as he was going the next morning to London. - - “I am astonished, my dear,” said Mrs. Bennet, “that you should be - so ready to think your own children silly. If I wished to think - slightingly of anybody’s children, it should not be of my own, - however.” - - “If my children are silly, I must hope to be always sensible of - it.” - - “Yes—but as it happens, they are all of them very clever.” - - “This is the only point, I flatter myself, on which we do not - agree. I had hoped that our sentiments coincided in every - particular, but I must so far differ from you as to think our two - youngest daughters uncommonly foolish.” - - “My dear Mr. Bennet, you must not expect such girls to have the - sense of their father and mother. When they get to our age, I - dare say they will not think about officers any more than we do. - I remember the time when I liked a red coat myself very well—and, - indeed, so I do still at my heart; and if a smart young colonel, - with five or six thousand a year, should want one of my girls I - shall not say nay to him; and I thought Colonel Forster looked - very becoming the other night at Sir William’s in his - regimentals.” - - “Mamma,” cried Lydia, “my aunt says that Colonel Forster and - Captain Carter do not go so often to Miss Watson’s as they did - when they first came; she sees them now very often standing in - Clarke’s library.” - - Mrs. Bennet was prevented replying by the entrance of the footman - with a note for Miss Bennet; it came from Netherfield, and the - servant waited for an answer. Mrs. Bennet’s eyes sparkled with - pleasure, and she was eagerly calling out, while her daughter - read, - - “Well, Jane, who is it from? What is it about? What does he say? - Well, Jane, make haste and tell us; make haste, my love.” - - “It is from Miss Bingley,” said Jane, and then read it aloud. - - “MY DEAR FRIEND,— - “If you are not so compassionate as to dine to-day with Louisa - and me, we shall be in danger of hating each other for the rest - of our lives, for a whole day’s _tÊte-à-tÊte_ between two women - can never end without a quarrel. Come as soon as you can on - receipt of this. My brother and the gentlemen are to dine with - the officers.—Yours ever, - - “CAROLINE BINGLEY” - - “With the officers!” cried Lydia. “I wonder my aunt did not tell - us of _that_.” - - “Dining out,” said Mrs. Bennet, “that is very unlucky.” - - “Can I have the carriage?” said Jane. - - “No, my dear, you had better go on horseback, because it seems - likely to rain; and then you must stay all night.” - - “That would be a good scheme,” said Elizabeth, “if you were sure - that they would not offer to send her home.” - - “Oh! but the gentlemen will have Mr. Bingley’s chaise to go to - Meryton, and the Hursts have no horses to theirs.” - - “I had much rather go in the coach.” - - “But, my dear, your father cannot spare the horses, I am sure. - They are wanted in the farm, Mr. Bennet, are they not?” - - “They are wanted in the farm much oftener than I can get them.” - - “But if you have got them to-day,” said Elizabeth, “my mother’s - purpose will be answered.” - - She did at last extort from her father an acknowledgment that the - horses were engaged. Jane was therefore obliged to go on - horseback, and her mother attended her to the door with many - cheerful prognostics of a bad day. Her hopes were answered; Jane - had not been gone long before it rained hard. Her sisters were - uneasy for her, but her mother was delighted. The rain continued - the whole evening without intermission; Jane certainly could not - come back. - - “This was a lucky idea of mine, indeed!” said Mrs. Bennet more - than once, as if the credit of making it rain were all her own. - Till the next morning, however, she was not aware of all the - felicity of her contrivance. Breakfast was scarcely over when a - servant from Netherfield brought the following note for - Elizabeth: - - “MY DEAREST LIZZY,— - “I find myself very unwell this morning, which, I suppose, is to - be imputed to my getting wet through yesterday. My kind friends - will not hear of my returning till I am better. They insist also - on my seeing Mr. Jones—therefore do not be alarmed if you should - hear of his having been to me—and, excepting a sore throat and - headache, there is not much the matter with me.—Yours, etc.” - - “Well, my dear,” said Mr. Bennet, when Elizabeth had read the - note aloud, “if your daughter should have a dangerous fit of - illness—if she should die, it would be a comfort to know that it - was all in pursuit of Mr. Bingley, and under your orders.” - - “Oh! I am not afraid of her dying. People do not die of little - trifling colds. She will be taken good care of. As long as she - stays there, it is all very well. I would go and see her if I - could have the carriage.” - - Elizabeth, feeling really anxious, was determined to go to her, - though the carriage was not to be had; and as she was no - horsewoman, walking was her only alternative. She declared her - resolution. - - “How can you be so silly,” cried her mother, “as to think of such - a thing, in all this dirt! You will not be fit to be seen when - you get there.” - - “I shall be very fit to see Jane—which is all I want.” - - “Is this a hint to me, Lizzy,” said her father, “to send for the - horses?” - - “No, indeed, I do not wish to avoid the walk. The distance is - nothing when one has a motive; only three miles. I shall be back - by dinner.” - - “I admire the activity of your benevolence,” observed Mary, “but - every impulse of feeling should be guided by reason; and, in my - opinion, exertion should always be in proportion to what is - required.” - - “We will go as far as Meryton with you,” said Catherine and - Lydia. Elizabeth accepted their company, and the three young - ladies set off together. - - “If we make haste,” said Lydia, as they walked along, “perhaps we - may see something of Captain Carter before he goes.” - - In Meryton they parted; the two youngest repaired to the lodgings - of one of the officers’ wives, and Elizabeth continued her walk - alone, crossing field after field at a quick pace, jumping over - stiles and springing over puddles with impatient activity, and - finding herself at last within view of the house, with weary - ankles, dirty stockings, and a face glowing with the warmth of - exercise. - - She was shown into the breakfast-parlour, where all but Jane were - assembled, and where her appearance created a great deal of - surprise. That she should have walked three miles so early in the - day, in such dirty weather, and by herself, was almost incredible - to Mrs. Hurst and Miss Bingley; and Elizabeth was convinced that - they held her in contempt for it. She was received, however, very - politely by them; and in their brother’s manners there was - something better than politeness; there was good humour and - kindness. Mr. Darcy said very little, and Mr. Hurst nothing at - all. The former was divided between admiration of the brilliancy - which exercise had given to her complexion, and doubt as to the - occasion’s justifying her coming so far alone. The latter was - thinking only of his breakfast. - - Her inquiries after her sister were not very favourably answered. - Miss Bennet had slept ill, and though up, was very feverish, and - not well enough to leave her room. Elizabeth was glad to be taken - to her immediately; and Jane, who had only been withheld by the - fear of giving alarm or inconvenience from expressing in her note - how much she longed for such a visit, was delighted at her - entrance. She was not equal, however, to much conversation, and - when Miss Bingley left them together, could attempt little - besides expressions of gratitude for the extraordinary kindness - she was treated with. Elizabeth silently attended her. - - When breakfast was over they were joined by the sisters; and - Elizabeth began to like them herself, when she saw how much - affection and solicitude they showed for Jane. The apothecary - came, and having examined his patient, said, as might be - supposed, that she had caught a violent cold, and that they must - endeavour to get the better of it; advised her to return to bed, - and promised her some draughts. The advice was followed readily, - for the feverish symptoms increased, and her head ached acutely. - Elizabeth did not quit her room for a moment; nor were the other - ladies often absent; the gentlemen being out, they had, in fact, - nothing to do elsewhere. - - When the clock struck three, Elizabeth felt that she must go, and - very unwillingly said so. Miss Bingley offered her the carriage, - and she only wanted a little pressing to accept it, when Jane - testified such concern in parting with her, that Miss Bingley was - obliged to convert the offer of the chaise to an invitation to - remain at Netherfield for the present. Elizabeth most thankfully - consented, and a servant was dispatched to Longbourn to acquaint - the family with her stay and bring back a supply of clothes. - - - - - Chapter 8 - - At five o’clock the two ladies retired to dress, and at half-past - six Elizabeth was summoned to dinner. To the civil inquiries - which then poured in, and amongst which she had the pleasure of - distinguishing the much superior solicitude of Mr. Bingley’s, she - could not make a very favourable answer. Jane was by no means - better. The sisters, on hearing this, repeated three or four - times how much they were grieved, how shocking it was to have a - bad cold, and how excessively they disliked being ill themselves; - and then thought no more of the matter: and their indifference - towards Jane when not immediately before them restored Elizabeth - to the enjoyment of all her former dislike. - - Their brother, indeed, was the only one of the party whom she - could regard with any complacency. His anxiety for Jane was - evident, and his attentions to herself most pleasing, and they - prevented her feeling herself so much an intruder as she believed - she was considered by the others. She had very little notice from - any but him. Miss Bingley was engrossed by Mr. Darcy, her sister - scarcely less so; and as for Mr. Hurst, by whom Elizabeth sat, he - was an indolent man, who lived only to eat, drink, and play at - cards; who, when he found her to prefer a plain dish to a ragout, - had nothing to say to her. - - When dinner was over, she returned directly to Jane, and Miss - Bingley began abusing her as soon as she was out of the room. Her - manners were pronounced to be very bad indeed, a mixture of pride - and impertinence; she had no conversation, no style, no beauty. - Mrs. Hurst thought the same, and added: - - “She has nothing, in short, to recommend her, but being an - excellent walker. I shall never forget her appearance this - morning. She really looked almost wild.” - - “She did, indeed, Louisa. I could hardly keep my countenance. - Very nonsensical to come at all! Why must _she_ be scampering - about the country, because her sister had a cold? Her hair, so - untidy, so blowsy!” - - “Yes, and her petticoat; I hope you saw her petticoat, six inches - deep in mud, I am absolutely certain; and the gown which had been - let down to hide it not doing its office.” - - “Your picture may be very exact, Louisa,” said Bingley; “but this - was all lost upon me. I thought Miss Elizabeth Bennet looked - remarkably well when she came into the room this morning. Her - dirty petticoat quite escaped my notice.” - - “_You_ observed it, Mr. Darcy, I am sure,” said Miss Bingley; - “and I am inclined to think that you would not wish to see _your - sister_ make such an exhibition.” - - “Certainly not.” - - “To walk three miles, or four miles, or five miles, or whatever - it is, above her ankles in dirt, and alone, quite alone! What - could she mean by it? It seems to me to show an abominable sort - of conceited independence, a most country-town indifference to - decorum.” - - “It shows an affection for her sister that is very pleasing,” - said Bingley. - - “I am afraid, Mr. Darcy,” observed Miss Bingley in a half - whisper, “that this adventure has rather affected your admiration - of her fine eyes.” - - “Not at all,” he replied; “they were brightened by the exercise.” - A short pause followed this speech, and Mrs. Hurst began again: - - “I have an excessive regard for Miss Jane Bennet, she is really a - very sweet girl, and I wish with all my heart she were well - settled. But with such a father and mother, and such low - connections, I am afraid there is no chance of it.” - - “I think I have heard you say that their uncle is an attorney in - Meryton.” - - “Yes; and they have another, who lives somewhere near Cheapside.” - - “That is capital,” added her sister, and they both laughed - heartily. - - “If they had uncles enough to fill _all_ Cheapside,” cried - Bingley, “it would not make them one jot less agreeable.” - - “But it must very materially lessen their chance of marrying men - of any consideration in the world,” replied Darcy. - - To this speech Bingley made no answer; but his sisters gave it - their hearty assent, and indulged their mirth for some time at - the expense of their dear friend’s vulgar relations. - - With a renewal of tenderness, however, they returned to her room - on leaving the dining-parlour, and sat with her till summoned to - coffee. She was still very poorly, and Elizabeth would not quit - her at all, till late in the evening, when she had the comfort of - seeing her sleep, and when it seemed to her rather right than - pleasant that she should go downstairs herself. On entering the - drawing-room she found the whole party at loo, and was - immediately invited to join them; but suspecting them to be - playing high she declined it, and making her sister the excuse, - said she would amuse herself for the short time she could stay - below, with a book. Mr. Hurst looked at her with astonishment. - - “Do you prefer reading to cards?” said he; “that is rather - singular.” - - “Miss Eliza Bennet,” said Miss Bingley, “despises cards. She is a - great reader, and has no pleasure in anything else.” - - “I deserve neither such praise nor such censure,” cried - Elizabeth; “I am _not_ a great reader, and I have pleasure in - many things.” - - “In nursing your sister I am sure you have pleasure,” said - Bingley; “and I hope it will be soon increased by seeing her - quite well.” - - Elizabeth thanked him from her heart, and then walked towards the - table where a few books were lying. He immediately offered to - fetch her others—all that his library afforded. - - “And I wish my collection were larger for your benefit and my own - credit; but I am an idle fellow, and though I have not many, I - have more than I ever looked into.” - - Elizabeth assured him that she could suit herself perfectly with - those in the room. - - “I am astonished,” said Miss Bingley, “that my father should have - left so small a collection of books. What a delightful library - you have at Pemberley, Mr. Darcy!” - - “It ought to be good,” he replied, “it has been the work of many - generations.” - - “And then you have added so much to it yourself, you are always - buying books.” - - “I cannot comprehend the neglect of a family library in such days - as these.” - - “Neglect! I am sure you neglect nothing that can add to the - beauties of that noble place. Charles, when you build _your_ - house, I wish it may be half as delightful as Pemberley.” - - “I wish it may.” - - “But I would really advise you to make your purchase in that - neighbourhood, and take Pemberley for a kind of model. There is - not a finer county in England than Derbyshire.” - - “With all my heart; I will buy Pemberley itself if Darcy will - sell it.” - - “I am talking of possibilities, Charles.” - - “Upon my word, Caroline, I should think it more possible to get - Pemberley by purchase than by imitation.” - - Elizabeth was so much caught with what passed, as to leave her - very little attention for her book; and soon laying it wholly - aside, she drew near the card-table, and stationed herself - between Mr. Bingley and his eldest sister, to observe the game. - - “Is Miss Darcy much grown since the spring?” said Miss Bingley; - “will she be as tall as I am?” - - “I think she will. She is now about Miss Elizabeth Bennet’s - height, or rather taller.” - - “How I long to see her again! I never met with anybody who - delighted me so much. Such a countenance, such manners! And so - extremely accomplished for her age! Her performance on the - pianoforte is exquisite.” - - “It is amazing to me,” said Bingley, “how young ladies can have - patience to be so very accomplished as they all are.” - - “All young ladies accomplished! My dear Charles, what do you - mean?” - - “Yes, all of them, I think. They all paint tables, cover screens, - and net purses. I scarcely know anyone who cannot do all this, - and I am sure I never heard a young lady spoken of for the first - time, without being informed that she was very accomplished.” - - “Your list of the common extent of accomplishments,” said Darcy, - “has too much truth. The word is applied to many a woman who - deserves it no otherwise than by netting a purse or covering a - screen. But I am very far from agreeing with you in your - estimation of ladies in general. I cannot boast of knowing more - than half-a-dozen, in the whole range of my acquaintance, that - are really accomplished.” - - “Nor I, I am sure,” said Miss Bingley. - - “Then,” observed Elizabeth, “you must comprehend a great deal in - your idea of an accomplished woman.” - - “Yes, I do comprehend a great deal in it.” - - “Oh! certainly,” cried his faithful assistant, “no one can be - really esteemed accomplished who does not greatly surpass what is - usually met with. A woman must have a thorough knowledge of - music, singing, drawing, dancing, and the modern languages, to - deserve the word; and besides all this, she must possess a - certain something in her air and manner of walking, the tone of - her voice, her address and expressions, or the word will be but - half-deserved.” - - “All this she must possess,” added Darcy, “and to all this she - must yet add something more substantial, in the improvement of - her mind by extensive reading.” - - “I am no longer surprised at your knowing _only_ six accomplished - women. I rather wonder now at your knowing _any_.” - - “Are you so severe upon your own sex as to doubt the possibility - of all this?” - - “_I_ never saw such a woman. _I_ never saw such capacity, and - taste, and application, and elegance, as you describe united.” - - Mrs. Hurst and Miss Bingley both cried out against the injustice - of her implied doubt, and were both protesting that they knew - many women who answered this description, when Mr. Hurst called - them to order, with bitter complaints of their inattention to - what was going forward. As all conversation was thereby at an - end, Elizabeth soon afterwards left the room. - - “Elizabeth Bennet,” said Miss Bingley, when the door was closed - on her, “is one of those young ladies who seek to recommend - themselves to the other sex by undervaluing their own; and with - many men, I dare say, it succeeds. But, in my opinion, it is a - paltry device, a very mean art.” - - “Undoubtedly,” replied Darcy, to whom this remark was chiefly - addressed, “there is a meanness in _all_ the arts which ladies - sometimes condescend to employ for captivation. Whatever bears - affinity to cunning is despicable.” - - Miss Bingley was not so entirely satisfied with this reply as to - continue the subject. - - Elizabeth joined them again only to say that her sister was - worse, and that she could not leave her. Bingley urged Mr. Jones - being sent for immediately; while his sisters, convinced that no - country advice could be of any service, recommended an express to - town for one of the most eminent physicians. This she would not - hear of; but she was not so unwilling to comply with their - brother’s proposal; and it was settled that Mr. Jones should be - sent for early in the morning, if Miss Bennet were not decidedly - better. Bingley was quite uncomfortable; his sisters declared - that they were miserable. They solaced their wretchedness, - however, by duets after supper, while he could find no better - relief to his feelings than by giving his housekeeper directions - that every attention might be paid to the sick lady and her - sister. - - - - - Chapter 9 - - Elizabeth passed the chief of the night in her sister’s room, and - in the morning had the pleasure of being able to send a tolerable - answer to the inquiries which she very early received from Mr. - Bingley by a housemaid, and some time afterwards from the two - elegant ladies who waited on his sisters. In spite of this - amendment, however, she requested to have a note sent to - Longbourn, desiring her mother to visit Jane, and form her own - judgement of her situation. The note was immediately dispatched, - and its contents as quickly complied with. Mrs. Bennet, - accompanied by her two youngest girls, reached Netherfield soon - after the family breakfast. - - Had she found Jane in any apparent danger, Mrs. Bennet would have - been very miserable; but being satisfied on seeing her that her - illness was not alarming, she had no wish of her recovering - immediately, as her restoration to health would probably remove - her from Netherfield. She would not listen, therefore, to her - daughter’s proposal of being carried home; neither did the - apothecary, who arrived about the same time, think it at all - advisable. After sitting a little while with Jane, on Miss - Bingley’s appearance and invitation, the mother and three - daughters all attended her into the breakfast parlour. Bingley - met them with hopes that Mrs. Bennet had not found Miss Bennet - worse than she expected. - - “Indeed I have, sir,” was her answer. “She is a great deal too - ill to be moved. Mr. Jones says we must not think of moving her. - We must trespass a little longer on your kindness.” - - “Removed!” cried Bingley. “It must not be thought of. My sister, - I am sure, will not hear of her removal.” - - “You may depend upon it, Madam,” said Miss Bingley, with cold - civility, “that Miss Bennet will receive every possible attention - while she remains with us.” - - Mrs. Bennet was profuse in her acknowledgments. - - “I am sure,” she added, “if it was not for such good friends I do - not know what would become of her, for she is very ill indeed, - and suffers a vast deal, though with the greatest patience in the - world, which is always the way with her, for she has, without - exception, the sweetest temper I have ever met with. I often tell - my other girls they are nothing to _her_. You have a sweet room - here, Mr. Bingley, and a charming prospect over the gravel walk. - I do not know a place in the country that is equal to - Netherfield. You will not think of quitting it in a hurry, I - hope, though you have but a short lease.” - - “Whatever I do is done in a hurry,” replied he; “and therefore if - I should resolve to quit Netherfield, I should probably be off in - five minutes. At present, however, I consider myself as quite - fixed here.” - - “That is exactly what I should have supposed of you,” said - Elizabeth. - - “You begin to comprehend me, do you?” cried he, turning towards - her. - - “Oh! yes—I understand you perfectly.” - - “I wish I might take this for a compliment; but to be so easily - seen through I am afraid is pitiful.” - - “That is as it happens. It does not follow that a deep, intricate - character is more or less estimable than such a one as yours.” - - “Lizzy,” cried her mother, “remember where you are, and do not - run on in the wild manner that you are suffered to do at home.” - - “I did not know before,” continued Bingley immediately, “that you - were a studier of character. It must be an amusing study.” - - “Yes, but intricate characters are the _most_ amusing. They have - at least that advantage.” - - “The country,” said Darcy, “can in general supply but a few - subjects for such a study. In a country neighbourhood you move in - a very confined and unvarying society.” - - “But people themselves alter so much, that there is something new - to be observed in them for ever.” - - “Yes, indeed,” cried Mrs. Bennet, offended by his manner of - mentioning a country neighbourhood. “I assure you there is quite - as much of _that_ going on in the country as in town.” - - Everybody was surprised, and Darcy, after looking at her for a - moment, turned silently away. Mrs. Bennet, who fancied she had - gained a complete victory over him, continued her triumph. - - “I cannot see that London has any great advantage over the - country, for my part, except the shops and public places. The - country is a vast deal pleasanter, is it not, Mr. Bingley?” - - “When I am in the country,” he replied, “I never wish to leave - it; and when I am in town it is pretty much the same. They have - each their advantages, and I can be equally happy in either.” - - “Aye—that is because you have the right disposition. But that - gentleman,” looking at Darcy, “seemed to think the country was - nothing at all.” - - “Indeed, Mamma, you are mistaken,” said Elizabeth, blushing for - her mother. “You quite mistook Mr. Darcy. He only meant that - there was not such a variety of people to be met with in the - country as in the town, which you must acknowledge to be true.” - - “Certainly, my dear, nobody said there were; but as to not - meeting with many people in this neighbourhood, I believe there - are few neighbourhoods larger. I know we dine with - four-and-twenty families.” - - Nothing but concern for Elizabeth could enable Bingley to keep - his countenance. His sister was less delicate, and directed her - eyes towards Mr. Darcy with a very expressive smile. Elizabeth, - for the sake of saying something that might turn her mother’s - thoughts, now asked her if Charlotte Lucas had been at Longbourn - since _her_ coming away. - - “Yes, she called yesterday with her father. What an agreeable man - Sir William is, Mr. Bingley, is not he? So much the man of - fashion! So genteel and easy! He has always something to say to - everybody. _That_ is my idea of good breeding; and those persons - who fancy themselves very important, and never open their mouths, - quite mistake the matter.” - - “Did Charlotte dine with you?” - - “No, she would go home. I fancy she was wanted about the - mince-pies. For my part, Mr. Bingley, _I_ always keep servants - that can do their own work; _my_ daughters are brought up very - differently. But everybody is to judge for themselves, and the - Lucases are a very good sort of girls, I assure you. It is a pity - they are not handsome! Not that _I_ think Charlotte so _very_ - plain—but then she is our particular friend.” - - “She seems a very pleasant young woman.” - - “Oh! dear, yes; but you must own she is very plain. Lady Lucas - herself has often said so, and envied me Jane’s beauty. I do not - like to boast of my own child, but to be sure, Jane—one does not - often see anybody better looking. It is what everybody says. I do - not trust my own partiality. When she was only fifteen, there was - a man at my brother Gardiner’s in town so much in love with her - that my sister-in-law was sure he would make her an offer before - we came away. But, however, he did not. Perhaps he thought her - too young. However, he wrote some verses on her, and very pretty - they were.” - - “And so ended his affection,” said Elizabeth impatiently. “There - has been many a one, I fancy, overcome in the same way. I wonder - who first discovered the efficacy of poetry in driving away - love!” - - “I have been used to consider poetry as the _food_ of love,” said - Darcy. - - “Of a fine, stout, healthy love it may. Everything nourishes what - is strong already. But if it be only a slight, thin sort of - inclination, I am convinced that one good sonnet will starve it - entirely away.” - - Darcy only smiled; and the general pause which ensued made - Elizabeth tremble lest her mother should be exposing herself - again. She longed to speak, but could think of nothing to say; - and after a short silence Mrs. Bennet began repeating her thanks - to Mr. Bingley for his kindness to Jane, with an apology for - troubling him also with Lizzy. Mr. Bingley was unaffectedly civil - in his answer, and forced his younger sister to be civil also, - and say what the occasion required. She performed her part indeed - without much graciousness, but Mrs. Bennet was satisfied, and - soon afterwards ordered her carriage. Upon this signal, the - youngest of her daughters put herself forward. The two girls had - been whispering to each other during the whole visit, and the - result of it was, that the youngest should tax Mr. Bingley with - having promised on his first coming into the country to give a - ball at Netherfield. - - Lydia was a stout, well-grown girl of fifteen, with a fine - complexion and good-humoured countenance; a favourite with her - mother, whose affection had brought her into public at an early - age. She had high animal spirits, and a sort of natural - self-consequence, which the attention of the officers, to whom - her uncle’s good dinners, and her own easy manners recommended - her, had increased into assurance. She was very equal, therefore, - to address Mr. Bingley on the subject of the ball, and abruptly - reminded him of his promise; adding, that it would be the most - shameful thing in the world if he did not keep it. His answer to - this sudden attack was delightful to their mother’s ear: - - “I am perfectly ready, I assure you, to keep my engagement; and - when your sister is recovered, you shall, if you please, name the - very day of the ball. But you would not wish to be dancing when - she is ill.” - - Lydia declared herself satisfied. “Oh! yes—it would be much - better to wait till Jane was well, and by that time most likely - Captain Carter would be at Meryton again. And when you have given - _your_ ball,” she added, “I shall insist on their giving one - also. I shall tell Colonel Forster it will be quite a shame if he - does not.” - - Mrs. Bennet and her daughters then departed, and Elizabeth - returned instantly to Jane, leaving her own and her relations’ - behaviour to the remarks of the two ladies and Mr. Darcy; the - latter of whom, however, could not be prevailed on to join in - their censure of _her_, in spite of all Miss Bingley’s witticisms - on _fine eyes_. - - - - - Chapter 10 - - The day passed much as the day before had done. Mrs. Hurst and - Miss Bingley had spent some hours of the morning with the - invalid, who continued, though slowly, to mend; and in the - evening Elizabeth joined their party in the drawing-room. The - loo-table, however, did not appear. Mr. Darcy was writing, and - Miss Bingley, seated near him, was watching the progress of his - letter and repeatedly calling off his attention by messages to - his sister. Mr. Hurst and Mr. Bingley were at piquet, and Mrs. - Hurst was observing their game. - - Elizabeth took up some needlework, and was sufficiently amused in - attending to what passed between Darcy and his companion. The - perpetual commendations of the lady, either on his handwriting, - or on the evenness of his lines, or on the length of his letter, - with the perfect unconcern with which her praises were received, - formed a curious dialogue, and was exactly in union with her - opinion of each. - - “How delighted Miss Darcy will be to receive such a letter!” - - He made no answer. - - “You write uncommonly fast.” - - “You are mistaken. I write rather slowly.” - - “How many letters you must have occasion to write in the course - of a year! Letters of business, too! How odious I should think - them!” - - “It is fortunate, then, that they fall to my lot instead of - yours.” - - “Pray tell your sister that I long to see her.” - - “I have already told her so once, by your desire.” - - “I am afraid you do not like your pen. Let me mend it for you. I - mend pens remarkably well.” - - “Thank you—but I always mend my own.” - - “How can you contrive to write so even?” - - He was silent. - - “Tell your sister I am delighted to hear of her improvement on - the harp; and pray let her know that I am quite in raptures with - her beautiful little design for a table, and I think it - infinitely superior to Miss Grantley’s.” - - “Will you give me leave to defer your raptures till I write - again? At present I have not room to do them justice.” - - “Oh! it is of no consequence. I shall see her in January. But do - you always write such charming long letters to her, Mr. Darcy?” - - “They are generally long; but whether always charming it is not - for me to determine.” - - “It is a rule with me, that a person who can write a long letter - with ease, cannot write ill.” - - “That will not do for a compliment to Darcy, Caroline,” cried her - brother, “because he does _not_ write with ease. He studies too - much for words of four syllables. Do not you, Darcy?” - - “My style of writing is very different from yours.” - - “Oh!” cried Miss Bingley, “Charles writes in the most careless - way imaginable. He leaves out half his words, and blots the - rest.” - - “My ideas flow so rapidly that I have not time to express them—by - which means my letters sometimes convey no ideas at all to my - correspondents.” - - “Your humility, Mr. Bingley,” said Elizabeth, “must disarm - reproof.” - - “Nothing is more deceitful,” said Darcy, “than the appearance of - humility. It is often only carelessness of opinion, and sometimes - an indirect boast.” - - “And which of the two do you call _my_ little recent piece of - modesty?” - - “The indirect boast; for you are really proud of your defects in - writing, because you consider them as proceeding from a rapidity - of thought and carelessness of execution, which, if not - estimable, you think at least highly interesting. The power of - doing anything with quickness is always prized much by the - possessor, and often without any attention to the imperfection of - the performance. When you told Mrs. Bennet this morning that if - you ever resolved upon quitting Netherfield you should be gone in - five minutes, you meant it to be a sort of panegyric, of - compliment to yourself—and yet what is there so very laudable in - a precipitance which must leave very necessary business undone, - and can be of no real advantage to yourself or anyone else?” - - “Nay,” cried Bingley, “this is too much, to remember at night all - the foolish things that were said in the morning. And yet, upon - my honour, I believe what I said of myself to be true, and I - believe it at this moment. At least, therefore, I did not assume - the character of needless precipitance merely to show off before - the ladies.” - - “I dare say you believed it; but I am by no means convinced that - you would be gone with such celerity. Your conduct would be quite - as dependent on chance as that of any man I know; and if, as you - were mounting your horse, a friend were to say, ‘Bingley, you had - better stay till next week,’ you would probably do it, you would - probably not go—and at another word, might stay a month.” - - “You have only proved by this,” cried Elizabeth, “that Mr. - Bingley did not do justice to his own disposition. You have shown - him off now much more than he did himself.” - - “I am exceedingly gratified,” said Bingley, “by your converting - what my friend says into a compliment on the sweetness of my - temper. But I am afraid you are giving it a turn which that - gentleman did by no means intend; for he would certainly think - better of me, if under such a circumstance I were to give a flat - denial, and ride off as fast as I could.” - - “Would Mr. Darcy then consider the rashness of your original - intentions as atoned for by your obstinacy in adhering to it?” - - “Upon my word, I cannot exactly explain the matter; Darcy must - speak for himself.” - - “You expect me to account for opinions which you choose to call - mine, but which I have never acknowledged. Allowing the case, - however, to stand according to your representation, you must - remember, Miss Bennet, that the friend who is supposed to desire - his return to the house, and the delay of his plan, has merely - desired it, asked it without offering one argument in favour of - its propriety.” - - “To yield readily—easily—to the _persuasion_ of a friend is no - merit with you.” - - “To yield without conviction is no compliment to the - understanding of either.” - - “You appear to me, Mr. Darcy, to allow nothing for the influence - of friendship and affection. A regard for the requester would - often make one readily yield to a request, without waiting for - arguments to reason one into it. I am not particularly speaking - of such a case as you have supposed about Mr. Bingley. We may as - well wait, perhaps, till the circumstance occurs before we - discuss the discretion of his behaviour thereupon. But in general - and ordinary cases between friend and friend, where one of them - is desired by the other to change a resolution of no very great - moment, should you think ill of that person for complying with - the desire, without waiting to be argued into it?” - - “Will it not be advisable, before we proceed on this subject, to - arrange with rather more precision the degree of importance which - is to appertain to this request, as well as the degree of - intimacy subsisting between the parties?” - - “By all means,” cried Bingley; “let us hear all the particulars, - not forgetting their comparative height and size; for that will - have more weight in the argument, Miss Bennet, than you may be - aware of. I assure you, that if Darcy were not such a great tall - fellow, in comparison with myself, I should not pay him half so - much deference. I declare I do not know a more awful object than - Darcy, on particular occasions, and in particular places; at his - own house especially, and of a Sunday evening, when he has - nothing to do.” - - Mr. Darcy smiled; but Elizabeth thought she could perceive that - he was rather offended, and therefore checked her laugh. Miss - Bingley warmly resented the indignity he had received, in an - expostulation with her brother for talking such nonsense. - - “I see your design, Bingley,” said his friend. “You dislike an - argument, and want to silence this.” - - “Perhaps I do. Arguments are too much like disputes. If you and - Miss Bennet will defer yours till I am out of the room, I shall - be very thankful; and then you may say whatever you like of me.” - - “What you ask,” said Elizabeth, “is no sacrifice on my side; and - Mr. Darcy had much better finish his letter.” - - Mr. Darcy took her advice, and did finish his letter. - - When that business was over, he applied to Miss Bingley and - Elizabeth for an indulgence of some music. Miss Bingley moved - with some alacrity to the pianoforte; and, after a polite request - that Elizabeth would lead the way which the other as politely and - more earnestly negatived, she seated herself. - - Mrs. Hurst sang with her sister, and while they were thus - employed, Elizabeth could not help observing, as she turned over - some music-books that lay on the instrument, how frequently Mr. - Darcy’s eyes were fixed on her. She hardly knew how to suppose - that she could be an object of admiration to so great a man; and - yet that he should look at her because he disliked her, was still - more strange. She could only imagine, however, at last that she - drew his notice because there was something more wrong and - reprehensible, according to his ideas of right, than in any other - person present. The supposition did not pain her. She liked him - too little to care for his approbation. - - After playing some Italian songs, Miss Bingley varied the charm - by a lively Scotch air; and soon afterwards Mr. Darcy, drawing - near Elizabeth, said to her: - - “Do not you feel a great inclination, Miss Bennet, to seize such - an opportunity of dancing a reel?” - - She smiled, but made no answer. He repeated the question, with - some surprise at her silence. - - “Oh!” said she, “I heard you before, but I could not immediately - determine what to say in reply. You wanted me, I know, to say - ‘Yes,’ that you might have the pleasure of despising my taste; - but I always delight in overthrowing those kind of schemes, and - cheating a person of their premeditated contempt. I have, - therefore, made up my mind to tell you, that I do not want to - dance a reel at all—and now despise me if you dare.” - - “Indeed I do not dare.” - - Elizabeth, having rather expected to affront him, was amazed at - his gallantry; but there was a mixture of sweetness and archness - in her manner which made it difficult for her to affront anybody; - and Darcy had never been so bewitched by any woman as he was by - her. He really believed, that were it not for the inferiority of - her connections, he should be in some danger. - - Miss Bingley saw, or suspected enough to be jealous; and her - great anxiety for the recovery of her dear friend Jane received - some assistance from her desire of getting rid of Elizabeth. - - She often tried to provoke Darcy into disliking her guest, by - talking of their supposed marriage, and planning his happiness in - such an alliance. - - “I hope,” said she, as they were walking together in the - shrubbery the next day, “you will give your mother-in-law a few - hints, when this desirable event takes place, as to the advantage - of holding her tongue; and if you can compass it, do cure the - younger girls of running after officers. And, if I may mention so - delicate a subject, endeavour to check that little something, - bordering on conceit and impertinence, which your lady - possesses.” - - “Have you anything else to propose for my domestic felicity?” - - “Oh! yes. Do let the portraits of your uncle and aunt Phillips be - placed in the gallery at Pemberley. Put them next to your - great-uncle the judge. They are in the same profession, you know, - only in different lines. As for your Elizabeth’s picture, you - must not have it taken, for what painter could do justice to - those beautiful eyes?” - - “It would not be easy, indeed, to catch their expression, but - their colour and shape, and the eyelashes, so remarkably fine, - might be copied.” - - At that moment they were met from another walk by Mrs. Hurst and - Elizabeth herself. - - “I did not know that you intended to walk,” said Miss Bingley, in - some confusion, lest they had been overheard. - - “You used us abominably ill,” answered Mrs. Hurst, “running away - without telling us that you were coming out.” - - Then taking the disengaged arm of Mr. Darcy, she left Elizabeth - to walk by herself. The path just admitted three. Mr. Darcy felt - their rudeness, and immediately said: - - “This walk is not wide enough for our party. We had better go - into the avenue.” - - But Elizabeth, who had not the least inclination to remain with - them, laughingly answered: - - “No, no; stay where you are. You are charmingly grouped, and - appear to uncommon advantage. The picturesque would be spoilt by - admitting a fourth. Good-bye.” - - She then ran gaily off, rejoicing as she rambled about, in the - hope of being at home again in a day or two. Jane was already so - much recovered as to intend leaving her room for a couple of - hours that evening. - - - - - Chapter 11 - - When the ladies removed after dinner, Elizabeth ran up to her - sister, and seeing her well guarded from cold, attended her into - the drawing-room, where she was welcomed by her two friends with - many professions of pleasure; and Elizabeth had never seen them - so agreeable as they were during the hour which passed before the - gentlemen appeared. Their powers of conversation were - considerable. They could describe an entertainment with accuracy, - relate an anecdote with humour, and laugh at their acquaintance - with spirit. - - But when the gentlemen entered, Jane was no longer the first - object; Miss Bingley’s eyes were instantly turned toward Darcy, - and she had something to say to him before he had advanced many - steps. He addressed himself to Miss Bennet, with a polite - congratulation; Mr. Hurst also made her a slight bow, and said he - was “very glad;” but diffuseness and warmth remained for - Bingley’s salutation. He was full of joy and attention. The first - half-hour was spent in piling up the fire, lest she should suffer - from the change of room; and she removed at his desire to the - other side of the fireplace, that she might be further from the - door. He then sat down by her, and talked scarcely to anyone - else. Elizabeth, at work in the opposite corner, saw it all with - great delight. - - When tea was over, Mr. Hurst reminded his sister-in-law of the - card-table—but in vain. She had obtained private intelligence - that Mr. Darcy did not wish for cards; and Mr. Hurst soon found - even his open petition rejected. She assured him that no one - intended to play, and the silence of the whole party on the - subject seemed to justify her. Mr. Hurst had therefore nothing to - do, but to stretch himself on one of the sofas and go to sleep. - Darcy took up a book; Miss Bingley did the same; and Mrs. Hurst, - principally occupied in playing with her bracelets and rings, - joined now and then in her brother’s conversation with Miss - Bennet. - - Miss Bingley’s attention was quite as much engaged in watching - Mr. Darcy’s progress through _his_ book, as in reading her own; - and she was perpetually either making some inquiry, or looking at - his page. She could not win him, however, to any conversation; he - merely answered her question, and read on. At length, quite - exhausted by the attempt to be amused with her own book, which - she had only chosen because it was the second volume of his, she - gave a great yawn and said, “How pleasant it is to spend an - evening in this way! I declare after all there is no enjoyment - like reading! How much sooner one tires of anything than of a - book! When I have a house of my own, I shall be miserable if I - have not an excellent library.” - - No one made any reply. She then yawned again, threw aside her - book, and cast her eyes round the room in quest for some - amusement; when hearing her brother mentioning a ball to Miss - Bennet, she turned suddenly towards him and said: - - “By the bye, Charles, are you really serious in meditating a - dance at Netherfield? I would advise you, before you determine on - it, to consult the wishes of the present party; I am much - mistaken if there are not some among us to whom a ball would be - rather a punishment than a pleasure.” - - “If you mean Darcy,” cried her brother, “he may go to bed, if he - chooses, before it begins—but as for the ball, it is quite a - settled thing; and as soon as Nicholls has made white soup - enough, I shall send round my cards.” - - “I should like balls infinitely better,” she replied, “if they - were carried on in a different manner; but there is something - insufferably tedious in the usual process of such a meeting. It - would surely be much more rational if conversation instead of - dancing were made the order of the day.” - - “Much more rational, my dear Caroline, I dare say, but it would - not be near so much like a ball.” - - Miss Bingley made no answer, and soon afterwards she got up and - walked about the room. Her figure was elegant, and she walked - well; but Darcy, at whom it was all aimed, was still inflexibly - studious. In the desperation of her feelings, she resolved on one - effort more, and, turning to Elizabeth, said: - - “Miss Eliza Bennet, let me persuade you to follow my example, and - take a turn about the room. I assure you it is very refreshing - after sitting so long in one attitude.” - - Elizabeth was surprised, but agreed to it immediately. Miss - Bingley succeeded no less in the real object of her civility; Mr. - Darcy looked up. He was as much awake to the novelty of attention - in that quarter as Elizabeth herself could be, and unconsciously - closed his book. He was directly invited to join their party, but - he declined it, observing that he could imagine but two motives - for their choosing to walk up and down the room together, with - either of which motives his joining them would interfere. “What - could he mean? She was dying to know what could be his - meaning?”—and asked Elizabeth whether she could at all understand - him? - - “Not at all,” was her answer; “but depend upon it, he means to be - severe on us, and our surest way of disappointing him will be to - ask nothing about it.” - - Miss Bingley, however, was incapable of disappointing Mr. Darcy - in anything, and persevered therefore in requiring an explanation - of his two motives. - - “I have not the smallest objection to explaining them,” said he, - as soon as she allowed him to speak. “You either choose this - method of passing the evening because you are in each other’s - confidence, and have secret affairs to discuss, or because you - are conscious that your figures appear to the greatest advantage - in walking; if the first, I would be completely in your way, and - if the second, I can admire you much better as I sit by the - fire.” - - “Oh! shocking!” cried Miss Bingley. “I never heard anything so - abominable. How shall we punish him for such a speech?” - - “Nothing so easy, if you have but the inclination,” said - Elizabeth. “We can all plague and punish one another. Tease - him—laugh at him. Intimate as you are, you must know how it is to - be done.” - - “But upon my honour, I do _not_. I do assure you that my intimacy - has not yet taught me _that_. Tease calmness of manner and - presence of mind! No, no; I feel he may defy us there. And as to - laughter, we will not expose ourselves, if you please, by - attempting to laugh without a subject. Mr. Darcy may hug - himself.” - - “Mr. Darcy is not to be laughed at!” cried Elizabeth. “That is an - uncommon advantage, and uncommon I hope it will continue, for it - would be a great loss to _me_ to have many such acquaintances. I - dearly love a laugh.” - - “Miss Bingley,” said he, “has given me more credit than can be. - The wisest and the best of men—nay, the wisest and best of their - actions—may be rendered ridiculous by a person whose first object - in life is a joke.” - - “Certainly,” replied Elizabeth—“there are such people, but I hope - I am not one of _them_. I hope I never ridicule what is wise and - good. Follies and nonsense, whims and inconsistencies, _do_ - divert me, I own, and I laugh at them whenever I can. But these, - I suppose, are precisely what you are without.” - - “Perhaps that is not possible for anyone. But it has been the - study of my life to avoid those weaknesses which often expose a - strong understanding to ridicule.” - - “Such as vanity and pride.” - - “Yes, vanity is a weakness indeed. But pride—where there is a - real superiority of mind, pride will be always under good - regulation.” - - Elizabeth turned away to hide a smile. - - “Your examination of Mr. Darcy is over, I presume,” said Miss - Bingley; “and pray what is the result?” - - “I am perfectly convinced by it that Mr. Darcy has no defect. He - owns it himself without disguise.” - - “No,” said Darcy, “I have made no such pretension. I have faults - enough, but they are not, I hope, of understanding. My temper I - dare not vouch for. It is, I believe, too little - yielding—certainly too little for the convenience of the world. I - cannot forget the follies and vices of others so soon as I ought, - nor their offenses against myself. My feelings are not puffed - about with every attempt to move them. My temper would perhaps be - called resentful. My good opinion once lost, is lost forever.” - - “_That_ is a failing indeed!” cried Elizabeth. “Implacable - resentment _is_ a shade in a character. But you have chosen your - fault well. I really cannot _laugh_ at it. You are safe from me.” - - “There is, I believe, in every disposition a tendency to some - particular evil—a natural defect, which not even the best - education can overcome.” - - “And _your_ defect is to hate everybody.” - - “And yours,” he replied with a smile, “is willfully to - misunderstand them.” - - “Do let us have a little music,” cried Miss Bingley, tired of a - conversation in which she had no share. “Louisa, you will not - mind my waking Mr. Hurst?” - - Her sister had not the smallest objection, and the pianoforte was - opened; and Darcy, after a few moments’ recollection, was not - sorry for it. He began to feel the danger of paying Elizabeth too - much attention. - - - - - Chapter 12 - - In consequence of an agreement between the sisters, Elizabeth - wrote the next morning to their mother, to beg that the carriage - might be sent for them in the course of the day. But Mrs. Bennet, - who had calculated on her daughters remaining at Netherfield till - the following Tuesday, which would exactly finish Jane’s week, - could not bring herself to receive them with pleasure before. Her - answer, therefore, was not propitious, at least not to - Elizabeth’s wishes, for she was impatient to get home. Mrs. - Bennet sent them word that they could not possibly have the - carriage before Tuesday; and in her postscript it was added, that - if Mr. Bingley and his sister pressed them to stay longer, she - could spare them very well. Against staying longer, however, - Elizabeth was positively resolved—nor did she much expect it - would be asked; and fearful, on the contrary, as being considered - as intruding themselves needlessly long, she urged Jane to borrow - Mr. Bingley’s carriage immediately, and at length it was settled - that their original design of leaving Netherfield that morning - should be mentioned, and the request made. - - The communication excited many professions of concern; and enough - was said of wishing them to stay at least till the following day - to work on Jane; and till the morrow their going was deferred. - Miss Bingley was then sorry that she had proposed the delay, for - her jealousy and dislike of one sister much exceeded her - affection for the other. - - The master of the house heard with real sorrow that they were to - go so soon, and repeatedly tried to persuade Miss Bennet that it - would not be safe for her—that she was not enough recovered; but - Jane was firm where she felt herself to be right. - - To Mr. Darcy it was welcome intelligence—Elizabeth had been at - Netherfield long enough. She attracted him more than he liked—and - Miss Bingley was uncivil to _her_, and more teasing than usual to - himself. He wisely resolved to be particularly careful that no - sign of admiration should _now_ escape him, nothing that could - elevate her with the hope of influencing his felicity; sensible - that if such an idea had been suggested, his behaviour during the - last day must have material weight in confirming or crushing it. - Steady to his purpose, he scarcely spoke ten words to her through - the whole of Saturday, and though they were at one time left by - themselves for half-an-hour, he adhered most conscientiously to - his book, and would not even look at her. - - On Sunday, after morning service, the separation, so agreeable to - almost all, took place. Miss Bingley’s civility to Elizabeth - increased at last very rapidly, as well as her affection for - Jane; and when they parted, after assuring the latter of the - pleasure it would always give her to see her either at Longbourn - or Netherfield, and embracing her most tenderly, she even shook - hands with the former. Elizabeth took leave of the whole party in - the liveliest of spirits. - - They were not welcomed home very cordially by their mother. Mrs. - Bennet wondered at their coming, and thought them very wrong to - give so much trouble, and was sure Jane would have caught cold - again. But their father, though very laconic in his expressions - of pleasure, was really glad to see them; he had felt their - importance in the family circle. The evening conversation, when - they were all assembled, had lost much of its animation, and - almost all its sense by the absence of Jane and Elizabeth. - - They found Mary, as usual, deep in the study of thorough-bass and - human nature; and had some extracts to admire, and some new - observations of threadbare morality to listen to. Catherine and - Lydia had information for them of a different sort. Much had been - done and much had been said in the regiment since the preceding - Wednesday; several of the officers had dined lately with their - uncle, a private had been flogged, and it had actually been - hinted that Colonel Forster was going to be married. - - - - - Chapter 13 - - “I hope, my dear,” said Mr. Bennet to his wife, as they were at - breakfast the next morning, “that you have ordered a good dinner - to-day, because I have reason to expect an addition to our family - party.” - - “Who do you mean, my dear? I know of nobody that is coming, I am - sure, unless Charlotte Lucas should happen to call in—and I hope - _my_ dinners are good enough for her. I do not believe she often - sees such at home.” - - “The person of whom I speak is a gentleman, and a stranger.” - - Mrs. Bennet’s eyes sparkled. “A gentleman and a stranger! It is - Mr. Bingley, I am sure! Well, I am sure I shall be extremely glad - to see Mr. Bingley. But—good Lord! how unlucky! There is not a - bit of fish to be got to-day. Lydia, my love, ring the bell—I - must speak to Hill this moment.” - - “It is _not_ Mr. Bingley,” said her husband; “it is a person whom - I never saw in the whole course of my life.” - - This roused a general astonishment; and he had the pleasure of - being eagerly questioned by his wife and his five daughters at - once. - - After amusing himself some time with their curiosity, he thus - explained: - - “About a month ago I received this letter; and about a fortnight - ago I answered it, for I thought it a case of some delicacy, and - requiring early attention. It is from my cousin, Mr. Collins, - who, when I am dead, may turn you all out of this house as soon - as he pleases.” - - “Oh! my dear,” cried his wife, “I cannot bear to hear that - mentioned. Pray do not talk of that odious man. I do think it is - the hardest thing in the world, that your estate should be - entailed away from your own children; and I am sure, if I had - been you, I should have tried long ago to do something or other - about it.” - - Jane and Elizabeth tried to explain to her the nature of an - entail. They had often attempted to do it before, but it was a - subject on which Mrs. Bennet was beyond the reach of reason, and - she continued to rail bitterly against the cruelty of settling an - estate away from a family of five daughters, in favour of a man - whom nobody cared anything about. - - “It certainly is a most iniquitous affair,” said Mr. Bennet, “and - nothing can clear Mr. Collins from the guilt of inheriting - Longbourn. But if you will listen to his letter, you may perhaps - be a little softened by his manner of expressing himself.” - - “No, that I am sure I shall not; and I think it is very - impertinent of him to write to you at all, and very hypocritical. - I hate such false friends. Why could he not keep on quarreling - with you, as his father did before him?” - - “Why, indeed; he does seem to have had some filial scruples on - that head, as you will hear.” - - “Hunsford, near Westerham, Kent, 15_th October_. - - “Dear Sir,— - “The disagreement subsisting between yourself and my late - honoured father always gave me much uneasiness, and since I have - had the misfortune to lose him, I have frequently wished to heal - the breach; but for some time I was kept back by my own doubts, - fearing lest it might seem disrespectful to his memory for me to - be on good terms with anyone with whom it had always pleased him - to be at variance.—‘There, Mrs. Bennet.’—My mind, however, is now - made up on the subject, for having received ordination at Easter, - I have been so fortunate as to be distinguished by the patronage - of the Right Honourable Lady Catherine de Bourgh, widow of Sir - Lewis de Bourgh, whose bounty and beneficence has preferred me to - the valuable rectory of this parish, where it shall be my earnest - endeavour to demean myself with grateful respect towards her - ladyship, and be ever ready to perform those rites and ceremonies - which are instituted by the Church of England. As a clergyman, - moreover, I feel it my duty to promote and establish the blessing - of peace in all families within the reach of my influence; and on - these grounds I flatter myself that my present overtures are - highly commendable, and that the circumstance of my being next in - the entail of Longbourn estate will be kindly overlooked on your - side, and not lead you to reject the offered olive-branch. I - cannot be otherwise than concerned at being the means of injuring - your amiable daughters, and beg leave to apologise for it, as - well as to assure you of my readiness to make them every possible - amends—but of this hereafter. If you should have no objection to - receive me into your house, I propose myself the satisfaction of - waiting on you and your family, Monday, November 18th, by four - o’clock, and shall probably trespass on your hospitality till the - Saturday se’ennight following, which I can do without any - inconvenience, as Lady Catherine is far from objecting to my - occasional absence on a Sunday, provided that some other - clergyman is engaged to do the duty of the day.—I remain, dear - sir, with respectful compliments to your lady and daughters, your - well-wisher and friend, - - “WILLIAM COLLINS” - - “At four o’clock, therefore, we may expect this peace-making - gentleman,” said Mr. Bennet, as he folded up the letter. “He - seems to be a most conscientious and polite young man, upon my - word, and I doubt not will prove a valuable acquaintance, - especially if Lady Catherine should be so indulgent as to let him - come to us again.” - - “There is some sense in what he says about the girls, however, - and if he is disposed to make them any amends, I shall not be the - person to discourage him.” - - “Though it is difficult,” said Jane, “to guess in what way he can - mean to make us the atonement he thinks our due, the wish is - certainly to his credit.” - - Elizabeth was chiefly struck by his extraordinary deference for - Lady Catherine, and his kind intention of christening, marrying, - and burying his parishioners whenever it were required. - - “He must be an oddity, I think,” said she. “I cannot make him - out.—There is something very pompous in his style.—And what can - he mean by apologising for being next in the entail?—We cannot - suppose he would help it if he could.—Could he be a sensible man, - sir?” - - “No, my dear, I think not. I have great hopes of finding him - quite the reverse. There is a mixture of servility and - self-importance in his letter, which promises well. I am - impatient to see him.” - - “In point of composition,” said Mary, “the letter does not seem - defective. The idea of the olive-branch perhaps is not wholly - new, yet I think it is well expressed.” - - To Catherine and Lydia, neither the letter nor its writer were in - any degree interesting. It was next to impossible that their - cousin should come in a scarlet coat, and it was now some weeks - since they had received pleasure from the society of a man in any - other colour. As for their mother, Mr. Collins’s letter had done - away much of her ill-will, and she was preparing to see him with - a degree of composure which astonished her husband and daughters. - - Mr. Collins was punctual to his time, and was received with great - politeness by the whole family. Mr. Bennet indeed said little; - but the ladies were ready enough to talk, and Mr. Collins seemed - neither in need of encouragement, nor inclined to be silent - himself. He was a tall, heavy-looking young man of - five-and-twenty. His air was grave and stately, and his manners - were very formal. He had not been long seated before he - complimented Mrs. Bennet on having so fine a family of daughters; - said he had heard much of their beauty, but that in this instance - fame had fallen short of the truth; and added, that he did not - doubt her seeing them all in due time disposed of in marriage. - This gallantry was not much to the taste of some of his hearers; - but Mrs. Bennet, who quarreled with no compliments, answered most - readily. - - “You are very kind, I am sure; and I wish with all my heart it - may prove so, for else they will be destitute enough. Things are - settled so oddly.” - - “You allude, perhaps, to the entail of this estate.” - - “Ah! sir, I do indeed. It is a grievous affair to my poor girls, - you must confess. Not that I mean to find fault with _you_, for - such things I know are all chance in this world. There is no - knowing how estates will go when once they come to be entailed.” - - “I am very sensible, madam, of the hardship to my fair cousins, - and could say much on the subject, but that I am cautious of - appearing forward and precipitate. But I can assure the young - ladies that I come prepared to admire them. At present I will not - say more; but, perhaps, when we are better acquainted—” - - He was interrupted by a summons to dinner; and the girls smiled - on each other. They were not the only objects of Mr. Collins’s - admiration. The hall, the dining-room, and all its furniture, - were examined and praised; and his commendation of everything - would have touched Mrs. Bennet’s heart, but for the mortifying - supposition of his viewing it all as his own future property. The - dinner too in its turn was highly admired; and he begged to know - to which of his fair cousins the excellency of its cooking was - owing. But he was set right there by Mrs. Bennet, who assured him - with some asperity that they were very well able to keep a good - cook, and that her daughters had nothing to do in the kitchen. He - begged pardon for having displeased her. In a softened tone she - declared herself not at all offended; but he continued to - apologise for about a quarter of an hour. - - - - - Chapter 14 - - During dinner, Mr. Bennet scarcely spoke at all; but when the - servants were withdrawn, he thought it time to have some - conversation with his guest, and therefore started a subject in - which he expected him to shine, by observing that he seemed very - fortunate in his patroness. Lady Catherine de Bourgh’s attention - to his wishes, and consideration for his comfort, appeared very - remarkable. Mr. Bennet could not have chosen better. Mr. Collins - was eloquent in her praise. The subject elevated him to more than - usual solemnity of manner, and with a most important aspect he - protested that “he had never in his life witnessed such behaviour - in a person of rank—such affability and condescension, as he had - himself experienced from Lady Catherine. She had been graciously - pleased to approve of both of the discourses which he had already - had the honour of preaching before her. She had also asked him - twice to dine at Rosings, and had sent for him only the Saturday - before, to make up her pool of quadrille in the evening. Lady - Catherine was reckoned proud by many people he knew, but _he_ had - never seen anything but affability in her. She had always spoken - to him as she would to any other gentleman; she made not the - smallest objection to his joining in the society of the - neighbourhood nor to his leaving the parish occasionally for a - week or two, to visit his relations. She had even condescended to - advise him to marry as soon as he could, provided he chose with - discretion; and had once paid him a visit in his humble - parsonage, where she had perfectly approved all the alterations - he had been making, and had even vouchsafed to suggest some - herself—some shelves in the closet up stairs.” - - “That is all very proper and civil, I am sure,” said Mrs. Bennet, - “and I dare say she is a very agreeable woman. It is a pity that - great ladies in general are not more like her. Does she live near - you, sir?” - - “The garden in which stands my humble abode is separated only by - a lane from Rosings Park, her ladyship’s residence.” - - “I think you said she was a widow, sir? Has she any family?” - - “She has only one daughter, the heiress of Rosings, and of very - extensive property.” - - “Ah!” said Mrs. Bennet, shaking her head, “then she is better off - than many girls. And what sort of young lady is she? Is she - handsome?” - - “She is a most charming young lady indeed. Lady Catherine herself - says that, in point of true beauty, Miss de Bourgh is far - superior to the handsomest of her sex, because there is that in - her features which marks the young lady of distinguished birth. - She is unfortunately of a sickly constitution, which has - prevented her from making that progress in many accomplishments - which she could not have otherwise failed of, as I am informed by - the lady who superintended her education, and who still resides - with them. But she is perfectly amiable, and often condescends to - drive by my humble abode in her little phaeton and ponies.” - - “Has she been presented? I do not remember her name among the - ladies at court.” - - “Her indifferent state of health unhappily prevents her being in - town; and by that means, as I told Lady Catherine one day, has - deprived the British court of its brightest ornament. Her - ladyship seemed pleased with the idea; and you may imagine that I - am happy on every occasion to offer those little delicate - compliments which are always acceptable to ladies. I have more - than once observed to Lady Catherine, that her charming daughter - seemed born to be a duchess, and that the most elevated rank, - instead of giving her consequence, would be adorned by her. These - are the kind of little things which please her ladyship, and it - is a sort of attention which I conceive myself peculiarly bound - to pay.” - - “You judge very properly,” said Mr. Bennet, “and it is happy for - you that you possess the talent of flattering with delicacy. May - I ask whether these pleasing attentions proceed from the impulse - of the moment, or are the result of previous study?” - - “They arise chiefly from what is passing at the time, and though - I sometimes amuse myself with suggesting and arranging such - little elegant compliments as may be adapted to ordinary - occasions, I always wish to give them as unstudied an air as - possible.” - - Mr. Bennet’s expectations were fully answered. His cousin was as - absurd as he had hoped, and he listened to him with the keenest - enjoyment, maintaining at the same time the most resolute - composure of countenance, and, except in an occasional glance at - Elizabeth, requiring no partner in his pleasure. - - By tea-time, however, the dose had been enough, and Mr. Bennet - was glad to take his guest into the drawing-room again, and, when - tea was over, glad to invite him to read aloud to the ladies. Mr. - Collins readily assented, and a book was produced; but, on - beholding it (for everything announced it to be from a - circulating library), he started back, and begging pardon, - protested that he never read novels. Kitty stared at him, and - Lydia exclaimed. Other books were produced, and after some - deliberation he chose Fordyce’s Sermons. Lydia gaped as he opened - the volume, and before he had, with very monotonous solemnity, - read three pages, she interrupted him with: - - “Do you know, mamma, that my uncle Phillips talks of turning away - Richard; and if he does, Colonel Forster will hire him. My aunt - told me so herself on Saturday. I shall walk to Meryton to-morrow - to hear more about it, and to ask when Mr. Denny comes back from - town.” - - Lydia was bid by her two eldest sisters to hold her tongue; but - Mr. Collins, much offended, laid aside his book, and said: - - “I have often observed how little young ladies are interested by - books of a serious stamp, though written solely for their - benefit. It amazes me, I confess; for, certainly, there can be - nothing so advantageous to them as instruction. But I will no - longer importune my young cousin.” - - Then turning to Mr. Bennet, he offered himself as his antagonist - at backgammon. Mr. Bennet accepted the challenge, observing that - he acted very wisely in leaving the girls to their own trifling - amusements. Mrs. Bennet and her daughters apologised most civilly - for Lydia’s interruption, and promised that it should not occur - again, if he would resume his book; but Mr. Collins, after - assuring them that he bore his young cousin no ill-will, and - should never resent her behaviour as any affront, seated himself - at another table with Mr. Bennet, and prepared for backgammon. - - - - - Chapter 15 - - Mr. Collins was not a sensible man, and the deficiency of nature - had been but little assisted by education or society; the - greatest part of his life having been spent under the guidance of - an illiterate and miserly father; and though he belonged to one - of the universities, he had merely kept the necessary terms, - without forming at it any useful acquaintance. The subjection in - which his father had brought him up had given him originally - great humility of manner; but it was now a good deal counteracted - by the self-conceit of a weak head, living in retirement, and the - consequential feelings of early and unexpected prosperity. A - fortunate chance had recommended him to Lady Catherine de Bourgh - when the living of Hunsford was vacant; and the respect which he - felt for her high rank, and his veneration for her as his - patroness, mingling with a very good opinion of himself, of his - authority as a clergyman, and his right as a rector, made him - altogether a mixture of pride and obsequiousness, self-importance - and humility. - - Having now a good house and a very sufficient income, he intended - to marry; and in seeking a reconciliation with the Longbourn - family he had a wife in view, as he meant to choose one of the - daughters, if he found them as handsome and amiable as they were - represented by common report. This was his plan of amends—of - atonement—for inheriting their father’s estate; and he thought it - an excellent one, full of eligibility and suitableness, and - excessively generous and disinterested on his own part. - - His plan did not vary on seeing them. Miss Bennet’s lovely face - confirmed his views, and established all his strictest notions of - what was due to seniority; and for the first evening _she_ was - his settled choice. The next morning, however, made an - alteration; for in a quarter of an hour’s _tÊte-à-tÊte_ with Mrs. - Bennet before breakfast, a conversation beginning with his - parsonage-house, and leading naturally to the avowal of his - hopes, that a mistress might be found for it at Longbourn, - produced from her, amid very complaisant smiles and general - encouragement, a caution against the very Jane he had fixed on. - “As to her _younger_ daughters, she could not take upon her to - say—she could not positively answer—but she did not _know_ of any - prepossession; her _eldest_ daughter, she must just mention—she - felt it incumbent on her to hint, was likely to be very soon - engaged.” - - Mr. Collins had only to change from Jane to Elizabeth—and it was - soon done—done while Mrs. Bennet was stirring the fire. - Elizabeth, equally next to Jane in birth and beauty, succeeded - her of course. - - Mrs. Bennet treasured up the hint, and trusted that she might - soon have two daughters married; and the man whom she could not - bear to speak of the day before was now high in her good graces. - - Lydia’s intention of walking to Meryton was not forgotten; every - sister except Mary agreed to go with her; and Mr. Collins was to - attend them, at the request of Mr. Bennet, who was most anxious - to get rid of him, and have his library to himself; for thither - Mr. Collins had followed him after breakfast; and there he would - continue, nominally engaged with one of the largest folios in the - collection, but really talking to Mr. Bennet, with little - cessation, of his house and garden at Hunsford. Such doings - discomposed Mr. Bennet exceedingly. In his library he had been - always sure of leisure and tranquillity; and though prepared, as - he told Elizabeth, to meet with folly and conceit in every other - room of the house, he was used to be free from them there; his - civility, therefore, was most prompt in inviting Mr. Collins to - join his daughters in their walk; and Mr. Collins, being in fact - much better fitted for a walker than a reader, was extremely - pleased to close his large book, and go. - - In pompous nothings on his side, and civil assents on that of his - cousins, their time passed till they entered Meryton. The - attention of the younger ones was then no longer to be gained by - _him_. Their eyes were immediately wandering up in the street in - quest of the officers, and nothing less than a very smart bonnet - indeed, or a really new muslin in a shop window, could recall - them. - - But the attention of every lady was soon caught by a young man, - whom they had never seen before, of most gentlemanlike - appearance, walking with another officer on the other side of the - way. The officer was the very Mr. Denny concerning whose return - from London Lydia came to inquire, and he bowed as they passed. - All were struck with the stranger’s air, all wondered who he - could be; and Kitty and Lydia, determined if possible to find - out, led the way across the street, under pretense of wanting - something in an opposite shop, and fortunately had just gained - the pavement when the two gentlemen, turning back, had reached - the same spot. Mr. Denny addressed them directly, and entreated - permission to introduce his friend, Mr. Wickham, who had returned - with him the day before from town, and he was happy to say had - accepted a commission in their corps. This was exactly as it - should be; for the young man wanted only regimentals to make him - completely charming. His appearance was greatly in his favour; he - had all the best part of beauty, a fine countenance, a good - figure, and very pleasing address. The introduction was followed - up on his side by a happy readiness of conversation—a readiness - at the same time perfectly correct and unassuming; and the whole - party were still standing and talking together very agreeably, - when the sound of horses drew their notice, and Darcy and Bingley - were seen riding down the street. On distinguishing the ladies of - the group, the two gentlemen came directly towards them, and - began the usual civilities. Bingley was the principal spokesman, - and Miss Bennet the principal object. He was then, he said, on - his way to Longbourn on purpose to inquire after her. Mr. Darcy - corroborated it with a bow, and was beginning to determine not to - fix his eyes on Elizabeth, when they were suddenly arrested by - the sight of the stranger, and Elizabeth happening to see the - countenance of both as they looked at each other, was all - astonishment at the effect of the meeting. Both changed colour, - one looked white, the other red. Mr. Wickham, after a few - moments, touched his hat—a salutation which Mr. Darcy just - deigned to return. What could be the meaning of it? It was - impossible to imagine; it was impossible not to long to know. - - In another minute, Mr. Bingley, but without seeming to have - noticed what passed, took leave and rode on with his friend. - - Mr. Denny and Mr. Wickham walked with the young ladies to the - door of Mr. Phillip’s house, and then made their bows, in spite - of Miss Lydia’s pressing entreaties that they should come in, and - even in spite of Mrs. Phillips’s throwing up the parlour window - and loudly seconding the invitation. - - Mrs. Phillips was always glad to see her nieces; and the two - eldest, from their recent absence, were particularly welcome, and - she was eagerly expressing her surprise at their sudden return - home, which, as their own carriage had not fetched them, she - should have known nothing about, if she had not happened to see - Mr. Jones’s shop-boy in the street, who had told her that they - were not to send any more draughts to Netherfield because the - Miss Bennets were come away, when her civility was claimed - towards Mr. Collins by Jane’s introduction of him. She received - him with her very best politeness, which he returned with as much - more, apologising for his intrusion, without any previous - acquaintance with her, which he could not help flattering - himself, however, might be justified by his relationship to the - young ladies who introduced him to her notice. Mrs. Phillips was - quite awed by such an excess of good breeding; but her - contemplation of one stranger was soon put to an end by - exclamations and inquiries about the other; of whom, however, she - could only tell her nieces what they already knew, that Mr. Denny - had brought him from London, and that he was to have a - lieutenant’s commission in the ——shire. She had been watching him - the last hour, she said, as he walked up and down the street, and - had Mr. Wickham appeared, Kitty and Lydia would certainly have - continued the occupation, but unluckily no one passed windows now - except a few of the officers, who, in comparison with the - stranger, were become “stupid, disagreeable fellows.” Some of - them were to dine with the Phillipses the next day, and their - aunt promised to make her husband call on Mr. Wickham, and give - him an invitation also, if the family from Longbourn would come - in the evening. This was agreed to, and Mrs. Phillips protested - that they would have a nice comfortable noisy game of lottery - tickets, and a little bit of hot supper afterwards. The prospect - of such delights was very cheering, and they parted in mutual - good spirits. Mr. Collins repeated his apologies in quitting the - room, and was assured with unwearying civility that they were - perfectly needless. - - As they walked home, Elizabeth related to Jane what she had seen - pass between the two gentlemen; but though Jane would have - defended either or both, had they appeared to be in the wrong, - she could no more explain such behaviour than her sister. - - Mr. Collins on his return highly gratified Mrs. Bennet by - admiring Mrs. Phillips’s manners and politeness. He protested - that, except Lady Catherine and her daughter, he had never seen a - more elegant woman; for she had not only received him with the - utmost civility, but even pointedly included him in her - invitation for the next evening, although utterly unknown to her - before. Something, he supposed, might be attributed to his - connection with them, but yet he had never met with so much - attention in the whole course of his life. - - - - - Chapter 16 - - As no objection was made to the young people’s engagement with - their aunt, and all Mr. Collins’s scruples of leaving Mr. and - Mrs. Bennet for a single evening during his visit were most - steadily resisted, the coach conveyed him and his five cousins at - a suitable hour to Meryton; and the girls had the pleasure of - hearing, as they entered the drawing-room, that Mr. Wickham had - accepted their uncle’s invitation, and was then in the house. - - When this information was given, and they had all taken their - seats, Mr. Collins was at leisure to look around him and admire, - and he was so much struck with the size and furniture of the - apartment, that he declared he might almost have supposed himself - in the small summer breakfast parlour at Rosings; a comparison - that did not at first convey much gratification; but when Mrs. - Phillips understood from him what Rosings was, and who was its - proprietor—when she had listened to the description of only one - of Lady Catherine’s drawing-rooms, and found that the - chimney-piece alone had cost eight hundred pounds, she felt all - the force of the compliment, and would hardly have resented a - comparison with the housekeeper’s room. - - In describing to her all the grandeur of Lady Catherine and her - mansion, with occasional digressions in praise of his own humble - abode, and the improvements it was receiving, he was happily - employed until the gentlemen joined them; and he found in Mrs. - Phillips a very attentive listener, whose opinion of his - consequence increased with what she heard, and who was resolving - to retail it all among her neighbours as soon as she could. To - the girls, who could not listen to their cousin, and who had - nothing to do but to wish for an instrument, and examine their - own indifferent imitations of china on the mantelpiece, the - interval of waiting appeared very long. It was over at last, - however. The gentlemen did approach, and when Mr. Wickham walked - into the room, Elizabeth felt that she had neither been seeing - him before, nor thinking of him since, with the smallest degree - of unreasonable admiration. The officers of the ——shire were in - general a very creditable, gentlemanlike set, and the best of - them were of the present party; but Mr. Wickham was as far beyond - them all in person, countenance, air, and walk, as _they_ were - superior to the broad-faced, stuffy uncle Phillips, breathing - port wine, who followed them into the room. - - Mr. Wickham was the happy man towards whom almost every female - eye was turned, and Elizabeth was the happy woman by whom he - finally seated himself; and the agreeable manner in which he - immediately fell into conversation, though it was only on its - being a wet night, made her feel that the commonest, dullest, - most threadbare topic might be rendered interesting by the skill - of the speaker. - - With such rivals for the notice of the fair as Mr. Wickham and - the officers, Mr. Collins seemed to sink into insignificance; to - the young ladies he certainly was nothing; but he had still at - intervals a kind listener in Mrs. Phillips, and was by her - watchfulness, most abundantly supplied with coffee and muffin. - When the card-tables were placed, he had the opportunity of - obliging her in turn, by sitting down to whist. - - “I know little of the game at present,” said he, “but I shall be - glad to improve myself, for in my situation in life—” Mrs. - Phillips was very glad for his compliance, but could not wait for - his reason. - - Mr. Wickham did not play at whist, and with ready delight was he - received at the other table between Elizabeth and Lydia. At first - there seemed danger of Lydia’s engrossing him entirely, for she - was a most determined talker; but being likewise extremely fond - of lottery tickets, she soon grew too much interested in the - game, too eager in making bets and exclaiming after prizes to - have attention for anyone in particular. Allowing for the common - demands of the game, Mr. Wickham was therefore at leisure to talk - to Elizabeth, and she was very willing to hear him, though what - she chiefly wished to hear she could not hope to be told—the - history of his acquaintance with Mr. Darcy. She dared not even - mention that gentleman. Her curiosity, however, was unexpectedly - relieved. Mr. Wickham began the subject himself. He inquired how - far Netherfield was from Meryton; and, after receiving her - answer, asked in a hesitating manner how long Mr. Darcy had been - staying there. - - “About a month,” said Elizabeth; and then, unwilling to let the - subject drop, added, “He is a man of very large property in - Derbyshire, I understand.” - - “Yes,” replied Mr. Wickham; “his estate there is a noble one. A - clear ten thousand per annum. You could not have met with a - person more capable of giving you certain information on that - head than myself, for I have been connected with his family in a - particular manner from my infancy.” - - Elizabeth could not but look surprised. - - “You may well be surprised, Miss Bennet, at such an assertion, - after seeing, as you probably might, the very cold manner of our - meeting yesterday. Are you much acquainted with Mr. Darcy?” - - “As much as I ever wish to be,” cried Elizabeth very warmly. “I - have spent four days in the same house with him, and I think him - very disagreeable.” - - “I have no right to give _my_ opinion,” said Wickham, “as to his - being agreeable or otherwise. I am not qualified to form one. I - have known him too long and too well to be a fair judge. It is - impossible for _me_ to be impartial. But I believe your opinion - of him would in general astonish—and perhaps you would not - express it quite so strongly anywhere else. Here you are in your - own family.” - - “Upon my word, I say no more _here_ than I might say in any house - in the neighbourhood, except Netherfield. He is not at all liked - in Hertfordshire. Everybody is disgusted with his pride. You will - not find him more favourably spoken of by anyone.” - - “I cannot pretend to be sorry,” said Wickham, after a short - interruption, “that he or that any man should not be estimated - beyond their deserts; but with _him_ I believe it does not often - happen. The world is blinded by his fortune and consequence, or - frightened by his high and imposing manners, and sees him only as - he chooses to be seen.” - - “I should take him, even on _my_ slight acquaintance, to be an - ill-tempered man.” Wickham only shook his head. - - “I wonder,” said he, at the next opportunity of speaking, - “whether he is likely to be in this country much longer.” - - “I do not at all know; but I _heard_ nothing of his going away - when I was at Netherfield. I hope your plans in favour of the - ——shire will not be affected by his being in the neighbourhood.” - - “Oh! no—it is not for _me_ to be driven away by Mr. Darcy. If - _he_ wishes to avoid seeing _me_, he must go. We are not on - friendly terms, and it always gives me pain to meet him, but I - have no reason for avoiding _him_ but what I might proclaim - before all the world, a sense of very great ill-usage, and most - painful regrets at his being what he is. His father, Miss Bennet, - the late Mr. Darcy, was one of the best men that ever breathed, - and the truest friend I ever had; and I can never be in company - with this Mr. Darcy without being grieved to the soul by a - thousand tender recollections. His behaviour to myself has been - scandalous; but I verily believe I could forgive him anything and - everything, rather than his disappointing the hopes and - disgracing the memory of his father.” - - Elizabeth found the interest of the subject increase, and - listened with all her heart; but the delicacy of it prevented - further inquiry. - - Mr. Wickham began to speak on more general topics, Meryton, the - neighbourhood, the society, appearing highly pleased with all - that he had yet seen, and speaking of the latter with gentle but - very intelligible gallantry. - - “It was the prospect of constant society, and good society,” he - added, “which was my chief inducement to enter the ——shire. I - knew it to be a most respectable, agreeable corps, and my friend - Denny tempted me further by his account of their present - quarters, and the very great attentions and excellent - acquaintances Meryton had procured them. Society, I own, is - necessary to me. I have been a disappointed man, and my spirits - will not bear solitude. I _must_ have employment and society. A - military life is not what I was intended for, but circumstances - have now made it eligible. The church _ought_ to have been my - profession—I was brought up for the church, and I should at this - time have been in possession of a most valuable living, had it - pleased the gentleman we were speaking of just now.” - - “Indeed!” - - “Yes—the late Mr. Darcy bequeathed me the next presentation of - the best living in his gift. He was my godfather, and excessively - attached to me. I cannot do justice to his kindness. He meant to - provide for me amply, and thought he had done it; but when the - living fell, it was given elsewhere.” - - “Good heavens!” cried Elizabeth; “but how could _that_ be? How - could his will be disregarded? Why did you not seek legal - redress?” - - “There was just such an informality in the terms of the bequest - as to give me no hope from law. A man of honour could not have - doubted the intention, but Mr. Darcy chose to doubt it—or to - treat it as a merely conditional recommendation, and to assert - that I had forfeited all claim to it by extravagance, - imprudence—in short anything or nothing. Certain it is, that the - living became vacant two years ago, exactly as I was of an age to - hold it, and that it was given to another man; and no less - certain is it, that I cannot accuse myself of having really done - anything to deserve to lose it. I have a warm, unguarded temper, - and I may have spoken my opinion _of_ him, and _to_ him, too - freely. I can recall nothing worse. But the fact is, that we are - very different sort of men, and that he hates me.” - - “This is quite shocking! He deserves to be publicly disgraced.” - - “Some time or other he _will_ be—but it shall not be by _me_. - Till I can forget his father, I can never defy or expose _him_.” - - Elizabeth honoured him for such feelings, and thought him - handsomer than ever as he expressed them. - - “But what,” said she, after a pause, “can have been his motive? - What can have induced him to behave so cruelly?” - - “A thorough, determined dislike of me—a dislike which I cannot - but attribute in some measure to jealousy. Had the late Mr. Darcy - liked me less, his son might have borne with me better; but his - father’s uncommon attachment to me irritated him, I believe, very - early in life. He had not a temper to bear the sort of - competition in which we stood—the sort of preference which was - often given me.” - - “I had not thought Mr. Darcy so bad as this—though I have never - liked him. I had not thought so very ill of him. I had supposed - him to be despising his fellow-creatures in general, but did not - suspect him of descending to such malicious revenge, such - injustice, such inhumanity as this.” - - After a few minutes’ reflection, however, she continued, “I _do_ - remember his boasting one day, at Netherfield, of the - implacability of his resentments, of his having an unforgiving - temper. His disposition must be dreadful.” - - “I will not trust myself on the subject,” replied Wickham; “_I_ - can hardly be just to him.” - - Elizabeth was again deep in thought, and after a time exclaimed, - “To treat in such a manner the godson, the friend, the favourite - of his father!” She could have added, “A young man, too, like - _you_, whose very countenance may vouch for your being - amiable”—but she contented herself with, “and one, too, who had - probably been his companion from childhood, connected together, - as I think you said, in the closest manner!” - - “We were born in the same parish, within the same park; the - greatest part of our youth was passed together; inmates of the - same house, sharing the same amusements, objects of the same - parental care. _My_ father began life in the profession which - your uncle, Mr. Phillips, appears to do so much credit to—but he - gave up everything to be of use to the late Mr. Darcy and devoted - all his time to the care of the Pemberley property. He was most - highly esteemed by Mr. Darcy, a most intimate, confidential - friend. Mr. Darcy often acknowledged himself to be under the - greatest obligations to my father’s active superintendence, and - when, immediately before my father’s death, Mr. Darcy gave him a - voluntary promise of providing for me, I am convinced that he - felt it to be as much a debt of gratitude to _him_, as of his - affection to myself.” - - “How strange!” cried Elizabeth. “How abominable! I wonder that - the very pride of this Mr. Darcy has not made him just to you! If - from no better motive, that he should not have been too proud to - be dishonest—for dishonesty I must call it.” - - “It _is_ wonderful,” replied Wickham, “for almost all his actions - may be traced to pride; and pride had often been his best friend. - It has connected him nearer with virtue than with any other - feeling. But we are none of us consistent, and in his behaviour - to me there were stronger impulses even than pride.” - - “Can such abominable pride as his have ever done him good?” - - “Yes. It has often led him to be liberal and generous, to give - his money freely, to display hospitality, to assist his tenants, - and relieve the poor. Family pride, and _filial_ pride—for he is - very proud of what his father was—have done this. Not to appear - to disgrace his family, to degenerate from the popular qualities, - or lose the influence of the Pemberley House, is a powerful - motive. He has also _brotherly_ pride, which, with _some_ - brotherly affection, makes him a very kind and careful guardian - of his sister, and you will hear him generally cried up as the - most attentive and best of brothers.” - - “What sort of girl is Miss Darcy?” - - He shook his head. “I wish I could call her amiable. It gives me - pain to speak ill of a Darcy. But she is too much like her - brother—very, very proud. As a child, she was affectionate and - pleasing, and extremely fond of me; and I have devoted hours and - hours to her amusement. But she is nothing to me now. She is a - handsome girl, about fifteen or sixteen, and, I understand, - highly accomplished. Since her father’s death, her home has been - London, where a lady lives with her, and superintends her - education.” - - After many pauses and many trials of other subjects, Elizabeth - could not help reverting once more to the first, and saying: - - “I am astonished at his intimacy with Mr. Bingley! How can Mr. - Bingley, who seems good humour itself, and is, I really believe, - truly amiable, be in friendship with such a man? How can they - suit each other? Do you know Mr. Bingley?” - - “Not at all.” - - “He is a sweet-tempered, amiable, charming man. He cannot know - what Mr. Darcy is.” - - “Probably not; but Mr. Darcy can please where he chooses. He does - not want abilities. He can be a conversible companion if he - thinks it worth his while. Among those who are at all his equals - in consequence, he is a very different man from what he is to the - less prosperous. His pride never deserts him; but with the rich - he is liberal-minded, just, sincere, rational, honourable, and - perhaps agreeable—allowing something for fortune and figure.” - - The whist party soon afterwards breaking up, the players gathered - round the other table and Mr. Collins took his station between - his cousin Elizabeth and Mrs. Phillips. The usual inquiries as to - his success were made by the latter. It had not been very great; - he had lost every point; but when Mrs. Phillips began to express - her concern thereupon, he assured her with much earnest gravity - that it was not of the least importance, that he considered the - money as a mere trifle, and begged that she would not make - herself uneasy. - - “I know very well, madam,” said he, “that when persons sit down - to a card-table, they must take their chances of these things, - and happily I am not in such circumstances as to make five - shillings any object. There are undoubtedly many who could not - say the same, but thanks to Lady Catherine de Bourgh, I am - removed far beyond the necessity of regarding little matters.” - - Mr. Wickham’s attention was caught; and after observing Mr. - Collins for a few moments, he asked Elizabeth in a low voice - whether her relation was very intimately acquainted with the - family of de Bourgh. - - “Lady Catherine de Bourgh,” she replied, “has very lately given - him a living. I hardly know how Mr. Collins was first introduced - to her notice, but he certainly has not known her long.” - - “You know of course that Lady Catherine de Bourgh and Lady Anne - Darcy were sisters; consequently that she is aunt to the present - Mr. Darcy.” - - “No, indeed, I did not. I knew nothing at all of Lady Catherine’s - connections. I never heard of her existence till the day before - yesterday.” - - “Her daughter, Miss de Bourgh, will have a very large fortune, - and it is believed that she and her cousin will unite the two - estates.” - - This information made Elizabeth smile, as she thought of poor - Miss Bingley. Vain indeed must be all her attentions, vain and - useless her affection for his sister and her praise of himself, - if he were already self-destined for another. - - “Mr. Collins,” said she, “speaks highly both of Lady Catherine - and her daughter; but from some particulars that he has related - of her ladyship, I suspect his gratitude misleads him, and that - in spite of her being his patroness, she is an arrogant, - conceited woman.” - - “I believe her to be both in a great degree,” replied Wickham; “I - have not seen her for many years, but I very well remember that I - never liked her, and that her manners were dictatorial and - insolent. She has the reputation of being remarkably sensible and - clever; but I rather believe she derives part of her abilities - from her rank and fortune, part from her authoritative manner, - and the rest from the pride for her nephew, who chooses that - everyone connected with him should have an understanding of the - first class.” - - Elizabeth allowed that he had given a very rational account of - it, and they continued talking together, with mutual satisfaction - till supper put an end to cards, and gave the rest of the ladies - their share of Mr. Wickham’s attentions. There could be no - conversation in the noise of Mrs. Phillips’s supper party, but - his manners recommended him to everybody. Whatever he said, was - said well; and whatever he did, done gracefully. Elizabeth went - away with her head full of him. She could think of nothing but of - Mr. Wickham, and of what he had told her, all the way home; but - there was not time for her even to mention his name as they went, - for neither Lydia nor Mr. Collins were once silent. Lydia talked - incessantly of lottery tickets, of the fish she had lost and the - fish she had won; and Mr. Collins in describing the civility of - Mr. and Mrs. Phillips, protesting that he did not in the least - regard his losses at whist, enumerating all the dishes at supper, - and repeatedly fearing that he crowded his cousins, had more to - say than he could well manage before the carriage stopped at - Longbourn House. - - - - - Chapter 17 - - Elizabeth related to Jane the next day what had passed between - Mr. Wickham and herself. Jane listened with astonishment and - concern; she knew not how to believe that Mr. Darcy could be so - unworthy of Mr. Bingley’s regard; and yet, it was not in her - nature to question the veracity of a young man of such amiable - appearance as Wickham. The possibility of his having endured such - unkindness, was enough to interest all her tender feelings; and - nothing remained therefore to be done, but to think well of them - both, to defend the conduct of each, and throw into the account - of accident or mistake whatever could not be otherwise explained. - - “They have both,” said she, “been deceived, I dare say, in some - way or other, of which we can form no idea. Interested people - have perhaps misrepresented each to the other. It is, in short, - impossible for us to conjecture the causes or circumstances which - may have alienated them, without actual blame on either side.” - - “Very true, indeed; and now, my dear Jane, what have you got to - say on behalf of the interested people who have probably been - concerned in the business? Do clear _them_ too, or we shall be - obliged to think ill of somebody.” - - “Laugh as much as you choose, but you will not laugh me out of my - opinion. My dearest Lizzy, do but consider in what a disgraceful - light it places Mr. Darcy, to be treating his father’s favourite - in such a manner, one whom his father had promised to provide - for. It is impossible. No man of common humanity, no man who had - any value for his character, could be capable of it. Can his most - intimate friends be so excessively deceived in him? Oh! no.” - - “I can much more easily believe Mr. Bingley’s being imposed on, - than that Mr. Wickham should invent such a history of himself as - he gave me last night; names, facts, everything mentioned without - ceremony. If it be not so, let Mr. Darcy contradict it. Besides, - there was truth in his looks.” - - “It is difficult indeed—it is distressing. One does not know what - to think.” - - “I beg your pardon; one knows exactly what to think.” - - But Jane could think with certainty on only one point—that Mr. - Bingley, if he _had been_ imposed on, would have much to suffer - when the affair became public. - - The two young ladies were summoned from the shrubbery, where this - conversation passed, by the arrival of the very persons of whom - they had been speaking; Mr. Bingley and his sisters came to give - their personal invitation for the long-expected ball at - Netherfield, which was fixed for the following Tuesday. The two - ladies were delighted to see their dear friend again, called it - an age since they had met, and repeatedly asked what she had been - doing with herself since their separation. To the rest of the - family they paid little attention; avoiding Mrs. Bennet as much - as possible, saying not much to Elizabeth, and nothing at all to - the others. They were soon gone again, rising from their seats - with an activity which took their brother by surprise, and - hurrying off as if eager to escape from Mrs. Bennet’s civilities. - - The prospect of the Netherfield ball was extremely agreeable to - every female of the family. Mrs. Bennet chose to consider it as - given in compliment to her eldest daughter, and was particularly - flattered by receiving the invitation from Mr. Bingley himself, - instead of a ceremonious card. Jane pictured to herself a happy - evening in the society of her two friends, and the attentions of - their brother; and Elizabeth thought with pleasure of dancing a - great deal with Mr. Wickham, and of seeing a confirmation of - everything in Mr. Darcy’s look and behaviour. The happiness - anticipated by Catherine and Lydia depended less on any single - event, or any particular person, for though they each, like - Elizabeth, meant to dance half the evening with Mr. Wickham, he - was by no means the only partner who could satisfy them, and a - ball was, at any rate, a ball. And even Mary could assure her - family that she had no disinclination for it. - - “While I can have my mornings to myself,” said she, “it is - enough—I think it is no sacrifice to join occasionally in evening - engagements. Society has claims on us all; and I profess myself - one of those who consider intervals of recreation and amusement - as desirable for everybody.” - - Elizabeth’s spirits were so high on this occasion, that though - she did not often speak unnecessarily to Mr. Collins, she could - not help asking him whether he intended to accept Mr. Bingley’s - invitation, and if he did, whether he would think it proper to - join in the evening’s amusement; and she was rather surprised to - find that he entertained no scruple whatever on that head, and - was very far from dreading a rebuke either from the Archbishop, - or Lady Catherine de Bourgh, by venturing to dance. - - “I am by no means of the opinion, I assure you,” said he, “that a - ball of this kind, given by a young man of character, to - respectable people, can have any evil tendency; and I am so far - from objecting to dancing myself, that I shall hope to be - honoured with the hands of all my fair cousins in the course of - the evening; and I take this opportunity of soliciting yours, - Miss Elizabeth, for the two first dances especially, a preference - which I trust my cousin Jane will attribute to the right cause, - and not to any disrespect for her.” - - Elizabeth felt herself completely taken in. She had fully - proposed being engaged by Mr. Wickham for those very dances; and - to have Mr. Collins instead! her liveliness had never been worse - timed. There was no help for it, however. Mr. Wickham’s happiness - and her own were perforce delayed a little longer, and Mr. - Collins’s proposal accepted with as good a grace as she could. - She was not the better pleased with his gallantry from the idea - it suggested of something more. It now first struck her, that - _she_ was selected from among her sisters as worthy of being - mistress of Hunsford Parsonage, and of assisting to form a - quadrille table at Rosings, in the absence of more eligible - visitors. The idea soon reached to conviction, as she observed - his increasing civilities toward herself, and heard his frequent - attempt at a compliment on her wit and vivacity; and though more - astonished than gratified herself by this effect of her charms, - it was not long before her mother gave her to understand that the - probability of their marriage was extremely agreeable to _her_. - Elizabeth, however, did not choose to take the hint, being well - aware that a serious dispute must be the consequence of any - reply. Mr. Collins might never make the offer, and till he did, - it was useless to quarrel about him. - - If there had not been a Netherfield ball to prepare for and talk - of, the younger Miss Bennets would have been in a very pitiable - state at this time, for from the day of the invitation, to the - day of the ball, there was such a succession of rain as prevented - their walking to Meryton once. No aunt, no officers, no news - could be sought after—the very shoe-roses for Netherfield were - got by proxy. Even Elizabeth might have found some trial of her - patience in weather which totally suspended the improvement of - her acquaintance with Mr. Wickham; and nothing less than a dance - on Tuesday, could have made such a Friday, Saturday, Sunday, and - Monday endurable to Kitty and Lydia. - - - - - Chapter 18 - - Till Elizabeth entered the drawing-room at Netherfield, and - looked in vain for Mr. Wickham among the cluster of red coats - there assembled, a doubt of his being present had never occurred - to her. The certainty of meeting him had not been checked by any - of those recollections that might not unreasonably have alarmed - her. She had dressed with more than usual care, and prepared in - the highest spirits for the conquest of all that remained - unsubdued of his heart, trusting that it was not more than might - be won in the course of the evening. But in an instant arose the - dreadful suspicion of his being purposely omitted for Mr. Darcy’s - pleasure in the Bingleys’ invitation to the officers; and though - this was not exactly the case, the absolute fact of his absence - was pronounced by his friend Denny, to whom Lydia eagerly - applied, and who told them that Wickham had been obliged to go to - town on business the day before, and was not yet returned; - adding, with a significant smile, “I do not imagine his business - would have called him away just now, if he had not wanted to - avoid a certain gentleman here.” - - This part of his intelligence, though unheard by Lydia, was - caught by Elizabeth, and, as it assured her that Darcy was not - less answerable for Wickham’s absence than if her first surmise - had been just, every feeling of displeasure against the former - was so sharpened by immediate disappointment, that she could - hardly reply with tolerable civility to the polite inquiries - which he directly afterwards approached to make. Attendance, - forbearance, patience with Darcy, was injury to Wickham. She was - resolved against any sort of conversation with him, and turned - away with a degree of ill-humour which she could not wholly - surmount even in speaking to Mr. Bingley, whose blind partiality - provoked her. - - But Elizabeth was not formed for ill-humour; and though every - prospect of her own was destroyed for the evening, it could not - dwell long on her spirits; and having told all her griefs to - Charlotte Lucas, whom she had not seen for a week, she was soon - able to make a voluntary transition to the oddities of her - cousin, and to point him out to her particular notice. The first - two dances, however, brought a return of distress; they were - dances of mortification. Mr. Collins, awkward and solemn, - apologising instead of attending, and often moving wrong without - being aware of it, gave her all the shame and misery which a - disagreeable partner for a couple of dances can give. The moment - of her release from him was ecstasy. - - She danced next with an officer, and had the refreshment of - talking of Wickham, and of hearing that he was universally liked. - When those dances were over, she returned to Charlotte Lucas, and - was in conversation with her, when she found herself suddenly - addressed by Mr. Darcy who took her so much by surprise in his - application for her hand, that, without knowing what she did, she - accepted him. He walked away again immediately, and she was left - to fret over her own want of presence of mind; Charlotte tried to - console her: - - “I dare say you will find him very agreeable.” - - “Heaven forbid! _That_ would be the greatest misfortune of all! - To find a man agreeable whom one is determined to hate! Do not - wish me such an evil.” - - When the dancing recommenced, however, and Darcy approached to - claim her hand, Charlotte could not help cautioning her in a - whisper, not to be a simpleton, and allow her fancy for Wickham - to make her appear unpleasant in the eyes of a man ten times his - consequence. Elizabeth made no answer, and took her place in the - set, amazed at the dignity to which she was arrived in being - allowed to stand opposite to Mr. Darcy, and reading in her - neighbours’ looks, their equal amazement in beholding it. They - stood for some time without speaking a word; and she began to - imagine that their silence was to last through the two dances, - and at first was resolved not to break it; till suddenly fancying - that it would be the greater punishment to her partner to oblige - him to talk, she made some slight observation on the dance. He - replied, and was again silent. After a pause of some minutes, she - addressed him a second time with:—“It is _your_ turn to say - something now, Mr. Darcy. _I_ talked about the dance, and _you_ - ought to make some sort of remark on the size of the room, or the - number of couples.” - - He smiled, and assured her that whatever she wished him to say - should be said. - - “Very well. That reply will do for the present. Perhaps by and by - I may observe that private balls are much pleasanter than public - ones. But _now_ we may be silent.” - - “Do you talk by rule, then, while you are dancing?” - - “Sometimes. One must speak a little, you know. It would look odd - to be entirely silent for half an hour together; and yet for the - advantage of _some_, conversation ought to be so arranged, as - that they may have the trouble of saying as little as possible.” - - “Are you consulting your own feelings in the present case, or do - you imagine that you are gratifying mine?” - - “Both,” replied Elizabeth archly; “for I have always seen a great - similarity in the turn of our minds. We are each of an unsocial, - taciturn disposition, unwilling to speak, unless we expect to say - something that will amaze the whole room, and be handed down to - posterity with all the _ÃĐclat_ of a proverb.” - - “This is no very striking resemblance of your own character, I am - sure,” said he. “How near it may be to _mine_, I cannot pretend - to say. _You_ think it a faithful portrait undoubtedly.” - - “I must not decide on my own performance.” - - He made no answer, and they were again silent till they had gone - down the dance, when he asked her if she and her sisters did not - very often walk to Meryton. She answered in the affirmative, and, - unable to resist the temptation, added, “When you met us there - the other day, we had just been forming a new acquaintance.” - - The effect was immediate. A deeper shade of _hauteur_ overspread - his features, but he said not a word, and Elizabeth, though - blaming herself for her own weakness, could not go on. At length - Darcy spoke, and in a constrained manner said, “Mr. Wickham is - blessed with such happy manners as may ensure his _making_ - friends—whether he may be equally capable of _retaining_ them, is - less certain.” - - “He has been so unlucky as to lose your friendship,” replied - Elizabeth with emphasis, “and in a manner which he is likely to - suffer from all his life.” - - Darcy made no answer, and seemed desirous of changing the - subject. At that moment, Sir William Lucas appeared close to - them, meaning to pass through the set to the other side of the - room; but on perceiving Mr. Darcy, he stopped with a bow of - superior courtesy to compliment him on his dancing and his - partner. - - “I have been most highly gratified indeed, my dear sir. Such very - superior dancing is not often seen. It is evident that you belong - to the first circles. Allow me to say, however, that your fair - partner does not disgrace you, and that I must hope to have this - pleasure often repeated, especially when a certain desirable - event, my dear Eliza (glancing at her sister and Bingley) shall - take place. What congratulations will then flow in! I appeal to - Mr. Darcy:—but let me not interrupt you, sir. You will not thank - me for detaining you from the bewitching converse of that young - lady, whose bright eyes are also upbraiding me.” - - The latter part of this address was scarcely heard by Darcy; but - Sir William’s allusion to his friend seemed to strike him - forcibly, and his eyes were directed with a very serious - expression towards Bingley and Jane, who were dancing together. - Recovering himself, however, shortly, he turned to his partner, - and said, “Sir William’s interruption has made me forget what we - were talking of.” - - “I do not think we were speaking at all. Sir William could not - have interrupted two people in the room who had less to say for - themselves. We have tried two or three subjects already without - success, and what we are to talk of next I cannot imagine.” - - “What think you of books?” said he, smiling. - - “Books—oh! no. I am sure we never read the same, or not with the - same feelings.” - - “I am sorry you think so; but if that be the case, there can at - least be no want of subject. We may compare our different - opinions.” - - “No—I cannot talk of books in a ball-room; my head is always full - of something else.” - - “The _present_ always occupies you in such scenes—does it?” said - he, with a look of doubt. - - “Yes, always,” she replied, without knowing what she said, for - her thoughts had wandered far from the subject, as soon - afterwards appeared by her suddenly exclaiming, “I remember - hearing you once say, Mr. Darcy, that you hardly ever forgave, - that your resentment once created was unappeasable. You are very - cautious, I suppose, as to its _being created?_” - - “I am,” said he, with a firm voice. - - “And never allow yourself to be blinded by prejudice?” - - “I hope not.” - - “It is particularly incumbent on those who never change their - opinion, to be secure of judging properly at first.” - - “May I ask to what these questions tend?” - - “Merely to the illustration of _your_ character,” said she, - endeavouring to shake off her gravity. “I am trying to make it - out.” - - “And what is your success?” - - She shook her head. “I do not get on at all. I hear such - different accounts of you as puzzle me exceedingly.” - - “I can readily believe,” answered he gravely, “that reports may - vary greatly with respect to me; and I could wish, Miss Bennet, - that you were not to sketch my character at the present moment, - as there is reason to fear that the performance would reflect no - credit on either.” - - “But if I do not take your likeness now, I may never have another - opportunity.” - - “I would by no means suspend any pleasure of yours,” he coldly - replied. She said no more, and they went down the other dance and - parted in silence; and on each side dissatisfied, though not to - an equal degree, for in Darcy’s breast there was a tolerably - powerful feeling towards her, which soon procured her pardon, and - directed all his anger against another. - - They had not long separated, when Miss Bingley came towards her, - and with an expression of civil disdain accosted her: - - “So, Miss Eliza, I hear you are quite delighted with George - Wickham! Your sister has been talking to me about him, and asking - me a thousand questions; and I find that the young man quite - forgot to tell you, among his other communication, that he was - the son of old Wickham, the late Mr. Darcy’s steward. Let me - recommend you, however, as a friend, not to give implicit - confidence to all his assertions; for as to Mr. Darcy’s using him - ill, it is perfectly false; for, on the contrary, he has always - been remarkably kind to him, though George Wickham has treated - Mr. Darcy in a most infamous manner. I do not know the - particulars, but I know very well that Mr. Darcy is not in the - least to blame, that he cannot bear to hear George Wickham - mentioned, and that though my brother thought that he could not - well avoid including him in his invitation to the officers, he - was excessively glad to find that he had taken himself out of the - way. His coming into the country at all is a most insolent thing, - indeed, and I wonder how he could presume to do it. I pity you, - Miss Eliza, for this discovery of your favourite’s guilt; but - really, considering his descent, one could not expect much - better.” - - “His guilt and his descent appear by your account to be the - same,” said Elizabeth angrily; “for I have heard you accuse him - of nothing worse than of being the son of Mr. Darcy’s steward, - and of _that_, I can assure you, he informed me himself.” - - “I beg your pardon,” replied Miss Bingley, turning away with a - sneer. “Excuse my interference—it was kindly meant.” - - “Insolent girl!” said Elizabeth to herself. “You are much - mistaken if you expect to influence me by such a paltry attack as - this. I see nothing in it but your own wilful ignorance and the - malice of Mr. Darcy.” She then sought her eldest sister, who had - undertaken to make inquiries on the same subject of Bingley. Jane - met her with a smile of such sweet complacency, a glow of such - happy expression, as sufficiently marked how well she was - satisfied with the occurrences of the evening. Elizabeth - instantly read her feelings, and at that moment solicitude for - Wickham, resentment against his enemies, and everything else, - gave way before the hope of Jane’s being in the fairest way for - happiness. - - “I want to know,” said she, with a countenance no less smiling - than her sister’s, “what you have learnt about Mr. Wickham. But - perhaps you have been too pleasantly engaged to think of any - third person; in which case you may be sure of my pardon.” - - “No,” replied Jane, “I have not forgotten him; but I have nothing - satisfactory to tell you. Mr. Bingley does not know the whole of - his history, and is quite ignorant of the circumstances which - have principally offended Mr. Darcy; but he will vouch for the - good conduct, the probity, and honour of his friend, and is - perfectly convinced that Mr. Wickham has deserved much less - attention from Mr. Darcy than he has received; and I am sorry to - say by his account as well as his sister’s, Mr. Wickham is by no - means a respectable young man. I am afraid he has been very - imprudent, and has deserved to lose Mr. Darcy’s regard.” - - “Mr. Bingley does not know Mr. Wickham himself?” - - “No; he never saw him till the other morning at Meryton.” - - “This account then is what he has received from Mr. Darcy. I am - satisfied. But what does he say of the living?” - - “He does not exactly recollect the circumstances, though he has - heard them from Mr. Darcy more than once, but he believes that it - was left to him _conditionally_ only.” - - “I have not a doubt of Mr. Bingley’s sincerity,” said Elizabeth - warmly; “but you must excuse my not being convinced by assurances - only. Mr. Bingley’s defense of his friend was a very able one, I - dare say; but since he is unacquainted with several parts of the - story, and has learnt the rest from that friend himself, I shall - venture to still think of both gentlemen as I did before.” - - She then changed the discourse to one more gratifying to each, - and on which there could be no difference of sentiment. Elizabeth - listened with delight to the happy, though modest hopes which - Jane entertained of Mr. Bingley’s regard, and said all in her - power to heighten her confidence in it. On their being joined by - Mr. Bingley himself, Elizabeth withdrew to Miss Lucas; to whose - inquiry after the pleasantness of her last partner she had - scarcely replied, before Mr. Collins came up to them, and told - her with great exultation that he had just been so fortunate as - to make a most important discovery. - - “I have found out,” said he, “by a singular accident, that there - is now in the room a near relation of my patroness. I happened to - overhear the gentleman himself mentioning to the young lady who - does the honours of the house the names of his cousin Miss de - Bourgh, and of her mother Lady Catherine. How wonderfully these - sort of things occur! Who would have thought of my meeting with, - perhaps, a nephew of Lady Catherine de Bourgh in this assembly! I - am most thankful that the discovery is made in time for me to pay - my respects to him, which I am now going to do, and trust he will - excuse my not having done it before. My total ignorance of the - connection must plead my apology.” - - “You are not going to introduce yourself to Mr. Darcy!” - - “Indeed I am. I shall entreat his pardon for not having done it - earlier. I believe him to be Lady Catherine’s _nephew_. It will - be in my power to assure him that her ladyship was quite well - yesterday se’nnight.” - - Elizabeth tried hard to dissuade him from such a scheme, assuring - him that Mr. Darcy would consider his addressing him without - introduction as an impertinent freedom, rather than a compliment - to his aunt; that it was not in the least necessary there should - be any notice on either side; and that if it were, it must belong - to Mr. Darcy, the superior in consequence, to begin the - acquaintance. Mr. Collins listened to her with the determined air - of following his own inclination, and, when she ceased speaking, - replied thus: - - “My dear Miss Elizabeth, I have the highest opinion in the world - in your excellent judgement in all matters within the scope of - your understanding; but permit me to say, that there must be a - wide difference between the established forms of ceremony amongst - the laity, and those which regulate the clergy; for, give me - leave to observe that I consider the clerical office as equal in - point of dignity with the highest rank in the kingdom—provided - that a proper humility of behaviour is at the same time - maintained. You must therefore allow me to follow the dictates of - my conscience on this occasion, which leads me to perform what I - look on as a point of duty. Pardon me for neglecting to profit by - your advice, which on every other subject shall be my constant - guide, though in the case before us I consider myself more fitted - by education and habitual study to decide on what is right than a - young lady like yourself.” And with a low bow he left her to - attack Mr. Darcy, whose reception of his advances she eagerly - watched, and whose astonishment at being so addressed was very - evident. Her cousin prefaced his speech with a solemn bow and - though she could not hear a word of it, she felt as if hearing it - all, and saw in the motion of his lips the words “apology,” - “Hunsford,” and “Lady Catherine de Bourgh.” It vexed her to see - him expose himself to such a man. Mr. Darcy was eyeing him with - unrestrained wonder, and when at last Mr. Collins allowed him - time to speak, replied with an air of distant civility. Mr. - Collins, however, was not discouraged from speaking again, and - Mr. Darcy’s contempt seemed abundantly increasing with the length - of his second speech, and at the end of it he only made him a - slight bow, and moved another way. Mr. Collins then returned to - Elizabeth. - - “I have no reason, I assure you,” said he, “to be dissatisfied - with my reception. Mr. Darcy seemed much pleased with the - attention. He answered me with the utmost civility, and even paid - me the compliment of saying that he was so well convinced of Lady - Catherine’s discernment as to be certain she could never bestow a - favour unworthily. It was really a very handsome thought. Upon - the whole, I am much pleased with him.” - - As Elizabeth had no longer any interest of her own to pursue, she - turned her attention almost entirely on her sister and Mr. - Bingley; and the train of agreeable reflections which her - observations gave birth to, made her perhaps almost as happy as - Jane. She saw her in idea settled in that very house, in all the - felicity which a marriage of true affection could bestow; and she - felt capable, under such circumstances, of endeavouring even to - like Bingley’s two sisters. Her mother’s thoughts she plainly saw - were bent the same way, and she determined not to venture near - her, lest she might hear too much. When they sat down to supper, - therefore, she considered it a most unlucky perverseness which - placed them within one of each other; and deeply was she vexed to - find that her mother was talking to that one person (Lady Lucas) - freely, openly, and of nothing else but her expectation that Jane - would soon be married to Mr. Bingley. It was an animating - subject, and Mrs. Bennet seemed incapable of fatigue while - enumerating the advantages of the match. His being such a - charming young man, and so rich, and living but three miles from - them, were the first points of self-gratulation; and then it was - such a comfort to think how fond the two sisters were of Jane, - and to be certain that they must desire the connection as much as - she could do. It was, moreover, such a promising thing for her - younger daughters, as Jane’s marrying so greatly must throw them - in the way of other rich men; and lastly, it was so pleasant at - her time of life to be able to consign her single daughters to - the care of their sister, that she might not be obliged to go - into company more than she liked. It was necessary to make this - circumstance a matter of pleasure, because on such occasions it - is the etiquette; but no one was less likely than Mrs. Bennet to - find comfort in staying home at any period of her life. She - concluded with many good wishes that Lady Lucas might soon be - equally fortunate, though evidently and triumphantly believing - there was no chance of it. - - In vain did Elizabeth endeavour to check the rapidity of her - mother’s words, or persuade her to describe her felicity in a - less audible whisper; for, to her inexpressible vexation, she - could perceive that the chief of it was overheard by Mr. Darcy, - who sat opposite to them. Her mother only scolded her for being - nonsensical. - - “What is Mr. Darcy to me, pray, that I should be afraid of him? I - am sure we owe him no such particular civility as to be obliged - to say nothing _he_ may not like to hear.” - - “For heaven’s sake, madam, speak lower. What advantage can it be - for you to offend Mr. Darcy? You will never recommend yourself to - his friend by so doing!” - - Nothing that she could say, however, had any influence. Her - mother would talk of her views in the same intelligible tone. - Elizabeth blushed and blushed again with shame and vexation. She - could not help frequently glancing her eye at Mr. Darcy, though - every glance convinced her of what she dreaded; for though he was - not always looking at her mother, she was convinced that his - attention was invariably fixed by her. The expression of his face - changed gradually from indignant contempt to a composed and - steady gravity. - - At length, however, Mrs. Bennet had no more to say; and Lady - Lucas, who had been long yawning at the repetition of delights - which she saw no likelihood of sharing, was left to the comforts - of cold ham and chicken. Elizabeth now began to revive. But not - long was the interval of tranquillity; for, when supper was over, - singing was talked of, and she had the mortification of seeing - Mary, after very little entreaty, preparing to oblige the - company. By many significant looks and silent entreaties, did she - endeavour to prevent such a proof of complaisance, but in vain; - Mary would not understand them; such an opportunity of exhibiting - was delightful to her, and she began her song. Elizabeth’s eyes - were fixed on her with most painful sensations, and she watched - her progress through the several stanzas with an impatience which - was very ill rewarded at their close; for Mary, on receiving, - amongst the thanks of the table, the hint of a hope that she - might be prevailed on to favour them again, after the pause of - half a minute began another. Mary’s powers were by no means - fitted for such a display; her voice was weak, and her manner - affected. Elizabeth was in agonies. She looked at Jane, to see - how she bore it; but Jane was very composedly talking to Bingley. - She looked at his two sisters, and saw them making signs of - derision at each other, and at Darcy, who continued, however, - imperturbably grave. She looked at her father to entreat his - interference, lest Mary should be singing all night. He took the - hint, and when Mary had finished her second song, said aloud, - “That will do extremely well, child. You have delighted us long - enough. Let the other young ladies have time to exhibit.” - - Mary, though pretending not to hear, was somewhat disconcerted; - and Elizabeth, sorry for her, and sorry for her father’s speech, - was afraid her anxiety had done no good. Others of the party were - now applied to. - - “If I,” said Mr. Collins, “were so fortunate as to be able to - sing, I should have great pleasure, I am sure, in obliging the - company with an air; for I consider music as a very innocent - diversion, and perfectly compatible with the profession of a - clergyman. I do not mean, however, to assert that we can be - justified in devoting too much of our time to music, for there - are certainly other things to be attended to. The rector of a - parish has much to do. In the first place, he must make such an - agreement for tithes as may be beneficial to himself and not - offensive to his patron. He must write his own sermons; and the - time that remains will not be too much for his parish duties, and - the care and improvement of his dwelling, which he cannot be - excused from making as comfortable as possible. And I do not - think it of light importance that he should have attentive and - conciliatory manners towards everybody, especially towards those - to whom he owes his preferment. I cannot acquit him of that duty; - nor could I think well of the man who should omit an occasion of - testifying his respect towards anybody connected with the - family.” And with a bow to Mr. Darcy, he concluded his speech, - which had been spoken so loud as to be heard by half the room. - Many stared—many smiled; but no one looked more amused than Mr. - Bennet himself, while his wife seriously commended Mr. Collins - for having spoken so sensibly, and observed in a half-whisper to - Lady Lucas, that he was a remarkably clever, good kind of young - man. - - To Elizabeth it appeared that, had her family made an agreement - to expose themselves as much as they could during the evening, it - would have been impossible for them to play their parts with more - spirit or finer success; and happy did she think it for Bingley - and her sister that some of the exhibition had escaped his - notice, and that his feelings were not of a sort to be much - distressed by the folly which he must have witnessed. That his - two sisters and Mr. Darcy, however, should have such an - opportunity of ridiculing her relations, was bad enough, and she - could not determine whether the silent contempt of the gentleman, - or the insolent smiles of the ladies, were more intolerable. - - The rest of the evening brought her little amusement. She was - teased by Mr. Collins, who continued most perseveringly by her - side, and though he could not prevail on her to dance with him - again, put it out of her power to dance with others. In vain did - she entreat him to stand up with somebody else, and offer to - introduce him to any young lady in the room. He assured her, that - as to dancing, he was perfectly indifferent to it; that his chief - object was by delicate attentions to recommend himself to her and - that he should therefore make a point of remaining close to her - the whole evening. There was no arguing upon such a project. She - owed her greatest relief to her friend Miss Lucas, who often - joined them, and good-naturedly engaged Mr. Collins’s - conversation to herself. - - She was at least free from the offense of Mr. Darcy’s further - notice; though often standing within a very short distance of - her, quite disengaged, he never came near enough to speak. She - felt it to be the probable consequence of her allusions to Mr. - Wickham, and rejoiced in it. - - The Longbourn party were the last of all the company to depart, - and, by a manoeuvre of Mrs. Bennet, had to wait for their - carriage a quarter of an hour after everybody else was gone, - which gave them time to see how heartily they were wished away by - some of the family. Mrs. Hurst and her sister scarcely opened - their mouths, except to complain of fatigue, and were evidently - impatient to have the house to themselves. They repulsed every - attempt of Mrs. Bennet at conversation, and by so doing threw a - languor over the whole party, which was very little relieved by - the long speeches of Mr. Collins, who was complimenting Mr. - Bingley and his sisters on the elegance of their entertainment, - and the hospitality and politeness which had marked their - behaviour to their guests. Darcy said nothing at all. Mr. Bennet, - in equal silence, was enjoying the scene. Mr. Bingley and Jane - were standing together, a little detached from the rest, and - talked only to each other. Elizabeth preserved as steady a - silence as either Mrs. Hurst or Miss Bingley; and even Lydia was - too much fatigued to utter more than the occasional exclamation - of “Lord, how tired I am!” accompanied by a violent yawn. - - When at length they arose to take leave, Mrs. Bennet was most - pressingly civil in her hope of seeing the whole family soon at - Longbourn, and addressed herself especially to Mr. Bingley, to - assure him how happy he would make them by eating a family dinner - with them at any time, without the ceremony of a formal - invitation. Bingley was all grateful pleasure, and he readily - engaged for taking the earliest opportunity of waiting on her, - after his return from London, whither he was obliged to go the - next day for a short time. - - Mrs. Bennet was perfectly satisfied, and quitted the house under - the delightful persuasion that, allowing for the necessary - preparations of settlements, new carriages, and wedding clothes, - she should undoubtedly see her daughter settled at Netherfield in - the course of three or four months. Of having another daughter - married to Mr. Collins, she thought with equal certainty, and - with considerable, though not equal, pleasure. Elizabeth was the - least dear to her of all her children; and though the man and the - match were quite good enough for _her_, the worth of each was - eclipsed by Mr. Bingley and Netherfield. - - - - - Chapter 19 - - The next day opened a new scene at Longbourn. Mr. Collins made - his declaration in form. Having resolved to do it without loss of - time, as his leave of absence extended only to the following - Saturday, and having no feelings of diffidence to make it - distressing to himself even at the moment, he set about it in a - very orderly manner, with all the observances, which he supposed - a regular part of the business. On finding Mrs. Bennet, - Elizabeth, and one of the younger girls together, soon after - breakfast, he addressed the mother in these words: - - “May I hope, madam, for your interest with your fair daughter - Elizabeth, when I solicit for the honour of a private audience - with her in the course of this morning?” - - Before Elizabeth had time for anything but a blush of surprise, - Mrs. Bennet answered instantly, “Oh dear!—yes—certainly. I am - sure Lizzy will be very happy—I am sure she can have no - objection. Come, Kitty, I want you up stairs.” And, gathering her - work together, she was hastening away, when Elizabeth called out: - - “Dear madam, do not go. I beg you will not go. Mr. Collins must - excuse me. He can have nothing to say to me that anybody need not - hear. I am going away myself.” - - “No, no, nonsense, Lizzy. I desire you to stay where you are.” - And upon Elizabeth’s seeming really, with vexed and embarrassed - looks, about to escape, she added: “Lizzy, I _insist_ upon your - staying and hearing Mr. Collins.” - - Elizabeth would not oppose such an injunction—and a moment’s - consideration making her also sensible that it would be wisest to - get it over as soon and as quietly as possible, she sat down - again and tried to conceal, by incessant employment the feelings - which were divided between distress and diversion. Mrs. Bennet - and Kitty walked off, and as soon as they were gone, Mr. Collins - began. - - “Believe me, my dear Miss Elizabeth, that your modesty, so far - from doing you any disservice, rather adds to your other - perfections. You would have been less amiable in my eyes had - there _not_ been this little unwillingness; but allow me to - assure you, that I have your respected mother’s permission for - this address. You can hardly doubt the purport of my discourse, - however your natural delicacy may lead you to dissemble; my - attentions have been too marked to be mistaken. Almost as soon as - I entered the house, I singled you out as the companion of my - future life. But before I am run away with by my feelings on this - subject, perhaps it would be advisable for me to state my reasons - for marrying—and, moreover, for coming into Hertfordshire with - the design of selecting a wife, as I certainly did.” - - The idea of Mr. Collins, with all his solemn composure, being run - away with by his feelings, made Elizabeth so near laughing, that - she could not use the short pause he allowed in any attempt to - stop him further, and he continued: - - “My reasons for marrying are, first, that I think it a right - thing for every clergyman in easy circumstances (like myself) to - set the example of matrimony in his parish; secondly, that I am - convinced that it will add very greatly to my happiness; and - thirdly—which perhaps I ought to have mentioned earlier, that it - is the particular advice and recommendation of the very noble - lady whom I have the honour of calling patroness. Twice has she - condescended to give me her opinion (unasked too!) on this - subject; and it was but the very Saturday night before I left - Hunsford—between our pools at quadrille, while Mrs. Jenkinson was - arranging Miss de Bourgh’s footstool, that she said, ‘Mr. - Collins, you must marry. A clergyman like you must marry. Choose - properly, choose a gentlewoman for _my_ sake; and for your _own_, - let her be an active, useful sort of person, not brought up high, - but able to make a small income go a good way. This is my advice. - Find such a woman as soon as you can, bring her to Hunsford, and - I will visit her.’ Allow me, by the way, to observe, my fair - cousin, that I do not reckon the notice and kindness of Lady - Catherine de Bourgh as among the least of the advantages in my - power to offer. You will find her manners beyond anything I can - describe; and your wit and vivacity, I think, must be acceptable - to her, especially when tempered with the silence and respect - which her rank will inevitably excite. Thus much for my general - intention in favour of matrimony; it remains to be told why my - views were directed towards Longbourn instead of my own - neighbourhood, where I can assure you there are many amiable - young women. But the fact is, that being, as I am, to inherit - this estate after the death of your honoured father (who, - however, may live many years longer), I could not satisfy myself - without resolving to choose a wife from among his daughters, that - the loss to them might be as little as possible, when the - melancholy event takes place—which, however, as I have already - said, may not be for several years. This has been my motive, my - fair cousin, and I flatter myself it will not sink me in your - esteem. And now nothing remains for me but to assure you in the - most animated language of the violence of my affection. To - fortune I am perfectly indifferent, and shall make no demand of - that nature on your father, since I am well aware that it could - not be complied with; and that one thousand pounds in the four - per cents, which will not be yours till after your mother’s - decease, is all that you may ever be entitled to. On that head, - therefore, I shall be uniformly silent; and you may assure - yourself that no ungenerous reproach shall ever pass my lips when - we are married.” - - It was absolutely necessary to interrupt him now. - - “You are too hasty, sir,” she cried. “You forget that I have made - no answer. Let me do it without further loss of time. Accept my - thanks for the compliment you are paying me. I am very sensible - of the honour of your proposals, but it is impossible for me to - do otherwise than to decline them.” - - “I am not now to learn,” replied Mr. Collins, with a formal wave - of the hand, “that it is usual with young ladies to reject the - addresses of the man whom they secretly mean to accept, when he - first applies for their favour; and that sometimes the refusal is - repeated a second, or even a third time. I am therefore by no - means discouraged by what you have just said, and shall hope to - lead you to the altar ere long.” - - “Upon my word, sir,” cried Elizabeth, “your hope is a rather - extraordinary one after my declaration. I do assure you that I am - not one of those young ladies (if such young ladies there are) - who are so daring as to risk their happiness on the chance of - being asked a second time. I am perfectly serious in my refusal. - You could not make _me_ happy, and I am convinced that I am the - last woman in the world who could make you so. Nay, were your - friend Lady Catherine to know me, I am persuaded she would find - me in every respect ill qualified for the situation.” - - “Were it certain that Lady Catherine would think so,” said Mr. - Collins very gravely—“but I cannot imagine that her ladyship - would at all disapprove of you. And you may be certain when I - have the honour of seeing her again, I shall speak in the very - highest terms of your modesty, economy, and other amiable - qualification.” - - “Indeed, Mr. Collins, all praise of me will be unnecessary. You - must give me leave to judge for myself, and pay me the compliment - of believing what I say. I wish you very happy and very rich, and - by refusing your hand, do all in my power to prevent your being - otherwise. In making me the offer, you must have satisfied the - delicacy of your feelings with regard to my family, and may take - possession of Longbourn estate whenever it falls, without any - self-reproach. This matter may be considered, therefore, as - finally settled.” And rising as she thus spoke, she would have - quitted the room, had Mr. Collins not thus addressed her: - - “When I do myself the honour of speaking to you next on the - subject, I shall hope to receive a more favourable answer than - you have now given me; though I am far from accusing you of - cruelty at present, because I know it to be the established - custom of your sex to reject a man on the first application, and - perhaps you have even now said as much to encourage my suit as - would be consistent with the true delicacy of the female - character.” - - “Really, Mr. Collins,” cried Elizabeth with some warmth, “you - puzzle me exceedingly. If what I have hitherto said can appear to - you in the form of encouragement, I know not how to express my - refusal in such a way as to convince you of its being one.” - - “You must give me leave to flatter myself, my dear cousin, that - your refusal of my addresses is merely words of course. My - reasons for believing it are briefly these: It does not appear to - me that my hand is unworthy of your acceptance, or that the - establishment I can offer would be any other than highly - desirable. My situation in life, my connections with the family - of de Bourgh, and my relationship to your own, are circumstances - highly in my favour; and you should take it into further - consideration, that in spite of your manifold attractions, it is - by no means certain that another offer of marriage may ever be - made you. Your portion is unhappily so small that it will in all - likelihood undo the effects of your loveliness and amiable - qualifications. As I must therefore conclude that you are not - serious in your rejection of me, I shall choose to attribute it - to your wish of increasing my love by suspense, according to the - usual practice of elegant females.” - - “I do assure you, sir, that I have no pretensions whatever to - that kind of elegance which consists in tormenting a respectable - man. I would rather be paid the compliment of being believed - sincere. I thank you again and again for the honour you have done - me in your proposals, but to accept them is absolutely - impossible. My feelings in every respect forbid it. Can I speak - plainer? Do not consider me now as an elegant female, intending - to plague you, but as a rational creature, speaking the truth - from her heart.” - - “You are uniformly charming!” cried he, with an air of awkward - gallantry; “and I am persuaded that when sanctioned by the - express authority of both your excellent parents, my proposals - will not fail of being acceptable.” - - To such perseverance in wilful self-deception Elizabeth would - make no reply, and immediately and in silence withdrew; - determined, if he persisted in considering her repeated refusals - as flattering encouragement, to apply to her father, whose - negative might be uttered in such a manner as to be decisive, and - whose behaviour at least could not be mistaken for the - affectation and coquetry of an elegant female. - - - - - Chapter 20 - - Mr. Collins was not left long to the silent contemplation of his - successful love; for Mrs. Bennet, having dawdled about in the - vestibule to watch for the end of the conference, no sooner saw - Elizabeth open the door and with quick step pass her towards the - staircase, than she entered the breakfast-room, and congratulated - both him and herself in warm terms on the happy prospect of their - nearer connection. Mr. Collins received and returned these - felicitations with equal pleasure, and then proceeded to relate - the particulars of their interview, with the result of which he - trusted he had every reason to be satisfied, since the refusal - which his cousin had steadfastly given him would naturally flow - from her bashful modesty and the genuine delicacy of her - character. - - This information, however, startled Mrs. Bennet; she would have - been glad to be equally satisfied that her daughter had meant to - encourage him by protesting against his proposals, but she dared - not believe it, and could not help saying so. - - “But, depend upon it, Mr. Collins,” she added, “that Lizzy shall - be brought to reason. I will speak to her about it directly. She - is a very headstrong, foolish girl, and does not know her own - interest but I will _make_ her know it.” - - “Pardon me for interrupting you, madam,” cried Mr. Collins; “but - if she is really headstrong and foolish, I know not whether she - would altogether be a very desirable wife to a man in my - situation, who naturally looks for happiness in the marriage - state. If therefore she actually persists in rejecting my suit, - perhaps it were better not to force her into accepting me, - because if liable to such defects of temper, she could not - contribute much to my felicity.” - - “Sir, you quite misunderstand me,” said Mrs. Bennet, alarmed. - “Lizzy is only headstrong in such matters as these. In everything - else she is as good-natured a girl as ever lived. I will go - directly to Mr. Bennet, and we shall very soon settle it with - her, I am sure.” - - She would not give him time to reply, but hurrying instantly to - her husband, called out as she entered the library, “Oh! Mr. - Bennet, you are wanted immediately; we are all in an uproar. You - must come and make Lizzy marry Mr. Collins, for she vows she will - not have him, and if you do not make haste he will change his - mind and not have _her_.” - - Mr. Bennet raised his eyes from his book as she entered, and - fixed them on her face with a calm unconcern which was not in the - least altered by her communication. - - “I have not the pleasure of understanding you,” said he, when she - had finished her speech. “Of what are you talking?” - - “Of Mr. Collins and Lizzy. Lizzy declares she will not have Mr. - Collins, and Mr. Collins begins to say that he will not have - Lizzy.” - - “And what am I to do on the occasion? It seems an hopeless - business.” - - “Speak to Lizzy about it yourself. Tell her that you insist upon - her marrying him.” - - “Let her be called down. She shall hear my opinion.” - - Mrs. Bennet rang the bell, and Miss Elizabeth was summoned to the - library. - - “Come here, child,” cried her father as she appeared. “I have - sent for you on an affair of importance. I understand that Mr. - Collins has made you an offer of marriage. Is it true?” Elizabeth - replied that it was. “Very well—and this offer of marriage you - have refused?” - - “I have, sir.” - - “Very well. We now come to the point. Your mother insists upon - your accepting it. Is it not so, Mrs. Bennet?” - - “Yes, or I will never see her again.” - - “An unhappy alternative is before you, Elizabeth. From this day - you must be a stranger to one of your parents. Your mother will - never see you again if you do _not_ marry Mr. Collins, and I will - never see you again if you _do_.” - - Elizabeth could not but smile at such a conclusion of such a - beginning, but Mrs. Bennet, who had persuaded herself that her - husband regarded the affair as she wished, was excessively - disappointed. - - “What do you mean, Mr. Bennet, in talking this way? You promised - me to _insist_ upon her marrying him.” - - “My dear,” replied her husband, “I have two small favours to - request. First, that you will allow me the free use of my - understanding on the present occasion; and secondly, of my room. - I shall be glad to have the library to myself as soon as may be.” - - Not yet, however, in spite of her disappointment in her husband, - did Mrs. Bennet give up the point. She talked to Elizabeth again - and again; coaxed and threatened her by turns. She endeavoured to - secure Jane in her interest; but Jane, with all possible - mildness, declined interfering; and Elizabeth, sometimes with - real earnestness, and sometimes with playful gaiety, replied to - her attacks. Though her manner varied, however, her determination - never did. - - Mr. Collins, meanwhile, was meditating in solitude on what had - passed. He thought too well of himself to comprehend on what - motives his cousin could refuse him; and though his pride was - hurt, he suffered in no other way. His regard for her was quite - imaginary; and the possibility of her deserving her mother’s - reproach prevented his feeling any regret. - - While the family were in this confusion, Charlotte Lucas came to - spend the day with them. She was met in the vestibule by Lydia, - who, flying to her, cried in a half whisper, “I am glad you are - come, for there is such fun here! What do you think has happened - this morning? Mr. Collins has made an offer to Lizzy, and she - will not have him.” - - Charlotte hardly had time to answer, before they were joined by - Kitty, who came to tell the same news; and no sooner had they - entered the breakfast-room, where Mrs. Bennet was alone, than she - likewise began on the subject, calling on Miss Lucas for her - compassion, and entreating her to persuade her friend Lizzy to - comply with the wishes of all her family. “Pray do, my dear Miss - Lucas,” she added in a melancholy tone, “for nobody is on my - side, nobody takes part with me. I am cruelly used, nobody feels - for my poor nerves.” - - Charlotte’s reply was spared by the entrance of Jane and - Elizabeth. - - “Aye, there she comes,” continued Mrs. Bennet, “looking as - unconcerned as may be, and caring no more for us than if we were - at York, provided she can have her own way. But I tell you, Miss - Lizzy—if you take it into your head to go on refusing every offer - of marriage in this way, you will never get a husband at all—and - I am sure I do not know who is to maintain you when your father - is dead. _I_ shall not be able to keep you—and so I warn you. I - have done with you from this very day. I told you in the library, - you know, that I should never speak to you again, and you will - find me as good as my word. I have no pleasure in talking to - undutiful children. Not that I have much pleasure, indeed, in - talking to anybody. People who suffer as I do from nervous - complaints can have no great inclination for talking. Nobody can - tell what I suffer! But it is always so. Those who do not - complain are never pitied.” - - Her daughters listened in silence to this effusion, sensible that - any attempt to reason with her or soothe her would only increase - the irritation. She talked on, therefore, without interruption - from any of them, till they were joined by Mr. Collins, who - entered the room with an air more stately than usual, and on - perceiving whom, she said to the girls, “Now, I do insist upon - it, that you, all of you, hold your tongues, and let me and Mr. - Collins have a little conversation together.” - - Elizabeth passed quietly out of the room, Jane and Kitty - followed, but Lydia stood her ground, determined to hear all she - could; and Charlotte, detained first by the civility of Mr. - Collins, whose inquiries after herself and all her family were - very minute, and then by a little curiosity, satisfied herself - with walking to the window and pretending not to hear. In a - doleful voice Mrs. Bennet began the projected conversation: “Oh! - Mr. Collins!” - - “My dear madam,” replied he, “let us be for ever silent on this - point. Far be it from me,” he presently continued, in a voice - that marked his displeasure, “to resent the behaviour of your - daughter. Resignation to inevitable evils is the duty of us all; - the peculiar duty of a young man who has been so fortunate as I - have been in early preferment; and I trust I am resigned. Perhaps - not the less so from feeling a doubt of my positive happiness had - my fair cousin honoured me with her hand; for I have often - observed that resignation is never so perfect as when the - blessing denied begins to lose somewhat of its value in our - estimation. You will not, I hope, consider me as showing any - disrespect to your family, my dear madam, by thus withdrawing my - pretensions to your daughter’s favour, without having paid - yourself and Mr. Bennet the compliment of requesting you to - interpose your authority in my behalf. My conduct may, I fear, be - objectionable in having accepted my dismission from your - daughter’s lips instead of your own. But we are all liable to - error. I have certainly meant well through the whole affair. My - object has been to secure an amiable companion for myself, with - due consideration for the advantage of all your family, and if my - _manner_ has been at all reprehensible, I here beg leave to - apologise.” - - - - - Chapter 21 - - The discussion of Mr. Collins’s offer was now nearly at an end, - and Elizabeth had only to suffer from the uncomfortable feelings - necessarily attending it, and occasionally from some peevish - allusions of her mother. As for the gentleman himself, _his_ - feelings were chiefly expressed, not by embarrassment or - dejection, or by trying to avoid her, but by stiffness of manner - and resentful silence. He scarcely ever spoke to her, and the - assiduous attentions which he had been so sensible of himself - were transferred for the rest of the day to Miss Lucas, whose - civility in listening to him was a seasonable relief to them all, - and especially to her friend. - - The morrow produced no abatement of Mrs. Bennet’s ill-humour or - ill health. Mr. Collins was also in the same state of angry - pride. Elizabeth had hoped that his resentment might shorten his - visit, but his plan did not appear in the least affected by it. - He was always to have gone on Saturday, and to Saturday he meant - to stay. - - After breakfast, the girls walked to Meryton to inquire if Mr. - Wickham were returned, and to lament over his absence from the - Netherfield ball. He joined them on their entering the town, and - attended them to their aunt’s where his regret and vexation, and - the concern of everybody, was well talked over. To Elizabeth, - however, he voluntarily acknowledged that the necessity of his - absence _had_ been self-imposed. - - “I found,” said he, “as the time drew near that I had better not - meet Mr. Darcy; that to be in the same room, the same party with - him for so many hours together, might be more than I could bear, - and that scenes might arise unpleasant to more than myself.” - - She highly approved his forbearance, and they had leisure for a - full discussion of it, and for all the commendation which they - civilly bestowed on each other, as Wickham and another officer - walked back with them to Longbourn, and during the walk he - particularly attended to her. His accompanying them was a double - advantage; she felt all the compliment it offered to herself, and - it was most acceptable as an occasion of introducing him to her - father and mother. - - Soon after their return, a letter was delivered to Miss Bennet; - it came from Netherfield. The envelope contained a sheet of - elegant, little, hot-pressed paper, well covered with a lady’s - fair, flowing hand; and Elizabeth saw her sister’s countenance - change as she read it, and saw her dwelling intently on some - particular passages. Jane recollected herself soon, and putting - the letter away, tried to join with her usual cheerfulness in the - general conversation; but Elizabeth felt an anxiety on the - subject which drew off her attention even from Wickham; and no - sooner had he and his companion taken leave, than a glance from - Jane invited her to follow her up stairs. When they had gained - their own room, Jane, taking out the letter, said: - - “This is from Caroline Bingley; what it contains has surprised me - a good deal. The whole party have left Netherfield by this time, - and are on their way to town—and without any intention of coming - back again. You shall hear what she says.” - - She then read the first sentence aloud, which comprised the - information of their having just resolved to follow their brother - to town directly, and of their meaning to dine in Grosvenor - Street, where Mr. Hurst had a house. The next was in these words: - “I do not pretend to regret anything I shall leave in - Hertfordshire, except your society, my dearest friend; but we - will hope, at some future period, to enjoy many returns of that - delightful intercourse we have known, and in the meanwhile may - lessen the pain of separation by a very frequent and most - unreserved correspondence. I depend on you for that.” To these - highflown expressions Elizabeth listened with all the - insensibility of distrust; and though the suddenness of their - removal surprised her, she saw nothing in it really to lament; it - was not to be supposed that their absence from Netherfield would - prevent Mr. Bingley’s being there; and as to the loss of their - society, she was persuaded that Jane must cease to regard it, in - the enjoyment of his. - - “It is unlucky,” said she, after a short pause, “that you should - not be able to see your friends before they leave the country. - But may we not hope that the period of future happiness to which - Miss Bingley looks forward may arrive earlier than she is aware, - and that the delightful intercourse you have known as friends - will be renewed with yet greater satisfaction as sisters? Mr. - Bingley will not be detained in London by them.” - - “Caroline decidedly says that none of the party will return into - Hertfordshire this winter. I will read it to you:” - - “When my brother left us yesterday, he imagined that the business - which took him to London might be concluded in three or four - days; but as we are certain it cannot be so, and at the same time - convinced that when Charles gets to town he will be in no hurry - to leave it again, we have determined on following him thither, - that he may not be obliged to spend his vacant hours in a - comfortless hotel. Many of my acquaintances are already there for - the winter; I wish that I could hear that you, my dearest friend, - had any intention of making one of the crowd—but of that I - despair. I sincerely hope your Christmas in Hertfordshire may - abound in the gaieties which that season generally brings, and - that your beaux will be so numerous as to prevent your feeling - the loss of the three of whom we shall deprive you.” - - “It is evident by this,” added Jane, “that he comes back no more - this winter.” - - “It is only evident that Miss Bingley does not mean that he - _should_.” - - “Why will you think so? It must be his own doing. He is his own - master. But you do not know _all_. I _will_ read you the passage - which particularly hurts me. I will have no reserves from _you_.” - - “Mr. Darcy is impatient to see his sister; and, to confess the - truth, _we_ are scarcely less eager to meet her again. I really - do not think Georgiana Darcy has her equal for beauty, elegance, - and accomplishments; and the affection she inspires in Louisa and - myself is heightened into something still more interesting, from - the hope we dare entertain of her being hereafter our sister. I - do not know whether I ever before mentioned to you my feelings on - this subject; but I will not leave the country without confiding - them, and I trust you will not esteem them unreasonable. My - brother admires her greatly already; he will have frequent - opportunity now of seeing her on the most intimate footing; her - relations all wish the connection as much as his own; and a - sister’s partiality is not misleading me, I think, when I call - Charles most capable of engaging any woman’s heart. With all - these circumstances to favour an attachment, and nothing to - prevent it, am I wrong, my dearest Jane, in indulging the hope of - an event which will secure the happiness of so many?” - - “What do you think of _this_ sentence, my dear Lizzy?” said Jane - as she finished it. “Is it not clear enough? Does it not - expressly declare that Caroline neither expects nor wishes me to - be her sister; that she is perfectly convinced of her brother’s - indifference; and that if she suspects the nature of my feelings - for him, she means (most kindly!) to put me on my guard? Can - there be any other opinion on the subject?” - - “Yes, there can; for mine is totally different. Will you hear - it?” - - “Most willingly.” - - “You shall have it in a few words. Miss Bingley sees that her - brother is in love with you, and wants him to marry Miss Darcy. - She follows him to town in hope of keeping him there, and tries - to persuade you that he does not care about you.” - - Jane shook her head. - - “Indeed, Jane, you ought to believe me. No one who has ever seen - you together can doubt his affection. Miss Bingley, I am sure, - cannot. She is not such a simpleton. Could she have seen half as - much love in Mr. Darcy for herself, she would have ordered her - wedding clothes. But the case is this: We are not rich enough or - grand enough for them; and she is the more anxious to get Miss - Darcy for her brother, from the notion that when there has been - _one_ intermarriage, she may have less trouble in achieving a - second; in which there is certainly some ingenuity, and I dare - say it would succeed, if Miss de Bourgh were out of the way. But, - my dearest Jane, you cannot seriously imagine that because Miss - Bingley tells you her brother greatly admires Miss Darcy, he is - in the smallest degree less sensible of _your_ merit than when he - took leave of you on Tuesday, or that it will be in her power to - persuade him that, instead of being in love with you, he is very - much in love with her friend.” - - “If we thought alike of Miss Bingley,” replied Jane, “your - representation of all this might make me quite easy. But I know - the foundation is unjust. Caroline is incapable of wilfully - deceiving anyone; and all that I can hope in this case is that - she is deceiving herself.” - - “That is right. You could not have started a more happy idea, - since you will not take comfort in mine. Believe her to be - deceived, by all means. You have now done your duty by her, and - must fret no longer.” - - “But, my dear sister, can I be happy, even supposing the best, in - accepting a man whose sisters and friends are all wishing him to - marry elsewhere?” - - “You must decide for yourself,” said Elizabeth; “and if, upon - mature deliberation, you find that the misery of disobliging his - two sisters is more than equivalent to the happiness of being his - wife, I advise you by all means to refuse him.” - - “How can you talk so?” said Jane, faintly smiling. “You must know - that though I should be exceedingly grieved at their - disapprobation, I could not hesitate.” - - “I did not think you would; and that being the case, I cannot - consider your situation with much compassion.” - - “But if he returns no more this winter, my choice will never be - required. A thousand things may arise in six months!” - - The idea of his returning no more Elizabeth treated with the - utmost contempt. It appeared to her merely the suggestion of - Caroline’s interested wishes, and she could not for a moment - suppose that those wishes, however openly or artfully spoken, - could influence a young man so totally independent of everyone. - - She represented to her sister as forcibly as possible what she - felt on the subject, and had soon the pleasure of seeing its - happy effect. Jane’s temper was not desponding, and she was - gradually led to hope, though the diffidence of affection - sometimes overcame the hope, that Bingley would return to - Netherfield and answer every wish of her heart. - - They agreed that Mrs. Bennet should only hear of the departure of - the family, without being alarmed on the score of the gentleman’s - conduct; but even this partial communication gave her a great - deal of concern, and she bewailed it as exceedingly unlucky that - the ladies should happen to go away just as they were all getting - so intimate together. After lamenting it, however, at some - length, she had the consolation that Mr. Bingley would be soon - down again and soon dining at Longbourn, and the conclusion of - all was the comfortable declaration, that though he had been - invited only to a family dinner, she would take care to have two - full courses. - - - - - Chapter 22 - - The Bennets were engaged to dine with the Lucases and again - during the chief of the day was Miss Lucas so kind as to listen - to Mr. Collins. Elizabeth took an opportunity of thanking her. - “It keeps him in good humour,” said she, “and I am more obliged - to you than I can express.” Charlotte assured her friend of her - satisfaction in being useful, and that it amply repaid her for - the little sacrifice of her time. This was very amiable, but - Charlotte’s kindness extended farther than Elizabeth had any - conception of; its object was nothing else than to secure her - from any return of Mr. Collins’s addresses, by engaging them - towards herself. Such was Miss Lucas’s scheme; and appearances - were so favourable, that when they parted at night, she would - have felt almost secure of success if he had not been to leave - Hertfordshire so very soon. But here she did injustice to the - fire and independence of his character, for it led him to escape - out of Longbourn House the next morning with admirable slyness, - and hasten to Lucas Lodge to throw himself at her feet. He was - anxious to avoid the notice of his cousins, from a conviction - that if they saw him depart, they could not fail to conjecture - his design, and he was not willing to have the attempt known till - its success might be known likewise; for though feeling almost - secure, and with reason, for Charlotte had been tolerably - encouraging, he was comparatively diffident since the adventure - of Wednesday. His reception, however, was of the most flattering - kind. Miss Lucas perceived him from an upper window as he walked - towards the house, and instantly set out to meet him accidentally - in the lane. But little had she dared to hope that so much love - and eloquence awaited her there. - - In as short a time as Mr. Collins’s long speeches would allow, - everything was settled between them to the satisfaction of both; - and as they entered the house he earnestly entreated her to name - the day that was to make him the happiest of men; and though such - a solicitation must be waived for the present, the lady felt no - inclination to trifle with his happiness. The stupidity with - which he was favoured by nature must guard his courtship from any - charm that could make a woman wish for its continuance; and Miss - Lucas, who accepted him solely from the pure and disinterested - desire of an establishment, cared not how soon that establishment - were gained. - - Sir William and Lady Lucas were speedily applied to for their - consent; and it was bestowed with a most joyful alacrity. Mr. - Collins’s present circumstances made it a most eligible match for - their daughter, to whom they could give little fortune; and his - prospects of future wealth were exceedingly fair. Lady Lucas - began directly to calculate, with more interest than the matter - had ever excited before, how many years longer Mr. Bennet was - likely to live; and Sir William gave it as his decided opinion, - that whenever Mr. Collins should be in possession of the - Longbourn estate, it would be highly expedient that both he and - his wife should make their appearance at St. James’s. The whole - family, in short, were properly overjoyed on the occasion. The - younger girls formed hopes of _coming out_ a year or two sooner - than they might otherwise have done; and the boys were relieved - from their apprehension of Charlotte’s dying an old maid. - Charlotte herself was tolerably composed. She had gained her - point, and had time to consider of it. Her reflections were in - general satisfactory. Mr. Collins, to be sure, was neither - sensible nor agreeable; his society was irksome, and his - attachment to her must be imaginary. But still he would be her - husband. Without thinking highly either of men or matrimony, - marriage had always been her object; it was the only provision - for well-educated young women of small fortune, and however - uncertain of giving happiness, must be their pleasantest - preservative from want. This preservative she had now obtained; - and at the age of twenty-seven, without having ever been - handsome, she felt all the good luck of it. The least agreeable - circumstance in the business was the surprise it must occasion to - Elizabeth Bennet, whose friendship she valued beyond that of any - other person. Elizabeth would wonder, and probably would blame - her; and though her resolution was not to be shaken, her feelings - must be hurt by such a disapprobation. She resolved to give her - the information herself, and therefore charged Mr. Collins, when - he returned to Longbourn to dinner, to drop no hint of what had - passed before any of the family. A promise of secrecy was of - course very dutifully given, but it could not be kept without - difficulty; for the curiosity excited by his long absence burst - forth in such very direct questions on his return as required - some ingenuity to evade, and he was at the same time exercising - great self-denial, for he was longing to publish his prosperous - love. - - As he was to begin his journey too early on the morrow to see any - of the family, the ceremony of leave-taking was performed when - the ladies moved for the night; and Mrs. Bennet, with great - politeness and cordiality, said how happy they should be to see - him at Longbourn again, whenever his engagements might allow him - to visit them. - - “My dear madam,” he replied, “this invitation is particularly - gratifying, because it is what I have been hoping to receive; and - you may be very certain that I shall avail myself of it as soon - as possible.” - - They were all astonished; and Mr. Bennet, who could by no means - wish for so speedy a return, immediately said: - - “But is there not danger of Lady Catherine’s disapprobation here, - my good sir? You had better neglect your relations than run the - risk of offending your patroness.” - - “My dear sir,” replied Mr. Collins, “I am particularly obliged to - you for this friendly caution, and you may depend upon my not - taking so material a step without her ladyship’s concurrence.” - - “You cannot be too much upon your guard. Risk anything rather - than her displeasure; and if you find it likely to be raised by - your coming to us again, which I should think exceedingly - probable, stay quietly at home, and be satisfied that _we_ shall - take no offence.” - - “Believe me, my dear sir, my gratitude is warmly excited by such - affectionate attention; and depend upon it, you will speedily - receive from me a letter of thanks for this, and for every other - mark of your regard during my stay in Hertfordshire. As for my - fair cousins, though my absence may not be long enough to render - it necessary, I shall now take the liberty of wishing them health - and happiness, not excepting my cousin Elizabeth.” - - With proper civilities the ladies then withdrew; all of them - equally surprised that he meditated a quick return. Mrs. Bennet - wished to understand by it that he thought of paying his - addresses to one of her younger girls, and Mary might have been - prevailed on to accept him. She rated his abilities much higher - than any of the others; there was a solidity in his reflections - which often struck her, and though by no means so clever as - herself, she thought that if encouraged to read and improve - himself by such an example as hers, he might become a very - agreeable companion. But on the following morning, every hope of - this kind was done away. Miss Lucas called soon after breakfast, - and in a private conference with Elizabeth related the event of - the day before. - - The possibility of Mr. Collins’s fancying himself in love with - her friend had once occurred to Elizabeth within the last day or - two; but that Charlotte could encourage him seemed almost as far - from possibility as she could encourage him herself, and her - astonishment was consequently so great as to overcome at first - the bounds of decorum, and she could not help crying out: - - “Engaged to Mr. Collins! My dear Charlotte—impossible!” - - The steady countenance which Miss Lucas had commanded in telling - her story, gave way to a momentary confusion here on receiving so - direct a reproach; though, as it was no more than she expected, - she soon regained her composure, and calmly replied: - - “Why should you be surprised, my dear Eliza? Do you think it - incredible that Mr. Collins should be able to procure any woman’s - good opinion, because he was not so happy as to succeed with - you?” - - But Elizabeth had now recollected herself, and making a strong - effort for it, was able to assure with tolerable firmness that - the prospect of their relationship was highly grateful to her, - and that she wished her all imaginable happiness. - - “I see what you are feeling,” replied Charlotte. “You must be - surprised, very much surprised—so lately as Mr. Collins was - wishing to marry you. But when you have had time to think it - over, I hope you will be satisfied with what I have done. I am - not romantic, you know; I never was. I ask only a comfortable - home; and considering Mr. Collins’s character, connection, and - situation in life, I am convinced that my chance of happiness - with him is as fair as most people can boast on entering the - marriage state.” - - Elizabeth quietly answered “Undoubtedly;” and after an awkward - pause, they returned to the rest of the family. Charlotte did not - stay much longer, and Elizabeth was then left to reflect on what - she had heard. It was a long time before she became at all - reconciled to the idea of so unsuitable a match. The strangeness - of Mr. Collins’s making two offers of marriage within three days - was nothing in comparison of his being now accepted. She had - always felt that Charlotte’s opinion of matrimony was not exactly - like her own, but she had not supposed it to be possible that, - when called into action, she would have sacrificed every better - feeling to worldly advantage. Charlotte the wife of Mr. Collins - was a most humiliating picture! And to the pang of a friend - disgracing herself and sunk in her esteem, was added the - distressing conviction that it was impossible for that friend to - be tolerably happy in the lot she had chosen. - - - - - Chapter 23 - - Elizabeth was sitting with her mother and sisters, reflecting on - what she had heard, and doubting whether she was authorised to - mention it, when Sir William Lucas himself appeared, sent by his - daughter, to announce her engagement to the family. With many - compliments to them, and much self-gratulation on the prospect of - a connection between the houses, he unfolded the matter—to an - audience not merely wondering, but incredulous; for Mrs. Bennet, - with more perseverance than politeness, protested he must be - entirely mistaken; and Lydia, always unguarded and often uncivil, - boisterously exclaimed: - - “Good Lord! Sir William, how can you tell such a story? Do not - you know that Mr. Collins wants to marry Lizzy?” - - Nothing less than the complaisance of a courtier could have borne - without anger such treatment; but Sir William’s good breeding - carried him through it all; and though he begged leave to be - positive as to the truth of his information, he listened to all - their impertinence with the most forbearing courtesy. - - Elizabeth, feeling it incumbent on her to relieve him from so - unpleasant a situation, now put herself forward to confirm his - account, by mentioning her prior knowledge of it from Charlotte - herself; and endeavoured to put a stop to the exclamations of her - mother and sisters by the earnestness of her congratulations to - Sir William, in which she was readily joined by Jane, and by - making a variety of remarks on the happiness that might be - expected from the match, the excellent character of Mr. Collins, - and the convenient distance of Hunsford from London. - - Mrs. Bennet was in fact too much overpowered to say a great deal - while Sir William remained; but no sooner had he left them than - her feelings found a rapid vent. In the first place, she - persisted in disbelieving the whole of the matter; secondly, she - was very sure that Mr. Collins had been taken in; thirdly, she - trusted that they would never be happy together; and fourthly, - that the match might be broken off. Two inferences, however, were - plainly deduced from the whole: one, that Elizabeth was the real - cause of the mischief; and the other that she herself had been - barbarously misused by them all; and on these two points she - principally dwelt during the rest of the day. Nothing could - console and nothing could appease her. Nor did that day wear out - her resentment. A week elapsed before she could see Elizabeth - without scolding her, a month passed away before she could speak - to Sir William or Lady Lucas without being rude, and many months - were gone before she could at all forgive their daughter. - - Mr. Bennet’s emotions were much more tranquil on the occasion, - and such as he did experience he pronounced to be of a most - agreeable sort; for it gratified him, he said, to discover that - Charlotte Lucas, whom he had been used to think tolerably - sensible, was as foolish as his wife, and more foolish than his - daughter! - - Jane confessed herself a little surprised at the match; but she - said less of her astonishment than of her earnest desire for - their happiness; nor could Elizabeth persuade her to consider it - as improbable. Kitty and Lydia were far from envying Miss Lucas, - for Mr. Collins was only a clergyman; and it affected them in no - other way than as a piece of news to spread at Meryton. - - Lady Lucas could not be insensible of triumph on being able to - retort on Mrs. Bennet the comfort of having a daughter well - married; and she called at Longbourn rather oftener than usual to - say how happy she was, though Mrs. Bennet’s sour looks and - ill-natured remarks might have been enough to drive happiness - away. - - Between Elizabeth and Charlotte there was a restraint which kept - them mutually silent on the subject; and Elizabeth felt persuaded - that no real confidence could ever subsist between them again. - Her disappointment in Charlotte made her turn with fonder regard - to her sister, of whose rectitude and delicacy she was sure her - opinion could never be shaken, and for whose happiness she grew - daily more anxious, as Bingley had now been gone a week and - nothing more was heard of his return. - - Jane had sent Caroline an early answer to her letter, and was - counting the days till she might reasonably hope to hear again. - The promised letter of thanks from Mr. Collins arrived on - Tuesday, addressed to their father, and written with all the - solemnity of gratitude which a twelvemonth’s abode in the family - might have prompted. After discharging his conscience on that - head, he proceeded to inform them, with many rapturous - expressions, of his happiness in having obtained the affection of - their amiable neighbour, Miss Lucas, and then explained that it - was merely with the view of enjoying her society that he had been - so ready to close with their kind wish of seeing him again at - Longbourn, whither he hoped to be able to return on Monday - fortnight; for Lady Catherine, he added, so heartily approved his - marriage, that she wished it to take place as soon as possible, - which he trusted would be an unanswerable argument with his - amiable Charlotte to name an early day for making him the - happiest of men. - - Mr. Collins’s return into Hertfordshire was no longer a matter of - pleasure to Mrs. Bennet. On the contrary, she was as much - disposed to complain of it as her husband. It was very strange - that he should come to Longbourn instead of to Lucas Lodge; it - was also very inconvenient and exceedingly troublesome. She hated - having visitors in the house while her health was so indifferent, - and lovers were of all people the most disagreeable. Such were - the gentle murmurs of Mrs. Bennet, and they gave way only to the - greater distress of Mr. Bingley’s continued absence. - - Neither Jane nor Elizabeth were comfortable on this subject. Day - after day passed away without bringing any other tidings of him - than the report which shortly prevailed in Meryton of his coming - no more to Netherfield the whole winter; a report which highly - incensed Mrs. Bennet, and which she never failed to contradict as - a most scandalous falsehood. - - Even Elizabeth began to fear—not that Bingley was indifferent—but - that his sisters would be successful in keeping him away. - Unwilling as she was to admit an idea so destructive of Jane’s - happiness, and so dishonorable to the stability of her lover, she - could not prevent its frequently occurring. The united efforts of - his two unfeeling sisters and of his overpowering friend, - assisted by the attractions of Miss Darcy and the amusements of - London might be too much, she feared, for the strength of his - attachment. - - As for Jane, _her_ anxiety under this suspense was, of course, - more painful than Elizabeth’s, but whatever she felt she was - desirous of concealing, and between herself and Elizabeth, - therefore, the subject was never alluded to. But as no such - delicacy restrained her mother, an hour seldom passed in which - she did not talk of Bingley, express her impatience for his - arrival, or even require Jane to confess that if he did not come - back she would think herself very ill used. It needed all Jane’s - steady mildness to bear these attacks with tolerable - tranquillity. - - Mr. Collins returned most punctually on Monday fortnight, but his - reception at Longbourn was not quite so gracious as it had been - on his first introduction. He was too happy, however, to need - much attention; and luckily for the others, the business of - love-making relieved them from a great deal of his company. The - chief of every day was spent by him at Lucas Lodge, and he - sometimes returned to Longbourn only in time to make an apology - for his absence before the family went to bed. - - Mrs. Bennet was really in a most pitiable state. The very mention - of anything concerning the match threw her into an agony of - ill-humour, and wherever she went she was sure of hearing it - talked of. The sight of Miss Lucas was odious to her. As her - successor in that house, she regarded her with jealous - abhorrence. Whenever Charlotte came to see them, she concluded - her to be anticipating the hour of possession; and whenever she - spoke in a low voice to Mr. Collins, was convinced that they were - talking of the Longbourn estate, and resolving to turn herself - and her daughters out of the house, as soon as Mr. Bennet were - dead. She complained bitterly of all this to her husband. - - “Indeed, Mr. Bennet,” said she, “it is very hard to think that - Charlotte Lucas should ever be mistress of this house, that _I_ - should be forced to make way for _her_, and live to see her take - her place in it!” - - “My dear, do not give way to such gloomy thoughts. Let us hope - for better things. Let us flatter ourselves that _I_ may be the - survivor.” - - This was not very consoling to Mrs. Bennet, and therefore, - instead of making any answer, she went on as before. - - “I cannot bear to think that they should have all this estate. If - it was not for the entail, I should not mind it.” - - “What should not you mind?” - - “I should not mind anything at all.” - - “Let us be thankful that you are preserved from a state of such - insensibility.” - - “I never can be thankful, Mr. Bennet, for anything about the - entail. How anyone could have the conscience to entail away an - estate from one’s own daughters, I cannot understand; and all for - the sake of Mr. Collins too! Why should _he_ have it more than - anybody else?” - - “I leave it to yourself to determine,” said Mr. Bennet. - - - - - Chapter 24 - - Miss Bingley’s letter arrived, and put an end to doubt. The very - first sentence conveyed the assurance of their being all settled - in London for the winter, and concluded with her brother’s regret - at not having had time to pay his respects to his friends in - Hertfordshire before he left the country. - - Hope was over, entirely over; and when Jane could attend to the - rest of the letter, she found little, except the professed - affection of the writer, that could give her any comfort. Miss - Darcy’s praise occupied the chief of it. Her many attractions - were again dwelt on, and Caroline boasted joyfully of their - increasing intimacy, and ventured to predict the accomplishment - of the wishes which had been unfolded in her former letter. She - wrote also with great pleasure of her brother’s being an inmate - of Mr. Darcy’s house, and mentioned with raptures some plans of - the latter with regard to new furniture. - - Elizabeth, to whom Jane very soon communicated the chief of all - this, heard it in silent indignation. Her heart was divided - between concern for her sister, and resentment against all - others. To Caroline’s assertion of her brother’s being partial to - Miss Darcy she paid no credit. That he was really fond of Jane, - she doubted no more than she had ever done; and much as she had - always been disposed to like him, she could not think without - anger, hardly without contempt, on that easiness of temper, that - want of proper resolution, which now made him the slave of his - designing friends, and led him to sacrifice of his own happiness - to the caprice of their inclination. Had his own happiness, - however, been the only sacrifice, he might have been allowed to - sport with it in whatever manner he thought best, but her - sister’s was involved in it, as she thought he must be sensible - himself. It was a subject, in short, on which reflection would be - long indulged, and must be unavailing. She could think of nothing - else; and yet whether Bingley’s regard had really died away, or - were suppressed by his friends’ interference; whether he had been - aware of Jane’s attachment, or whether it had escaped his - observation; whatever were the case, though her opinion of him - must be materially affected by the difference, her sister’s - situation remained the same, her peace equally wounded. - - A day or two passed before Jane had courage to speak of her - feelings to Elizabeth; but at last, on Mrs. Bennet’s leaving them - together, after a longer irritation than usual about Netherfield - and its master, she could not help saying: - - “Oh, that my dear mother had more command over herself! She can - have no idea of the pain she gives me by her continual - reflections on him. But I will not repine. It cannot last long. - He will be forgot, and we shall all be as we were before.” - - Elizabeth looked at her sister with incredulous solicitude, but - said nothing. - - “You doubt me,” cried Jane, slightly colouring; “indeed, you have - no reason. He may live in my memory as the most amiable man of my - acquaintance, but that is all. I have nothing either to hope or - fear, and nothing to reproach him with. Thank God! I have not - _that_ pain. A little time, therefore—I shall certainly try to - get the better.” - - With a stronger voice she soon added, “I have this comfort - immediately, that it has not been more than an error of fancy on - my side, and that it has done no harm to anyone but myself.” - - “My dear Jane!” exclaimed Elizabeth, “you are too good. Your - sweetness and disinterestedness are really angelic; I do not know - what to say to you. I feel as if I had never done you justice, or - loved you as you deserve.” - - Miss Bennet eagerly disclaimed all extraordinary merit, and threw - back the praise on her sister’s warm affection. - - “Nay,” said Elizabeth, “this is not fair. _You_ wish to think all - the world respectable, and are hurt if I speak ill of anybody. - _I_ only want to think _you_ perfect, and you set yourself - against it. Do not be afraid of my running into any excess, of my - encroaching on your privilege of universal good-will. You need - not. There are few people whom I really love, and still fewer of - whom I think well. The more I see of the world, the more am I - dissatisfied with it; and every day confirms my belief of the - inconsistency of all human characters, and of the little - dependence that can be placed on the appearance of merit or - sense. I have met with two instances lately, one I will not - mention; the other is Charlotte’s marriage. It is unaccountable! - In every view it is unaccountable!” - - “My dear Lizzy, do not give way to such feelings as these. They - will ruin your happiness. You do not make allowance enough for - difference of situation and temper. Consider Mr. Collins’s - respectability, and Charlotte’s steady, prudent character. - Remember that she is one of a large family; that as to fortune, - it is a most eligible match; and be ready to believe, for - everybody’s sake, that she may feel something like regard and - esteem for our cousin.” - - “To oblige you, I would try to believe almost anything, but no - one else could be benefited by such a belief as this; for were I - persuaded that Charlotte had any regard for him, I should only - think worse of her understanding than I now do of her heart. My - dear Jane, Mr. Collins is a conceited, pompous, narrow-minded, - silly man; you know he is, as well as I do; and you must feel, as - well as I do, that the woman who married him cannot have a proper - way of thinking. You shall not defend her, though it is Charlotte - Lucas. You shall not, for the sake of one individual, change the - meaning of principle and integrity, nor endeavour to persuade - yourself or me, that selfishness is prudence, and insensibility - of danger security for happiness.” - - “I must think your language too strong in speaking of both,” - replied Jane; “and I hope you will be convinced of it by seeing - them happy together. But enough of this. You alluded to something - else. You mentioned _two_ instances. I cannot misunderstand you, - but I entreat you, dear Lizzy, not to pain me by thinking _that - person_ to blame, and saying your opinion of him is sunk. We must - not be so ready to fancy ourselves intentionally injured. We must - not expect a lively young man to be always so guarded and - circumspect. It is very often nothing but our own vanity that - deceives us. Women fancy admiration means more than it does.” - - “And men take care that they should.” - - “If it is designedly done, they cannot be justified; but I have - no idea of there being so much design in the world as some - persons imagine.” - - “I am far from attributing any part of Mr. Bingley’s conduct to - design,” said Elizabeth; “but without scheming to do wrong, or to - make others unhappy, there may be error, and there may be misery. - Thoughtlessness, want of attention to other people’s feelings, - and want of resolution, will do the business.” - - “And do you impute it to either of those?” - - “Yes; to the last. But if I go on, I shall displease you by - saying what I think of persons you esteem. Stop me whilst you - can.” - - “You persist, then, in supposing his sisters influence him?” - - “Yes, in conjunction with his friend.” - - “I cannot believe it. Why should they try to influence him? They - can only wish his happiness; and if he is attached to me, no - other woman can secure it.” - - “Your first position is false. They may wish many things besides - his happiness; they may wish his increase of wealth and - consequence; they may wish him to marry a girl who has all the - importance of money, great connections, and pride.” - - “Beyond a doubt, they do wish him to choose Miss Darcy,” replied - Jane; “but this may be from better feelings than you are - supposing. They have known her much longer than they have known - me; no wonder if they love her better. But, whatever may be their - own wishes, it is very unlikely they should have opposed their - brother’s. What sister would think herself at liberty to do it, - unless there were something very objectionable? If they believed - him attached to me, they would not try to part us; if he were so, - they could not succeed. By supposing such an affection, you make - everybody acting unnaturally and wrong, and me most unhappy. Do - not distress me by the idea. I am not ashamed of having been - mistaken—or, at least, it is light, it is nothing in comparison - of what I should feel in thinking ill of him or his sisters. Let - me take it in the best light, in the light in which it may be - understood.” - - Elizabeth could not oppose such a wish; and from this time Mr. - Bingley’s name was scarcely ever mentioned between them. - - Mrs. Bennet still continued to wonder and repine at his returning - no more, and though a day seldom passed in which Elizabeth did - not account for it clearly, there was little chance of her ever - considering it with less perplexity. Her daughter endeavoured to - convince her of what she did not believe herself, that his - attentions to Jane had been merely the effect of a common and - transient liking, which ceased when he saw her no more; but - though the probability of the statement was admitted at the time, - she had the same story to repeat every day. Mrs. Bennet’s best - comfort was that Mr. Bingley must be down again in the summer. - - Mr. Bennet treated the matter differently. “So, Lizzy,” said he - one day, “your sister is crossed in love, I find. I congratulate - her. Next to being married, a girl likes to be crossed a little - in love now and then. It is something to think of, and it gives - her a sort of distinction among her companions. When is your turn - to come? You will hardly bear to be long outdone by Jane. Now is - your time. Here are officers enough in Meryton to disappoint all - the young ladies in the country. Let Wickham be your man. He is a - pleasant fellow, and would jilt you creditably.” - - “Thank you, sir, but a less agreeable man would satisfy me. We - must not all expect Jane’s good fortune.” - - “True,” said Mr. Bennet, “but it is a comfort to think that - whatever of that kind may befall you, you have an affectionate - mother who will make the most of it.” - - Mr. Wickham’s society was of material service in dispelling the - gloom which the late perverse occurrences had thrown on many of - the Longbourn family. They saw him often, and to his other - recommendations was now added that of general unreserve. The - whole of what Elizabeth had already heard, his claims on Mr. - Darcy, and all that he had suffered from him, was now openly - acknowledged and publicly canvassed; and everybody was pleased to - know how much they had always disliked Mr. Darcy before they had - known anything of the matter. - - Miss Bennet was the only creature who could suppose there might - be any extenuating circumstances in the case, unknown to the - society of Hertfordshire; her mild and steady candour always - pleaded for allowances, and urged the possibility of mistakes—but - by everybody else Mr. Darcy was condemned as the worst of men. - - - - - Chapter 25 - - After a week spent in professions of love and schemes of - felicity, Mr. Collins was called from his amiable Charlotte by - the arrival of Saturday. The pain of separation, however, might - be alleviated on his side, by preparations for the reception of - his bride; as he had reason to hope, that shortly after his - return into Hertfordshire, the day would be fixed that was to - make him the happiest of men. He took leave of his relations at - Longbourn with as much solemnity as before; wished his fair - cousins health and happiness again, and promised their father - another letter of thanks. - - On the following Monday, Mrs. Bennet had the pleasure of - receiving her brother and his wife, who came as usual to spend - the Christmas at Longbourn. Mr. Gardiner was a sensible, - gentlemanlike man, greatly superior to his sister, as well by - nature as education. The Netherfield ladies would have had - difficulty in believing that a man who lived by trade, and within - view of his own warehouses, could have been so well-bred and - agreeable. Mrs. Gardiner, who was several years younger than Mrs. - Bennet and Mrs. Phillips, was an amiable, intelligent, elegant - woman, and a great favourite with all her Longbourn nieces. - Between the two eldest and herself especially, there subsisted a - particular regard. They had frequently been staying with her in - town. - - The first part of Mrs. Gardiner’s business on her arrival was to - distribute her presents and describe the newest fashions. When - this was done she had a less active part to play. It became her - turn to listen. Mrs. Bennet had many grievances to relate, and - much to complain of. They had all been very ill-used since she - last saw her sister. Two of her girls had been upon the point of - marriage, and after all there was nothing in it. - - “I do not blame Jane,” she continued, “for Jane would have got - Mr. Bingley if she could. But Lizzy! Oh, sister! It is very hard - to think that she might have been Mr. Collins’s wife by this - time, had it not been for her own perverseness. He made her an - offer in this very room, and she refused him. The consequence of - it is, that Lady Lucas will have a daughter married before I - have, and that the Longbourn estate is just as much entailed as - ever. The Lucases are very artful people indeed, sister. They are - all for what they can get. I am sorry to say it of them, but so - it is. It makes me very nervous and poorly, to be thwarted so in - my own family, and to have neighbours who think of themselves - before anybody else. However, your coming just at this time is - the greatest of comforts, and I am very glad to hear what you - tell us, of long sleeves.” - - Mrs. Gardiner, to whom the chief of this news had been given - before, in the course of Jane and Elizabeth’s correspondence with - her, made her sister a slight answer, and, in compassion to her - nieces, turned the conversation. - - When alone with Elizabeth afterwards, she spoke more on the - subject. “It seems likely to have been a desirable match for - Jane,” said she. “I am sorry it went off. But these things happen - so often! A young man, such as you describe Mr. Bingley, so - easily falls in love with a pretty girl for a few weeks, and when - accident separates them, so easily forgets her, that these sort - of inconsistencies are very frequent.” - - “An excellent consolation in its way,” said Elizabeth, “but it - will not do for _us_. We do not suffer by accident. It does not - often happen that the interference of friends will persuade a - young man of independent fortune to think no more of a girl whom - he was violently in love with only a few days before.” - - “But that expression of ‘violently in love’ is so hackneyed, so - doubtful, so indefinite, that it gives me very little idea. It is - as often applied to feelings which arise from a half-hour’s - acquaintance, as to a real, strong attachment. Pray, how _violent - was_ Mr. Bingley’s love?” - - “I never saw a more promising inclination; he was growing quite - inattentive to other people, and wholly engrossed by her. Every - time they met, it was more decided and remarkable. At his own - ball he offended two or three young ladies, by not asking them to - dance; and I spoke to him twice myself, without receiving an - answer. Could there be finer symptoms? Is not general incivility - the very essence of love?” - - “Oh, yes!—of that kind of love which I suppose him to have felt. - Poor Jane! I am sorry for her, because, with her disposition, she - may not get over it immediately. It had better have happened to - _you_, Lizzy; you would have laughed yourself out of it sooner. - But do you think she would be prevailed upon to go back with us? - Change of scene might be of service—and perhaps a little relief - from home may be as useful as anything.” - - Elizabeth was exceedingly pleased with this proposal, and felt - persuaded of her sister’s ready acquiescence. - - “I hope,” added Mrs. Gardiner, “that no consideration with regard - to this young man will influence her. We live in so different a - part of town, all our connections are so different, and, as you - well know, we go out so little, that it is very improbable that - they should meet at all, unless he really comes to see her.” - - “And _that_ is quite impossible; for he is now in the custody of - his friend, and Mr. Darcy would no more suffer him to call on - Jane in such a part of London! My dear aunt, how could you think - of it? Mr. Darcy may perhaps have _heard_ of such a place as - Gracechurch Street, but he would hardly think a month’s ablution - enough to cleanse him from its impurities, were he once to enter - it; and depend upon it, Mr. Bingley never stirs without him.” - - “So much the better. I hope they will not meet at all. But does - not Jane correspond with his sister? _She_ will not be able to - help calling.” - - “She will drop the acquaintance entirely.” - - But in spite of the certainty in which Elizabeth affected to - place this point, as well as the still more interesting one of - Bingley’s being withheld from seeing Jane, she felt a solicitude - on the subject which convinced her, on examination, that she did - not consider it entirely hopeless. It was possible, and sometimes - she thought it probable, that his affection might be reanimated, - and the influence of his friends successfully combated by the - more natural influence of Jane’s attractions. - - Miss Bennet accepted her aunt’s invitation with pleasure; and the - Bingleys were no otherwise in her thoughts at the same time, than - as she hoped by Caroline’s not living in the same house with her - brother, she might occasionally spend a morning with her, without - any danger of seeing him. - - The Gardiners stayed a week at Longbourn; and what with the - Phillipses, the Lucases, and the officers, there was not a day - without its engagement. Mrs. Bennet had so carefully provided for - the entertainment of her brother and sister, that they did not - once sit down to a family dinner. When the engagement was for - home, some of the officers always made part of it—of which - officers Mr. Wickham was sure to be one; and on these occasions, - Mrs. Gardiner, rendered suspicious by Elizabeth’s warm - commendation, narrowly observed them both. Without supposing - them, from what she saw, to be very seriously in love, their - preference of each other was plain enough to make her a little - uneasy; and she resolved to speak to Elizabeth on the subject - before she left Hertfordshire, and represent to her the - imprudence of encouraging such an attachment. - - To Mrs. Gardiner, Wickham had one means of affording pleasure, - unconnected with his general powers. About ten or a dozen years - ago, before her marriage, she had spent a considerable time in - that very part of Derbyshire to which he belonged. They had, - therefore, many acquaintances in common; and though Wickham had - been little there since the death of Darcy’s father, it was yet - in his power to give her fresher intelligence of her former - friends than she had been in the way of procuring. - - Mrs. Gardiner had seen Pemberley, and known the late Mr. Darcy by - character perfectly well. Here consequently was an inexhaustible - subject of discourse. In comparing her recollection of Pemberley - with the minute description which Wickham could give, and in - bestowing her tribute of praise on the character of its late - possessor, she was delighting both him and herself. On being made - acquainted with the present Mr. Darcy’s treatment of him, she - tried to remember some of that gentleman’s reputed disposition - when quite a lad which might agree with it, and was confident at - last that she recollected having heard Mr. Fitzwilliam Darcy - formerly spoken of as a very proud, ill-natured boy. - - - - - Chapter 26 - - Mrs. Gardiner’s caution to Elizabeth was punctually and kindly - given on the first favourable opportunity of speaking to her - alone; after honestly telling her what she thought, she thus went - on: - - “You are too sensible a girl, Lizzy, to fall in love merely - because you are warned against it; and, therefore, I am not - afraid of speaking openly. Seriously, I would have you be on your - guard. Do not involve yourself or endeavour to involve him in an - affection which the want of fortune would make so very imprudent. - I have nothing to say against _him_; he is a most interesting - young man; and if he had the fortune he ought to have, I should - think you could not do better. But as it is, you must not let - your fancy run away with you. You have sense, and we all expect - you to use it. Your father would depend on _your_ resolution and - good conduct, I am sure. You must not disappoint your father.” - - “My dear aunt, this is being serious indeed.” - - “Yes, and I hope to engage you to be serious likewise.” - - “Well, then, you need not be under any alarm. I will take care of - myself, and of Mr. Wickham too. He shall not be in love with me, - if I can prevent it.” - - “Elizabeth, you are not serious now.” - - “I beg your pardon, I will try again. At present I am not in love - with Mr. Wickham; no, I certainly am not. But he is, beyond all - comparison, the most agreeable man I ever saw—and if he becomes - really attached to me—I believe it will be better that he should - not. I see the imprudence of it. Oh! _that_ abominable Mr. Darcy! - My father’s opinion of me does me the greatest honour, and I - should be miserable to forfeit it. My father, however, is partial - to Mr. Wickham. In short, my dear aunt, I should be very sorry to - be the means of making any of you unhappy; but since we see every - day that where there is affection, young people are seldom - withheld by immediate want of fortune from entering into - engagements with each other, how can I promise to be wiser than - so many of my fellow-creatures if I am tempted, or how am I even - to know that it would be wisdom to resist? All that I can promise - you, therefore, is not to be in a hurry. I will not be in a hurry - to believe myself his first object. When I am in company with - him, I will not be wishing. In short, I will do my best.” - - “Perhaps it will be as well if you discourage his coming here so - very often. At least, you should not _remind_ your mother of - inviting him.” - - “As I did the other day,” said Elizabeth with a conscious smile: - “very true, it will be wise in me to refrain from _that_. But do - not imagine that he is always here so often. It is on your - account that he has been so frequently invited this week. You - know my mother’s ideas as to the necessity of constant company - for her friends. But really, and upon my honour, I will try to do - what I think to be the wisest; and now I hope you are satisfied.” - - Her aunt assured her that she was, and Elizabeth having thanked - her for the kindness of her hints, they parted; a wonderful - instance of advice being given on such a point, without being - resented. - - Mr. Collins returned into Hertfordshire soon after it had been - quitted by the Gardiners and Jane; but as he took up his abode - with the Lucases, his arrival was no great inconvenience to Mrs. - Bennet. His marriage was now fast approaching, and she was at - length so far resigned as to think it inevitable, and even - repeatedly to say, in an ill-natured tone, that she “_wished_ - they might be happy.” Thursday was to be the wedding day, and on - Wednesday Miss Lucas paid her farewell visit; and when she rose - to take leave, Elizabeth, ashamed of her mother’s ungracious and - reluctant good wishes, and sincerely affected herself, - accompanied her out of the room. As they went downstairs - together, Charlotte said: - - “I shall depend on hearing from you very often, Eliza.” - - “_That_ you certainly shall.” - - “And I have another favour to ask you. Will you come and see me?” - - “We shall often meet, I hope, in Hertfordshire.” - - “I am not likely to leave Kent for some time. Promise me, - therefore, to come to Hunsford.” - - Elizabeth could not refuse, though she foresaw little pleasure in - the visit. - - “My father and Maria are coming to me in March,” added Charlotte, - “and I hope you will consent to be of the party. Indeed, Eliza, - you will be as welcome as either of them.” - - The wedding took place; the bride and bridegroom set off for Kent - from the church door, and everybody had as much to say, or to - hear, on the subject as usual. Elizabeth soon heard from her - friend; and their correspondence was as regular and frequent as - it had ever been; that it should be equally unreserved was - impossible. Elizabeth could never address her without feeling - that all the comfort of intimacy was over, and though determined - not to slacken as a correspondent, it was for the sake of what - had been, rather than what was. Charlotte’s first letters were - received with a good deal of eagerness; there could not but be - curiosity to know how she would speak of her new home, how she - would like Lady Catherine, and how happy she would dare pronounce - herself to be; though, when the letters were read, Elizabeth felt - that Charlotte expressed herself on every point exactly as she - might have foreseen. She wrote cheerfully, seemed surrounded with - comforts, and mentioned nothing which she could not praise. The - house, furniture, neighbourhood, and roads, were all to her - taste, and Lady Catherine’s behaviour was most friendly and - obliging. It was Mr. Collins’s picture of Hunsford and Rosings - rationally softened; and Elizabeth perceived that she must wait - for her own visit there to know the rest. - - Jane had already written a few lines to her sister to announce - their safe arrival in London; and when she wrote again, Elizabeth - hoped it would be in her power to say something of the Bingleys. - - Her impatience for this second letter was as well rewarded as - impatience generally is. Jane had been a week in town without - either seeing or hearing from Caroline. She accounted for it, - however, by supposing that her last letter to her friend from - Longbourn had by some accident been lost. - - “My aunt,” she continued, “is going to-morrow into that part of - the town, and I shall take the opportunity of calling in - Grosvenor Street.” - - She wrote again when the visit was paid, and she had seen Miss - Bingley. “I did not think Caroline in spirits,” were her words, - “but she was very glad to see me, and reproached me for giving - her no notice of my coming to London. I was right, therefore, my - last letter had never reached her. I inquired after their - brother, of course. He was well, but so much engaged with Mr. - Darcy that they scarcely ever saw him. I found that Miss Darcy - was expected to dinner. I wish I could see her. My visit was not - long, as Caroline and Mrs. Hurst were going out. I dare say I - shall see them soon here.” - - Elizabeth shook her head over this letter. It convinced her that - accident only could discover to Mr. Bingley her sister’s being in - town. - - Four weeks passed away, and Jane saw nothing of him. She - endeavoured to persuade herself that she did not regret it; but - she could no longer be blind to Miss Bingley’s inattention. After - waiting at home every morning for a fortnight, and inventing - every evening a fresh excuse for her, the visitor did at last - appear; but the shortness of her stay, and yet more, the - alteration of her manner would allow Jane to deceive herself no - longer. The letter which she wrote on this occasion to her sister - will prove what she felt. - - “My dearest Lizzy will, I am sure, be incapable of triumphing in - her better judgement, at my expense, when I confess myself to - have been entirely deceived in Miss Bingley’s regard for me. But, - my dear sister, though the event has proved you right, do not - think me obstinate if I still assert that, considering what her - behaviour was, my confidence was as natural as your suspicion. I - do not at all comprehend her reason for wishing to be intimate - with me; but if the same circumstances were to happen again, I am - sure I should be deceived again. Caroline did not return my visit - till yesterday; and not a note, not a line, did I receive in the - meantime. When she did come, it was very evident that she had no - pleasure in it; she made a slight, formal apology, for not - calling before, said not a word of wishing to see me again, and - was in every respect so altered a creature, that when she went - away I was perfectly resolved to continue the acquaintance no - longer. I pity, though I cannot help blaming her. She was very - wrong in singling me out as she did; I can safely say that every - advance to intimacy began on her side. But I pity her, because - she must feel that she has been acting wrong, and because I am - very sure that anxiety for her brother is the cause of it. I need - not explain myself farther; and though _we_ know this anxiety to - be quite needless, yet if she feels it, it will easily account - for her behaviour to me; and so deservedly dear as he is to his - sister, whatever anxiety she must feel on his behalf is natural - and amiable. I cannot but wonder, however, at her having any such - fears now, because, if he had at all cared about me, we must have - met, long ago. He knows of my being in town, I am certain, from - something she said herself; and yet it would seem, by her manner - of talking, as if she wanted to persuade herself that he is - really partial to Miss Darcy. I cannot understand it. If I were - not afraid of judging harshly, I should be almost tempted to say - that there is a strong appearance of duplicity in all this. But I - will endeavour to banish every painful thought, and think only of - what will make me happy—your affection, and the invariable - kindness of my dear uncle and aunt. Let me hear from you very - soon. Miss Bingley said something of his never returning to - Netherfield again, of giving up the house, but not with any - certainty. We had better not mention it. I am extremely glad that - you have such pleasant accounts from our friends at Hunsford. - Pray go to see them, with Sir William and Maria. I am sure you - will be very comfortable there.—Yours, etc.” - - This letter gave Elizabeth some pain; but her spirits returned as - she considered that Jane would no longer be duped, by the sister - at least. All expectation from the brother was now absolutely - over. She would not even wish for a renewal of his attentions. - His character sunk on every review of it; and as a punishment for - him, as well as a possible advantage to Jane, she seriously hoped - he might really soon marry Mr. Darcy’s sister, as by Wickham’s - account, she would make him abundantly regret what he had thrown - away. - - Mrs. Gardiner about this time reminded Elizabeth of her promise - concerning that gentleman, and required information; and - Elizabeth had such to send as might rather give contentment to - her aunt than to herself. His apparent partiality had subsided, - his attentions were over, he was the admirer of some one else. - Elizabeth was watchful enough to see it all, but she could see it - and write of it without material pain. Her heart had been but - slightly touched, and her vanity was satisfied with believing - that _she_ would have been his only choice, had fortune permitted - it. The sudden acquisition of ten thousand pounds was the most - remarkable charm of the young lady to whom he was now rendering - himself agreeable; but Elizabeth, less clear-sighted perhaps in - this case than in Charlotte’s, did not quarrel with him for his - wish of independence. Nothing, on the contrary, could be more - natural; and while able to suppose that it cost him a few - struggles to relinquish her, she was ready to allow it a wise and - desirable measure for both, and could very sincerely wish him - happy. - - All this was acknowledged to Mrs. Gardiner; and after relating - the circumstances, she thus went on: “I am now convinced, my dear - aunt, that I have never been much in love; for had I really - experienced that pure and elevating passion, I should at present - detest his very name, and wish him all manner of evil. But my - feelings are not only cordial towards _him_; they are even - impartial towards Miss King. I cannot find out that I hate her at - all, or that I am in the least unwilling to think her a very good - sort of girl. There can be no love in all this. My watchfulness - has been effectual; and though I certainly should be a more - interesting object to all my acquaintances were I distractedly in - love with him, I cannot say that I regret my comparative - insignificance. Importance may sometimes be purchased too dearly. - Kitty and Lydia take his defection much more to heart than I do. - They are young in the ways of the world, and not yet open to the - mortifying conviction that handsome young men must have something - to live on as well as the plain.” - - - - - Chapter 27 - - With no greater events than these in the Longbourn family, and - otherwise diversified by little beyond the walks to Meryton, - sometimes dirty and sometimes cold, did January and February pass - away. March was to take Elizabeth to Hunsford. She had not at - first thought very seriously of going thither; but Charlotte, she - soon found, was depending on the plan and she gradually learned - to consider it herself with greater pleasure as well as greater - certainty. Absence had increased her desire of seeing Charlotte - again, and weakened her disgust of Mr. Collins. There was novelty - in the scheme, and as, with such a mother and such - uncompanionable sisters, home could not be faultless, a little - change was not unwelcome for its own sake. The journey would - moreover give her a peep at Jane; and, in short, as the time drew - near, she would have been very sorry for any delay. Everything, - however, went on smoothly, and was finally settled according to - Charlotte’s first sketch. She was to accompany Sir William and - his second daughter. The improvement of spending a night in - London was added in time, and the plan became perfect as plan - could be. - - The only pain was in leaving her father, who would certainly miss - her, and who, when it came to the point, so little liked her - going, that he told her to write to him, and almost promised to - answer her letter. - - The farewell between herself and Mr. Wickham was perfectly - friendly; on his side even more. His present pursuit could not - make him forget that Elizabeth had been the first to excite and - to deserve his attention, the first to listen and to pity, the - first to be admired; and in his manner of bidding her adieu, - wishing her every enjoyment, reminding her of what she was to - expect in Lady Catherine de Bourgh, and trusting their opinion of - her—their opinion of everybody—would always coincide, there was a - solicitude, an interest which she felt must ever attach her to - him with a most sincere regard; and she parted from him convinced - that, whether married or single, he must always be her model of - the amiable and pleasing. - - Her fellow-travellers the next day were not of a kind to make her - think him less agreeable. Sir William Lucas, and his daughter - Maria, a good-humoured girl, but as empty-headed as himself, had - nothing to say that could be worth hearing, and were listened to - with about as much delight as the rattle of the chaise. Elizabeth - loved absurdities, but she had known Sir William’s too long. He - could tell her nothing new of the wonders of his presentation and - knighthood; and his civilities were worn out, like his - information. - - It was a journey of only twenty-four miles, and they began it so - early as to be in Gracechurch Street by noon. As they drove to - Mr. Gardiner’s door, Jane was at a drawing-room window watching - their arrival; when they entered the passage she was there to - welcome them, and Elizabeth, looking earnestly in her face, was - pleased to see it healthful and lovely as ever. On the stairs - were a troop of little boys and girls, whose eagerness for their - cousin’s appearance would not allow them to wait in the - drawing-room, and whose shyness, as they had not seen her for a - twelvemonth, prevented their coming lower. All was joy and - kindness. The day passed most pleasantly away; the morning in - bustle and shopping, and the evening at one of the theatres. - - Elizabeth then contrived to sit by her aunt. Their first object - was her sister; and she was more grieved than astonished to hear, - in reply to her minute inquiries, that though Jane always - struggled to support her spirits, there were periods of - dejection. It was reasonable, however, to hope that they would - not continue long. Mrs. Gardiner gave her the particulars also of - Miss Bingley’s visit in Gracechurch Street, and repeated - conversations occurring at different times between Jane and - herself, which proved that the former had, from her heart, given - up the acquaintance. - - Mrs. Gardiner then rallied her niece on Wickham’s desertion, and - complimented her on bearing it so well. - - “But my dear Elizabeth,” she added, “what sort of girl is Miss - King? I should be sorry to think our friend mercenary.” - - “Pray, my dear aunt, what is the difference in matrimonial - affairs, between the mercenary and the prudent motive? Where does - discretion end, and avarice begin? Last Christmas you were afraid - of his marrying me, because it would be imprudent; and now, - because he is trying to get a girl with only ten thousand pounds, - you want to find out that he is mercenary.” - - “If you will only tell me what sort of girl Miss King is, I shall - know what to think.” - - “She is a very good kind of girl, I believe. I know no harm of - her.” - - “But he paid her not the smallest attention till her - grandfather’s death made her mistress of this fortune.” - - “No—why should he? If it were not allowable for him to gain _my_ - affections because I had no money, what occasion could there be - for making love to a girl whom he did not care about, and who was - equally poor?” - - “But there seems an indelicacy in directing his attentions - towards her so soon after this event.” - - “A man in distressed circumstances has not time for all those - elegant decorums which other people may observe. If _she_ does - not object to it, why should _we_?” - - “_Her_ not objecting does not justify _him_. It only shows her - being deficient in something herself—sense or feeling.” - - “Well,” cried Elizabeth, “have it as you choose. _He_ shall be - mercenary, and _she_ shall be foolish.” - - “No, Lizzy, that is what I do _not_ choose. I should be sorry, - you know, to think ill of a young man who has lived so long in - Derbyshire.” - - “Oh! if that is all, I have a very poor opinion of young men who - live in Derbyshire; and their intimate friends who live in - Hertfordshire are not much better. I am sick of them all. Thank - Heaven! I am going to-morrow where I shall find a man who has not - one agreeable quality, who has neither manner nor sense to - recommend him. Stupid men are the only ones worth knowing, after - all.” - - “Take care, Lizzy; that speech savours strongly of - disappointment.” - - Before they were separated by the conclusion of the play, she had - the unexpected happiness of an invitation to accompany her uncle - and aunt in a tour of pleasure which they proposed taking in the - summer. - - “We have not determined how far it shall carry us,” said Mrs. - Gardiner, “but, perhaps, to the Lakes.” - - No scheme could have been more agreeable to Elizabeth, and her - acceptance of the invitation was most ready and grateful. “Oh, my - dear, dear aunt,” she rapturously cried, “what delight! what - felicity! You give me fresh life and vigour. Adieu to - disappointment and spleen. What are young men to rocks and - mountains? Oh! what hours of transport we shall spend! And when - we _do_ return, it shall not be like other travellers, without - being able to give one accurate idea of anything. We _will_ know - where we have gone—we _will_ recollect what we have seen. Lakes, - mountains, and rivers shall not be jumbled together in our - imaginations; nor when we attempt to describe any particular - scene, will we begin quarreling about its relative situation. Let - _our_ first effusions be less insupportable than those of the - generality of travellers.” - - - - - Chapter 28 - - Every object in the next day’s journey was new and interesting to - Elizabeth; and her spirits were in a state of enjoyment; for she - had seen her sister looking so well as to banish all fear for her - health, and the prospect of her northern tour was a constant - source of delight. - - When they left the high road for the lane to Hunsford, every eye - was in search of the Parsonage, and every turning expected to - bring it in view. The palings of Rosings Park was their boundary - on one side. Elizabeth smiled at the recollection of all that she - had heard of its inhabitants. - - At length the Parsonage was discernible. The garden sloping to - the road, the house standing in it, the green pales, and the - laurel hedge, everything declared they were arriving. Mr. Collins - and Charlotte appeared at the door, and the carriage stopped at - the small gate which led by a short gravel walk to the house, - amidst the nods and smiles of the whole party. In a moment they - were all out of the chaise, rejoicing at the sight of each other. - Mrs. Collins welcomed her friend with the liveliest pleasure, and - Elizabeth was more and more satisfied with coming when she found - herself so affectionately received. She saw instantly that her - cousin’s manners were not altered by his marriage; his formal - civility was just what it had been, and he detained her some - minutes at the gate to hear and satisfy his inquiries after all - her family. They were then, with no other delay than his pointing - out the neatness of the entrance, taken into the house; and as - soon as they were in the parlour, he welcomed them a second time, - with ostentatious formality to his humble abode, and punctually - repeated all his wife’s offers of refreshment. - - Elizabeth was prepared to see him in his glory; and she could not - help in fancying that in displaying the good proportion of the - room, its aspect and its furniture, he addressed himself - particularly to her, as if wishing to make her feel what she had - lost in refusing him. But though everything seemed neat and - comfortable, she was not able to gratify him by any sigh of - repentance, and rather looked with wonder at her friend that she - could have so cheerful an air with such a companion. When Mr. - Collins said anything of which his wife might reasonably be - ashamed, which certainly was not unseldom, she involuntarily - turned her eye on Charlotte. Once or twice she could discern a - faint blush; but in general Charlotte wisely did not hear. After - sitting long enough to admire every article of furniture in the - room, from the sideboard to the fender, to give an account of - their journey, and of all that had happened in London, Mr. - Collins invited them to take a stroll in the garden, which was - large and well laid out, and to the cultivation of which he - attended himself. To work in this garden was one of his most - respectable pleasures; and Elizabeth admired the command of - countenance with which Charlotte talked of the healthfulness of - the exercise, and owned she encouraged it as much as possible. - Here, leading the way through every walk and cross walk, and - scarcely allowing them an interval to utter the praises he asked - for, every view was pointed out with a minuteness which left - beauty entirely behind. He could number the fields in every - direction, and could tell how many trees there were in the most - distant clump. But of all the views which his garden, or which - the country or kingdom could boast, none were to be compared with - the prospect of Rosings, afforded by an opening in the trees that - bordered the park nearly opposite the front of his house. It was - a handsome modern building, well situated on rising ground. - - From his garden, Mr. Collins would have led them round his two - meadows; but the ladies, not having shoes to encounter the - remains of a white frost, turned back; and while Sir William - accompanied him, Charlotte took her sister and friend over the - house, extremely well pleased, probably, to have the opportunity - of showing it without her husband’s help. It was rather small, - but well built and convenient; and everything was fitted up and - arranged with a neatness and consistency of which Elizabeth gave - Charlotte all the credit. When Mr. Collins could be forgotten, - there was really an air of great comfort throughout, and by - Charlotte’s evident enjoyment of it, Elizabeth supposed he must - be often forgotten. - - She had already learnt that Lady Catherine was still in the - country. It was spoken of again while they were at dinner, when - Mr. Collins joining in, observed: - - “Yes, Miss Elizabeth, you will have the honour of seeing Lady - Catherine de Bourgh on the ensuing Sunday at church, and I need - not say you will be delighted with her. She is all affability and - condescension, and I doubt not but you will be honoured with some - portion of her notice when service is over. I have scarcely any - hesitation in saying she will include you and my sister Maria in - every invitation with which she honours us during your stay here. - Her behaviour to my dear Charlotte is charming. We dine at - Rosings twice every week, and are never allowed to walk home. Her - ladyship’s carriage is regularly ordered for us. I _should_ say, - one of her ladyship’s carriages, for she has several.” - - “Lady Catherine is a very respectable, sensible woman indeed,” - added Charlotte, “and a most attentive neighbour.” - - “Very true, my dear, that is exactly what I say. She is the sort - of woman whom one cannot regard with too much deference.” - - The evening was spent chiefly in talking over Hertfordshire news, - and telling again what had already been written; and when it - closed, Elizabeth, in the solitude of her chamber, had to - meditate upon Charlotte’s degree of contentment, to understand - her address in guiding, and composure in bearing with, her - husband, and to acknowledge that it was all done very well. She - had also to anticipate how her visit would pass, the quiet tenor - of their usual employments, the vexatious interruptions of Mr. - Collins, and the gaieties of their intercourse with Rosings. A - lively imagination soon settled it all. - - About the middle of the next day, as she was in her room getting - ready for a walk, a sudden noise below seemed to speak the whole - house in confusion; and, after listening a moment, she heard - somebody running up stairs in a violent hurry, and calling loudly - after her. She opened the door and met Maria in the landing - place, who, breathless with agitation, cried out— - - “Oh, my dear Eliza! pray make haste and come into the - dining-room, for there is such a sight to be seen! I will not - tell you what it is. Make haste, and come down this moment.” - - Elizabeth asked questions in vain; Maria would tell her nothing - more, and down they ran into the dining-room, which fronted the - lane, in quest of this wonder; It was two ladies stopping in a - low phaeton at the garden gate. - - “And is this all?” cried Elizabeth. “I expected at least that the - pigs were got into the garden, and here is nothing but Lady - Catherine and her daughter.” - - “La! my dear,” said Maria, quite shocked at the mistake, “it is - not Lady Catherine. The old lady is Mrs. Jenkinson, who lives - with them; the other is Miss de Bourgh. Only look at her. She is - quite a little creature. Who would have thought that she could be - so thin and small?” - - “She is abominably rude to keep Charlotte out of doors in all - this wind. Why does she not come in?” - - “Oh, Charlotte says she hardly ever does. It is the greatest of - favours when Miss de Bourgh comes in.” - - “I like her appearance,” said Elizabeth, struck with other ideas. - “She looks sickly and cross. Yes, she will do for him very well. - She will make him a very proper wife.” - - Mr. Collins and Charlotte were both standing at the gate in - conversation with the ladies; and Sir William, to Elizabeth’s - high diversion, was stationed in the doorway, in earnest - contemplation of the greatness before him, and constantly bowing - whenever Miss de Bourgh looked that way. - - At length there was nothing more to be said; the ladies drove on, - and the others returned into the house. Mr. Collins no sooner saw - the two girls than he began to congratulate them on their good - fortune, which Charlotte explained by letting them know that the - whole party was asked to dine at Rosings the next day. - - - - - Chapter 29 - - Mr. Collins’s triumph, in consequence of this invitation, was - complete. The power of displaying the grandeur of his patroness - to his wondering visitors, and of letting them see her civility - towards himself and his wife, was exactly what he had wished for; - and that an opportunity of doing it should be given so soon, was - such an instance of Lady Catherine’s condescension, as he knew - not how to admire enough. - - “I confess,” said he, “that I should not have been at all - surprised by her ladyship’s asking us on Sunday to drink tea and - spend the evening at Rosings. I rather expected, from my - knowledge of her affability, that it would happen. But who could - have foreseen such an attention as this? Who could have imagined - that we should receive an invitation to dine there (an - invitation, moreover, including the whole party) so immediately - after your arrival!” - - “I am the less surprised at what has happened,” replied Sir - William, “from that knowledge of what the manners of the great - really are, which my situation in life has allowed me to acquire. - About the court, such instances of elegant breeding are not - uncommon.” - - Scarcely anything was talked of the whole day or next morning but - their visit to Rosings. Mr. Collins was carefully instructing - them in what they were to expect, that the sight of such rooms, - so many servants, and so splendid a dinner, might not wholly - overpower them. - - When the ladies were separating for the toilette, he said to - Elizabeth— - - “Do not make yourself uneasy, my dear cousin, about your apparel. - Lady Catherine is far from requiring that elegance of dress in us - which becomes herself and her daughter. I would advise you merely - to put on whatever of your clothes is superior to the rest—there - is no occasion for anything more. Lady Catherine will not think - the worse of you for being simply dressed. She likes to have the - distinction of rank preserved.” - - While they were dressing, he came two or three times to their - different doors, to recommend their being quick, as Lady - Catherine very much objected to be kept waiting for her dinner. - Such formidable accounts of her ladyship, and her manner of - living, quite frightened Maria Lucas who had been little used to - company, and she looked forward to her introduction at Rosings - with as much apprehension as her father had done to his - presentation at St. James’s. - - As the weather was fine, they had a pleasant walk of about half a - mile across the park. Every park has its beauty and its - prospects; and Elizabeth saw much to be pleased with, though she - could not be in such raptures as Mr. Collins expected the scene - to inspire, and was but slightly affected by his enumeration of - the windows in front of the house, and his relation of what the - glazing altogether had originally cost Sir Lewis de Bourgh. - - When they ascended the steps to the hall, Maria’s alarm was every - moment increasing, and even Sir William did not look perfectly - calm. Elizabeth’s courage did not fail her. She had heard nothing - of Lady Catherine that spoke her awful from any extraordinary - talents or miraculous virtue, and the mere stateliness of money - or rank she thought she could witness without trepidation. - - From the entrance-hall, of which Mr. Collins pointed out, with a - rapturous air, the fine proportion and the finished ornaments, - they followed the servants through an ante-chamber, to the room - where Lady Catherine, her daughter, and Mrs. Jenkinson were - sitting. Her ladyship, with great condescension, arose to receive - them; and as Mrs. Collins had settled it with her husband that - the office of introduction should be hers, it was performed in a - proper manner, without any of those apologies and thanks which he - would have thought necessary. - - In spite of having been at St. James’s, Sir William was so - completely awed by the grandeur surrounding him, that he had but - just courage enough to make a very low bow, and take his seat - without saying a word; and his daughter, frightened almost out of - her senses, sat on the edge of her chair, not knowing which way - to look. Elizabeth found herself quite equal to the scene, and - could observe the three ladies before her composedly. Lady - Catherine was a tall, large woman, with strongly-marked features, - which might once have been handsome. Her air was not - conciliating, nor was her manner of receiving them such as to - make her visitors forget their inferior rank. She was not - rendered formidable by silence; but whatever she said was spoken - in so authoritative a tone, as marked her self-importance, and - brought Mr. Wickham immediately to Elizabeth’s mind; and from the - observation of the day altogether, she believed Lady Catherine to - be exactly what he represented. - - When, after examining the mother, in whose countenance and - deportment she soon found some resemblance of Mr. Darcy, she - turned her eyes on the daughter, she could almost have joined in - Maria’s astonishment at her being so thin and so small. There was - neither in figure nor face any likeness between the ladies. Miss - de Bourgh was pale and sickly; her features, though not plain, - were insignificant; and she spoke very little, except in a low - voice, to Mrs. Jenkinson, in whose appearance there was nothing - remarkable, and who was entirely engaged in listening to what she - said, and placing a screen in the proper direction before her - eyes. - - After sitting a few minutes, they were all sent to one of the - windows to admire the view, Mr. Collins attending them to point - out its beauties, and Lady Catherine kindly informing them that - it was much better worth looking at in the summer. - - The dinner was exceedingly handsome, and there were all the - servants and all the articles of plate which Mr. Collins had - promised; and, as he had likewise foretold, he took his seat at - the bottom of the table, by her ladyship’s desire, and looked as - if he felt that life could furnish nothing greater. He carved, - and ate, and praised with delighted alacrity; and every dish was - commended, first by him and then by Sir William, who was now - enough recovered to echo whatever his son-in-law said, in a - manner which Elizabeth wondered Lady Catherine could bear. But - Lady Catherine seemed gratified by their excessive admiration, - and gave most gracious smiles, especially when any dish on the - table proved a novelty to them. The party did not supply much - conversation. Elizabeth was ready to speak whenever there was an - opening, but she was seated between Charlotte and Miss de - Bourgh—the former of whom was engaged in listening to Lady - Catherine, and the latter said not a word to her all dinner-time. - Mrs. Jenkinson was chiefly employed in watching how little Miss - de Bourgh ate, pressing her to try some other dish, and fearing - she was indisposed. Maria thought speaking out of the question, - and the gentlemen did nothing but eat and admire. - - When the ladies returned to the drawing-room, there was little to - be done but to hear Lady Catherine talk, which she did without - any intermission till coffee came in, delivering her opinion on - every subject in so decisive a manner, as proved that she was not - used to have her judgement controverted. She inquired into - Charlotte’s domestic concerns familiarly and minutely, gave her a - great deal of advice as to the management of them all; told her - how everything ought to be regulated in so small a family as - hers, and instructed her as to the care of her cows and her - poultry. Elizabeth found that nothing was beneath this great - lady’s attention, which could furnish her with an occasion of - dictating to others. In the intervals of her discourse with Mrs. - Collins, she addressed a variety of questions to Maria and - Elizabeth, but especially to the latter, of whose connections she - knew the least, and who she observed to Mrs. Collins was a very - genteel, pretty kind of girl. She asked her, at different times, - how many sisters she had, whether they were older or younger than - herself, whether any of them were likely to be married, whether - they were handsome, where they had been educated, what carriage - her father kept, and what had been her mother’s maiden name? - Elizabeth felt all the impertinence of her questions but answered - them very composedly. Lady Catherine then observed, - - “Your father’s estate is entailed on Mr. Collins, I think. For - your sake,” turning to Charlotte, “I am glad of it; but otherwise - I see no occasion for entailing estates from the female line. It - was not thought necessary in Sir Lewis de Bourgh’s family. Do you - play and sing, Miss Bennet?” - - “A little.” - - “Oh! then—some time or other we shall be happy to hear you. Our - instrument is a capital one, probably superior to——You shall try - it some day. Do your sisters play and sing?” - - “One of them does.” - - “Why did not you all learn? You ought all to have learned. The - Miss Webbs all play, and their father has not so good an income - as yours. Do you draw?” - - “No, not at all.” - - “What, none of you?” - - “Not one.” - - “That is very strange. But I suppose you had no opportunity. Your - mother should have taken you to town every spring for the benefit - of masters.” - - “My mother would have had no objection, but my father hates - London.” - - “Has your governess left you?” - - “We never had any governess.” - - “No governess! How was that possible? Five daughters brought up - at home without a governess! I never heard of such a thing. Your - mother must have been quite a slave to your education.” - - Elizabeth could hardly help smiling as she assured her that had - not been the case. - - “Then, who taught you? who attended to you? Without a governess, - you must have been neglected.” - - “Compared with some families, I believe we were; but such of us - as wished to learn never wanted the means. We were always - encouraged to read, and had all the masters that were necessary. - Those who chose to be idle, certainly might.” - - “Aye, no doubt; but that is what a governess will prevent, and if - I had known your mother, I should have advised her most - strenuously to engage one. I always say that nothing is to be - done in education without steady and regular instruction, and - nobody but a governess can give it. It is wonderful how many - families I have been the means of supplying in that way. I am - always glad to get a young person well placed out. Four nieces of - Mrs. Jenkinson are most delightfully situated through my means; - and it was but the other day that I recommended another young - person, who was merely accidentally mentioned to me, and the - family are quite delighted with her. Mrs. Collins, did I tell you - of Lady Metcalf’s calling yesterday to thank me? She finds Miss - Pope a treasure. ‘Lady Catherine,’ said she, ‘you have given me a - treasure.’ Are any of your younger sisters out, Miss Bennet?” - - “Yes, ma’am, all.” - - “All! What, all five out at once? Very odd! And you only the - second. The younger ones out before the elder ones are married! - Your younger sisters must be very young?” - - “Yes, my youngest is not sixteen. Perhaps _she_ is full young to - be much in company. But really, ma’am, I think it would be very - hard upon younger sisters, that they should not have their share - of society and amusement, because the elder may not have the - means or inclination to marry early. The last-born has as good a - right to the pleasures of youth as the first. And to be kept back - on _such_ a motive! I think it would not be very likely to - promote sisterly affection or delicacy of mind.” - - “Upon my word,” said her ladyship, “you give your opinion very - decidedly for so young a person. Pray, what is your age?” - - “With three younger sisters grown up,” replied Elizabeth, - smiling, “your ladyship can hardly expect me to own it.” - - Lady Catherine seemed quite astonished at not receiving a direct - answer; and Elizabeth suspected herself to be the first creature - who had ever dared to trifle with so much dignified impertinence. - - “You cannot be more than twenty, I am sure, therefore you need - not conceal your age.” - - “I am not one-and-twenty.” - - When the gentlemen had joined them, and tea was over, the - card-tables were placed. Lady Catherine, Sir William, and Mr. and - Mrs. Collins sat down to quadrille; and as Miss de Bourgh chose - to play at cassino, the two girls had the honour of assisting - Mrs. Jenkinson to make up her party. Their table was - superlatively stupid. Scarcely a syllable was uttered that did - not relate to the game, except when Mrs. Jenkinson expressed her - fears of Miss de Bourgh’s being too hot or too cold, or having - too much or too little light. A great deal more passed at the - other table. Lady Catherine was generally speaking—stating the - mistakes of the three others, or relating some anecdote of - herself. Mr. Collins was employed in agreeing to everything her - ladyship said, thanking her for every fish he won, and - apologising if he thought he won too many. Sir William did not - say much. He was storing his memory with anecdotes and noble - names. - - When Lady Catherine and her daughter had played as long as they - chose, the tables were broken up, the carriage was offered to - Mrs. Collins, gratefully accepted and immediately ordered. The - party then gathered round the fire to hear Lady Catherine - determine what weather they were to have on the morrow. From - these instructions they were summoned by the arrival of the - coach; and with many speeches of thankfulness on Mr. Collins’s - side and as many bows on Sir William’s they departed. As soon as - they had driven from the door, Elizabeth was called on by her - cousin to give her opinion of all that she had seen at Rosings, - which, for Charlotte’s sake, she made more favourable than it - really was. But her commendation, though costing her some - trouble, could by no means satisfy Mr. Collins, and he was very - soon obliged to take her ladyship’s praise into his own hands. - - - - - Chapter 30 - - Sir William stayed only a week at Hunsford, but his visit was - long enough to convince him of his daughter’s being most - comfortably settled, and of her possessing such a husband and - such a neighbour as were not often met with. While Sir William - was with them, Mr. Collins devoted his morning to driving him out - in his gig, and showing him the country; but when he went away, - the whole family returned to their usual employments, and - Elizabeth was thankful to find that they did not see more of her - cousin by the alteration, for the chief of the time between - breakfast and dinner was now passed by him either at work in the - garden or in reading and writing, and looking out of the window - in his own book-room, which fronted the road. The room in which - the ladies sat was backwards. Elizabeth had at first rather - wondered that Charlotte should not prefer the dining-parlour for - common use; it was a better sized room, and had a more pleasant - aspect; but she soon saw that her friend had an excellent reason - for what she did, for Mr. Collins would undoubtedly have been - much less in his own apartment, had they sat in one equally - lively; and she gave Charlotte credit for the arrangement. - - From the drawing-room they could distinguish nothing in the lane, - and were indebted to Mr. Collins for the knowledge of what - carriages went along, and how often especially Miss de Bourgh - drove by in her phaeton, which he never failed coming to inform - them of, though it happened almost every day. She not - unfrequently stopped at the Parsonage, and had a few minutes’ - conversation with Charlotte, but was scarcely ever prevailed upon - to get out. - - Very few days passed in which Mr. Collins did not walk to - Rosings, and not many in which his wife did not think it - necessary to go likewise; and till Elizabeth recollected that - there might be other family livings to be disposed of, she could - not understand the sacrifice of so many hours. Now and then they - were honoured with a call from her ladyship, and nothing escaped - her observation that was passing in the room during these visits. - She examined into their employments, looked at their work, and - advised them to do it differently; found fault with the - arrangement of the furniture; or detected the housemaid in - negligence; and if she accepted any refreshment, seemed to do it - only for the sake of finding out that Mrs. Collins’s joints of - meat were too large for her family. - - Elizabeth soon perceived, that though this great lady was not in - commission of the peace of the county, she was a most active - magistrate in her own parish, the minutest concerns of which were - carried to her by Mr. Collins; and whenever any of the cottagers - were disposed to be quarrelsome, discontented, or too poor, she - sallied forth into the village to settle their differences, - silence their complaints, and scold them into harmony and plenty. - - The entertainment of dining at Rosings was repeated about twice a - week; and, allowing for the loss of Sir William, and there being - only one card-table in the evening, every such entertainment was - the counterpart of the first. Their other engagements were few, - as the style of living in the neighbourhood in general was beyond - Mr. Collins’s reach. This, however, was no evil to Elizabeth, and - upon the whole she spent her time comfortably enough; there were - half-hours of pleasant conversation with Charlotte, and the - weather was so fine for the time of year that she had often great - enjoyment out of doors. Her favourite walk, and where she - frequently went while the others were calling on Lady Catherine, - was along the open grove which edged that side of the park, where - there was a nice sheltered path, which no one seemed to value but - herself, and where she felt beyond the reach of Lady Catherine’s - curiosity. - - In this quiet way, the first fortnight of her visit soon passed - away. Easter was approaching, and the week preceding it was to - bring an addition to the family at Rosings, which in so small a - circle must be important. Elizabeth had heard soon after her - arrival that Mr. Darcy was expected there in the course of a few - weeks, and though there were not many of her acquaintances whom - she did not prefer, his coming would furnish one comparatively - new to look at in their Rosings parties, and she might be amused - in seeing how hopeless Miss Bingley’s designs on him were, by his - behaviour to his cousin, for whom he was evidently destined by - Lady Catherine, who talked of his coming with the greatest - satisfaction, spoke of him in terms of the highest admiration, - and seemed almost angry to find that he had already been - frequently seen by Miss Lucas and herself. - - His arrival was soon known at the Parsonage; for Mr. Collins was - walking the whole morning within view of the lodges opening into - Hunsford Lane, in order to have the earliest assurance of it, and - after making his bow as the carriage turned into the Park, - hurried home with the great intelligence. On the following - morning he hastened to Rosings to pay his respects. There were - two nephews of Lady Catherine to require them, for Mr. Darcy had - brought with him a Colonel Fitzwilliam, the younger son of his - uncle Lord ——, and, to the great surprise of all the party, when - Mr. Collins returned, the gentlemen accompanied him. Charlotte - had seen them from her husband’s room, crossing the road, and - immediately running into the other, told the girls what an honour - they might expect, adding: - - “I may thank you, Eliza, for this piece of civility. Mr. Darcy - would never have come so soon to wait upon me.” - - Elizabeth had scarcely time to disclaim all right to the - compliment, before their approach was announced by the door-bell, - and shortly afterwards the three gentlemen entered the room. - Colonel Fitzwilliam, who led the way, was about thirty, not - handsome, but in person and address most truly the gentleman. Mr. - Darcy looked just as he had been used to look in - Hertfordshire—paid his compliments, with his usual reserve, to - Mrs. Collins, and whatever might be his feelings toward her - friend, met her with every appearance of composure. Elizabeth - merely curtseyed to him without saying a word. - - Colonel Fitzwilliam entered into conversation directly with the - readiness and ease of a well-bred man, and talked very - pleasantly; but his cousin, after having addressed a slight - observation on the house and garden to Mrs. Collins, sat for some - time without speaking to anybody. At length, however, his - civility was so far awakened as to inquire of Elizabeth after the - health of her family. She answered him in the usual way, and - after a moment’s pause, added: - - “My eldest sister has been in town these three months. Have you - never happened to see her there?” - - She was perfectly sensible that he never had; but she wished to - see whether he would betray any consciousness of what had passed - between the Bingleys and Jane, and she thought he looked a little - confused as he answered that he had never been so fortunate as to - meet Miss Bennet. The subject was pursued no farther, and the - gentlemen soon afterwards went away. - - - - - Chapter 31 - - Colonel Fitzwilliam’s manners were very much admired at the - Parsonage, and the ladies all felt that he must add considerably - to the pleasures of their engagements at Rosings. It was some - days, however, before they received any invitation thither—for - while there were visitors in the house, they could not be - necessary; and it was not till Easter-day, almost a week after - the gentlemen’s arrival, that they were honoured by such an - attention, and then they were merely asked on leaving church to - come there in the evening. For the last week they had seen very - little of Lady Catherine or her daughter. Colonel Fitzwilliam had - called at the Parsonage more than once during the time, but Mr. - Darcy they had seen only at church. - - The invitation was accepted of course, and at a proper hour they - joined the party in Lady Catherine’s drawing-room. Her ladyship - received them civilly, but it was plain that their company was by - no means so acceptable as when she could get nobody else; and she - was, in fact, almost engrossed by her nephews, speaking to them, - especially to Darcy, much more than to any other person in the - room. - - Colonel Fitzwilliam seemed really glad to see them; anything was - a welcome relief to him at Rosings; and Mrs. Collins’s pretty - friend had moreover caught his fancy very much. He now seated - himself by her, and talked so agreeably of Kent and - Hertfordshire, of travelling and staying at home, of new books - and music, that Elizabeth had never been half so well entertained - in that room before; and they conversed with so much spirit and - flow, as to draw the attention of Lady Catherine herself, as well - as of Mr. Darcy. _His_ eyes had been soon and repeatedly turned - towards them with a look of curiosity; and that her ladyship, - after a while, shared the feeling, was more openly acknowledged, - for she did not scruple to call out: - - “What is that you are saying, Fitzwilliam? What is it you are - talking of? What are you telling Miss Bennet? Let me hear what it - is.” - - “We are speaking of music, madam,” said he, when no longer able - to avoid a reply. - - “Of music! Then pray speak aloud. It is of all subjects my - delight. I must have my share in the conversation if you are - speaking of music. There are few people in England, I suppose, - who have more true enjoyment of music than myself, or a better - natural taste. If I had ever learnt, I should have been a great - proficient. And so would Anne, if her health had allowed her to - apply. I am confident that she would have performed delightfully. - How does Georgiana get on, Darcy?” - - Mr. Darcy spoke with affectionate praise of his sister’s - proficiency. - - “I am very glad to hear such a good account of her,” said Lady - Catherine; “and pray tell her from me, that she cannot expect to - excel if she does not practice a good deal.” - - “I assure you, madam,” he replied, “that she does not need such - advice. She practises very constantly.” - - “So much the better. It cannot be done too much; and when I next - write to her, I shall charge her not to neglect it on any - account. I often tell young ladies that no excellence in music is - to be acquired without constant practice. I have told Miss Bennet - several times, that she will never play really well unless she - practises more; and though Mrs. Collins has no instrument, she is - very welcome, as I have often told her, to come to Rosings every - day, and play on the pianoforte in Mrs. Jenkinson’s room. She - would be in nobody’s way, you know, in that part of the house.” - - Mr. Darcy looked a little ashamed of his aunt’s ill-breeding, and - made no answer. - - When coffee was over, Colonel Fitzwilliam reminded Elizabeth of - having promised to play to him; and she sat down directly to the - instrument. He drew a chair near her. Lady Catherine listened to - half a song, and then talked, as before, to her other nephew; - till the latter walked away from her, and making with his usual - deliberation towards the pianoforte stationed himself so as to - command a full view of the fair performer’s countenance. - Elizabeth saw what he was doing, and at the first convenient - pause, turned to him with an arch smile, and said: - - “You mean to frighten me, Mr. Darcy, by coming in all this state - to hear me? I will not be alarmed though your sister _does_ play - so well. There is a stubbornness about me that never can bear to - be frightened at the will of others. My courage always rises at - every attempt to intimidate me.” - - “I shall not say you are mistaken,” he replied, “because you - could not really believe me to entertain any design of alarming - you; and I have had the pleasure of your acquaintance long enough - to know that you find great enjoyment in occasionally professing - opinions which in fact are not your own.” - - Elizabeth laughed heartily at this picture of herself, and said - to Colonel Fitzwilliam, “Your cousin will give you a very pretty - notion of me, and teach you not to believe a word I say. I am - particularly unlucky in meeting with a person so able to expose - my real character, in a part of the world where I had hoped to - pass myself off with some degree of credit. Indeed, Mr. Darcy, it - is very ungenerous in you to mention all that you knew to my - disadvantage in Hertfordshire—and, give me leave to say, very - impolitic too—for it is provoking me to retaliate, and such - things may come out as will shock your relations to hear.” - - “I am not afraid of you,” said he, smilingly. - - “Pray let me hear what you have to accuse him of,” cried Colonel - Fitzwilliam. “I should like to know how he behaves among - strangers.” - - “You shall hear then—but prepare yourself for something very - dreadful. The first time of my ever seeing him in Hertfordshire, - you must know, was at a ball—and at this ball, what do you think - he did? He danced only four dances, though gentlemen were scarce; - and, to my certain knowledge, more than one young lady was - sitting down in want of a partner. Mr. Darcy, you cannot deny the - fact.” - - “I had not at that time the honour of knowing any lady in the - assembly beyond my own party.” - - “True; and nobody can ever be introduced in a ball-room. Well, - Colonel Fitzwilliam, what do I play next? My fingers wait your - orders.” - - “Perhaps,” said Darcy, “I should have judged better, had I sought - an introduction; but I am ill-qualified to recommend myself to - strangers.” - - “Shall we ask your cousin the reason of this?” said Elizabeth, - still addressing Colonel Fitzwilliam. “Shall we ask him why a man - of sense and education, and who has lived in the world, is ill - qualified to recommend himself to strangers?” - - “I can answer your question,” said Fitzwilliam, “without applying - to him. It is because he will not give himself the trouble.” - - “I certainly have not the talent which some people possess,” said - Darcy, “of conversing easily with those I have never seen before. - I cannot catch their tone of conversation, or appear interested - in their concerns, as I often see done.” - - “My fingers,” said Elizabeth, “do not move over this instrument - in the masterly manner which I see so many women’s do. They have - not the same force or rapidity, and do not produce the same - expression. But then I have always supposed it to be my own - fault—because I will not take the trouble of practising. It is - not that I do not believe _my_ fingers as capable as any other - woman’s of superior execution.” - - Darcy smiled and said, “You are perfectly right. You have - employed your time much better. No one admitted to the privilege - of hearing you can think anything wanting. We neither of us - perform to strangers.” - - Here they were interrupted by Lady Catherine, who called out to - know what they were talking of. Elizabeth immediately began - playing again. Lady Catherine approached, and, after listening - for a few minutes, said to Darcy: - - “Miss Bennet would not play at all amiss if she practised more, - and could have the advantage of a London master. She has a very - good notion of fingering, though her taste is not equal to - Anne’s. Anne would have been a delightful performer, had her - health allowed her to learn.” - - Elizabeth looked at Darcy to see how cordially he assented to his - cousin’s praise; but neither at that moment nor at any other - could she discern any symptom of love; and from the whole of his - behaviour to Miss de Bourgh she derived this comfort for Miss - Bingley, that he might have been just as likely to marry _her_, - had she been his relation. - - Lady Catherine continued her remarks on Elizabeth’s performance, - mixing with them many instructions on execution and taste. - Elizabeth received them with all the forbearance of civility, - and, at the request of the gentlemen, remained at the instrument - till her ladyship’s carriage was ready to take them all home. - - - - - Chapter 32 - - Elizabeth was sitting by herself the next morning, and writing to - Jane while Mrs. Collins and Maria were gone on business into the - village, when she was startled by a ring at the door, the certain - signal of a visitor. As she had heard no carriage, she thought it - not unlikely to be Lady Catherine, and under that apprehension - was putting away her half-finished letter that she might escape - all impertinent questions, when the door opened, and, to her very - great surprise, Mr. Darcy, and Mr. Darcy only, entered the room. - - He seemed astonished too on finding her alone, and apologised for - his intrusion by letting her know that he had understood all the - ladies were to be within. - - They then sat down, and when her inquiries after Rosings were - made, seemed in danger of sinking into total silence. It was - absolutely necessary, therefore, to think of something, and in - this emergence recollecting _when_ she had seen him last in - Hertfordshire, and feeling curious to know what he would say on - the subject of their hasty departure, she observed: - - “How very suddenly you all quitted Netherfield last November, Mr. - Darcy! It must have been a most agreeable surprise to Mr. Bingley - to see you all after him so soon; for, if I recollect right, he - went but the day before. He and his sisters were well, I hope, - when you left London?” - - “Perfectly so, I thank you.” - - She found that she was to receive no other answer, and, after a - short pause added: - - “I think I have understood that Mr. Bingley has not much idea of - ever returning to Netherfield again?” - - “I have never heard him say so; but it is probable that he may - spend very little of his time there in the future. He has many - friends, and is at a time of life when friends and engagements - are continually increasing.” - - “If he means to be but little at Netherfield, it would be better - for the neighbourhood that he should give up the place entirely, - for then we might possibly get a settled family there. But, - perhaps, Mr. Bingley did not take the house so much for the - convenience of the neighbourhood as for his own, and we must - expect him to keep it or quit it on the same principle.” - - “I should not be surprised,” said Darcy, “if he were to give it - up as soon as any eligible purchase offers.” - - Elizabeth made no answer. She was afraid of talking longer of his - friend; and, having nothing else to say, was now determined to - leave the trouble of finding a subject to him. - - He took the hint, and soon began with, “This seems a very - comfortable house. Lady Catherine, I believe, did a great deal to - it when Mr. Collins first came to Hunsford.” - - “I believe she did—and I am sure she could not have bestowed her - kindness on a more grateful object.” - - “Mr. Collins appears to be very fortunate in his choice of a - wife.” - - “Yes, indeed, his friends may well rejoice in his having met with - one of the very few sensible women who would have accepted him, - or have made him happy if they had. My friend has an excellent - understanding—though I am not certain that I consider her - marrying Mr. Collins as the wisest thing she ever did. She seems - perfectly happy, however, and in a prudential light it is - certainly a very good match for her.” - - “It must be very agreeable for her to be settled within so easy a - distance of her own family and friends.” - - “An easy distance, do you call it? It is nearly fifty miles.” - - “And what is fifty miles of good road? Little more than half a - day’s journey. Yes, I call it a very easy distance.” - - “I should never have considered the distance as one of the - _advantages_ of the match,” cried Elizabeth. “I should never have - said Mrs. Collins was settled _near_ her family.” - - “It is a proof of your own attachment to Hertfordshire. Anything - beyond the very neighbourhood of Longbourn, I suppose, would - appear far.” - - As he spoke there was a sort of smile which Elizabeth fancied she - understood; he must be supposing her to be thinking of Jane and - Netherfield, and she blushed as she answered: - - “I do not mean to say that a woman may not be settled too near - her family. The far and the near must be relative, and depend on - many varying circumstances. Where there is fortune to make the - expenses of travelling unimportant, distance becomes no evil. But - that is not the case _here_. Mr. and Mrs. Collins have a - comfortable income, but not such a one as will allow of frequent - journeys—and I am persuaded my friend would not call herself - _near_ her family under less than _half_ the present distance.” - - Mr. Darcy drew his chair a little towards her, and said, “_You_ - cannot have a right to such very strong local attachment. _You_ - cannot have been always at Longbourn.” - - Elizabeth looked surprised. The gentleman experienced some change - of feeling; he drew back his chair, took a newspaper from the - table, and glancing over it, said, in a colder voice: - - “Are you pleased with Kent?” - - A short dialogue on the subject of the country ensued, on either - side calm and concise—and soon put an end to by the entrance of - Charlotte and her sister, just returned from her walk. The - _tÊte-à-tÊte_ surprised them. Mr. Darcy related the mistake which - had occasioned his intruding on Miss Bennet, and after sitting a - few minutes longer without saying much to anybody, went away. - - “What can be the meaning of this?” said Charlotte, as soon as he - was gone. “My dear, Eliza, he must be in love with you, or he - would never have called us in this familiar way.” - - But when Elizabeth told of his silence, it did not seem very - likely, even to Charlotte’s wishes, to be the case; and after - various conjectures, they could at last only suppose his visit to - proceed from the difficulty of finding anything to do, which was - the more probable from the time of year. All field sports were - over. Within doors there was Lady Catherine, books, and a - billiard-table, but gentlemen cannot always be within doors; and - in the nearness of the Parsonage, or the pleasantness of the walk - to it, or of the people who lived in it, the two cousins found a - temptation from this period of walking thither almost every day. - They called at various times of the morning, sometimes - separately, sometimes together, and now and then accompanied by - their aunt. It was plain to them all that Colonel Fitzwilliam - came because he had pleasure in their society, a persuasion which - of course recommended him still more; and Elizabeth was reminded - by her own satisfaction in being with him, as well as by his - evident admiration of her, of her former favourite George - Wickham; and though, in comparing them, she saw there was less - captivating softness in Colonel Fitzwilliam’s manners, she - believed he might have the best informed mind. - - But why Mr. Darcy came so often to the Parsonage, it was more - difficult to understand. It could not be for society, as he - frequently sat there ten minutes together without opening his - lips; and when he did speak, it seemed the effect of necessity - rather than of choice—a sacrifice to propriety, not a pleasure to - himself. He seldom appeared really animated. Mrs. Collins knew - not what to make of him. Colonel Fitzwilliam’s occasionally - laughing at his stupidity, proved that he was generally - different, which her own knowledge of him could not have told - her; and as she would liked to have believed this change the - effect of love, and the object of that love her friend Eliza, she - set herself seriously to work to find it out. She watched him - whenever they were at Rosings, and whenever he came to Hunsford; - but without much success. He certainly looked at her friend a - great deal, but the expression of that look was disputable. It - was an earnest, steadfast gaze, but she often doubted whether - there were much admiration in it, and sometimes it seemed nothing - but absence of mind. - - She had once or twice suggested to Elizabeth the possibility of - his being partial to her, but Elizabeth always laughed at the - idea; and Mrs. Collins did not think it right to press the - subject, from the danger of raising expectations which might only - end in disappointment; for in her opinion it admitted not of a - doubt, that all her friend’s dislike would vanish, if she could - suppose him to be in her power. - - In her kind schemes for Elizabeth, she sometimes planned her - marrying Colonel Fitzwilliam. He was beyond comparison the most - pleasant man; he certainly admired her, and his situation in life - was most eligible; but, to counterbalance these advantages, Mr. - Darcy had considerable patronage in the church, and his cousin - could have none at all. - - - - - Chapter 33 - - More than once did Elizabeth, in her ramble within the park, - unexpectedly meet Mr. Darcy. She felt all the perverseness of the - mischance that should bring him where no one else was brought, - and, to prevent its ever happening again, took care to inform him - at first that it was a favourite haunt of hers. How it could - occur a second time, therefore, was very odd! Yet it did, and - even a third. It seemed like wilful ill-nature, or a voluntary - penance, for on these occasions it was not merely a few formal - inquiries and an awkward pause and then away, but he actually - thought it necessary to turn back and walk with her. He never - said a great deal, nor did she give herself the trouble of - talking or of listening much; but it struck her in the course of - their third rencontre that he was asking some odd unconnected - questions—about her pleasure in being at Hunsford, her love of - solitary walks, and her opinion of Mr. and Mrs. Collins’s - happiness; and that in speaking of Rosings and her not perfectly - understanding the house, he seemed to expect that whenever she - came into Kent again she would be staying _there_ too. His words - seemed to imply it. Could he have Colonel Fitzwilliam in his - thoughts? She supposed, if he meant anything, he must mean an - allusion to what might arise in that quarter. It distressed her a - little, and she was quite glad to find herself at the gate in the - pales opposite the Parsonage. - - She was engaged one day as she walked, in perusing Jane’s last - letter, and dwelling on some passages which proved that Jane had - not written in spirits, when, instead of being again surprised by - Mr. Darcy, she saw on looking up that Colonel Fitzwilliam was - meeting her. Putting away the letter immediately and forcing a - smile, she said: - - “I did not know before that you ever walked this way.” - - “I have been making the tour of the park,” he replied, “as I - generally do every year, and intend to close it with a call at - the Parsonage. Are you going much farther?” - - “No, I should have turned in a moment.” - - And accordingly she did turn, and they walked towards the - Parsonage together. - - “Do you certainly leave Kent on Saturday?” said she. - - “Yes—if Darcy does not put it off again. But I am at his - disposal. He arranges the business just as he pleases.” - - “And if not able to please himself in the arrangement, he has at - least pleasure in the great power of choice. I do not know - anybody who seems more to enjoy the power of doing what he likes - than Mr. Darcy.” - - “He likes to have his own way very well,” replied Colonel - Fitzwilliam. “But so we all do. It is only that he has better - means of having it than many others, because he is rich, and many - others are poor. I speak feelingly. A younger son, you know, must - be inured to self-denial and dependence.” - - “In my opinion, the younger son of an earl can know very little - of either. Now seriously, what have you ever known of self-denial - and dependence? When have you been prevented by want of money - from going wherever you chose, or procuring anything you had a - fancy for?” - - “These are home questions—and perhaps I cannot say that I have - experienced many hardships of that nature. But in matters of - greater weight, I may suffer from want of money. Younger sons - cannot marry where they like.” - - “Unless where they like women of fortune, which I think they very - often do.” - - “Our habits of expense make us too dependent, and there are not - many in my rank of life who can afford to marry without some - attention to money.” - - “Is this,” thought Elizabeth, “meant for me?” and she coloured at - the idea; but, recovering herself, said in a lively tone, “And - pray, what is the usual price of an earl’s younger son? Unless - the elder brother is very sickly, I suppose you would not ask - above fifty thousand pounds.” - - He answered her in the same style, and the subject dropped. To - interrupt a silence which might make him fancy her affected with - what had passed, she soon afterwards said: - - “I imagine your cousin brought you down with him chiefly for the - sake of having someone at his disposal. I wonder he does not - marry, to secure a lasting convenience of that kind. But, - perhaps, his sister does as well for the present, and, as she is - under his sole care, he may do what he likes with her.” - - “No,” said Colonel Fitzwilliam, “that is an advantage which he - must divide with me. I am joined with him in the guardianship of - Miss Darcy.” - - “Are you indeed? And pray what sort of guardians do you make? - Does your charge give you much trouble? Young ladies of her age - are sometimes a little difficult to manage, and if she has the - true Darcy spirit, she may like to have her own way.” - - As she spoke she observed him looking at her earnestly; and the - manner in which he immediately asked her why she supposed Miss - Darcy likely to give them any uneasiness, convinced her that she - had somehow or other got pretty near the truth. She directly - replied: - - “You need not be frightened. I never heard any harm of her; and I - dare say she is one of the most tractable creatures in the world. - She is a very great favourite with some ladies of my - acquaintance, Mrs. Hurst and Miss Bingley. I think I have heard - you say that you know them.” - - “I know them a little. Their brother is a pleasant gentlemanlike - man—he is a great friend of Darcy’s.” - - “Oh! yes,” said Elizabeth drily; “Mr. Darcy is uncommonly kind to - Mr. Bingley, and takes a prodigious deal of care of him.” - - “Care of him! Yes, I really believe Darcy _does_ take care of him - in those points where he most wants care. From something that he - told me in our journey hither, I have reason to think Bingley - very much indebted to him. But I ought to beg his pardon, for I - have no right to suppose that Bingley was the person meant. It - was all conjecture.” - - “What is it you mean?” - - “It is a circumstance which Darcy could not wish to be generally - known, because if it were to get round to the lady’s family, it - would be an unpleasant thing.” - - “You may depend upon my not mentioning it.” - - “And remember that I have not much reason for supposing it to be - Bingley. What he told me was merely this: that he congratulated - himself on having lately saved a friend from the inconveniences - of a most imprudent marriage, but without mentioning names or any - other particulars, and I only suspected it to be Bingley from - believing him the kind of young man to get into a scrape of that - sort, and from knowing them to have been together the whole of - last summer.” - - “Did Mr. Darcy give you reasons for this interference?” - - “I understood that there were some very strong objections against - the lady.” - - “And what arts did he use to separate them?” - - “He did not talk to me of his own arts,” said Fitzwilliam, - smiling. “He only told me what I have now told you.” - - Elizabeth made no answer, and walked on, her heart swelling with - indignation. After watching her a little, Fitzwilliam asked her - why she was so thoughtful. - - “I am thinking of what you have been telling me,” said she. “Your - cousin’s conduct does not suit my feelings. Why was he to be the - judge?” - - “You are rather disposed to call his interference officious?” - - “I do not see what right Mr. Darcy had to decide on the propriety - of his friend’s inclination, or why, upon his own judgement - alone, he was to determine and direct in what manner his friend - was to be happy. But,” she continued, recollecting herself, “as - we know none of the particulars, it is not fair to condemn him. - It is not to be supposed that there was much affection in the - case.” - - “That is not an unnatural surmise,” said Fitzwilliam, “but it is - a lessening of the honour of my cousin’s triumph very sadly.” - - This was spoken jestingly; but it appeared to her so just a - picture of Mr. Darcy, that she would not trust herself with an - answer, and therefore, abruptly changing the conversation talked - on indifferent matters until they reached the Parsonage. There, - shut into her own room, as soon as their visitor left them, she - could think without interruption of all that she had heard. It - was not to be supposed that any other people could be meant than - those with whom she was connected. There could not exist in the - world _two_ men over whom Mr. Darcy could have such boundless - influence. That he had been concerned in the measures taken to - separate Bingley and Jane she had never doubted; but she had - always attributed to Miss Bingley the principal design and - arrangement of them. If his own vanity, however, did not mislead - him, _he_ was the cause, his pride and caprice were the cause, of - all that Jane had suffered, and still continued to suffer. He had - ruined for a while every hope of happiness for the most - affectionate, generous heart in the world; and no one could say - how lasting an evil he might have inflicted. - - “There were some very strong objections against the lady,” were - Colonel Fitzwilliam’s words; and those strong objections probably - were, her having one uncle who was a country attorney, and - another who was in business in London. - - “To Jane herself,” she exclaimed, “there could be no possibility - of objection; all loveliness and goodness as she is!—her - understanding excellent, her mind improved, and her manners - captivating. Neither could anything be urged against my father, - who, though with some peculiarities, has abilities Mr. Darcy - himself need not disdain, and respectability which he will - probably never reach.” When she thought of her mother, her - confidence gave way a little; but she would not allow that any - objections _there_ had material weight with Mr. Darcy, whose - pride, she was convinced, would receive a deeper wound from the - want of importance in his friend’s connections, than from their - want of sense; and she was quite decided, at last, that he had - been partly governed by this worst kind of pride, and partly by - the wish of retaining Mr. Bingley for his sister. - - The agitation and tears which the subject occasioned, brought on - a headache; and it grew so much worse towards the evening, that, - added to her unwillingness to see Mr. Darcy, it determined her - not to attend her cousins to Rosings, where they were engaged to - drink tea. Mrs. Collins, seeing that she was really unwell, did - not press her to go and as much as possible prevented her husband - from pressing her; but Mr. Collins could not conceal his - apprehension of Lady Catherine’s being rather displeased by her - staying at home. - - - - - Chapter 34 - - When they were gone, Elizabeth, as if intending to exasperate - herself as much as possible against Mr. Darcy, chose for her - employment the examination of all the letters which Jane had - written to her since her being in Kent. They contained no actual - complaint, nor was there any revival of past occurrences, or any - communication of present suffering. But in all, and in almost - every line of each, there was a want of that cheerfulness which - had been used to characterise her style, and which, proceeding - from the serenity of a mind at ease with itself and kindly - disposed towards everyone, had been scarcely ever clouded. - Elizabeth noticed every sentence conveying the idea of - uneasiness, with an attention which it had hardly received on the - first perusal. Mr. Darcy’s shameful boast of what misery he had - been able to inflict, gave her a keener sense of her sister’s - sufferings. It was some consolation to think that his visit to - Rosings was to end on the day after the next—and, a still - greater, that in less than a fortnight she should herself be with - Jane again, and enabled to contribute to the recovery of her - spirits, by all that affection could do. - - She could not think of Darcy’s leaving Kent without remembering - that his cousin was to go with him; but Colonel Fitzwilliam had - made it clear that he had no intentions at all, and agreeable as - he was, she did not mean to be unhappy about him. - - While settling this point, she was suddenly roused by the sound - of the door-bell, and her spirits were a little fluttered by the - idea of its being Colonel Fitzwilliam himself, who had once - before called late in the evening, and might now come to inquire - particularly after her. But this idea was soon banished, and her - spirits were very differently affected, when, to her utter - amazement, she saw Mr. Darcy walk into the room. In an hurried - manner he immediately began an inquiry after her health, imputing - his visit to a wish of hearing that she were better. She answered - him with cold civility. He sat down for a few moments, and then - getting up, walked about the room. Elizabeth was surprised, but - said not a word. After a silence of several minutes, he came - towards her in an agitated manner, and thus began: - - “In vain I have struggled. It will not do. My feelings will not - be repressed. You must allow me to tell you how ardently I admire - and love you.” - - Elizabeth’s astonishment was beyond expression. She stared, - coloured, doubted, and was silent. This he considered sufficient - encouragement; and the avowal of all that he felt, and had long - felt for her, immediately followed. He spoke well; but there were - feelings besides those of the heart to be detailed; and he was - not more eloquent on the subject of tenderness than of pride. His - sense of her inferiority—of its being a degradation—of the family - obstacles which had always opposed to inclination, were dwelt on - with a warmth which seemed due to the consequence he was - wounding, but was very unlikely to recommend his suit. - - In spite of her deeply-rooted dislike, she could not be - insensible to the compliment of such a man’s affection, and - though her intentions did not vary for an instant, she was at - first sorry for the pain he was to receive; till, roused to - resentment by his subsequent language, she lost all compassion in - anger. She tried, however, to compose herself to answer him with - patience, when he should have done. He concluded with - representing to her the strength of that attachment which, in - spite of all his endeavours, he had found impossible to conquer; - and with expressing his hope that it would now be rewarded by her - acceptance of his hand. As he said this, she could easily see - that he had no doubt of a favourable answer. He _spoke_ of - apprehension and anxiety, but his countenance expressed real - security. Such a circumstance could only exasperate farther, and, - when he ceased, the colour rose into her cheeks, and she said: - - “In such cases as this, it is, I believe, the established mode to - express a sense of obligation for the sentiments avowed, however - unequally they may be returned. It is natural that obligation - should be felt, and if I could _feel_ gratitude, I would now - thank you. But I cannot—I have never desired your good opinion, - and you have certainly bestowed it most unwillingly. I am sorry - to have occasioned pain to anyone. It has been most unconsciously - done, however, and I hope will be of short duration. The feelings - which, you tell me, have long prevented the acknowledgment of - your regard, can have little difficulty in overcoming it after - this explanation.” - - Mr. Darcy, who was leaning against the mantelpiece with his eyes - fixed on her face, seemed to catch her words with no less - resentment than surprise. His complexion became pale with anger, - and the disturbance of his mind was visible in every feature. He - was struggling for the appearance of composure, and would not - open his lips till he believed himself to have attained it. The - pause was to Elizabeth’s feelings dreadful. At length, with a - voice of forced calmness, he said: - - “And this is all the reply which I am to have the honour of - expecting! I might, perhaps, wish to be informed why, with so - little _endeavour_ at civility, I am thus rejected. But it is of - small importance.” - - “I might as well inquire,” replied she, “why with so evident a - desire of offending and insulting me, you chose to tell me that - you liked me against your will, against your reason, and even - against your character? Was not this some excuse for incivility, - if I _was_ uncivil? But I have other provocations. You know I - have. Had not my feelings decided against you—had they been - indifferent, or had they even been favourable, do you think that - any consideration would tempt me to accept the man who has been - the means of ruining, perhaps for ever, the happiness of a most - beloved sister?” - - As she pronounced these words, Mr. Darcy changed colour; but the - emotion was short, and he listened without attempting to - interrupt her while she continued: - - “I have every reason in the world to think ill of you. No motive - can excuse the unjust and ungenerous part you acted _there_. You - dare not, you cannot deny, that you have been the principal, if - not the only means of dividing them from each other—of exposing - one to the censure of the world for caprice and instability, and - the other to its derision for disappointed hopes, and involving - them both in misery of the acutest kind.” - - She paused, and saw with no slight indignation that he was - listening with an air which proved him wholly unmoved by any - feeling of remorse. He even looked at her with a smile of - affected incredulity. - - “Can you deny that you have done it?” she repeated. - - With assumed tranquillity he then replied: “I have no wish of - denying that I did everything in my power to separate my friend - from your sister, or that I rejoice in my success. Towards _him_ - I have been kinder than towards myself.” - - Elizabeth disdained the appearance of noticing this civil - reflection, but its meaning did not escape, nor was it likely to - conciliate her. - - “But it is not merely this affair,” she continued, “on which my - dislike is founded. Long before it had taken place my opinion of - you was decided. Your character was unfolded in the recital which - I received many months ago from Mr. Wickham. On this subject, - what can you have to say? In what imaginary act of friendship can - you here defend yourself? or under what misrepresentation can you - here impose upon others?” - - “You take an eager interest in that gentleman’s concerns,” said - Darcy, in a less tranquil tone, and with a heightened colour. - - “Who that knows what his misfortunes have been, can help feeling - an interest in him?” - - “His misfortunes!” repeated Darcy contemptuously; “yes, his - misfortunes have been great indeed.” - - “And of your infliction,” cried Elizabeth with energy. “You have - reduced him to his present state of poverty—comparative poverty. - You have withheld the advantages which you must know to have been - designed for him. You have deprived the best years of his life of - that independence which was no less his due than his desert. You - have done all this! and yet you can treat the mention of his - misfortune with contempt and ridicule.” - - “And this,” cried Darcy, as he walked with quick steps across the - room, “is your opinion of me! This is the estimation in which you - hold me! I thank you for explaining it so fully. My faults, - according to this calculation, are heavy indeed! But perhaps,” - added he, stopping in his walk, and turning towards her, “these - offenses might have been overlooked, had not your pride been hurt - by my honest confession of the scruples that had long prevented - my forming any serious design. These bitter accusations might - have been suppressed, had I, with greater policy, concealed my - struggles, and flattered you into the belief of my being impelled - by unqualified, unalloyed inclination; by reason, by reflection, - by everything. But disguise of every sort is my abhorrence. Nor - am I ashamed of the feelings I related. They were natural and - just. Could you expect me to rejoice in the inferiority of your - connections?—to congratulate myself on the hope of relations, - whose condition in life is so decidedly beneath my own?” - - Elizabeth felt herself growing more angry every moment; yet she - tried to the utmost to speak with composure when she said: - - “You are mistaken, Mr. Darcy, if you suppose that the mode of - your declaration affected me in any other way, than as it spared - me the concern which I might have felt in refusing you, had you - behaved in a more gentlemanlike manner.” - - She saw him start at this, but he said nothing, and she - continued: - - “You could not have made the offer of your hand in any possible - way that would have tempted me to accept it.” - - Again his astonishment was obvious; and he looked at her with an - expression of mingled incredulity and mortification. She went on: - - “From the very beginning—from the first moment, I may almost - say—of my acquaintance with you, your manners, impressing me with - the fullest belief of your arrogance, your conceit, and your - selfish disdain of the feelings of others, were such as to form - the groundwork of disapprobation on which succeeding events have - built so immovable a dislike; and I had not known you a month - before I felt that you were the last man in the world whom I - could ever be prevailed on to marry.” - - “You have said quite enough, madam. I perfectly comprehend your - feelings, and have now only to be ashamed of what my own have - been. Forgive me for having taken up so much of your time, and - accept my best wishes for your health and happiness.” - - And with these words he hastily left the room, and Elizabeth - heard him the next moment open the front door and quit the house. - - The tumult of her mind, was now painfully great. She knew not how - to support herself, and from actual weakness sat down and cried - for half-an-hour. Her astonishment, as she reflected on what had - passed, was increased by every review of it. That she should - receive an offer of marriage from Mr. Darcy! That he should have - been in love with her for so many months! So much in love as to - wish to marry her in spite of all the objections which had made - him prevent his friend’s marrying her sister, and which must - appear at least with equal force in his own case—was almost - incredible! It was gratifying to have inspired unconsciously so - strong an affection. But his pride, his abominable pride—his - shameless avowal of what he had done with respect to Jane—his - unpardonable assurance in acknowledging, though he could not - justify it, and the unfeeling manner in which he had mentioned - Mr. Wickham, his cruelty towards whom he had not attempted to - deny, soon overcame the pity which the consideration of his - attachment had for a moment excited. She continued in very - agitated reflections till the sound of Lady Catherine’s carriage - made her feel how unequal she was to encounter Charlotte’s - observation, and hurried her away to her room. - - - - - Chapter 35 - - Elizabeth awoke the next morning to the same thoughts and - meditations which had at length closed her eyes. She could not - yet recover from the surprise of what had happened; it was - impossible to think of anything else; and, totally indisposed for - employment, she resolved, soon after breakfast, to indulge - herself in air and exercise. She was proceeding directly to her - favourite walk, when the recollection of Mr. Darcy’s sometimes - coming there stopped her, and instead of entering the park, she - turned up the lane, which led farther from the turnpike-road. The - park paling was still the boundary on one side, and she soon - passed one of the gates into the ground. - - After walking two or three times along that part of the lane, she - was tempted, by the pleasantness of the morning, to stop at the - gates and look into the park. The five weeks which she had now - passed in Kent had made a great difference in the country, and - every day was adding to the verdure of the early trees. She was - on the point of continuing her walk, when she caught a glimpse of - a gentleman within the sort of grove which edged the park; he was - moving that way; and, fearful of its being Mr. Darcy, she was - directly retreating. But the person who advanced was now near - enough to see her, and stepping forward with eagerness, - pronounced her name. She had turned away; but on hearing herself - called, though in a voice which proved it to be Mr. Darcy, she - moved again towards the gate. He had by that time reached it - also, and, holding out a letter, which she instinctively took, - said, with a look of haughty composure, “I have been walking in - the grove some time in the hope of meeting you. Will you do me - the honour of reading that letter?” And then, with a slight bow, - turned again into the plantation, and was soon out of sight. - - With no expectation of pleasure, but with the strongest - curiosity, Elizabeth opened the letter, and, to her still - increasing wonder, perceived an envelope containing two sheets of - letter-paper, written quite through, in a very close hand. The - envelope itself was likewise full. Pursuing her way along the - lane, she then began it. It was dated from Rosings, at eight - o’clock in the morning, and was as follows:— - - “Be not alarmed, madam, on receiving this letter, by the - apprehension of its containing any repetition of those sentiments - or renewal of those offers which were last night so disgusting to - you. I write without any intention of paining you, or humbling - myself, by dwelling on wishes which, for the happiness of both, - cannot be too soon forgotten; and the effort which the formation - and the perusal of this letter must occasion, should have been - spared, had not my character required it to be written and read. - You must, therefore, pardon the freedom with which I demand your - attention; your feelings, I know, will bestow it unwillingly, but - I demand it of your justice. - - “Two offenses of a very different nature, and by no means of - equal magnitude, you last night laid to my charge. The first - mentioned was, that, regardless of the sentiments of either, I - had detached Mr. Bingley from your sister, and the other, that I - had, in defiance of various claims, in defiance of honour and - humanity, ruined the immediate prosperity and blasted the - prospects of Mr. Wickham. Wilfully and wantonly to have thrown - off the companion of my youth, the acknowledged favourite of my - father, a young man who had scarcely any other dependence than on - our patronage, and who had been brought up to expect its - exertion, would be a depravity, to which the separation of two - young persons, whose affection could be the growth of only a few - weeks, could bear no comparison. But from the severity of that - blame which was last night so liberally bestowed, respecting each - circumstance, I shall hope to be in the future secured, when the - following account of my actions and their motives has been read. - If, in the explanation of them, which is due to myself, I am - under the necessity of relating feelings which may be offensive - to yours, I can only say that I am sorry. The necessity must be - obeyed, and further apology would be absurd. - - “I had not been long in Hertfordshire, before I saw, in common - with others, that Bingley preferred your elder sister to any - other young woman in the country. But it was not till the evening - of the dance at Netherfield that I had any apprehension of his - feeling a serious attachment. I had often seen him in love - before. At that ball, while I had the honour of dancing with you, - I was first made acquainted, by Sir William Lucas’s accidental - information, that Bingley’s attentions to your sister had given - rise to a general expectation of their marriage. He spoke of it - as a certain event, of which the time alone could be undecided. - From that moment I observed my friend’s behaviour attentively; - and I could then perceive that his partiality for Miss Bennet was - beyond what I had ever witnessed in him. Your sister I also - watched. Her look and manners were open, cheerful, and engaging - as ever, but without any symptom of peculiar regard, and I - remained convinced from the evening’s scrutiny, that though she - received his attentions with pleasure, she did not invite them by - any participation of sentiment. If _you_ have not been mistaken - here, _I_ must have been in error. Your superior knowledge of - your sister must make the latter probable. If it be so, if I have - been misled by such error to inflict pain on her, your resentment - has not been unreasonable. But I shall not scruple to assert, - that the serenity of your sister’s countenance and air was such - as might have given the most acute observer a conviction that, - however amiable her temper, her heart was not likely to be easily - touched. That I was desirous of believing her indifferent is - certain—but I will venture to say that my investigation and - decisions are not usually influenced by my hopes or fears. I did - not believe her to be indifferent because I wished it; I believed - it on impartial conviction, as truly as I wished it in reason. My - objections to the marriage were not merely those which I last - night acknowledged to have the utmost force of passion to put - aside, in my own case; the want of connection could not be so - great an evil to my friend as to me. But there were other causes - of repugnance; causes which, though still existing, and existing - to an equal degree in both instances, I had myself endeavoured to - forget, because they were not immediately before me. These causes - must be stated, though briefly. The situation of your mother’s - family, though objectionable, was nothing in comparison to that - total want of propriety so frequently, so almost uniformly - betrayed by herself, by your three younger sisters, and - occasionally even by your father. Pardon me. It pains me to - offend you. But amidst your concern for the defects of your - nearest relations, and your displeasure at this representation of - them, let it give you consolation to consider that, to have - conducted yourselves so as to avoid any share of the like - censure, is praise no less generally bestowed on you and your - elder sister, than it is honourable to the sense and disposition - of both. I will only say farther that from what passed that - evening, my opinion of all parties was confirmed, and every - inducement heightened which could have led me before, to preserve - my friend from what I esteemed a most unhappy connection. He left - Netherfield for London, on the day following, as you, I am - certain, remember, with the design of soon returning. - - “The part which I acted is now to be explained. His sisters’ - uneasiness had been equally excited with my own; our coincidence - of feeling was soon discovered, and, alike sensible that no time - was to be lost in detaching their brother, we shortly resolved on - joining him directly in London. We accordingly went—and there I - readily engaged in the office of pointing out to my friend the - certain evils of such a choice. I described, and enforced them - earnestly. But, however this remonstrance might have staggered or - delayed his determination, I do not suppose that it would - ultimately have prevented the marriage, had it not been seconded - by the assurance that I hesitated not in giving, of your sister’s - indifference. He had before believed her to return his affection - with sincere, if not with equal regard. But Bingley has great - natural modesty, with a stronger dependence on my judgement than - on his own. To convince him, therefore, that he had deceived - himself, was no very difficult point. To persuade him against - returning into Hertfordshire, when that conviction had been - given, was scarcely the work of a moment. I cannot blame myself - for having done thus much. There is but one part of my conduct in - the whole affair on which I do not reflect with satisfaction; it - is that I condescended to adopt the measures of art so far as to - conceal from him your sister’s being in town. I knew it myself, - as it was known to Miss Bingley; but her brother is even yet - ignorant of it. That they might have met without ill consequence - is perhaps probable; but his regard did not appear to me enough - extinguished for him to see her without some danger. Perhaps this - concealment, this disguise was beneath me; it is done, however, - and it was done for the best. On this subject I have nothing more - to say, no other apology to offer. If I have wounded your - sister’s feelings, it was unknowingly done and though the motives - which governed me may to you very naturally appear insufficient, - I have not yet learnt to condemn them. - - “With respect to that other, more weighty accusation, of having - injured Mr. Wickham, I can only refute it by laying before you - the whole of his connection with my family. Of what he has - _particularly_ accused me I am ignorant; but of the truth of what - I shall relate, I can summon more than one witness of undoubted - veracity. - - “Mr. Wickham is the son of a very respectable man, who had for - many years the management of all the Pemberley estates, and whose - good conduct in the discharge of his trust naturally inclined my - father to be of service to him; and on George Wickham, who was - his godson, his kindness was therefore liberally bestowed. My - father supported him at school, and afterwards at Cambridge—most - important assistance, as his own father, always poor from the - extravagance of his wife, would have been unable to give him a - gentleman’s education. My father was not only fond of this young - man’s society, whose manners were always engaging; he had also - the highest opinion of him, and hoping the church would be his - profession, intended to provide for him in it. As for myself, it - is many, many years since I first began to think of him in a very - different manner. The vicious propensities—the want of principle, - which he was careful to guard from the knowledge of his best - friend, could not escape the observation of a young man of nearly - the same age with himself, and who had opportunities of seeing - him in unguarded moments, which Mr. Darcy could not have. Here - again I shall give you pain—to what degree you only can tell. But - whatever may be the sentiments which Mr. Wickham has created, a - suspicion of their nature shall not prevent me from unfolding his - real character—it adds even another motive. - - “My excellent father died about five years ago; and his - attachment to Mr. Wickham was to the last so steady, that in his - will he particularly recommended it to me, to promote his - advancement in the best manner that his profession might - allow—and if he took orders, desired that a valuable family - living might be his as soon as it became vacant. There was also a - legacy of one thousand pounds. His own father did not long - survive mine, and within half a year from these events, Mr. - Wickham wrote to inform me that, having finally resolved against - taking orders, he hoped I should not think it unreasonable for - him to expect some more immediate pecuniary advantage, in lieu of - the preferment, by which he could not be benefited. He had some - intention, he added, of studying law, and I must be aware that - the interest of one thousand pounds would be a very insufficient - support therein. I rather wished, than believed him to be - sincere; but, at any rate, was perfectly ready to accede to his - proposal. I knew that Mr. Wickham ought not to be a clergyman; - the business was therefore soon settled—he resigned all claim to - assistance in the church, were it possible that he could ever be - in a situation to receive it, and accepted in return three - thousand pounds. All connection between us seemed now dissolved. - I thought too ill of him to invite him to Pemberley, or admit his - society in town. In town I believe he chiefly lived, but his - studying the law was a mere pretence, and being now free from all - restraint, his life was a life of idleness and dissipation. For - about three years I heard little of him; but on the decease of - the incumbent of the living which had been designed for him, he - applied to me again by letter for the presentation. His - circumstances, he assured me, and I had no difficulty in - believing it, were exceedingly bad. He had found the law a most - unprofitable study, and was now absolutely resolved on being - ordained, if I would present him to the living in question—of - which he trusted there could be little doubt, as he was well - assured that I had no other person to provide for, and I could - not have forgotten my revered father’s intentions. You will - hardly blame me for refusing to comply with this entreaty, or for - resisting every repetition to it. His resentment was in - proportion to the distress of his circumstances—and he was - doubtless as violent in his abuse of me to others as in his - reproaches to myself. After this period every appearance of - acquaintance was dropped. How he lived I know not. But last - summer he was again most painfully obtruded on my notice. - - “I must now mention a circumstance which I would wish to forget - myself, and which no obligation less than the present should - induce me to unfold to any human being. Having said thus much, I - feel no doubt of your secrecy. My sister, who is more than ten - years my junior, was left to the guardianship of my mother’s - nephew, Colonel Fitzwilliam, and myself. About a year ago, she - was taken from school, and an establishment formed for her in - London; and last summer she went with the lady who presided over - it, to Ramsgate; and thither also went Mr. Wickham, undoubtedly - by design; for there proved to have been a prior acquaintance - between him and Mrs. Younge, in whose character we were most - unhappily deceived; and by her connivance and aid, he so far - recommended himself to Georgiana, whose affectionate heart - retained a strong impression of his kindness to her as a child, - that she was persuaded to believe herself in love, and to consent - to an elopement. She was then but fifteen, which must be her - excuse; and after stating her imprudence, I am happy to add, that - I owed the knowledge of it to herself. I joined them unexpectedly - a day or two before the intended elopement, and then Georgiana, - unable to support the idea of grieving and offending a brother - whom she almost looked up to as a father, acknowledged the whole - to me. You may imagine what I felt and how I acted. Regard for my - sister’s credit and feelings prevented any public exposure; but I - wrote to Mr. Wickham, who left the place immediately, and Mrs. - Younge was of course removed from her charge. Mr. Wickham’s chief - object was unquestionably my sister’s fortune, which is thirty - thousand pounds; but I cannot help supposing that the hope of - revenging himself on me was a strong inducement. His revenge - would have been complete indeed. - - “This, madam, is a faithful narrative of every event in which we - have been concerned together; and if you do not absolutely reject - it as false, you will, I hope, acquit me henceforth of cruelty - towards Mr. Wickham. I know not in what manner, under what form - of falsehood he had imposed on you; but his success is not - perhaps to be wondered at. Ignorant as you previously were of - everything concerning either, detection could not be in your - power, and suspicion certainly not in your inclination. - - “You may possibly wonder why all this was not told you last - night; but I was not then master enough of myself to know what - could or ought to be revealed. For the truth of everything here - related, I can appeal more particularly to the testimony of - Colonel Fitzwilliam, who, from our near relationship and constant - intimacy, and, still more, as one of the executors of my father’s - will, has been unavoidably acquainted with every particular of - these transactions. If your abhorrence of _me_ should make _my_ - assertions valueless, you cannot be prevented by the same cause - from confiding in my cousin; and that there may be the - possibility of consulting him, I shall endeavour to find some - opportunity of putting this letter in your hands in the course of - the morning. I will only add, God bless you. - - “FITZWILLIAM DARCY” - - - - - Chapter 36 - - If Elizabeth, when Mr. Darcy gave her the letter, did not expect - it to contain a renewal of his offers, she had formed no - expectation at all of its contents. But such as they were, it may - well be supposed how eagerly she went through them, and what a - contrariety of emotion they excited. Her feelings as she read - were scarcely to be defined. With amazement did she first - understand that he believed any apology to be in his power; and - steadfastly was she persuaded, that he could have no explanation - to give, which a just sense of shame would not conceal. With a - strong prejudice against everything he might say, she began his - account of what had happened at Netherfield. She read with an - eagerness which hardly left her power of comprehension, and from - impatience of knowing what the next sentence might bring, was - incapable of attending to the sense of the one before her eyes. - His belief of her sister’s insensibility she instantly resolved - to be false; and his account of the real, the worst objections to - the match, made her too angry to have any wish of doing him - justice. He expressed no regret for what he had done which - satisfied her; his style was not penitent, but haughty. It was - all pride and insolence. - - But when this subject was succeeded by his account of Mr. - Wickham—when she read with somewhat clearer attention a relation - of events which, if true, must overthrow every cherished opinion - of his worth, and which bore so alarming an affinity to his own - history of himself—her feelings were yet more acutely painful and - more difficult of definition. Astonishment, apprehension, and - even horror, oppressed her. She wished to discredit it entirely, - repeatedly exclaiming, “This must be false! This cannot be! This - must be the grossest falsehood!”—and when she had gone through - the whole letter, though scarcely knowing anything of the last - page or two, put it hastily away, protesting that she would not - regard it, that she would never look in it again. - - In this perturbed state of mind, with thoughts that could rest on - nothing, she walked on; but it would not do; in half a minute the - letter was unfolded again, and collecting herself as well as she - could, she again began the mortifying perusal of all that related - to Wickham, and commanded herself so far as to examine the - meaning of every sentence. The account of his connection with the - Pemberley family was exactly what he had related himself; and the - kindness of the late Mr. Darcy, though she had not before known - its extent, agreed equally well with his own words. So far each - recital confirmed the other; but when she came to the will, the - difference was great. What Wickham had said of the living was - fresh in her memory, and as she recalled his very words, it was - impossible not to feel that there was gross duplicity on one side - or the other; and, for a few moments, she flattered herself that - her wishes did not err. But when she read and re-read with the - closest attention, the particulars immediately following of - Wickham’s resigning all pretensions to the living, of his - receiving in lieu so considerable a sum as three thousand pounds, - again was she forced to hesitate. She put down the letter, - weighed every circumstance with what she meant to be - impartiality—deliberated on the probability of each statement—but - with little success. On both sides it was only assertion. Again - she read on; but every line proved more clearly that the affair, - which she had believed it impossible that any contrivance could - so represent as to render Mr. Darcy’s conduct in it less than - infamous, was capable of a turn which must make him entirely - blameless throughout the whole. - - The extravagance and general profligacy which he scrupled not to - lay at Mr. Wickham’s charge, exceedingly shocked her; the more - so, as she could bring no proof of its injustice. She had never - heard of him before his entrance into the ——shire Militia, in - which he had engaged at the persuasion of the young man who, on - meeting him accidentally in town, had there renewed a slight - acquaintance. Of his former way of life nothing had been known in - Hertfordshire but what he told himself. As to his real character, - had information been in her power, she had never felt a wish of - inquiring. His countenance, voice, and manner had established him - at once in the possession of every virtue. She tried to recollect - some instance of goodness, some distinguished trait of integrity - or benevolence, that might rescue him from the attacks of Mr. - Darcy; or at least, by the predominance of virtue, atone for - those casual errors under which she would endeavour to class what - Mr. Darcy had described as the idleness and vice of many years’ - continuance. But no such recollection befriended her. She could - see him instantly before her, in every charm of air and address; - but she could remember no more substantial good than the general - approbation of the neighbourhood, and the regard which his social - powers had gained him in the mess. After pausing on this point a - considerable while, she once more continued to read. But, alas! - the story which followed, of his designs on Miss Darcy, received - some confirmation from what had passed between Colonel - Fitzwilliam and herself only the morning before; and at last she - was referred for the truth of every particular to Colonel - Fitzwilliam himself—from whom she had previously received the - information of his near concern in all his cousin’s affairs, and - whose character she had no reason to question. At one time she - had almost resolved on applying to him, but the idea was checked - by the awkwardness of the application, and at length wholly - banished by the conviction that Mr. Darcy would never have - hazarded such a proposal, if he had not been well assured of his - cousin’s corroboration. - - She perfectly remembered everything that had passed in - conversation between Wickham and herself, in their first evening - at Mr. Phillips’s. Many of his expressions were still fresh in - her memory. She was _now_ struck with the impropriety of such - communications to a stranger, and wondered it had escaped her - before. She saw the indelicacy of putting himself forward as he - had done, and the inconsistency of his professions with his - conduct. She remembered that he had boasted of having no fear of - seeing Mr. Darcy—that Mr. Darcy might leave the country, but that - _he_ should stand his ground; yet he had avoided the Netherfield - ball the very next week. She remembered also that, till the - Netherfield family had quitted the country, he had told his story - to no one but herself; but that after their removal it had been - everywhere discussed; that he had then no reserves, no scruples - in sinking Mr. Darcy’s character, though he had assured her that - respect for the father would always prevent his exposing the son. - - How differently did everything now appear in which he was - concerned! His attentions to Miss King were now the consequence - of views solely and hatefully mercenary; and the mediocrity of - her fortune proved no longer the moderation of his wishes, but - his eagerness to grasp at anything. His behaviour to herself - could now have had no tolerable motive; he had either been - deceived with regard to her fortune, or had been gratifying his - vanity by encouraging the preference which she believed she had - most incautiously shown. Every lingering struggle in his favour - grew fainter and fainter; and in farther justification of Mr. - Darcy, she could not but allow that Mr. Bingley, when questioned - by Jane, had long ago asserted his blamelessness in the affair; - that proud and repulsive as were his manners, she had never, in - the whole course of their acquaintance—an acquaintance which had - latterly brought them much together, and given her a sort of - intimacy with his ways—seen anything that betrayed him to be - unprincipled or unjust—anything that spoke him of irreligious or - immoral habits; that among his own connections he was esteemed - and valued—that even Wickham had allowed him merit as a brother, - and that she had often heard him speak so affectionately of his - sister as to prove him capable of some amiable feeling; that had - his actions been what Mr. Wickham represented them, so gross a - violation of everything right could hardly have been concealed - from the world; and that friendship between a person capable of - it, and such an amiable man as Mr. Bingley, was incomprehensible. - - She grew absolutely ashamed of herself. Of neither Darcy nor - Wickham could she think without feeling she had been blind, - partial, prejudiced, absurd. - - “How despicably I have acted!” she cried; “I, who have prided - myself on my discernment! I, who have valued myself on my - abilities! who have often disdained the generous candour of my - sister, and gratified my vanity in useless or blameable mistrust! - How humiliating is this discovery! Yet, how just a humiliation! - Had I been in love, I could not have been more wretchedly blind! - But vanity, not love, has been my folly. Pleased with the - preference of one, and offended by the neglect of the other, on - the very beginning of our acquaintance, I have courted - prepossession and ignorance, and driven reason away, where either - were concerned. Till this moment I never knew myself.” - - From herself to Jane—from Jane to Bingley, her thoughts were in a - line which soon brought to her recollection that Mr. Darcy’s - explanation _there_ had appeared very insufficient, and she read - it again. Widely different was the effect of a second perusal. - How could she deny that credit to his assertions in one instance, - which she had been obliged to give in the other? He declared - himself to be totally unsuspicious of her sister’s attachment; - and she could not help remembering what Charlotte’s opinion had - always been. Neither could she deny the justice of his - description of Jane. She felt that Jane’s feelings, though - fervent, were little displayed, and that there was a constant - complacency in her air and manner not often united with great - sensibility. - - When she came to that part of the letter in which her family were - mentioned in terms of such mortifying, yet merited reproach, her - sense of shame was severe. The justice of the charge struck her - too forcibly for denial, and the circumstances to which he - particularly alluded as having passed at the Netherfield ball, - and as confirming all his first disapprobation, could not have - made a stronger impression on his mind than on hers. - - The compliment to herself and her sister was not unfelt. It - soothed, but it could not console her for the contempt which had - thus been self-attracted by the rest of her family; and as she - considered that Jane’s disappointment had in fact been the work - of her nearest relations, and reflected how materially the credit - of both must be hurt by such impropriety of conduct, she felt - depressed beyond anything she had ever known before. - - After wandering along the lane for two hours, giving way to every - variety of thought—re-considering events, determining - probabilities, and reconciling herself, as well as she could, to - a change so sudden and so important, fatigue, and a recollection - of her long absence, made her at length return home; and she - entered the house with the wish of appearing cheerful as usual, - and the resolution of repressing such reflections as must make - her unfit for conversation. - - She was immediately told that the two gentlemen from Rosings had - each called during her absence; Mr. Darcy, only for a few - minutes, to take leave—but that Colonel Fitzwilliam had been - sitting with them at least an hour, hoping for her return, and - almost resolving to walk after her till she could be found. - Elizabeth could but just _affect_ concern in missing him; she - really rejoiced at it. Colonel Fitzwilliam was no longer an - object; she could think only of her letter. - - - - - Chapter 37 - - The two gentlemen left Rosings the next morning, and Mr. Collins - having been in waiting near the lodges, to make them his parting - obeisance, was able to bring home the pleasing intelligence, of - their appearing in very good health, and in as tolerable spirits - as could be expected, after the melancholy scene so lately gone - through at Rosings. To Rosings he then hastened, to console Lady - Catherine and her daughter; and on his return brought back, with - great satisfaction, a message from her ladyship, importing that - she felt herself so dull as to make her very desirous of having - them all to dine with her. - - Elizabeth could not see Lady Catherine without recollecting that, - had she chosen it, she might by this time have been presented to - her as her future niece; nor could she think, without a smile, of - what her ladyship’s indignation would have been. “What would she - have said? how would she have behaved?” were questions with which - she amused herself. - - Their first subject was the diminution of the Rosings party. “I - assure you, I feel it exceedingly,” said Lady Catherine; “I - believe no one feels the loss of friends so much as I do. But I - am particularly attached to these young men, and know them to be - so much attached to me! They were excessively sorry to go! But so - they always are. The dear Colonel rallied his spirits tolerably - till just at last; but Darcy seemed to feel it most acutely, - more, I think, than last year. His attachment to Rosings - certainly increases.” - - Mr. Collins had a compliment, and an allusion to throw in here, - which were kindly smiled on by the mother and daughter. - - Lady Catherine observed, after dinner, that Miss Bennet seemed - out of spirits, and immediately accounting for it by herself, by - supposing that she did not like to go home again so soon, she - added: - - “But if that is the case, you must write to your mother and beg - that you may stay a little longer. Mrs. Collins will be very glad - of your company, I am sure.” - - “I am much obliged to your ladyship for your kind invitation,” - replied Elizabeth, “but it is not in my power to accept it. I - must be in town next Saturday.” - - “Why, at that rate, you will have been here only six weeks. I - expected you to stay two months. I told Mrs. Collins so before - you came. There can be no occasion for your going so soon. Mrs. - Bennet could certainly spare you for another fortnight.” - - “But my father cannot. He wrote last week to hurry my return.” - - “Oh! your father of course may spare you, if your mother can. - Daughters are never of so much consequence to a father. And if - you will stay another _month_ complete, it will be in my power to - take one of you as far as London, for I am going there early in - June, for a week; and as Dawson does not object to the - barouche-box, there will be very good room for one of you—and - indeed, if the weather should happen to be cool, I should not - object to taking you both, as you are neither of you large.” - - “You are all kindness, madam; but I believe we must abide by our - original plan.” - - Lady Catherine seemed resigned. “Mrs. Collins, you must send a - servant with them. You know I always speak my mind, and I cannot - bear the idea of two young women travelling post by themselves. - It is highly improper. You must contrive to send somebody. I have - the greatest dislike in the world to that sort of thing. Young - women should always be properly guarded and attended, according - to their situation in life. When my niece Georgiana went to - Ramsgate last summer, I made a point of her having two - men-servants go with her. Miss Darcy, the daughter of Mr. Darcy, - of Pemberley, and Lady Anne, could not have appeared with - propriety in a different manner. I am excessively attentive to - all those things. You must send John with the young ladies, Mrs. - Collins. I am glad it occurred to me to mention it; for it would - really be discreditable to _you_ to let them go alone.” - - “My uncle is to send a servant for us.” - - “Oh! Your uncle! He keeps a man-servant, does he? I am very glad - you have somebody who thinks of these things. Where shall you - change horses? Oh! Bromley, of course. If you mention my name at - the Bell, you will be attended to.” - - Lady Catherine had many other questions to ask respecting their - journey, and as she did not answer them all herself, attention - was necessary, which Elizabeth believed to be lucky for her; or, - with a mind so occupied, she might have forgotten where she was. - Reflection must be reserved for solitary hours; whenever she was - alone, she gave way to it as the greatest relief; and not a day - went by without a solitary walk, in which she might indulge in - all the delight of unpleasant recollections. - - Mr. Darcy’s letter she was in a fair way of soon knowing by - heart. She studied every sentence; and her feelings towards its - writer were at times widely different. When she remembered the - style of his address, she was still full of indignation; but when - she considered how unjustly she had condemned and upbraided him, - her anger was turned against herself; and his disappointed - feelings became the object of compassion. His attachment excited - gratitude, his general character respect; but she could not - approve him; nor could she for a moment repent her refusal, or - feel the slightest inclination ever to see him again. In her own - past behaviour, there was a constant source of vexation and - regret; and in the unhappy defects of her family, a subject of - yet heavier chagrin. They were hopeless of remedy. Her father, - contented with laughing at them, would never exert himself to - restrain the wild giddiness of his youngest daughters; and her - mother, with manners so far from right herself, was entirely - insensible of the evil. Elizabeth had frequently united with Jane - in an endeavour to check the imprudence of Catherine and Lydia; - but while they were supported by their mother’s indulgence, what - chance could there be of improvement? Catherine, weak-spirited, - irritable, and completely under Lydia’s guidance, had been always - affronted by their advice; and Lydia, self-willed and careless, - would scarcely give them a hearing. They were ignorant, idle, and - vain. While there was an officer in Meryton, they would flirt - with him; and while Meryton was within a walk of Longbourn, they - would be going there forever. - - Anxiety on Jane’s behalf was another prevailing concern; and Mr. - Darcy’s explanation, by restoring Bingley to all her former good - opinion, heightened the sense of what Jane had lost. His - affection was proved to have been sincere, and his conduct - cleared of all blame, unless any could attach to the implicitness - of his confidence in his friend. How grievous then was the - thought that, of a situation so desirable in every respect, so - replete with advantage, so promising for happiness, Jane had been - deprived, by the folly and indecorum of her own family! - - When to these recollections was added the development of - Wickham’s character, it may be easily believed that the happy - spirits which had seldom been depressed before, were now so much - affected as to make it almost impossible for her to appear - tolerably cheerful. - - Their engagements at Rosings were as frequent during the last - week of her stay as they had been at first. The very last evening - was spent there; and her ladyship again inquired minutely into - the particulars of their journey, gave them directions as to the - best method of packing, and was so urgent on the necessity of - placing gowns in the only right way, that Maria thought herself - obliged, on her return, to undo all the work of the morning, and - pack her trunk afresh. - - When they parted, Lady Catherine, with great condescension, - wished them a good journey, and invited them to come to Hunsford - again next year; and Miss de Bourgh exerted herself so far as to - curtsey and hold out her hand to both. - - - - - Chapter 38 - - On Saturday morning Elizabeth and Mr. Collins met for breakfast a - few minutes before the others appeared; and he took the - opportunity of paying the parting civilities which he deemed - indispensably necessary. - - “I know not, Miss Elizabeth,” said he, “whether Mrs. Collins has - yet expressed her sense of your kindness in coming to us; but I - am very certain you will not leave the house without receiving - her thanks for it. The favour of your company has been much felt, - I assure you. We know how little there is to tempt anyone to our - humble abode. Our plain manner of living, our small rooms and few - domestics, and the little we see of the world, must make Hunsford - extremely dull to a young lady like yourself; but I hope you will - believe us grateful for the condescension, and that we have done - everything in our power to prevent your spending your time - unpleasantly.” - - Elizabeth was eager with her thanks and assurances of happiness. - She had spent six weeks with great enjoyment; and the pleasure of - being with Charlotte, and the kind attentions she had received, - must make _her_ feel the obliged. Mr. Collins was gratified, and - with a more smiling solemnity replied: - - “It gives me great pleasure to hear that you have passed your - time not disagreeably. We have certainly done our best; and most - fortunately having it in our power to introduce you to very - superior society, and, from our connection with Rosings, the - frequent means of varying the humble home scene, I think we may - flatter ourselves that your Hunsford visit cannot have been - entirely irksome. Our situation with regard to Lady Catherine’s - family is indeed the sort of extraordinary advantage and blessing - which few can boast. You see on what a footing we are. You see - how continually we are engaged there. In truth I must acknowledge - that, with all the disadvantages of this humble parsonage, I - should not think anyone abiding in it an object of compassion, - while they are sharers of our intimacy at Rosings.” - - Words were insufficient for the elevation of his feelings; and he - was obliged to walk about the room, while Elizabeth tried to - unite civility and truth in a few short sentences. - - “You may, in fact, carry a very favourable report of us into - Hertfordshire, my dear cousin. I flatter myself at least that you - will be able to do so. Lady Catherine’s great attentions to Mrs. - Collins you have been a daily witness of; and altogether I trust - it does not appear that your friend has drawn an unfortunate—but - on this point it will be as well to be silent. Only let me assure - you, my dear Miss Elizabeth, that I can from my heart most - cordially wish you equal felicity in marriage. My dear Charlotte - and I have but one mind and one way of thinking. There is in - everything a most remarkable resemblance of character and ideas - between us. We seem to have been designed for each other.” - - Elizabeth could safely say that it was a great happiness where - that was the case, and with equal sincerity could add, that she - firmly believed and rejoiced in his domestic comforts. She was - not sorry, however, to have the recital of them interrupted by - the lady from whom they sprang. Poor Charlotte! it was melancholy - to leave her to such society! But she had chosen it with her eyes - open; and though evidently regretting that her visitors were to - go, she did not seem to ask for compassion. Her home and her - housekeeping, her parish and her poultry, and all their dependent - concerns, had not yet lost their charms. - - At length the chaise arrived, the trunks were fastened on, the - parcels placed within, and it was pronounced to be ready. After - an affectionate parting between the friends, Elizabeth was - attended to the carriage by Mr. Collins, and as they walked down - the garden he was commissioning her with his best respects to all - her family, not forgetting his thanks for the kindness he had - received at Longbourn in the winter, and his compliments to Mr. - and Mrs. Gardiner, though unknown. He then handed her in, Maria - followed, and the door was on the point of being closed, when he - suddenly reminded them, with some consternation, that they had - hitherto forgotten to leave any message for the ladies at - Rosings. - - “But,” he added, “you will of course wish to have your humble - respects delivered to them, with your grateful thanks for their - kindness to you while you have been here.” - - Elizabeth made no objection; the door was then allowed to be - shut, and the carriage drove off. - - “Good gracious!” cried Maria, after a few minutes’ silence, “it - seems but a day or two since we first came! and yet how many - things have happened!” - - “A great many indeed,” said her companion with a sigh. - - “We have dined nine times at Rosings, besides drinking tea there - twice! How much I shall have to tell!” - - Elizabeth added privately, “And how much I shall have to - conceal!” - - Their journey was performed without much conversation, or any - alarm; and within four hours of their leaving Hunsford they - reached Mr. Gardiner’s house, where they were to remain a few - days. - - Jane looked well, and Elizabeth had little opportunity of - studying her spirits, amidst the various engagements which the - kindness of her aunt had reserved for them. But Jane was to go - home with her, and at Longbourn there would be leisure enough for - observation. - - It was not without an effort, meanwhile, that she could wait even - for Longbourn, before she told her sister of Mr. Darcy’s - proposals. To know that she had the power of revealing what would - so exceedingly astonish Jane, and must, at the same time, so - highly gratify whatever of her own vanity she had not yet been - able to reason away, was such a temptation to openness as nothing - could have conquered but the state of indecision in which she - remained as to the extent of what she should communicate; and her - fear, if she once entered on the subject, of being hurried into - repeating something of Bingley which might only grieve her sister - further. - - - - - Chapter 39 - - It was the second week in May, in which the three young ladies - set out together from Gracechurch Street for the town of ——, in - Hertfordshire; and, as they drew near the appointed inn where Mr. - Bennet’s carriage was to meet them, they quickly perceived, in - token of the coachman’s punctuality, both Kitty and Lydia looking - out of a dining-room up stairs. These two girls had been above an - hour in the place, happily employed in visiting an opposite - milliner, watching the sentinel on guard, and dressing a salad - and cucumber. - - After welcoming their sisters, they triumphantly displayed a - table set out with such cold meat as an inn larder usually - affords, exclaiming, “Is not this nice? Is not this an agreeable - surprise?” - - “And we mean to treat you all,” added Lydia, “but you must lend - us the money, for we have just spent ours at the shop out there.” - Then, showing her purchases—“Look here, I have bought this - bonnet. I do not think it is very pretty; but I thought I might - as well buy it as not. I shall pull it to pieces as soon as I get - home, and see if I can make it up any better.” - - And when her sisters abused it as ugly, she added, with perfect - unconcern, “Oh! but there were two or three much uglier in the - shop; and when I have bought some prettier-coloured satin to trim - it with fresh, I think it will be very tolerable. Besides, it - will not much signify what one wears this summer, after the - ——shire have left Meryton, and they are going in a fortnight.” - - “Are they indeed!” cried Elizabeth, with the greatest - satisfaction. - - “They are going to be encamped near Brighton; and I do so want - papa to take us all there for the summer! It would be such a - delicious scheme; and I dare say would hardly cost anything at - all. Mamma would like to go too of all things! Only think what a - miserable summer else we shall have!” - - “Yes,” thought Elizabeth, “_that_ would be a delightful scheme - indeed, and completely do for us at once. Good Heaven! Brighton, - and a whole campful of soldiers, to us, who have been overset - already by one poor regiment of militia, and the monthly balls of - Meryton!” - - “Now I have got some news for you,” said Lydia, as they sat down - at table. “What do you think? It is excellent news—capital - news—and about a certain person we all like!” - - Jane and Elizabeth looked at each other, and the waiter was told - he need not stay. Lydia laughed, and said: - - “Aye, that is just like your formality and discretion. You - thought the waiter must not hear, as if he cared! I dare say he - often hears worse things said than I am going to say. But he is - an ugly fellow! I am glad he is gone. I never saw such a long - chin in my life. Well, but now for my news; it is about dear - Wickham; too good for the waiter, is it not? There is no danger - of Wickham’s marrying Mary King. There’s for you! She is gone - down to her uncle at Liverpool: gone to stay. Wickham is safe.” - - “And Mary King is safe!” added Elizabeth; “safe from a connection - imprudent as to fortune.” - - “She is a great fool for going away, if she liked him.” - - “But I hope there is no strong attachment on either side,” said - Jane. - - “I am sure there is not on _his_. I will answer for it, he never - cared three straws about her—who _could_ about such a nasty - little freckled thing?” - - Elizabeth was shocked to think that, however incapable of such - coarseness of _expression_ herself, the coarseness of the - _sentiment_ was little other than her own breast had harboured - and fancied liberal! - - As soon as all had ate, and the elder ones paid, the carriage was - ordered; and after some contrivance, the whole party, with all - their boxes, work-bags, and parcels, and the unwelcome addition - of Kitty’s and Lydia’s purchases, were seated in it. - - “How nicely we are all crammed in,” cried Lydia. “I am glad I - bought my bonnet, if it is only for the fun of having another - bandbox! Well, now let us be quite comfortable and snug, and talk - and laugh all the way home. And in the first place, let us hear - what has happened to you all since you went away. Have you seen - any pleasant men? Have you had any flirting? I was in great hopes - that one of you would have got a husband before you came back. - Jane will be quite an old maid soon, I declare. She is almost - three-and-twenty! Lord, how ashamed I should be of not being - married before three-and-twenty! My aunt Phillips wants you so to - get husbands, you can’t think. She says Lizzy had better have - taken Mr. Collins; but _I_ do not think there would have been any - fun in it. Lord! how I should like to be married before any of - you; and then I would _chaperon_ you about to all the balls. Dear - me! we had such a good piece of fun the other day at Colonel - Forster’s. Kitty and me were to spend the day there, and Mrs. - Forster promised to have a little dance in the evening; (by the - bye, Mrs. Forster and me are _such_ friends!) and so she asked - the two Harringtons to come, but Harriet was ill, and so Pen was - forced to come by herself; and then, what do you think we did? We - dressed up Chamberlayne in woman’s clothes on purpose to pass for - a lady, only think what fun! Not a soul knew of it, but Colonel - and Mrs. Forster, and Kitty and me, except my aunt, for we were - forced to borrow one of her gowns; and you cannot imagine how - well he looked! When Denny, and Wickham, and Pratt, and two or - three more of the men came in, they did not know him in the - least. Lord! how I laughed! and so did Mrs. Forster. I thought I - should have died. And _that_ made the men suspect something, and - then they soon found out what was the matter.” - - With such kinds of histories of their parties and good jokes, did - Lydia, assisted by Kitty’s hints and additions, endeavour to - amuse her companions all the way to Longbourn. Elizabeth listened - as little as she could, but there was no escaping the frequent - mention of Wickham’s name. - - Their reception at home was most kind. Mrs. Bennet rejoiced to - see Jane in undiminished beauty; and more than once during dinner - did Mr. Bennet say voluntarily to Elizabeth: - - “I am glad you are come back, Lizzy.” - - Their party in the dining-room was large, for almost all the - Lucases came to meet Maria and hear the news; and various were - the subjects that occupied them: Lady Lucas was inquiring of - Maria, after the welfare and poultry of her eldest daughter; Mrs. - Bennet was doubly engaged, on one hand collecting an account of - the present fashions from Jane, who sat some way below her, and, - on the other, retailing them all to the younger Lucases; and - Lydia, in a voice rather louder than any other person’s, was - enumerating the various pleasures of the morning to anybody who - would hear her. - - “Oh! Mary,” said she, “I wish you had gone with us, for we had - such fun! As we went along, Kitty and I drew up the blinds, and - pretended there was nobody in the coach; and I should have gone - so all the way, if Kitty had not been sick; and when we got to - the George, I do think we behaved very handsomely, for we treated - the other three with the nicest cold luncheon in the world, and - if you would have gone, we would have treated you too. And then - when we came away it was such fun! I thought we never should have - got into the coach. I was ready to die of laughter. And then we - were so merry all the way home! we talked and laughed so loud, - that anybody might have heard us ten miles off!” - - To this Mary very gravely replied, “Far be it from me, my dear - sister, to depreciate such pleasures! They would doubtless be - congenial with the generality of female minds. But I confess they - would have no charms for _me_—I should infinitely prefer a book.” - - But of this answer Lydia heard not a word. She seldom listened to - anybody for more than half a minute, and never attended to Mary - at all. - - In the afternoon Lydia was urgent with the rest of the girls to - walk to Meryton, and to see how everybody went on; but Elizabeth - steadily opposed the scheme. It should not be said that the Miss - Bennets could not be at home half a day before they were in - pursuit of the officers. There was another reason too for her - opposition. She dreaded seeing Mr. Wickham again, and was - resolved to avoid it as long as possible. The comfort to _her_ of - the regiment’s approaching removal was indeed beyond expression. - In a fortnight they were to go—and once gone, she hoped there - could be nothing more to plague her on his account. - - She had not been many hours at home before she found that the - Brighton scheme, of which Lydia had given them a hint at the inn, - was under frequent discussion between her parents. Elizabeth saw - directly that her father had not the smallest intention of - yielding; but his answers were at the same time so vague and - equivocal, that her mother, though often disheartened, had never - yet despaired of succeeding at last. - - - - - Chapter 40 - - Elizabeth’s impatience to acquaint Jane with what had happened - could no longer be overcome; and at length, resolving to suppress - every particular in which her sister was concerned, and preparing - her to be surprised, she related to her the next morning the - chief of the scene between Mr. Darcy and herself. - - Miss Bennet’s astonishment was soon lessened by the strong - sisterly partiality which made any admiration of Elizabeth appear - perfectly natural; and all surprise was shortly lost in other - feelings. She was sorry that Mr. Darcy should have delivered his - sentiments in a manner so little suited to recommend them; but - still more was she grieved for the unhappiness which her sister’s - refusal must have given him. - - “His being so sure of succeeding was wrong,” said she, “and - certainly ought not to have appeared; but consider how much it - must increase his disappointment!” - - “Indeed,” replied Elizabeth, “I am heartily sorry for him; but he - has other feelings, which will probably soon drive away his - regard for me. You do not blame me, however, for refusing him?” - - “Blame you! Oh, no.” - - “But you blame me for having spoken so warmly of Wickham?” - - “No—I do not know that you were wrong in saying what you did.” - - “But you _will_ know it, when I tell you what happened the very - next day.” - - She then spoke of the letter, repeating the whole of its contents - as far as they concerned George Wickham. What a stroke was this - for poor Jane! who would willingly have gone through the world - without believing that so much wickedness existed in the whole - race of mankind, as was here collected in one individual. Nor was - Darcy’s vindication, though grateful to her feelings, capable of - consoling her for such discovery. Most earnestly did she labour - to prove the probability of error, and seek to clear the one - without involving the other. - - “This will not do,” said Elizabeth; “you never will be able to - make both of them good for anything. Take your choice, but you - must be satisfied with only one. There is but such a quantity of - merit between them; just enough to make one good sort of man; and - of late it has been shifting about pretty much. For my part, I am - inclined to believe it all Darcy’s; but you shall do as you - choose.” - - It was some time, however, before a smile could be extorted from - Jane. - - “I do not know when I have been more shocked,” said she. “Wickham - so very bad! It is almost past belief. And poor Mr. Darcy! Dear - Lizzy, only consider what he must have suffered. Such a - disappointment! and with the knowledge of your ill opinion, too! - and having to relate such a thing of his sister! It is really too - distressing. I am sure you must feel it so.” - - “Oh! no, my regret and compassion are all done away by seeing you - so full of both. I know you will do him such ample justice, that - I am growing every moment more unconcerned and indifferent. Your - profusion makes me saving; and if you lament over him much - longer, my heart will be as light as a feather.” - - “Poor Wickham! there is such an expression of goodness in his - countenance! such an openness and gentleness in his manner!” - - “There certainly was some great mismanagement in the education of - those two young men. One has got all the goodness, and the other - all the appearance of it.” - - “I never thought Mr. Darcy so deficient in the _appearance_ of it - as you used to do.” - - “And yet I meant to be uncommonly clever in taking so decided a - dislike to him, without any reason. It is such a spur to one’s - genius, such an opening for wit, to have a dislike of that kind. - One may be continually abusive without saying anything just; but - one cannot always be laughing at a man without now and then - stumbling on something witty.” - - “Lizzy, when you first read that letter, I am sure you could not - treat the matter as you do now.” - - “Indeed, I could not. I was uncomfortable enough, I may say - unhappy. And with no one to speak to about what I felt, no Jane - to comfort me and say that I had not been so very weak and vain - and nonsensical as I knew I had! Oh! how I wanted you!” - - “How unfortunate that you should have used such very strong - expressions in speaking of Wickham to Mr. Darcy, for now they - _do_ appear wholly undeserved.” - - “Certainly. But the misfortune of speaking with bitterness is a - most natural consequence of the prejudices I had been - encouraging. There is one point on which I want your advice. I - want to be told whether I ought, or ought not, to make our - acquaintances in general understand Wickham’s character.” - - Miss Bennet paused a little, and then replied, “Surely there can - be no occasion for exposing him so dreadfully. What is your - opinion?” - - “That it ought not to be attempted. Mr. Darcy has not authorised - me to make his communication public. On the contrary, every - particular relative to his sister was meant to be kept as much as - possible to myself; and if I endeavour to undeceive people as to - the rest of his conduct, who will believe me? The general - prejudice against Mr. Darcy is so violent, that it would be the - death of half the good people in Meryton to attempt to place him - in an amiable light. I am not equal to it. Wickham will soon be - gone; and therefore it will not signify to anyone here what he - really is. Some time hence it will be all found out, and then we - may laugh at their stupidity in not knowing it before. At present - I will say nothing about it.” - - “You are quite right. To have his errors made public might ruin - him for ever. He is now, perhaps, sorry for what he has done, and - anxious to re-establish a character. We must not make him - desperate.” - - The tumult of Elizabeth’s mind was allayed by this conversation. - She had got rid of two of the secrets which had weighed on her - for a fortnight, and was certain of a willing listener in Jane, - whenever she might wish to talk again of either. But there was - still something lurking behind, of which prudence forbade the - disclosure. She dared not relate the other half of Mr. Darcy’s - letter, nor explain to her sister how sincerely she had been - valued by her friend. Here was knowledge in which no one could - partake; and she was sensible that nothing less than a perfect - understanding between the parties could justify her in throwing - off this last encumbrance of mystery. “And then,” said she, “if - that very improbable event should ever take place, I shall merely - be able to tell what Bingley may tell in a much more agreeable - manner himself. The liberty of communication cannot be mine till - it has lost all its value!” - - She was now, on being settled at home, at leisure to observe the - real state of her sister’s spirits. Jane was not happy. She still - cherished a very tender affection for Bingley. Having never even - fancied herself in love before, her regard had all the warmth of - first attachment, and, from her age and disposition, greater - steadiness than most first attachments often boast; and so - fervently did she value his remembrance, and prefer him to every - other man, that all her good sense, and all her attention to the - feelings of her friends, were requisite to check the indulgence - of those regrets which must have been injurious to her own health - and their tranquillity. - - “Well, Lizzy,” said Mrs. Bennet one day, “what is your opinion - _now_ of this sad business of Jane’s? For my part, I am - determined never to speak of it again to anybody. I told my - sister Phillips so the other day. But I cannot find out that Jane - saw anything of him in London. Well, he is a very undeserving - young man—and I do not suppose there’s the least chance in the - world of her ever getting him now. There is no talk of his coming - to Netherfield again in the summer; and I have inquired of - everybody, too, who is likely to know.” - - “I do not believe he will ever live at Netherfield any more.” - - “Oh well! it is just as he chooses. Nobody wants him to come. - Though I shall always say he used my daughter extremely ill; and - if I was her, I would not have put up with it. Well, my comfort - is, I am sure Jane will die of a broken heart; and then he will - be sorry for what he has done.” - - But as Elizabeth could not receive comfort from any such - expectation, she made no answer. - - “Well, Lizzy,” continued her mother, soon afterwards, “and so the - Collinses live very comfortable, do they? Well, well, I only hope - it will last. And what sort of table do they keep? Charlotte is - an excellent manager, I dare say. If she is half as sharp as her - mother, she is saving enough. There is nothing extravagant in - _their_ housekeeping, I dare say.” - - “No, nothing at all.” - - “A great deal of good management, depend upon it. Yes, yes. - _They_ will take care not to outrun their income. _They_ will - never be distressed for money. Well, much good may it do them! - And so, I suppose, they often talk of having Longbourn when your - father is dead. They look upon it as quite their own, I dare say, - whenever that happens.” - - “It was a subject which they could not mention before me.” - - “No; it would have been strange if they had; but I make no doubt - they often talk of it between themselves. Well, if they can be - easy with an estate that is not lawfully their own, so much the - better. _I_ should be ashamed of having one that was only - entailed on me.” - - - - - Chapter 41 - - The first week of their return was soon gone. The second began. - It was the last of the regiment’s stay in Meryton, and all the - young ladies in the neighbourhood were drooping apace. The - dejection was almost universal. The elder Miss Bennets alone were - still able to eat, drink, and sleep, and pursue the usual course - of their employments. Very frequently were they reproached for - this insensibility by Kitty and Lydia, whose own misery was - extreme, and who could not comprehend such hard-heartedness in - any of the family. - - “Good Heaven! what is to become of us? What are we to do?” would - they often exclaim in the bitterness of woe. “How can you be - smiling so, Lizzy?” - - Their affectionate mother shared all their grief; she remembered - what she had herself endured on a similar occasion, - five-and-twenty years ago. - - “I am sure,” said she, “I cried for two days together when - Colonel Miller’s regiment went away. I thought I should have - broken my heart.” - - “I am sure I shall break _mine_,” said Lydia. - - “If one could but go to Brighton!” observed Mrs. Bennet. - - “Oh, yes!—if one could but go to Brighton! But papa is so - disagreeable.” - - “A little sea-bathing would set me up forever.” - - “And my aunt Phillips is sure it would do _me_ a great deal of - good,” added Kitty. - - Such were the kind of lamentations resounding perpetually through - Longbourn House. Elizabeth tried to be diverted by them; but all - sense of pleasure was lost in shame. She felt anew the justice of - Mr. Darcy’s objections; and never had she been so much disposed - to pardon his interference in the views of his friend. - - But the gloom of Lydia’s prospect was shortly cleared away; for - she received an invitation from Mrs. Forster, the wife of the - colonel of the regiment, to accompany her to Brighton. This - invaluable friend was a very young woman, and very lately - married. A resemblance in good humour and good spirits had - recommended her and Lydia to each other, and out of their _three_ - months’ acquaintance they had been intimate _two_. - - The rapture of Lydia on this occasion, her adoration of Mrs. - Forster, the delight of Mrs. Bennet, and the mortification of - Kitty, are scarcely to be described. Wholly inattentive to her - sister’s feelings, Lydia flew about the house in restless - ecstasy, calling for everyone’s congratulations, and laughing and - talking with more violence than ever; whilst the luckless Kitty - continued in the parlour repined at her fate in terms as - unreasonable as her accent was peevish. - - “I cannot see why Mrs. Forster should not ask _me_ as well as - Lydia,” said she, “Though I am _not_ her particular friend. I - have just as much right to be asked as she has, and more too, for - I am two years older.” - - In vain did Elizabeth attempt to make her reasonable, and Jane to - make her resigned. As for Elizabeth herself, this invitation was - so far from exciting in her the same feelings as in her mother - and Lydia, that she considered it as the death warrant of all - possibility of common sense for the latter; and detestable as - such a step must make her were it known, she could not help - secretly advising her father not to let her go. She represented - to him all the improprieties of Lydia’s general behaviour, the - little advantage she could derive from the friendship of such a - woman as Mrs. Forster, and the probability of her being yet more - imprudent with such a companion at Brighton, where the - temptations must be greater than at home. He heard her - attentively, and then said: - - “Lydia will never be easy until she has exposed herself in some - public place or other, and we can never expect her to do it with - so little expense or inconvenience to her family as under the - present circumstances.” - - “If you were aware,” said Elizabeth, “of the very great - disadvantage to us all which must arise from the public notice of - Lydia’s unguarded and imprudent manner—nay, which has already - arisen from it, I am sure you would judge differently in the - affair.” - - “Already arisen?” repeated Mr. Bennet. “What, has she frightened - away some of your lovers? Poor little Lizzy! But do not be cast - down. Such squeamish youths as cannot bear to be connected with a - little absurdity are not worth a regret. Come, let me see the - list of pitiful fellows who have been kept aloof by Lydia’s - folly.” - - “Indeed you are mistaken. I have no such injuries to resent. It - is not of particular, but of general evils, which I am now - complaining. Our importance, our respectability in the world must - be affected by the wild volatility, the assurance and disdain of - all restraint which mark Lydia’s character. Excuse me, for I must - speak plainly. If you, my dear father, will not take the trouble - of checking her exuberant spirits, and of teaching her that her - present pursuits are not to be the business of her life, she will - soon be beyond the reach of amendment. Her character will be - fixed, and she will, at sixteen, be the most determined flirt - that ever made herself or her family ridiculous; a flirt, too, in - the worst and meanest degree of flirtation; without any - attraction beyond youth and a tolerable person; and, from the - ignorance and emptiness of her mind, wholly unable to ward off - any portion of that universal contempt which her rage for - admiration will excite. In this danger Kitty also is - comprehended. She will follow wherever Lydia leads. Vain, - ignorant, idle, and absolutely uncontrolled! Oh! my dear father, - can you suppose it possible that they will not be censured and - despised wherever they are known, and that their sisters will not - be often involved in the disgrace?” - - Mr. Bennet saw that her whole heart was in the subject, and - affectionately taking her hand said in reply: - - “Do not make yourself uneasy, my love. Wherever you and Jane are - known you must be respected and valued; and you will not appear - to less advantage for having a couple of—or I may say, three—very - silly sisters. We shall have no peace at Longbourn if Lydia does - not go to Brighton. Let her go, then. Colonel Forster is a - sensible man, and will keep her out of any real mischief; and she - is luckily too poor to be an object of prey to anybody. At - Brighton she will be of less importance even as a common flirt - than she has been here. The officers will find women better worth - their notice. Let us hope, therefore, that her being there may - teach her her own insignificance. At any rate, she cannot grow - many degrees worse, without authorising us to lock her up for the - rest of her life.” - - With this answer Elizabeth was forced to be content; but her own - opinion continued the same, and she left him disappointed and - sorry. It was not in her nature, however, to increase her - vexations by dwelling on them. She was confident of having - performed her duty, and to fret over unavoidable evils, or - augment them by anxiety, was no part of her disposition. - - Had Lydia and her mother known the substance of her conference - with her father, their indignation would hardly have found - expression in their united volubility. In Lydia’s imagination, a - visit to Brighton comprised every possibility of earthly - happiness. She saw, with the creative eye of fancy, the streets - of that gay bathing-place covered with officers. She saw herself - the object of attention, to tens and to scores of them at present - unknown. She saw all the glories of the camp—its tents stretched - forth in beauteous uniformity of lines, crowded with the young - and the gay, and dazzling with scarlet; and, to complete the - view, she saw herself seated beneath a tent, tenderly flirting - with at least six officers at once. - - Had she known her sister sought to tear her from such prospects - and such realities as these, what would have been her sensations? - They could have been understood only by her mother, who might - have felt nearly the same. Lydia’s going to Brighton was all that - consoled her for her melancholy conviction of her husband’s never - intending to go there himself. - - But they were entirely ignorant of what had passed; and their - raptures continued, with little intermission, to the very day of - Lydia’s leaving home. - - Elizabeth was now to see Mr. Wickham for the last time. Having - been frequently in company with him since her return, agitation - was pretty well over; the agitations of former partiality - entirely so. She had even learnt to detect, in the very - gentleness which had first delighted her, an affectation and a - sameness to disgust and weary. In his present behaviour to - herself, moreover, she had a fresh source of displeasure, for the - inclination he soon testified of renewing those intentions which - had marked the early part of their acquaintance could only serve, - after what had since passed, to provoke her. She lost all concern - for him in finding herself thus selected as the object of such - idle and frivolous gallantry; and while she steadily repressed - it, could not but feel the reproof contained in his believing, - that however long, and for whatever cause, his attentions had - been withdrawn, her vanity would be gratified, and her preference - secured at any time by their renewal. - - On the very last day of the regiment’s remaining at Meryton, he - dined, with other of the officers, at Longbourn; and so little - was Elizabeth disposed to part from him in good humour, that on - his making some inquiry as to the manner in which her time had - passed at Hunsford, she mentioned Colonel Fitzwilliam’s and Mr. - Darcy’s having both spent three weeks at Rosings, and asked him, - if he was acquainted with the former. - - He looked surprised, displeased, alarmed; but with a moment’s - recollection and a returning smile, replied, that he had formerly - seen him often; and, after observing that he was a very - gentlemanlike man, asked her how she had liked him. Her answer - was warmly in his favour. With an air of indifference he soon - afterwards added: - - “How long did you say he was at Rosings?” - - “Nearly three weeks.” - - “And you saw him frequently?” - - “Yes, almost every day.” - - “His manners are very different from his cousin’s.” - - “Yes, very different. But I think Mr. Darcy improves upon - acquaintance.” - - “Indeed!” cried Mr. Wickham with a look which did not escape her. - “And pray, may I ask?—” But checking himself, he added, in a - gayer tone, “Is it in address that he improves? Has he deigned to - add aught of civility to his ordinary style?—for I dare not - hope,” he continued in a lower and more serious tone, “that he is - improved in essentials.” - - “Oh, no!” said Elizabeth. “In essentials, I believe, he is very - much what he ever was.” - - While she spoke, Wickham looked as if scarcely knowing whether to - rejoice over her words, or to distrust their meaning. There was a - something in her countenance which made him listen with an - apprehensive and anxious attention, while she added: - - “When I said that he improved on acquaintance, I did not mean - that his mind or his manners were in a state of improvement, but - that, from knowing him better, his disposition was better - understood.” - - Wickham’s alarm now appeared in a heightened complexion and - agitated look; for a few minutes he was silent, till, shaking off - his embarrassment, he turned to her again, and said in the - gentlest of accents: - - “You, who so well know my feeling towards Mr. Darcy, will readily - comprehend how sincerely I must rejoice that he is wise enough to - assume even the _appearance_ of what is right. His pride, in that - direction, may be of service, if not to himself, to many others, - for it must only deter him from such foul misconduct as I have - suffered by. I only fear that the sort of cautiousness to which - you, I imagine, have been alluding, is merely adopted on his - visits to his aunt, of whose good opinion and judgement he stands - much in awe. His fear of her has always operated, I know, when - they were together; and a good deal is to be imputed to his wish - of forwarding the match with Miss de Bourgh, which I am certain - he has very much at heart.” - - Elizabeth could not repress a smile at this, but she answered - only by a slight inclination of the head. She saw that he wanted - to engage her on the old subject of his grievances, and she was - in no humour to indulge him. The rest of the evening passed with - the _appearance_, on his side, of usual cheerfulness, but with no - further attempt to distinguish Elizabeth; and they parted at last - with mutual civility, and possibly a mutual desire of never - meeting again. - - When the party broke up, Lydia returned with Mrs. Forster to - Meryton, from whence they were to set out early the next morning. - The separation between her and her family was rather noisy than - pathetic. Kitty was the only one who shed tears; but she did weep - from vexation and envy. Mrs. Bennet was diffuse in her good - wishes for the felicity of her daughter, and impressive in her - injunctions that she should not miss the opportunity of enjoying - herself as much as possible—advice which there was every reason - to believe would be well attended to; and in the clamorous - happiness of Lydia herself in bidding farewell, the more gentle - adieus of her sisters were uttered without being heard. - - - - - Chapter 42 - - Had Elizabeth’s opinion been all drawn from her own family, she - could not have formed a very pleasing opinion of conjugal - felicity or domestic comfort. Her father, captivated by youth and - beauty, and that appearance of good humour which youth and beauty - generally give, had married a woman whose weak understanding and - illiberal mind had very early in their marriage put an end to all - real affection for her. Respect, esteem, and confidence had - vanished for ever; and all his views of domestic happiness were - overthrown. But Mr. Bennet was not of a disposition to seek - comfort for the disappointment which his own imprudence had - brought on, in any of those pleasures which too often console the - unfortunate for their folly or their vice. He was fond of the - country and of books; and from these tastes had arisen his - principal enjoyments. To his wife he was very little otherwise - indebted, than as her ignorance and folly had contributed to his - amusement. This is not the sort of happiness which a man would in - general wish to owe to his wife; but where other powers of - entertainment are wanting, the true philosopher will derive - benefit from such as are given. - - Elizabeth, however, had never been blind to the impropriety of - her father’s behaviour as a husband. She had always seen it with - pain; but respecting his abilities, and grateful for his - affectionate treatment of herself, she endeavoured to forget what - she could not overlook, and to banish from her thoughts that - continual breach of conjugal obligation and decorum which, in - exposing his wife to the contempt of her own children, was so - highly reprehensible. But she had never felt so strongly as now - the disadvantages which must attend the children of so unsuitable - a marriage, nor ever been so fully aware of the evils arising - from so ill-judged a direction of talents; talents, which, - rightly used, might at least have preserved the respectability of - his daughters, even if incapable of enlarging the mind of his - wife. - - When Elizabeth had rejoiced over Wickham’s departure she found - little other cause for satisfaction in the loss of the regiment. - Their parties abroad were less varied than before, and at home - she had a mother and sister whose constant repinings at the - dullness of everything around them threw a real gloom over their - domestic circle; and, though Kitty might in time regain her - natural degree of sense, since the disturbers of her brain were - removed, her other sister, from whose disposition greater evil - might be apprehended, was likely to be hardened in all her folly - and assurance by a situation of such double danger as a - watering-place and a camp. Upon the whole, therefore, she found, - what has been sometimes found before, that an event to which she - had been looking with impatient desire did not, in taking place, - bring all the satisfaction she had promised herself. It was - consequently necessary to name some other period for the - commencement of actual felicity—to have some other point on which - her wishes and hopes might be fixed, and by again enjoying the - pleasure of anticipation, console herself for the present, and - prepare for another disappointment. Her tour to the Lakes was now - the object of her happiest thoughts; it was her best consolation - for all the uncomfortable hours which the discontentedness of her - mother and Kitty made inevitable; and could she have included - Jane in the scheme, every part of it would have been perfect. - - “But it is fortunate,” thought she, “that I have something to - wish for. Were the whole arrangement complete, my disappointment - would be certain. But here, by carrying with me one ceaseless - source of regret in my sister’s absence, I may reasonably hope to - have all my expectations of pleasure realised. A scheme of which - every part promises delight can never be successful; and general - disappointment is only warded off by the defence of some little - peculiar vexation.” - - When Lydia went away she promised to write very often and very - minutely to her mother and Kitty; but her letters were always - long expected, and always very short. Those to her mother - contained little else than that they were just returned from the - library, where such and such officers had attended them, and - where she had seen such beautiful ornaments as made her quite - wild; that she had a new gown, or a new parasol, which she would - have described more fully, but was obliged to leave off in a - violent hurry, as Mrs. Forster called her, and they were going - off to the camp; and from her correspondence with her sister, - there was still less to be learnt—for her letters to Kitty, - though rather longer, were much too full of lines under the words - to be made public. - - After the first fortnight or three weeks of her absence, health, - good humour, and cheerfulness began to reappear at Longbourn. - Everything wore a happier aspect. The families who had been in - town for the winter came back again, and summer finery and summer - engagements arose. Mrs. Bennet was restored to her usual - querulous serenity; and, by the middle of June, Kitty was so much - recovered as to be able to enter Meryton without tears; an event - of such happy promise as to make Elizabeth hope that by the - following Christmas she might be so tolerably reasonable as not - to mention an officer above once a day, unless, by some cruel and - malicious arrangement at the War Office, another regiment should - be quartered in Meryton. - - The time fixed for the beginning of their northern tour was now - fast approaching, and a fortnight only was wanting of it, when a - letter arrived from Mrs. Gardiner, which at once delayed its - commencement and curtailed its extent. Mr. Gardiner would be - prevented by business from setting out till a fortnight later in - July, and must be in London again within a month, and as that - left too short a period for them to go so far, and see so much as - they had proposed, or at least to see it with the leisure and - comfort they had built on, they were obliged to give up the - Lakes, and substitute a more contracted tour, and, according to - the present plan, were to go no farther northwards than - Derbyshire. In that county there was enough to be seen to occupy - the chief of their three weeks; and to Mrs. Gardiner it had a - peculiarly strong attraction. The town where she had formerly - passed some years of her life, and where they were now to spend a - few days, was probably as great an object of her curiosity as all - the celebrated beauties of Matlock, Chatsworth, Dovedale, or the - Peak. - - Elizabeth was excessively disappointed; she had set her heart on - seeing the Lakes, and still thought there might have been time - enough. But it was her business to be satisfied—and certainly her - temper to be happy; and all was soon right again. - - With the mention of Derbyshire there were many ideas connected. - It was impossible for her to see the word without thinking of - Pemberley and its owner. “But surely,” said she, “I may enter his - county with impunity, and rob it of a few petrified spars without - his perceiving me.” - - The period of expectation was now doubled. Four weeks were to - pass away before her uncle and aunt’s arrival. But they did pass - away, and Mr. and Mrs. Gardiner, with their four children, did at - length appear at Longbourn. The children, two girls of six and - eight years old, and two younger boys, were to be left under the - particular care of their cousin Jane, who was the general - favourite, and whose steady sense and sweetness of temper exactly - adapted her for attending to them in every way—teaching them, - playing with them, and loving them. - - The Gardiners stayed only one night at Longbourn, and set off the - next morning with Elizabeth in pursuit of novelty and amusement. - One enjoyment was certain—that of suitableness of companions; a - suitableness which comprehended health and temper to bear - inconveniences—cheerfulness to enhance every pleasure—and - affection and intelligence, which might supply it among - themselves if there were disappointments abroad. - - It is not the object of this work to give a description of - Derbyshire, nor of any of the remarkable places through which - their route thither lay; Oxford, Blenheim, Warwick, Kenilworth, - Birmingham, etc. are sufficiently known. A small part of - Derbyshire is all the present concern. To the little town of - Lambton, the scene of Mrs. Gardiner’s former residence, and where - she had lately learned some acquaintance still remained, they - bent their steps, after having seen all the principal wonders of - the country; and within five miles of Lambton, Elizabeth found - from her aunt that Pemberley was situated. It was not in their - direct road, nor more than a mile or two out of it. In talking - over their route the evening before, Mrs. Gardiner expressed an - inclination to see the place again. Mr. Gardiner declared his - willingness, and Elizabeth was applied to for her approbation. - - “My love, should not you like to see a place of which you have - heard so much?” said her aunt; “a place, too, with which so many - of your acquaintances are connected. Wickham passed all his youth - there, you know.” - - Elizabeth was distressed. She felt that she had no business at - Pemberley, and was obliged to assume a disinclination for seeing - it. She must own that she was tired of seeing great houses; after - going over so many, she really had no pleasure in fine carpets or - satin curtains. - - Mrs. Gardiner abused her stupidity. “If it were merely a fine - house richly furnished,” said she, “I should not care about it - myself; but the grounds are delightful. They have some of the - finest woods in the country.” - - Elizabeth said no more—but her mind could not acquiesce. The - possibility of meeting Mr. Darcy, while viewing the place, - instantly occurred. It would be dreadful! She blushed at the very - idea, and thought it would be better to speak openly to her aunt - than to run such a risk. But against this there were objections; - and she finally resolved that it could be the last resource, if - her private inquiries to the absence of the family were - unfavourably answered. - - Accordingly, when she retired at night, she asked the chambermaid - whether Pemberley were not a very fine place? what was the name - of its proprietor? and, with no little alarm, whether the family - were down for the summer? A most welcome negative followed the - last question—and her alarms now being removed, she was at - leisure to feel a great deal of curiosity to see the house - herself; and when the subject was revived the next morning, and - she was again applied to, could readily answer, and with a proper - air of indifference, that she had not really any dislike to the - scheme. To Pemberley, therefore, they were to go. - - - - - Chapter 43 - - Elizabeth, as they drove along, watched for the first appearance - of Pemberley Woods with some perturbation; and when at length - they turned in at the lodge, her spirits were in a high flutter. - - The park was very large, and contained great variety of ground. - They entered it in one of its lowest points, and drove for some - time through a beautiful wood stretching over a wide extent. - - Elizabeth’s mind was too full for conversation, but she saw and - admired every remarkable spot and point of view. They gradually - ascended for half-a-mile, and then found themselves at the top of - a considerable eminence, where the wood ceased, and the eye was - instantly caught by Pemberley House, situated on the opposite - side of a valley, into which the road with some abruptness wound. - It was a large, handsome stone building, standing well on rising - ground, and backed by a ridge of high woody hills; and in front, - a stream of some natural importance was swelled into greater, but - without any artificial appearance. Its banks were neither formal - nor falsely adorned. Elizabeth was delighted. She had never seen - a place for which nature had done more, or where natural beauty - had been so little counteracted by an awkward taste. They were - all of them warm in their admiration; and at that moment she felt - that to be mistress of Pemberley might be something! - - They descended the hill, crossed the bridge, and drove to the - door; and, while examining the nearer aspect of the house, all - her apprehension of meeting its owner returned. She dreaded lest - the chambermaid had been mistaken. On applying to see the place, - they were admitted into the hall; and Elizabeth, as they waited - for the housekeeper, had leisure to wonder at her being where she - was. - - The housekeeper came; a respectable-looking elderly woman, much - less fine, and more civil, than she had any notion of finding - her. They followed her into the dining-parlour. It was a large, - well proportioned room, handsomely fitted up. Elizabeth, after - slightly surveying it, went to a window to enjoy its prospect. - The hill, crowned with wood, which they had descended, receiving - increased abruptness from the distance, was a beautiful object. - Every disposition of the ground was good; and she looked on the - whole scene, the river, the trees scattered on its banks and the - winding of the valley, as far as she could trace it, with - delight. As they passed into other rooms these objects were - taking different positions; but from every window there were - beauties to be seen. The rooms were lofty and handsome, and their - furniture suitable to the fortune of its proprietor; but - Elizabeth saw, with admiration of his taste, that it was neither - gaudy nor uselessly fine; with less of splendour, and more real - elegance, than the furniture of Rosings. - - “And of this place,” thought she, “I might have been mistress! - With these rooms I might now have been familiarly acquainted! - Instead of viewing them as a stranger, I might have rejoiced in - them as my own, and welcomed to them as visitors my uncle and - aunt. But no,”—recollecting herself—“that could never be; my - uncle and aunt would have been lost to me; I should not have been - allowed to invite them.” - - This was a lucky recollection—it saved her from something very - like regret. - - She longed to inquire of the housekeeper whether her master was - really absent, but had not the courage for it. At length however, - the question was asked by her uncle; and she turned away with - alarm, while Mrs. Reynolds replied that he was, adding, “But we - expect him to-morrow, with a large party of friends.” How - rejoiced was Elizabeth that their own journey had not by any - circumstance been delayed a day! - - Her aunt now called her to look at a picture. She approached and - saw the likeness of Mr. Wickham, suspended, amongst several other - miniatures, over the mantelpiece. Her aunt asked her, smilingly, - how she liked it. The housekeeper came forward, and told them it - was a picture of a young gentleman, the son of her late master’s - steward, who had been brought up by him at his own expense. “He - is now gone into the army,” she added; “but I am afraid he has - turned out very wild.” - - Mrs. Gardiner looked at her niece with a smile, but Elizabeth - could not return it. - - “And that,” said Mrs. Reynolds, pointing to another of the - miniatures, “is my master—and very like him. It was drawn at the - same time as the other—about eight years ago.” - - “I have heard much of your master’s fine person,” said Mrs. - Gardiner, looking at the picture; “it is a handsome face. But, - Lizzy, you can tell us whether it is like or not.” - - Mrs. Reynolds respect for Elizabeth seemed to increase on this - intimation of her knowing her master. - - “Does that young lady know Mr. Darcy?” - - Elizabeth coloured, and said: “A little.” - - “And do not you think him a very handsome gentleman, ma’am?” - - “Yes, very handsome.” - - “I am sure _I_ know none so handsome; but in the gallery up - stairs you will see a finer, larger picture of him than this. - This room was my late master’s favourite room, and these - miniatures are just as they used to be then. He was very fond of - them.” - - This accounted to Elizabeth for Mr. Wickham’s being among them. - - Mrs. Reynolds then directed their attention to one of Miss Darcy, - drawn when she was only eight years old. - - “And is Miss Darcy as handsome as her brother?” said Mrs. - Gardiner. - - “Oh! yes—the handsomest young lady that ever was seen; and so - accomplished!—She plays and sings all day long. In the next room - is a new instrument just come down for her—a present from my - master; she comes here to-morrow with him.” - - Mr. Gardiner, whose manners were very easy and pleasant, - encouraged her communicativeness by his questions and remarks; - Mrs. Reynolds, either by pride or attachment, had evidently great - pleasure in talking of her master and his sister. - - “Is your master much at Pemberley in the course of the year?” - - “Not so much as I could wish, sir; but I dare say he may spend - half his time here; and Miss Darcy is always down for the summer - months.” - - “Except,” thought Elizabeth, “when she goes to Ramsgate.” - - “If your master would marry, you might see more of him.” - - “Yes, sir; but I do not know when _that_ will be. I do not know - who is good enough for him.” - - Mr. and Mrs. Gardiner smiled. Elizabeth could not help saying, - “It is very much to his credit, I am sure, that you should think - so.” - - “I say no more than the truth, and everybody will say that knows - him,” replied the other. Elizabeth thought this was going pretty - far; and she listened with increasing astonishment as the - housekeeper added, “I have never known a cross word from him in - my life, and I have known him ever since he was four years old.” - - This was praise, of all others most extraordinary, most opposite - to her ideas. That he was not a good-tempered man had been her - firmest opinion. Her keenest attention was awakened; she longed - to hear more, and was grateful to her uncle for saying: - - “There are very few people of whom so much can be said. You are - lucky in having such a master.” - - “Yes, sir, I know I am. If I were to go through the world, I - could not meet with a better. But I have always observed, that - they who are good-natured when children, are good-natured when - they grow up; and he was always the sweetest-tempered, most - generous-hearted boy in the world.” - - Elizabeth almost stared at her. “Can this be Mr. Darcy?” thought - she. - - “His father was an excellent man,” said Mrs. Gardiner. - - “Yes, ma’am, that he was indeed; and his son will be just like - him—just as affable to the poor.” - - Elizabeth listened, wondered, doubted, and was impatient for - more. Mrs. Reynolds could interest her on no other point. She - related the subjects of the pictures, the dimensions of the - rooms, and the price of the furniture, in vain. Mr. Gardiner, - highly amused by the kind of family prejudice to which he - attributed her excessive commendation of her master, soon led - again to the subject; and she dwelt with energy on his many - merits as they proceeded together up the great staircase. - - “He is the best landlord, and the best master,” said she, “that - ever lived; not like the wild young men nowadays, who think of - nothing but themselves. There is not one of his tenants or - servants but will give him a good name. Some people call him - proud; but I am sure I never saw anything of it. To my fancy, it - is only because he does not rattle away like other young men.” - - “In what an amiable light does this place him!” thought - Elizabeth. - - “This fine account of him,” whispered her aunt as they walked, - “is not quite consistent with his behaviour to our poor friend.” - - “Perhaps we might be deceived.” - - “That is not very likely; our authority was too good.” - - On reaching the spacious lobby above they were shown into a very - pretty sitting-room, lately fitted up with greater elegance and - lightness than the apartments below; and were informed that it - was but just done to give pleasure to Miss Darcy, who had taken a - liking to the room when last at Pemberley. - - “He is certainly a good brother,” said Elizabeth, as she walked - towards one of the windows. - - Mrs. Reynolds anticipated Miss Darcy’s delight, when she should - enter the room. “And this is always the way with him,” she added. - “Whatever can give his sister any pleasure is sure to be done in - a moment. There is nothing he would not do for her.” - - The picture-gallery, and two or three of the principal bedrooms, - were all that remained to be shown. In the former were many good - paintings; but Elizabeth knew nothing of the art; and from such - as had been already visible below, she had willingly turned to - look at some drawings of Miss Darcy’s, in crayons, whose subjects - were usually more interesting, and also more intelligible. - - In the gallery there were many family portraits, but they could - have little to fix the attention of a stranger. Elizabeth walked - in quest of the only face whose features would be known to her. - At last it arrested her—and she beheld a striking resemblance to - Mr. Darcy, with such a smile over the face as she remembered to - have sometimes seen when he looked at her. She stood several - minutes before the picture, in earnest contemplation, and - returned to it again before they quitted the gallery. Mrs. - Reynolds informed them that it had been taken in his father’s - lifetime. - - There was certainly at this moment, in Elizabeth’s mind, a more - gentle sensation towards the original than she had ever felt at - the height of their acquaintance. The commendation bestowed on - him by Mrs. Reynolds was of no trifling nature. What praise is - more valuable than the praise of an intelligent servant? As a - brother, a landlord, a master, she considered how many people’s - happiness were in his guardianship!—how much of pleasure or pain - was it in his power to bestow!—how much of good or evil must be - done by him! Every idea that had been brought forward by the - housekeeper was favourable to his character, and as she stood - before the canvas on which he was represented, and fixed his eyes - upon herself, she thought of his regard with a deeper sentiment - of gratitude than it had ever raised before; she remembered its - warmth, and softened its impropriety of expression. - - When all of the house that was open to general inspection had - been seen, they returned downstairs, and, taking leave of the - housekeeper, were consigned over to the gardener, who met them at - the hall-door. - - As they walked across the hall towards the river, Elizabeth - turned back to look again; her uncle and aunt stopped also, and - while the former was conjecturing as to the date of the building, - the owner of it himself suddenly came forward from the road, - which led behind it to the stables. - - They were within twenty yards of each other, and so abrupt was - his appearance, that it was impossible to avoid his sight. Their - eyes instantly met, and the cheeks of both were overspread with - the deepest blush. He absolutely started, and for a moment seemed - immovable from surprise; but shortly recovering himself, advanced - towards the party, and spoke to Elizabeth, if not in terms of - perfect composure, at least of perfect civility. - - She had instinctively turned away; but stopping on his approach, - received his compliments with an embarrassment impossible to be - overcome. Had his first appearance, or his resemblance to the - picture they had just been examining, been insufficient to assure - the other two that they now saw Mr. Darcy, the gardener’s - expression of surprise, on beholding his master, must immediately - have told it. They stood a little aloof while he was talking to - their niece, who, astonished and confused, scarcely dared lift - her eyes to his face, and knew not what answer she returned to - his civil inquiries after her family. Amazed at the alteration of - his manner since they last parted, every sentence that he uttered - was increasing her embarrassment; and every idea of the - impropriety of her being found there recurring to her mind, the - few minutes in which they continued were some of the most - uncomfortable in her life. Nor did he seem much more at ease; - when he spoke, his accent had none of its usual sedateness; and - he repeated his inquiries as to the time of her having left - Longbourn, and of her having stayed in Derbyshire, so often, and - in so hurried a way, as plainly spoke the distraction of his - thoughts. - - At length every idea seemed to fail him; and, after standing a - few moments without saying a word, he suddenly recollected - himself, and took leave. - - The others then joined her, and expressed admiration of his - figure; but Elizabeth heard not a word, and wholly engrossed by - her own feelings, followed them in silence. She was overpowered - by shame and vexation. Her coming there was the most unfortunate, - the most ill-judged thing in the world! How strange it must - appear to him! In what a disgraceful light might it not strike so - vain a man! It might seem as if she had purposely thrown herself - in his way again! Oh! why did she come? Or, why did he thus come - a day before he was expected? Had they been only ten minutes - sooner, they should have been beyond the reach of his - discrimination; for it was plain that he was that moment - arrived—that moment alighted from his horse or his carriage. She - blushed again and again over the perverseness of the meeting. And - his behaviour, so strikingly altered—what could it mean? That he - should even speak to her was amazing!—but to speak with such - civility, to inquire after her family! Never in her life had she - seen his manners so little dignified, never had he spoken with - such gentleness as on this unexpected meeting. What a contrast - did it offer to his last address in Rosings Park, when he put his - letter into her hand! She knew not what to think, or how to - account for it. - - They had now entered a beautiful walk by the side of the water, - and every step was bringing forward a nobler fall of ground, or a - finer reach of the woods to which they were approaching; but it - was some time before Elizabeth was sensible of any of it; and, - though she answered mechanically to the repeated appeals of her - uncle and aunt, and seemed to direct her eyes to such objects as - they pointed out, she distinguished no part of the scene. Her - thoughts were all fixed on that one spot of Pemberley House, - whichever it might be, where Mr. Darcy then was. She longed to - know what at the moment was passing in his mind—in what manner he - thought of her, and whether, in defiance of everything, she was - still dear to him. Perhaps he had been civil only because he felt - himself at ease; yet there had been _that_ in his voice which was - not like ease. Whether he had felt more of pain or of pleasure in - seeing her she could not tell, but he certainly had not seen her - with composure. - - At length, however, the remarks of her companions on her absence - of mind aroused her, and she felt the necessity of appearing more - like herself. - - They entered the woods, and bidding adieu to the river for a - while, ascended some of the higher grounds; when, in spots where - the opening of the trees gave the eye power to wander, were many - charming views of the valley, the opposite hills, with the long - range of woods overspreading many, and occasionally part of the - stream. Mr. Gardiner expressed a wish of going round the whole - park, but feared it might be beyond a walk. With a triumphant - smile they were told that it was ten miles round. It settled the - matter; and they pursued the accustomed circuit; which brought - them again, after some time, in a descent among hanging woods, to - the edge of the water, and one of its narrowest parts. They - crossed it by a simple bridge, in character with the general air - of the scene; it was a spot less adorned than any they had yet - visited; and the valley, here contracted into a glen, allowed - room only for the stream, and a narrow walk amidst the rough - coppice-wood which bordered it. Elizabeth longed to explore its - windings; but when they had crossed the bridge, and perceived - their distance from the house, Mrs. Gardiner, who was not a great - walker, could go no farther, and thought only of returning to the - carriage as quickly as possible. Her niece was, therefore, - obliged to submit, and they took their way towards the house on - the opposite side of the river, in the nearest direction; but - their progress was slow, for Mr. Gardiner, though seldom able to - indulge the taste, was very fond of fishing, and was so much - engaged in watching the occasional appearance of some trout in - the water, and talking to the man about them, that he advanced - but little. Whilst wandering on in this slow manner, they were - again surprised, and Elizabeth’s astonishment was quite equal to - what it had been at first, by the sight of Mr. Darcy approaching - them, and at no great distance. The walk here being here less - sheltered than on the other side, allowed them to see him before - they met. Elizabeth, however astonished, was at least more - prepared for an interview than before, and resolved to appear and - to speak with calmness, if he really intended to meet them. For a - few moments, indeed, she felt that he would probably strike into - some other path. The idea lasted while a turning in the walk - concealed him from their view; the turning past, he was - immediately before them. With a glance, she saw that he had lost - none of his recent civility; and, to imitate his politeness, she - began, as they met, to admire the beauty of the place; but she - had not got beyond the words “delightful,” and “charming,” when - some unlucky recollections obtruded, and she fancied that praise - of Pemberley from her might be mischievously construed. Her - colour changed, and she said no more. - - Mrs. Gardiner was standing a little behind; and on her pausing, - he asked her if she would do him the honour of introducing him to - her friends. This was a stroke of civility for which she was - quite unprepared; and she could hardly suppress a smile at his - being now seeking the acquaintance of some of those very people - against whom his pride had revolted in his offer to herself. - “What will be his surprise,” thought she, “when he knows who they - are? He takes them now for people of fashion.” - - The introduction, however, was immediately made; and as she named - their relationship to herself, she stole a sly look at him, to - see how he bore it, and was not without the expectation of his - decamping as fast as he could from such disgraceful companions. - That he was _surprised_ by the connection was evident; he - sustained it, however, with fortitude, and so far from going - away, turned back with them, and entered into conversation with - Mr. Gardiner. Elizabeth could not but be pleased, could not but - triumph. It was consoling that he should know she had some - relations for whom there was no need to blush. She listened most - attentively to all that passed between them, and gloried in every - expression, every sentence of her uncle, which marked his - intelligence, his taste, or his good manners. - - The conversation soon turned upon fishing; and she heard Mr. - Darcy invite him, with the greatest civility, to fish there as - often as he chose while he continued in the neighbourhood, - offering at the same time to supply him with fishing tackle, and - pointing out those parts of the stream where there was usually - most sport. Mrs. Gardiner, who was walking arm-in-arm with - Elizabeth, gave her a look expressive of wonder. Elizabeth said - nothing, but it gratified her exceedingly; the compliment must be - all for herself. Her astonishment, however, was extreme, and - continually was she repeating, “Why is he so altered? From what - can it proceed? It cannot be for _me_—it cannot be for _my_ sake - that his manners are thus softened. My reproofs at Hunsford could - not work such a change as this. It is impossible that he should - still love me.” - - After walking some time in this way, the two ladies in front, the - two gentlemen behind, on resuming their places, after descending - to the brink of the river for the better inspection of some - curious water-plant, there chanced to be a little alteration. It - originated in Mrs. Gardiner, who, fatigued by the exercise of the - morning, found Elizabeth’s arm inadequate to her support, and - consequently preferred her husband’s. Mr. Darcy took her place by - her niece, and they walked on together. After a short silence, - the lady first spoke. She wished him to know that she had been - assured of his absence before she came to the place, and - accordingly began by observing, that his arrival had been very - unexpected—“for your housekeeper,” she added, “informed us that - you would certainly not be here till to-morrow; and indeed, - before we left Bakewell, we understood that you were not - immediately expected in the country.” He acknowledged the truth - of it all, and said that business with his steward had occasioned - his coming forward a few hours before the rest of the party with - whom he had been travelling. “They will join me early to-morrow,” - he continued, “and among them are some who will claim an - acquaintance with you—Mr. Bingley and his sisters.” - - Elizabeth answered only by a slight bow. Her thoughts were - instantly driven back to the time when Mr. Bingley’s name had - been the last mentioned between them; and, if she might judge by - his complexion, _his_ mind was not very differently engaged. - - “There is also one other person in the party,” he continued after - a pause, “who more particularly wishes to be known to you. Will - you allow me, or do I ask too much, to introduce my sister to - your acquaintance during your stay at Lambton?” - - The surprise of such an application was great indeed; it was too - great for her to know in what manner she acceded to it. She - immediately felt that whatever desire Miss Darcy might have of - being acquainted with her must be the work of her brother, and, - without looking farther, it was satisfactory; it was gratifying - to know that his resentment had not made him think really ill of - her. - - They now walked on in silence, each of them deep in thought. - Elizabeth was not comfortable; that was impossible; but she was - flattered and pleased. His wish of introducing his sister to her - was a compliment of the highest kind. They soon outstripped the - others, and when they had reached the carriage, Mr. and Mrs. - Gardiner were half a quarter of a mile behind. - - He then asked her to walk into the house—but she declared herself - not tired, and they stood together on the lawn. At such a time - much might have been said, and silence was very awkward. She - wanted to talk, but there seemed to be an embargo on every - subject. At last she recollected that she had been travelling, - and they talked of Matlock and Dove Dale with great perseverance. - Yet time and her aunt moved slowly—and her patience and her ideas - were nearly worn out before the _tÊte-à-tÊte_ was over. - - On Mr. and Mrs. Gardiner’s coming up they were all pressed to go - into the house and take some refreshment; but this was declined, - and they parted on each side with utmost politeness. Mr. Darcy - handed the ladies into the carriage; and when it drove off, - Elizabeth saw him walking slowly towards the house. - - The observations of her uncle and aunt now began; and each of - them pronounced him to be infinitely superior to anything they - had expected. “He is perfectly well behaved, polite, and - unassuming,” said her uncle. - - “There _is_ something a little stately in him, to be sure,” - replied her aunt, “but it is confined to his air, and is not - unbecoming. I can now say with the housekeeper, that though some - people may call him proud, _I_ have seen nothing of it.” - - “I was never more surprised than by his behaviour to us. It was - more than civil; it was really attentive; and there was no - necessity for such attention. His acquaintance with Elizabeth was - very trifling.” - - “To be sure, Lizzy,” said her aunt, “he is not so handsome as - Wickham; or, rather, he has not Wickham’s countenance, for his - features are perfectly good. But how came you to tell me that he - was so disagreeable?” - - Elizabeth excused herself as well as she could; said that she had - liked him better when they had met in Kent than before, and that - she had never seen him so pleasant as this morning. - - “But perhaps he may be a little whimsical in his civilities,” - replied her uncle. “Your great men often are; and therefore I - shall not take him at his word, as he might change his mind - another day, and warn me off his grounds.” - - Elizabeth felt that they had entirely misunderstood his - character, but said nothing. - - “From what we have seen of him,” continued Mrs. Gardiner, “I - really should not have thought that he could have behaved in so - cruel a way by anybody as he has done by poor Wickham. He has not - an ill-natured look. On the contrary, there is something pleasing - about his mouth when he speaks. And there is something of dignity - in his countenance that would not give one an unfavourable idea - of his heart. But, to be sure, the good lady who showed us his - house did give him a most flaming character! I could hardly help - laughing aloud sometimes. But he is a liberal master, I suppose, - and _that_ in the eye of a servant comprehends every virtue.” - - Elizabeth here felt herself called on to say something in - vindication of his behaviour to Wickham; and therefore gave them - to understand, in as guarded a manner as she could, that by what - she had heard from his relations in Kent, his actions were - capable of a very different construction; and that his character - was by no means so faulty, nor Wickham’s so amiable, as they had - been considered in Hertfordshire. In confirmation of this, she - related the particulars of all the pecuniary transactions in - which they had been connected, without actually naming her - authority, but stating it to be such as might be relied on. - - Mrs. Gardiner was surprised and concerned; but as they were now - approaching the scene of her former pleasures, every idea gave - way to the charm of recollection; and she was too much engaged in - pointing out to her husband all the interesting spots in its - environs to think of anything else. Fatigued as she had been by - the morning’s walk they had no sooner dined than she set off - again in quest of her former acquaintance, and the evening was - spent in the satisfactions of an intercourse renewed after many - years’ discontinuance. - - The occurrences of the day were too full of interest to leave - Elizabeth much attention for any of these new friends; and she - could do nothing but think, and think with wonder, of Mr. Darcy’s - civility, and, above all, of his wishing her to be acquainted - with his sister. - - - - - Chapter 44 - - Elizabeth had settled it that Mr. Darcy would bring his sister to - visit her the very day after her reaching Pemberley; and was - consequently resolved not to be out of sight of the inn the whole - of that morning. But her conclusion was false; for on the very - morning after their arrival at Lambton, these visitors came. They - had been walking about the place with some of their new friends, - and were just returning to the inn to dress themselves for dining - with the same family, when the sound of a carriage drew them to a - window, and they saw a gentleman and a lady in a curricle driving - up the street. Elizabeth immediately recognizing the livery, - guessed what it meant, and imparted no small degree of her - surprise to her relations by acquainting them with the honour - which she expected. Her uncle and aunt were all amazement; and - the embarrassment of her manner as she spoke, joined to the - circumstance itself, and many of the circumstances of the - preceding day, opened to them a new idea on the business. Nothing - had ever suggested it before, but they felt that there was no - other way of accounting for such attentions from such a quarter - than by supposing a partiality for their niece. While these - newly-born notions were passing in their heads, the perturbation - of Elizabeth’s feelings was at every moment increasing. She was - quite amazed at her own discomposure; but amongst other causes of - disquiet, she dreaded lest the partiality of the brother should - have said too much in her favour; and, more than commonly anxious - to please, she naturally suspected that every power of pleasing - would fail her. - - She retreated from the window, fearful of being seen; and as she - walked up and down the room, endeavouring to compose herself, saw - such looks of inquiring surprise in her uncle and aunt as made - everything worse. - - Miss Darcy and her brother appeared, and this formidable - introduction took place. With astonishment did Elizabeth see that - her new acquaintance was at least as much embarrassed as herself. - Since her being at Lambton, she had heard that Miss Darcy was - exceedingly proud; but the observation of a very few minutes - convinced her that she was only exceedingly shy. She found it - difficult to obtain even a word from her beyond a monosyllable. - - Miss Darcy was tall, and on a larger scale than Elizabeth; and, - though little more than sixteen, her figure was formed, and her - appearance womanly and graceful. She was less handsome than her - brother; but there was sense and good humour in her face, and her - manners were perfectly unassuming and gentle. Elizabeth, who had - expected to find in her as acute and unembarrassed an observer as - ever Mr. Darcy had been, was much relieved by discerning such - different feelings. - - They had not long been together before Mr. Darcy told her that - Bingley was also coming to wait on her; and she had barely time - to express her satisfaction, and prepare for such a visitor, when - Bingley’s quick step was heard on the stairs, and in a moment he - entered the room. All Elizabeth’s anger against him had been long - done away; but had she still felt any, it could hardly have stood - its ground against the unaffected cordiality with which he - expressed himself on seeing her again. He inquired in a friendly, - though general way, after her family, and looked and spoke with - the same good-humoured ease that he had ever done. - - To Mr. and Mrs. Gardiner he was scarcely a less interesting - personage than to herself. They had long wished to see him. The - whole party before them, indeed, excited a lively attention. The - suspicions which had just arisen of Mr. Darcy and their niece - directed their observation towards each with an earnest though - guarded inquiry; and they soon drew from those inquiries the full - conviction that one of them at least knew what it was to love. Of - the lady’s sensations they remained a little in doubt; but that - the gentleman was overflowing with admiration was evident enough. - - Elizabeth, on her side, had much to do. She wanted to ascertain - the feelings of each of her visitors; she wanted to compose her - own, and to make herself agreeable to all; and in the latter - object, where she feared most to fail, she was most sure of - success, for those to whom she endeavoured to give pleasure were - prepossessed in her favour. Bingley was ready, Georgiana was - eager, and Darcy determined, to be pleased. - - In seeing Bingley, her thoughts naturally flew to her sister; - and, oh! how ardently did she long to know whether any of his - were directed in a like manner. Sometimes she could fancy that he - talked less than on former occasions, and once or twice pleased - herself with the notion that, as he looked at her, he was trying - to trace a resemblance. But, though this might be imaginary, she - could not be deceived as to his behaviour to Miss Darcy, who had - been set up as a rival to Jane. No look appeared on either side - that spoke particular regard. Nothing occurred between them that - could justify the hopes of his sister. On this point she was soon - satisfied; and two or three little circumstances occurred ere - they parted, which, in her anxious interpretation, denoted a - recollection of Jane not untinctured by tenderness, and a wish of - saying more that might lead to the mention of her, had he dared. - He observed to her, at a moment when the others were talking - together, and in a tone which had something of real regret, that - it “was a very long time since he had had the pleasure of seeing - her;” and, before she could reply, he added, “It is above eight - months. We have not met since the 26th of November, when we were - all dancing together at Netherfield.” - - Elizabeth was pleased to find his memory so exact; and he - afterwards took occasion to ask her, when unattended to by any of - the rest, whether _all_ her sisters were at Longbourn. There was - not much in the question, nor in the preceding remark; but there - was a look and a manner which gave them meaning. - - It was not often that she could turn her eyes on Mr. Darcy - himself; but, whenever she did catch a glimpse, she saw an - expression of general complaisance, and in all that he said she - heard an accent so removed from _hauteur_ or disdain of his - companions, as convinced her that the improvement of manners - which she had yesterday witnessed however temporary its existence - might prove, had at least outlived one day. When she saw him thus - seeking the acquaintance and courting the good opinion of people - with whom any intercourse a few months ago would have been a - disgrace—when she saw him thus civil, not only to herself, but to - the very relations whom he had openly disdained, and recollected - their last lively scene in Hunsford Parsonage—the difference, the - change was so great, and struck so forcibly on her mind, that she - could hardly restrain her astonishment from being visible. Never, - even in the company of his dear friends at Netherfield, or his - dignified relations at Rosings, had she seen him so desirous to - please, so free from self-consequence or unbending reserve, as - now, when no importance could result from the success of his - endeavours, and when even the acquaintance of those to whom his - attentions were addressed would draw down the ridicule and - censure of the ladies both of Netherfield and Rosings. - - Their visitors stayed with them above half-an-hour; and when they - arose to depart, Mr. Darcy called on his sister to join him in - expressing their wish of seeing Mr. and Mrs. Gardiner, and Miss - Bennet, to dinner at Pemberley, before they left the country. - Miss Darcy, though with a diffidence which marked her little in - the habit of giving invitations, readily obeyed. Mrs. Gardiner - looked at her niece, desirous of knowing how _she_, whom the - invitation most concerned, felt disposed as to its acceptance, - but Elizabeth had turned away her head. Presuming however, that - this studied avoidance spoke rather a momentary embarrassment - than any dislike of the proposal, and seeing in her husband, who - was fond of society, a perfect willingness to accept it, she - ventured to engage for her attendance, and the day after the next - was fixed on. - - Bingley expressed great pleasure in the certainty of seeing - Elizabeth again, having still a great deal to say to her, and - many inquiries to make after all their Hertfordshire friends. - Elizabeth, construing all this into a wish of hearing her speak - of her sister, was pleased, and on this account, as well as some - others, found herself, when their visitors left them, capable of - considering the last half-hour with some satisfaction, though - while it was passing, the enjoyment of it had been little. Eager - to be alone, and fearful of inquiries or hints from her uncle and - aunt, she stayed with them only long enough to hear their - favourable opinion of Bingley, and then hurried away to dress. - - But she had no reason to fear Mr. and Mrs. Gardiner’s curiosity; - it was not their wish to force her communication. It was evident - that she was much better acquainted with Mr. Darcy than they had - before any idea of; it was evident that he was very much in love - with her. They saw much to interest, but nothing to justify - inquiry. - - Of Mr. Darcy it was now a matter of anxiety to think well; and, - as far as their acquaintance reached, there was no fault to find. - They could not be untouched by his politeness; and had they drawn - his character from their own feelings and his servant’s report, - without any reference to any other account, the circle in - Hertfordshire to which he was known would not have recognized it - for Mr. Darcy. There was now an interest, however, in believing - the housekeeper; and they soon became sensible that the authority - of a servant who had known him since he was four years old, and - whose own manners indicated respectability, was not to be hastily - rejected. Neither had anything occurred in the intelligence of - their Lambton friends that could materially lessen its weight. - They had nothing to accuse him of but pride; pride he probably - had, and if not, it would certainly be imputed by the inhabitants - of a small market-town where the family did not visit. It was - acknowledged, however, that he was a liberal man, and did much - good among the poor. - - With respect to Wickham, the travellers soon found that he was - not held there in much estimation; for though the chief of his - concerns with the son of his patron were imperfectly understood, - it was yet a well-known fact that, on his quitting Derbyshire, he - had left many debts behind him, which Mr. Darcy afterwards - discharged. - - As for Elizabeth, her thoughts were at Pemberley this evening - more than the last; and the evening, though as it passed it - seemed long, was not long enough to determine her feelings - towards _one_ in that mansion; and she lay awake two whole hours - endeavouring to make them out. She certainly did not hate him. - No; hatred had vanished long ago, and she had almost as long been - ashamed of ever feeling a dislike against him, that could be so - called. The respect created by the conviction of his valuable - qualities, though at first unwillingly admitted, had for some - time ceased to be repugnant to her feeling; and it was now - heightened into somewhat of a friendlier nature, by the testimony - so highly in his favour, and bringing forward his disposition in - so amiable a light, which yesterday had produced. But above all, - above respect and esteem, there was a motive within her of - goodwill which could not be overlooked. It was gratitude; - gratitude, not merely for having once loved her, but for loving - her still well enough to forgive all the petulance and acrimony - of her manner in rejecting him, and all the unjust accusations - accompanying her rejection. He who, she had been persuaded, would - avoid her as his greatest enemy, seemed, on this accidental - meeting, most eager to preserve the acquaintance, and without any - indelicate display of regard, or any peculiarity of manner, where - their two selves only were concerned, was soliciting the good - opinion of her friends, and bent on making her known to his - sister. Such a change in a man of so much pride exciting not only - astonishment but gratitude—for to love, ardent love, it must be - attributed; and as such its impression on her was of a sort to be - encouraged, as by no means unpleasing, though it could not be - exactly defined. She respected, she esteemed, she was grateful to - him, she felt a real interest in his welfare; and she only wanted - to know how far she wished that welfare to depend upon herself, - and how far it would be for the happiness of both that she should - employ the power, which her fancy told her she still possessed, - of bringing on her the renewal of his addresses. - - It had been settled in the evening between the aunt and the - niece, that such a striking civility as Miss Darcy’s in coming to - see them on the very day of her arrival at Pemberley, for she had - reached it only to a late breakfast, ought to be imitated, though - it could not be equalled, by some exertion of politeness on their - side; and, consequently, that it would be highly expedient to - wait on her at Pemberley the following morning. They were, - therefore, to go. Elizabeth was pleased; though when she asked - herself the reason, she had very little to say in reply. - - Mr. Gardiner left them soon after breakfast. The fishing scheme - had been renewed the day before, and a positive engagement made - of his meeting some of the gentlemen at Pemberley before noon. - - - - - Chapter 45 - - Convinced as Elizabeth now was that Miss Bingley’s dislike of her - had originated in jealousy, she could not help feeling how - unwelcome her appearance at Pemberley must be to her, and was - curious to know with how much civility on that lady’s side the - acquaintance would now be renewed. - - On reaching the house, they were shown through the hall into the - saloon, whose northern aspect rendered it delightful for summer. - Its windows opening to the ground, admitted a most refreshing - view of the high woody hills behind the house, and of the - beautiful oaks and Spanish chestnuts which were scattered over - the intermediate lawn. - - In this house they were received by Miss Darcy, who was sitting - there with Mrs. Hurst and Miss Bingley, and the lady with whom - she lived in London. Georgiana’s reception of them was very - civil, but attended with all the embarrassment which, though - proceeding from shyness and the fear of doing wrong, would easily - give to those who felt themselves inferior the belief of her - being proud and reserved. Mrs. Gardiner and her niece, however, - did her justice, and pitied her. - - By Mrs. Hurst and Miss Bingley they were noticed only by a - curtsey; and, on their being seated, a pause, awkward as such - pauses must always be, succeeded for a few moments. It was first - broken by Mrs. Annesley, a genteel, agreeable-looking woman, - whose endeavour to introduce some kind of discourse proved her to - be more truly well-bred than either of the others; and between - her and Mrs. Gardiner, with occasional help from Elizabeth, the - conversation was carried on. Miss Darcy looked as if she wished - for courage enough to join in it; and sometimes did venture a - short sentence when there was least danger of its being heard. - - Elizabeth soon saw that she was herself closely watched by Miss - Bingley, and that she could not speak a word, especially to Miss - Darcy, without calling her attention. This observation would not - have prevented her from trying to talk to the latter, had they - not been seated at an inconvenient distance; but she was not - sorry to be spared the necessity of saying much. Her own thoughts - were employing her. She expected every moment that some of the - gentlemen would enter the room. She wished, she feared that the - master of the house might be amongst them; and whether she wished - or feared it most, she could scarcely determine. After sitting in - this manner a quarter of an hour without hearing Miss Bingley’s - voice, Elizabeth was roused by receiving from her a cold inquiry - after the health of her family. She answered with equal - indifference and brevity, and the other said no more. - - The next variation which their visit afforded was produced by the - entrance of servants with cold meat, cake, and a variety of all - the finest fruits in season; but this did not take place till - after many a significant look and smile from Mrs. Annesley to - Miss Darcy had been given, to remind her of her post. There was - now employment for the whole party—for though they could not all - talk, they could all eat; and the beautiful pyramids of grapes, - nectarines, and peaches soon collected them round the table. - - While thus engaged, Elizabeth had a fair opportunity of deciding - whether she most feared or wished for the appearance of Mr. - Darcy, by the feelings which prevailed on his entering the room; - and then, though but a moment before she had believed her wishes - to predominate, she began to regret that he came. - - He had been some time with Mr. Gardiner, who, with two or three - other gentlemen from the house, was engaged by the river, and had - left him only on learning that the ladies of the family intended - a visit to Georgiana that morning. No sooner did he appear than - Elizabeth wisely resolved to be perfectly easy and unembarrassed; - a resolution the more necessary to be made, but perhaps not the - more easily kept, because she saw that the suspicions of the - whole party were awakened against them, and that there was - scarcely an eye which did not watch his behaviour when he first - came into the room. In no countenance was attentive curiosity so - strongly marked as in Miss Bingley’s, in spite of the smiles - which overspread her face whenever she spoke to one of its - objects; for jealousy had not yet made her desperate, and her - attentions to Mr. Darcy were by no means over. Miss Darcy, on her - brother’s entrance, exerted herself much more to talk, and - Elizabeth saw that he was anxious for his sister and herself to - get acquainted, and forwarded as much as possible, every attempt - at conversation on either side. Miss Bingley saw all this - likewise; and, in the imprudence of anger, took the first - opportunity of saying, with sneering civility: - - “Pray, Miss Eliza, are not the ——shire Militia removed from - Meryton? They must be a great loss to _your_ family.” - - In Darcy’s presence she dared not mention Wickham’s name; but - Elizabeth instantly comprehended that he was uppermost in her - thoughts; and the various recollections connected with him gave - her a moment’s distress; but exerting herself vigorously to repel - the ill-natured attack, she presently answered the question in a - tolerably detached tone. While she spoke, an involuntary glance - showed her Darcy, with a heightened complexion, earnestly looking - at her, and his sister overcome with confusion, and unable to - lift up her eyes. Had Miss Bingley known what pain she was then - giving her beloved friend, she undoubtedly would have refrained - from the hint; but she had merely intended to discompose - Elizabeth by bringing forward the idea of a man to whom she - believed her partial, to make her betray a sensibility which - might injure her in Darcy’s opinion, and, perhaps, to remind the - latter of all the follies and absurdities by which some part of - her family were connected with that corps. Not a syllable had - ever reached her of Miss Darcy’s meditated elopement. To no - creature had it been revealed, where secrecy was possible, except - to Elizabeth; and from all Bingley’s connections her brother was - particularly anxious to conceal it, from the very wish which - Elizabeth had long ago attributed to him, of their becoming - hereafter her own. He had certainly formed such a plan, and - without meaning that it should affect his endeavour to separate - him from Miss Bennet, it is probable that it might add something - to his lively concern for the welfare of his friend. - - Elizabeth’s collected behaviour, however, soon quieted his - emotion; and as Miss Bingley, vexed and disappointed, dared not - approach nearer to Wickham, Georgiana also recovered in time, - though not enough to be able to speak any more. Her brother, - whose eye she feared to meet, scarcely recollected her interest - in the affair, and the very circumstance which had been designed - to turn his thoughts from Elizabeth seemed to have fixed them on - her more and more cheerfully. - - Their visit did not continue long after the question and answer - above mentioned; and while Mr. Darcy was attending them to their - carriage Miss Bingley was venting her feelings in criticisms on - Elizabeth’s person, behaviour, and dress. But Georgiana would not - join her. Her brother’s recommendation was enough to ensure her - favour; his judgement could not err. And he had spoken in such - terms of Elizabeth as to leave Georgiana without the power of - finding her otherwise than lovely and amiable. When Darcy - returned to the saloon, Miss Bingley could not help repeating to - him some part of what she had been saying to his sister. - - “How very ill Miss Eliza Bennet looks this morning, Mr. Darcy,” - she cried; “I never in my life saw anyone so much altered as she - is since the winter. She is grown so brown and coarse! Louisa and - I were agreeing that we should not have known her again.” - - However little Mr. Darcy might have liked such an address, he - contented himself with coolly replying that he perceived no other - alteration than her being rather tanned, no miraculous - consequence of travelling in the summer. - - “For my own part,” she rejoined, “I must confess that I never - could see any beauty in her. Her face is too thin; her complexion - has no brilliancy; and her features are not at all handsome. Her - nose wants character—there is nothing marked in its lines. Her - teeth are tolerable, but not out of the common way; and as for - her eyes, which have sometimes been called so fine, I could never - see anything extraordinary in them. They have a sharp, shrewish - look, which I do not like at all; and in her air altogether there - is a self-sufficiency without fashion, which is intolerable.” - - Persuaded as Miss Bingley was that Darcy admired Elizabeth, this - was not the best method of recommending herself; but angry people - are not always wise; and in seeing him at last look somewhat - nettled, she had all the success she expected. He was resolutely - silent, however, and, from a determination of making him speak, - she continued: - - “I remember, when we first knew her in Hertfordshire, how amazed - we all were to find that she was a reputed beauty; and I - particularly recollect your saying one night, after they had been - dining at Netherfield, ‘_She_ a beauty!—I should as soon call her - mother a wit.’ But afterwards she seemed to improve on you, and I - believe you thought her rather pretty at one time.” - - “Yes,” replied Darcy, who could contain himself no longer, “but - _that_ was only when I first saw her, for it is many months since - I have considered her as one of the handsomest women of my - acquaintance.” - - He then went away, and Miss Bingley was left to all the - satisfaction of having forced him to say what gave no one any - pain but herself. - - Mrs. Gardiner and Elizabeth talked of all that had occurred - during their visit, as they returned, except what had - particularly interested them both. The look and behaviour of - everybody they had seen were discussed, except of the person who - had mostly engaged their attention. They talked of his sister, - his friends, his house, his fruit—of everything but himself; yet - Elizabeth was longing to know what Mrs. Gardiner thought of him, - and Mrs. Gardiner would have been highly gratified by her niece’s - beginning the subject. - - - - - Chapter 46 - - Elizabeth had been a good deal disappointed in not finding a - letter from Jane on their first arrival at Lambton; and this - disappointment had been renewed on each of the mornings that had - now been spent there; but on the third her repining was over, and - her sister justified, by the receipt of two letters from her at - once, on one of which was marked that it had been missent - elsewhere. Elizabeth was not surprised at it, as Jane had written - the direction remarkably ill. - - They had just been preparing to walk as the letters came in; and - her uncle and aunt, leaving her to enjoy them in quiet, set off - by themselves. The one missent must first be attended to; it had - been written five days ago. The beginning contained an account of - all their little parties and engagements, with such news as the - country afforded; but the latter half, which was dated a day - later, and written in evident agitation, gave more important - intelligence. It was to this effect: - - “Since writing the above, dearest Lizzy, something has occurred - of a most unexpected and serious nature; but I am afraid of - alarming you—be assured that we are all well. What I have to say - relates to poor Lydia. An express came at twelve last night, just - as we were all gone to bed, from Colonel Forster, to inform us - that she was gone off to Scotland with one of his officers; to - own the truth, with Wickham! Imagine our surprise. To Kitty, - however, it does not seem so wholly unexpected. I am very, very - sorry. So imprudent a match on both sides! But I am willing to - hope the best, and that his character has been misunderstood. - Thoughtless and indiscreet I can easily believe him, but this - step (and let us rejoice over it) marks nothing bad at heart. His - choice is disinterested at least, for he must know my father can - give her nothing. Our poor mother is sadly grieved. My father - bears it better. How thankful am I that we never let them know - what has been said against him; we must forget it ourselves. They - were off Saturday night about twelve, as is conjectured, but were - not missed till yesterday morning at eight. The express was sent - off directly. My dear Lizzy, they must have passed within ten - miles of us. Colonel Forster gives us reason to expect him here - soon. Lydia left a few lines for his wife, informing her of their - intention. I must conclude, for I cannot be long from my poor - mother. I am afraid you will not be able to make it out, but I - hardly know what I have written.” - - Without allowing herself time for consideration, and scarcely - knowing what she felt, Elizabeth on finishing this letter - instantly seized the other, and opening it with the utmost - impatience, read as follows: it had been written a day later than - the conclusion of the first. - - “By this time, my dearest sister, you have received my hurried - letter; I wish this may be more intelligible, but though not - confined for time, my head is so bewildered that I cannot answer - for being coherent. Dearest Lizzy, I hardly know what I would - write, but I have bad news for you, and it cannot be delayed. - Imprudent as the marriage between Mr. Wickham and our poor Lydia - would be, we are now anxious to be assured it has taken place, - for there is but too much reason to fear they are not gone to - Scotland. Colonel Forster came yesterday, having left Brighton - the day before, not many hours after the express. Though Lydia’s - short letter to Mrs. F. gave them to understand that they were - going to Gretna Green, something was dropped by Denny expressing - his belief that W. never intended to go there, or to marry Lydia - at all, which was repeated to Colonel F., who, instantly taking - the alarm, set off from B. intending to trace their route. He did - trace them easily to Clapham, but no further; for on entering - that place, they removed into a hackney coach, and dismissed the - chaise that brought them from Epsom. All that is known after this - is, that they were seen to continue the London road. I know not - what to think. After making every possible inquiry on that side - London, Colonel F. came on into Hertfordshire, anxiously renewing - them at all the turnpikes, and at the inns in Barnet and - Hatfield, but without any success—no such people had been seen to - pass through. With the kindest concern he came on to Longbourn, - and broke his apprehensions to us in a manner most creditable to - his heart. I am sincerely grieved for him and Mrs. F., but no one - can throw any blame on them. Our distress, my dear Lizzy, is very - great. My father and mother believe the worst, but I cannot think - so ill of him. Many circumstances might make it more eligible for - them to be married privately in town than to pursue their first - plan; and even if _he_ could form such a design against a young - woman of Lydia’s connections, which is not likely, can I suppose - her so lost to everything? Impossible! I grieve to find, however, - that Colonel F. is not disposed to depend upon their marriage; he - shook his head when I expressed my hopes, and said he feared W. - was not a man to be trusted. My poor mother is really ill, and - keeps her room. Could she exert herself, it would be better; but - this is not to be expected. And as to my father, I never in my - life saw him so affected. Poor Kitty has anger for having - concealed their attachment; but as it was a matter of confidence, - one cannot wonder. I am truly glad, dearest Lizzy, that you have - been spared something of these distressing scenes; but now, as - the first shock is over, shall I own that I long for your return? - I am not so selfish, however, as to press for it, if - inconvenient. Adieu! I take up my pen again to do what I have - just told you I would not; but circumstances are such that I - cannot help earnestly begging you all to come here as soon as - possible. I know my dear uncle and aunt so well, that I am not - afraid of requesting it, though I have still something more to - ask of the former. My father is going to London with Colonel - Forster instantly, to try to discover her. What he means to do I - am sure I know not; but his excessive distress will not allow him - to pursue any measure in the best and safest way, and Colonel - Forster is obliged to be at Brighton again to-morrow evening. In - such an exigence, my uncle’s advice and assistance would be - everything in the world; he will immediately comprehend what I - must feel, and I rely upon his goodness.” - - “Oh! where, where is my uncle?” cried Elizabeth, darting from her - seat as she finished the letter, in eagerness to follow him, - without losing a moment of the time so precious; but as she - reached the door it was opened by a servant, and Mr. Darcy - appeared. Her pale face and impetuous manner made him start, and - before he could recover himself to speak, she, in whose mind - every idea was superseded by Lydia’s situation, hastily - exclaimed, “I beg your pardon, but I must leave you. I must find - Mr. Gardiner this moment, on business that cannot be delayed; I - have not an instant to lose.” - - “Good God! what is the matter?” cried he, with more feeling than - politeness; then recollecting himself, “I will not detain you a - minute; but let me, or let the servant go after Mr. and Mrs. - Gardiner. You are not well enough; you cannot go yourself.” - - Elizabeth hesitated, but her knees trembled under her and she - felt how little would be gained by her attempting to pursue them. - Calling back the servant, therefore, she commissioned him, though - in so breathless an accent as made her almost unintelligible, to - fetch his master and mistress home instantly. - - On his quitting the room she sat down, unable to support herself, - and looking so miserably ill, that it was impossible for Darcy to - leave her, or to refrain from saying, in a tone of gentleness and - commiseration, “Let me call your maid. Is there nothing you could - take to give you present relief? A glass of wine; shall I get you - one? You are very ill.” - - “No, I thank you,” she replied, endeavouring to recover herself. - “There is nothing the matter with me. I am quite well; I am only - distressed by some dreadful news which I have just received from - Longbourn.” - - She burst into tears as she alluded to it, and for a few minutes - could not speak another word. Darcy, in wretched suspense, could - only say something indistinctly of his concern, and observe her - in compassionate silence. At length she spoke again. “I have just - had a letter from Jane, with such dreadful news. It cannot be - concealed from anyone. My younger sister has left all her - friends—has eloped; has thrown herself into the power of—of Mr. - Wickham. They are gone off together from Brighton. _You_ know him - too well to doubt the rest. She has no money, no connections, - nothing that can tempt him to—she is lost for ever.” - - Darcy was fixed in astonishment. “When I consider,” she added in - a yet more agitated voice, “that _I_ might have prevented it! _I_ - who knew what he was. Had I but explained some part of it - only—some part of what I learnt, to my own family! Had his - character been known, this could not have happened. But it is - all—all too late now.” - - “I am grieved indeed,” cried Darcy; “grieved—shocked. But is it - certain—absolutely certain?” - - “Oh, yes! They left Brighton together on Sunday night, and were - traced almost to London, but not beyond; they are certainly not - gone to Scotland.” - - “And what has been done, what has been attempted, to recover - her?” - - “My father is gone to London, and Jane has written to beg my - uncle’s immediate assistance; and we shall be off, I hope, in - half-an-hour. But nothing can be done—I know very well that - nothing can be done. How is such a man to be worked on? How are - they even to be discovered? I have not the smallest hope. It is - every way horrible!” - - Darcy shook his head in silent acquiescence. - - “When _my_ eyes were opened to his real character—Oh! had I known - what I ought, what I dared to do! But I knew not—I was afraid of - doing too much. Wretched, wretched mistake!” - - Darcy made no answer. He seemed scarcely to hear her, and was - walking up and down the room in earnest meditation, his brow - contracted, his air gloomy. Elizabeth soon observed, and - instantly understood it. Her power was sinking; everything _must_ - sink under such a proof of family weakness, such an assurance of - the deepest disgrace. She could neither wonder nor condemn, but - the belief of his self-conquest brought nothing consolatory to - her bosom, afforded no palliation of her distress. It was, on the - contrary, exactly calculated to make her understand her own - wishes; and never had she so honestly felt that she could have - loved him, as now, when all love must be vain. - - But self, though it would intrude, could not engross her. - Lydia—the humiliation, the misery she was bringing on them all, - soon swallowed up every private care; and covering her face with - her handkerchief, Elizabeth was soon lost to everything else; - and, after a pause of several minutes, was only recalled to a - sense of her situation by the voice of her companion, who, in a - manner which, though it spoke compassion, spoke likewise - restraint, said, “I am afraid you have been long desiring my - absence, nor have I anything to plead in excuse of my stay, but - real, though unavailing concern. Would to Heaven that anything - could be either said or done on my part that might offer - consolation to such distress! But I will not torment you with - vain wishes, which may seem purposely to ask for your thanks. - This unfortunate affair will, I fear, prevent my sister’s having - the pleasure of seeing you at Pemberley to-day.” - - “Oh, yes. Be so kind as to apologise for us to Miss Darcy. Say - that urgent business calls us home immediately. Conceal the - unhappy truth as long as it is possible, I know it cannot be - long.” - - He readily assured her of his secrecy; again expressed his sorrow - for her distress, wished it a happier conclusion than there was - at present reason to hope, and leaving his compliments for her - relations, with only one serious, parting look, went away. - - As he quitted the room, Elizabeth felt how improbable it was that - they should ever see each other again on such terms of cordiality - as had marked their several meetings in Derbyshire; and as she - threw a retrospective glance over the whole of their - acquaintance, so full of contradictions and varieties, sighed at - the perverseness of those feelings which would now have promoted - its continuance, and would formerly have rejoiced in its - termination. - - If gratitude and esteem are good foundations of affection, - Elizabeth’s change of sentiment will be neither improbable nor - faulty. But if otherwise—if regard springing from such sources is - unreasonable or unnatural, in comparison of what is so often - described as arising on a first interview with its object, and - even before two words have been exchanged, nothing can be said in - her defence, except that she had given somewhat of a trial to the - latter method in her partiality for Wickham, and that its ill - success might, perhaps, authorise her to seek the other less - interesting mode of attachment. Be that as it may, she saw him go - with regret; and in this early example of what Lydia’s infamy - must produce, found additional anguish as she reflected on that - wretched business. Never, since reading Jane’s second letter, had - she entertained a hope of Wickham’s meaning to marry her. No one - but Jane, she thought, could flatter herself with such an - expectation. Surprise was the least of her feelings on this - development. While the contents of the first letter remained in - her mind, she was all surprise—all astonishment that Wickham - should marry a girl whom it was impossible he could marry for - money; and how Lydia could ever have attached him had appeared - incomprehensible. But now it was all too natural. For such an - attachment as this she might have sufficient charms; and though - she did not suppose Lydia to be deliberately engaging in an - elopement without the intention of marriage, she had no - difficulty in believing that neither her virtue nor her - understanding would preserve her from falling an easy prey. - - She had never perceived, while the regiment was in Hertfordshire, - that Lydia had any partiality for him; but she was convinced that - Lydia wanted only encouragement to attach herself to anybody. - Sometimes one officer, sometimes another, had been her favourite, - as their attentions raised them in her opinion. Her affections - had continually been fluctuating but never without an object. The - mischief of neglect and mistaken indulgence towards such a - girl—oh! how acutely did she now feel it! - - She was wild to be at home—to hear, to see, to be upon the spot - to share with Jane in the cares that must now fall wholly upon - her, in a family so deranged, a father absent, a mother incapable - of exertion, and requiring constant attendance; and though almost - persuaded that nothing could be done for Lydia, her uncle’s - interference seemed of the utmost importance, and till he entered - the room her impatience was severe. Mr. and Mrs. Gardiner had - hurried back in alarm, supposing by the servant’s account that - their niece was taken suddenly ill; but satisfying them instantly - on that head, she eagerly communicated the cause of their - summons, reading the two letters aloud, and dwelling on the - postscript of the last with trembling energy.— Though Lydia had - never been a favourite with them, Mr. and Mrs. Gardiner could not - but be deeply afflicted. Not Lydia only, but all were concerned - in it; and after the first exclamations of surprise and horror, - Mr. Gardiner promised every assistance in his power. Elizabeth, - though expecting no less, thanked him with tears of gratitude; - and all three being actuated by one spirit, everything relating - to their journey was speedily settled. They were to be off as - soon as possible. “But what is to be done about Pemberley?” cried - Mrs. Gardiner. “John told us Mr. Darcy was here when you sent for - us; was it so?” - - “Yes; and I told him we should not be able to keep our - engagement. _That_ is all settled.” - - “What is all settled?” repeated the other, as she ran into her - room to prepare. “And are they upon such terms as for her to - disclose the real truth? Oh, that I knew how it was!” - - But wishes were vain, or at least could only serve to amuse her - in the hurry and confusion of the following hour. Had Elizabeth - been at leisure to be idle, she would have remained certain that - all employment was impossible to one so wretched as herself; but - she had her share of business as well as her aunt, and amongst - the rest there were notes to be written to all their friends at - Lambton, with false excuses for their sudden departure. An hour, - however, saw the whole completed; and Mr. Gardiner meanwhile - having settled his account at the inn, nothing remained to be - done but to go; and Elizabeth, after all the misery of the - morning, found herself, in a shorter space of time than she could - have supposed, seated in the carriage, and on the road to - Longbourn. - - - - - Chapter 47 - - “I have been thinking it over again, Elizabeth,” said her uncle, - as they drove from the town; “and really, upon serious - consideration, I am much more inclined than I was to judge as - your eldest sister does on the matter. It appears to me so very - unlikely that any young man should form such a design against a - girl who is by no means unprotected or friendless, and who was - actually staying in his colonel’s family, that I am strongly - inclined to hope the best. Could he expect that her friends would - not step forward? Could he expect to be noticed again by the - regiment, after such an affront to Colonel Forster? His - temptation is not adequate to the risk!” - - “Do you really think so?” cried Elizabeth, brightening up for a - moment. - - “Upon my word,” said Mrs. Gardiner, “I begin to be of your - uncle’s opinion. It is really too great a violation of decency, - honour, and interest, for him to be guilty of. I cannot think so - very ill of Wickham. Can you yourself, Lizzy, so wholly give him - up, as to believe him capable of it?” - - “Not, perhaps, of neglecting his own interest; but of every other - neglect I can believe him capable. If, indeed, it should be so! - But I dare not hope it. Why should they not go on to Scotland if - that had been the case?” - - “In the first place,” replied Mr. Gardiner, “there is no absolute - proof that they are not gone to Scotland.” - - “Oh! but their removing from the chaise into a hackney coach is - such a presumption! And, besides, no traces of them were to be - found on the Barnet road.” - - “Well, then—supposing them to be in London. They may be there, - though for the purpose of concealment, for no more exceptional - purpose. It is not likely that money should be very abundant on - either side; and it might strike them that they could be more - economically, though less expeditiously, married in London than - in Scotland.” - - “But why all this secrecy? Why any fear of detection? Why must - their marriage be private? Oh, no, no—this is not likely. His - most particular friend, you see by Jane’s account, was persuaded - of his never intending to marry her. Wickham will never marry a - woman without some money. He cannot afford it. And what claims - has Lydia—what attraction has she beyond youth, health, and good - humour that could make him, for her sake, forego every chance of - benefiting himself by marrying well? As to what restraint the - apprehensions of disgrace in the corps might throw on a - dishonourable elopement with her, I am not able to judge; for I - know nothing of the effects that such a step might produce. But - as to your other objection, I am afraid it will hardly hold good. - Lydia has no brothers to step forward; and he might imagine, from - my father’s behaviour, from his indolence and the little - attention he has ever seemed to give to what was going forward in - his family, that _he_ would do as little, and think as little - about it, as any father could do, in such a matter.” - - “But can you think that Lydia is so lost to everything but love - of him as to consent to live with him on any terms other than - marriage?” - - “It does seem, and it is most shocking indeed,” replied - Elizabeth, with tears in her eyes, “that a sister’s sense of - decency and virtue in such a point should admit of doubt. But, - really, I know not what to say. Perhaps I am not doing her - justice. But she is very young; she has never been taught to - think on serious subjects; and for the last half-year, nay, for a - twelvemonth—she has been given up to nothing but amusement and - vanity. She has been allowed to dispose of her time in the most - idle and frivolous manner, and to adopt any opinions that came in - her way. Since the ——shire were first quartered in Meryton, - nothing but love, flirtation, and officers have been in her head. - She has been doing everything in her power by thinking and - talking on the subject, to give greater—what shall I call it? - susceptibility to her feelings; which are naturally lively - enough. And we all know that Wickham has every charm of person - and address that can captivate a woman.” - - “But you see that Jane,” said her aunt, “does not think so very - ill of Wickham as to believe him capable of the attempt.” - - “Of whom does Jane ever think ill? And who is there, whatever - might be their former conduct, that she would think capable of - such an attempt, till it were proved against them? But Jane - knows, as well as I do, what Wickham really is. We both know that - he has been profligate in every sense of the word; that he has - neither integrity nor honour; that he is as false and deceitful - as he is insinuating.” - - “And do you really know all this?” cried Mrs. Gardiner, whose - curiosity as to the mode of her intelligence was all alive. - - “I do indeed,” replied Elizabeth, colouring. “I told you, the - other day, of his infamous behaviour to Mr. Darcy; and you - yourself, when last at Longbourn, heard in what manner he spoke - of the man who had behaved with such forbearance and liberality - towards him. And there are other circumstances which I am not at - liberty—which it is not worth while to relate; but his lies about - the whole Pemberley family are endless. From what he said of Miss - Darcy I was thoroughly prepared to see a proud, reserved, - disagreeable girl. Yet he knew to the contrary himself. He must - know that she was as amiable and unpretending as we have found - her.” - - “But does Lydia know nothing of this? can she be ignorant of what - you and Jane seem so well to understand?” - - “Oh, yes!—that, that is the worst of all. Till I was in Kent, and - saw so much both of Mr. Darcy and his relation Colonel - Fitzwilliam, I was ignorant of the truth myself. And when I - returned home, the ——shire was to leave Meryton in a week or - fortnight’s time. As that was the case, neither Jane, to whom I - related the whole, nor I, thought it necessary to make our - knowledge public; for of what use could it apparently be to any - one, that the good opinion which all the neighbourhood had of him - should then be overthrown? And even when it was settled that - Lydia should go with Mrs. Forster, the necessity of opening her - eyes to his character never occurred to me. That _she_ could be - in any danger from the deception never entered my head. That such - a consequence as _this_ could ensue, you may easily believe, was - far enough from my thoughts.” - - “When they all removed to Brighton, therefore, you had no reason, - I suppose, to believe them fond of each other?” - - “Not the slightest. I can remember no symptom of affection on - either side; and had anything of the kind been perceptible, you - must be aware that ours is not a family on which it could be - thrown away. When first he entered the corps, she was ready - enough to admire him; but so we all were. Every girl in or near - Meryton was out of her senses about him for the first two months; - but he never distinguished _her_ by any particular attention; - and, consequently, after a moderate period of extravagant and - wild admiration, her fancy for him gave way, and others of the - regiment, who treated her with more distinction, again became her - favourites.” - - It may be easily believed, that however little of novelty could - be added to their fears, hopes, and conjectures, on this - interesting subject, by its repeated discussion, no other could - detain them from it long, during the whole of the journey. From - Elizabeth’s thoughts it was never absent. Fixed there by the - keenest of all anguish, self-reproach, she could find no interval - of ease or forgetfulness. - - They travelled as expeditiously as possible, and, sleeping one - night on the road, reached Longbourn by dinner time the next day. - It was a comfort to Elizabeth to consider that Jane could not - have been wearied by long expectations. - - The little Gardiners, attracted by the sight of a chaise, were - standing on the steps of the house as they entered the paddock; - and, when the carriage drove up to the door, the joyful surprise - that lighted up their faces, and displayed itself over their - whole bodies, in a variety of capers and frisks, was the first - pleasing earnest of their welcome. - - Elizabeth jumped out; and, after giving each of them a hasty - kiss, hurried into the vestibule, where Jane, who came running - down from her mother’s apartment, immediately met her. - - Elizabeth, as she affectionately embraced her, whilst tears - filled the eyes of both, lost not a moment in asking whether - anything had been heard of the fugitives. - - “Not yet,” replied Jane. “But now that my dear uncle is come, I - hope everything will be well.” - - “Is my father in town?” - - “Yes, he went on Tuesday, as I wrote you word.” - - “And have you heard from him often?” - - “We have heard only twice. He wrote me a few lines on Wednesday - to say that he had arrived in safety, and to give me his - directions, which I particularly begged him to do. He merely - added that he should not write again till he had something of - importance to mention.” - - “And my mother—how is she? How are you all?” - - “My mother is tolerably well, I trust; though her spirits are - greatly shaken. She is up stairs and will have great satisfaction - in seeing you all. She does not yet leave her dressing-room. Mary - and Kitty, thank Heaven, are quite well.” - - “But you—how are you?” cried Elizabeth. “You look pale. How much - you must have gone through!” - - Her sister, however, assured her of her being perfectly well; and - their conversation, which had been passing while Mr. and Mrs. - Gardiner were engaged with their children, was now put an end to - by the approach of the whole party. Jane ran to her uncle and - aunt, and welcomed and thanked them both, with alternate smiles - and tears. - - When they were all in the drawing-room, the questions which - Elizabeth had already asked were of course repeated by the - others, and they soon found that Jane had no intelligence to - give. The sanguine hope of good, however, which the benevolence - of her heart suggested had not yet deserted her; she still - expected that it would all end well, and that every morning would - bring some letter, either from Lydia or her father, to explain - their proceedings, and, perhaps, announce their marriage. - - Mrs. Bennet, to whose apartment they all repaired, after a few - minutes’ conversation together, received them exactly as might be - expected; with tears and lamentations of regret, invectives - against the villainous conduct of Wickham, and complaints of her - own sufferings and ill-usage; blaming everybody but the person to - whose ill-judging indulgence the errors of her daughter must - principally be owing. - - “If I had been able,” said she, “to carry my point in going to - Brighton, with all my family, _this_ would not have happened; but - poor dear Lydia had nobody to take care of her. Why did the - Forsters ever let her go out of their sight? I am sure there was - some great neglect or other on their side, for she is not the - kind of girl to do such a thing if she had been well looked - after. I always thought they were very unfit to have the charge - of her; but I was overruled, as I always am. Poor dear child! And - now here’s Mr. Bennet gone away, and I know he will fight - Wickham, wherever he meets him and then he will be killed, and - what is to become of us all? The Collinses will turn us out - before he is cold in his grave, and if you are not kind to us, - brother, I do not know what we shall do.” - - They all exclaimed against such terrific ideas; and Mr. Gardiner, - after general assurances of his affection for her and all her - family, told her that he meant to be in London the very next day, - and would assist Mr. Bennet in every endeavour for recovering - Lydia. - - “Do not give way to useless alarm,” added he; “though it is right - to be prepared for the worst, there is no occasion to look on it - as certain. It is not quite a week since they left Brighton. In a - few days more we may gain some news of them; and till we know - that they are not married, and have no design of marrying, do not - let us give the matter over as lost. As soon as I get to town I - shall go to my brother, and make him come home with me to - Gracechurch Street; and then we may consult together as to what - is to be done.” - - “Oh! my dear brother,” replied Mrs. Bennet, “that is exactly what - I could most wish for. And now do, when you get to town, find - them out, wherever they may be; and if they are not married - already, _make_ them marry. And as for wedding clothes, do not - let them wait for that, but tell Lydia she shall have as much - money as she chooses to buy them, after they are married. And, - above all, keep Mr. Bennet from fighting. Tell him what a - dreadful state I am in, that I am frighted out of my wits—and - have such tremblings, such flutterings, all over me—such spasms - in my side and pains in my head, and such beatings at heart, that - I can get no rest by night nor by day. And tell my dear Lydia not - to give any directions about her clothes till she has seen me, - for she does not know which are the best warehouses. Oh, brother, - how kind you are! I know you will contrive it all.” - - But Mr. Gardiner, though he assured her again of his earnest - endeavours in the cause, could not avoid recommending moderation - to her, as well in her hopes as her fear; and after talking with - her in this manner till dinner was on the table, they all left - her to vent all her feelings on the housekeeper, who attended in - the absence of her daughters. - - Though her brother and sister were persuaded that there was no - real occasion for such a seclusion from the family, they did not - attempt to oppose it, for they knew that she had not prudence - enough to hold her tongue before the servants, while they waited - at table, and judged it better that _one_ only of the household, - and the one whom they could most trust should comprehend all her - fears and solicitude on the subject. - - In the dining-room they were soon joined by Mary and Kitty, who - had been too busily engaged in their separate apartments to make - their appearance before. One came from her books, and the other - from her toilette. The faces of both, however, were tolerably - calm; and no change was visible in either, except that the loss - of her favourite sister, or the anger which she had herself - incurred in this business, had given more of fretfulness than - usual to the accents of Kitty. As for Mary, she was mistress - enough of herself to whisper to Elizabeth, with a countenance of - grave reflection, soon after they were seated at table: - - “This is a most unfortunate affair, and will probably be much - talked of. But we must stem the tide of malice, and pour into the - wounded bosoms of each other the balm of sisterly consolation.” - - Then, perceiving in Elizabeth no inclination of replying, she - added, “Unhappy as the event must be for Lydia, we may draw from - it this useful lesson: that loss of virtue in a female is - irretrievable; that one false step involves her in endless ruin; - that her reputation is no less brittle than it is beautiful; and - that she cannot be too much guarded in her behaviour towards the - undeserving of the other sex.” - - Elizabeth lifted up her eyes in amazement, but was too much - oppressed to make any reply. Mary, however, continued to console - herself with such kind of moral extractions from the evil before - them. - - In the afternoon, the two elder Miss Bennets were able to be for - half-an-hour by themselves; and Elizabeth instantly availed - herself of the opportunity of making any inquiries, which Jane - was equally eager to satisfy. After joining in general - lamentations over the dreadful sequel of this event, which - Elizabeth considered as all but certain, and Miss Bennet could - not assert to be wholly impossible, the former continued the - subject, by saying, “But tell me all and everything about it - which I have not already heard. Give me further particulars. What - did Colonel Forster say? Had they no apprehension of anything - before the elopement took place? They must have seen them - together for ever.” - - “Colonel Forster did own that he had often suspected some - partiality, especially on Lydia’s side, but nothing to give him - any alarm. I am so grieved for him! His behaviour was attentive - and kind to the utmost. He _was_ coming to us, in order to assure - us of his concern, before he had any idea of their not being gone - to Scotland: when that apprehension first got abroad, it hastened - his journey.” - - “And was Denny convinced that Wickham would not marry? Did he - know of their intending to go off? Had Colonel Forster seen Denny - himself?” - - “Yes; but, when questioned by _him_, Denny denied knowing - anything of their plans, and would not give his real opinion - about it. He did not repeat his persuasion of their not - marrying—and from _that_, I am inclined to hope, he might have - been misunderstood before.” - - “And till Colonel Forster came himself, not one of you - entertained a doubt, I suppose, of their being really married?” - - “How was it possible that such an idea should enter our brains? I - felt a little uneasy—a little fearful of my sister’s happiness - with him in marriage, because I knew that his conduct had not - been always quite right. My father and mother knew nothing of - that; they only felt how imprudent a match it must be. Kitty then - owned, with a very natural triumph on knowing more than the rest - of us, that in Lydia’s last letter she had prepared her for such - a step. She had known, it seems, of their being in love with each - other, many weeks.” - - “But not before they went to Brighton?” - - “No, I believe not.” - - “And did Colonel Forster appear to think well of Wickham himself? - Does he know his real character?” - - “I must confess that he did not speak so well of Wickham as he - formerly did. He believed him to be imprudent and extravagant. - And since this sad affair has taken place, it is said that he - left Meryton greatly in debt; but I hope this may be false.” - - “Oh, Jane, had we been less secret, had we told what we knew of - him, this could not have happened!” - - “Perhaps it would have been better,” replied her sister. “But to - expose the former faults of any person without knowing what their - present feelings were, seemed unjustifiable. We acted with the - best intentions.” - - “Could Colonel Forster repeat the particulars of Lydia’s note to - his wife?” - - “He brought it with him for us to see.” - - Jane then took it from her pocket-book, and gave it to Elizabeth. - These were the contents: - - “My dear Harriet, - “You will laugh when you know where I am gone, and I cannot help - laughing myself at your surprise to-morrow morning, as soon as I - am missed. I am going to Gretna Green, and if you cannot guess - with who, I shall think you a simpleton, for there is but one man - in the world I love, and he is an angel. I should never be happy - without him, so think it no harm to be off. You need not send - them word at Longbourn of my going, if you do not like it, for it - will make the surprise the greater, when I write to them and sign - my name ‘Lydia Wickham.’ What a good joke it will be! I can - hardly write for laughing. Pray make my excuses to Pratt for not - keeping my engagement, and dancing with him to-night. Tell him I - hope he will excuse me when he knows all; and tell him I will - dance with him at the next ball we meet, with great pleasure. I - shall send for my clothes when I get to Longbourn; but I wish you - would tell Sally to mend a great slit in my worked muslin gown - before they are packed up. Good-bye. Give my love to Colonel - Forster. I hope you will drink to our good journey. - - “Your affectionate friend, - “LYDIA BENNET.” - - “Oh! thoughtless, thoughtless Lydia!” cried Elizabeth when she - had finished it. “What a letter is this, to be written at such a - moment! But at least it shows that _she_ was serious on the - subject of their journey. Whatever he might afterwards persuade - her to, it was not on her side a _scheme_ of infamy. My poor - father! how he must have felt it!” - - “I never saw anyone so shocked. He could not speak a word for - full ten minutes. My mother was taken ill immediately, and the - whole house in such confusion!” - - “Oh! Jane,” cried Elizabeth, “was there a servant belonging to it - who did not know the whole story before the end of the day?” - - “I do not know. I hope there was. But to be guarded at such a - time is very difficult. My mother was in hysterics, and though I - endeavoured to give her every assistance in my power, I am afraid - I did not do so much as I might have done! But the horror of what - might possibly happen almost took from me my faculties.” - - “Your attendance upon her has been too much for you. You do not - look well. Oh that I had been with you! you have had every care - and anxiety upon yourself alone.” - - “Mary and Kitty have been very kind, and would have shared in - every fatigue, I am sure; but I did not think it right for either - of them. Kitty is slight and delicate; and Mary studies so much, - that her hours of repose should not be broken in on. My aunt - Phillips came to Longbourn on Tuesday, after my father went away; - and was so good as to stay till Thursday with me. She was of - great use and comfort to us all. And Lady Lucas has been very - kind; she walked here on Wednesday morning to condole with us, - and offered her services, or any of her daughters’, if they - should be of use to us.” - - “She had better have stayed at home,” cried Elizabeth; “perhaps - she _meant_ well, but, under such a misfortune as this, one - cannot see too little of one’s neighbours. Assistance is - impossible; condolence insufferable. Let them triumph over us at - a distance, and be satisfied.” - - She then proceeded to inquire into the measures which her father - had intended to pursue, while in town, for the recovery of his - daughter. - - “He meant I believe,” replied Jane, “to go to Epsom, the place - where they last changed horses, see the postilions and try if - anything could be made out from them. His principal object must - be to discover the number of the hackney coach which took them - from Clapham. It had come with a fare from London; and as he - thought that the circumstance of a gentleman and lady’s removing - from one carriage into another might be remarked he meant to make - inquiries at Clapham. If he could anyhow discover at what house - the coachman had before set down his fare, he determined to make - inquiries there, and hoped it might not be impossible to find out - the stand and number of the coach. I do not know of any other - designs that he had formed; but he was in such a hurry to be - gone, and his spirits so greatly discomposed, that I had - difficulty in finding out even so much as this.” - - - - - Chapter 48 - - The whole party were in hopes of a letter from Mr. Bennet the - next morning, but the post came in without bringing a single line - from him. His family knew him to be, on all common occasions, a - most negligent and dilatory correspondent; but at such a time - they had hoped for exertion. They were forced to conclude that he - had no pleasing intelligence to send; but even of _that_ they - would have been glad to be certain. Mr. Gardiner had waited only - for the letters before he set off. - - When he was gone, they were certain at least of receiving - constant information of what was going on, and their uncle - promised, at parting, to prevail on Mr. Bennet to return to - Longbourn, as soon as he could, to the great consolation of his - sister, who considered it as the only security for her husband’s - not being killed in a duel. - - Mrs. Gardiner and the children were to remain in Hertfordshire a - few days longer, as the former thought her presence might be - serviceable to her nieces. She shared in their attendance on Mrs. - Bennet, and was a great comfort to them in their hours of - freedom. Their other aunt also visited them frequently, and - always, as she said, with the design of cheering and heartening - them up—though, as she never came without reporting some fresh - instance of Wickham’s extravagance or irregularity, she seldom - went away without leaving them more dispirited than she found - them. - - All Meryton seemed striving to blacken the man who, but three - months before, had been almost an angel of light. He was declared - to be in debt to every tradesman in the place, and his intrigues, - all honoured with the title of seduction, had been extended into - every tradesman’s family. Everybody declared that he was the - wickedest young man in the world; and everybody began to find out - that they had always distrusted the appearance of his goodness. - Elizabeth, though she did not credit above half of what was said, - believed enough to make her former assurance of her sister’s ruin - more certain; and even Jane, who believed still less of it, - became almost hopeless, more especially as the time was now come - when, if they had gone to Scotland, which she had never before - entirely despaired of, they must in all probability have gained - some news of them. - - Mr. Gardiner left Longbourn on Sunday; on Tuesday his wife - received a letter from him; it told them that, on his arrival, he - had immediately found out his brother, and persuaded him to come - to Gracechurch Street; that Mr. Bennet had been to Epsom and - Clapham, before his arrival, but without gaining any satisfactory - information; and that he was now determined to inquire at all the - principal hotels in town, as Mr. Bennet thought it possible they - might have gone to one of them, on their first coming to London, - before they procured lodgings. Mr. Gardiner himself did not - expect any success from this measure, but as his brother was - eager in it, he meant to assist him in pursuing it. He added that - Mr. Bennet seemed wholly disinclined at present to leave London - and promised to write again very soon. There was also a - postscript to this effect: - - “I have written to Colonel Forster to desire him to find out, if - possible, from some of the young man’s intimates in the regiment, - whether Wickham has any relations or connections who would be - likely to know in what part of town he has now concealed himself. - If there were anyone that one could apply to with a probability - of gaining such a clue as that, it might be of essential - consequence. At present we have nothing to guide us. Colonel - Forster will, I dare say, do everything in his power to satisfy - us on this head. But, on second thoughts, perhaps, Lizzy could - tell us what relations he has now living, better than any other - person.” - - Elizabeth was at no loss to understand from whence this deference - to her authority proceeded; but it was not in her power to give - any information of so satisfactory a nature as the compliment - deserved. She had never heard of his having had any relations, - except a father and mother, both of whom had been dead many - years. It was possible, however, that some of his companions in - the ——shire might be able to give more information; and though - she was not very sanguine in expecting it, the application was a - something to look forward to. - - Every day at Longbourn was now a day of anxiety; but the most - anxious part of each was when the post was expected. The arrival - of letters was the grand object of every morning’s impatience. - Through letters, whatever of good or bad was to be told would be - communicated, and every succeeding day was expected to bring some - news of importance. - - But before they heard again from Mr. Gardiner, a letter arrived - for their father, from a different quarter, from Mr. Collins; - which, as Jane had received directions to open all that came for - him in his absence, she accordingly read; and Elizabeth, who knew - what curiosities his letters always were, looked over her, and - read it likewise. It was as follows: - - “My dear Sir, - “I feel myself called upon, by our relationship, and my situation - in life, to condole with you on the grievous affliction you are - now suffering under, of which we were yesterday informed by a - letter from Hertfordshire. Be assured, my dear sir, that Mrs. - Collins and myself sincerely sympathise with you and all your - respectable family, in your present distress, which must be of - the bitterest kind, because proceeding from a cause which no time - can remove. No arguments shall be wanting on my part that can - alleviate so severe a misfortune—or that may comfort you, under a - circumstance that must be of all others the most afflicting to a - parent’s mind. The death of your daughter would have been a - blessing in comparison of this. And it is the more to be - lamented, because there is reason to suppose as my dear Charlotte - informs me, that this licentiousness of behaviour in your - daughter has proceeded from a faulty degree of indulgence; - though, at the same time, for the consolation of yourself and - Mrs. Bennet, I am inclined to think that her own disposition must - be naturally bad, or she could not be guilty of such an enormity, - at so early an age. Howsoever that may be, you are grievously to - be pitied; in which opinion I am not only joined by Mrs. Collins, - but likewise by Lady Catherine and her daughter, to whom I have - related the affair. They agree with me in apprehending that this - false step in one daughter will be injurious to the fortunes of - all the others; for who, as Lady Catherine herself - condescendingly says, will connect themselves with such a family? - And this consideration leads me moreover to reflect, with - augmented satisfaction, on a certain event of last November; for - had it been otherwise, I must have been involved in all your - sorrow and disgrace. Let me then advise you, dear sir, to console - yourself as much as possible, to throw off your unworthy child - from your affection for ever, and leave her to reap the fruits of - her own heinous offense. - - “I am, dear sir, etc., etc.” - - Mr. Gardiner did not write again till he had received an answer - from Colonel Forster; and then he had nothing of a pleasant - nature to send. It was not known that Wickham had a single - relationship with whom he kept up any connection, and it was - certain that he had no near one living. His former acquaintances - had been numerous; but since he had been in the militia, it did - not appear that he was on terms of particular friendship with any - of them. There was no one, therefore, who could be pointed out as - likely to give any news of him. And in the wretched state of his - own finances, there was a very powerful motive for secrecy, in - addition to his fear of discovery by Lydia’s relations, for it - had just transpired that he had left gaming debts behind him to a - very considerable amount. Colonel Forster believed that more than - a thousand pounds would be necessary to clear his expenses at - Brighton. He owed a good deal in town, but his debts of honour - were still more formidable. Mr. Gardiner did not attempt to - conceal these particulars from the Longbourn family. Jane heard - them with horror. “A gamester!” she cried. “This is wholly - unexpected. I had not an idea of it.” - - Mr. Gardiner added in his letter, that they might expect to see - their father at home on the following day, which was Saturday. - Rendered spiritless by the ill-success of all their endeavours, - he had yielded to his brother-in-law’s entreaty that he would - return to his family, and leave it to him to do whatever occasion - might suggest to be advisable for continuing their pursuit. When - Mrs. Bennet was told of this, she did not express so much - satisfaction as her children expected, considering what her - anxiety for his life had been before. - - “What, is he coming home, and without poor Lydia?” she cried. - “Sure he will not leave London before he has found them. Who is - to fight Wickham, and make him marry her, if he comes away?” - - As Mrs. Gardiner began to wish to be at home, it was settled that - she and the children should go to London, at the same time that - Mr. Bennet came from it. The coach, therefore, took them the - first stage of their journey, and brought its master back to - Longbourn. - - Mrs. Gardiner went away in all the perplexity about Elizabeth and - her Derbyshire friend that had attended her from that part of the - world. His name had never been voluntarily mentioned before them - by her niece; and the kind of half-expectation which Mrs. - Gardiner had formed, of their being followed by a letter from - him, had ended in nothing. Elizabeth had received none since her - return that could come from Pemberley. - - The present unhappy state of the family rendered any other excuse - for the lowness of her spirits unnecessary; nothing, therefore, - could be fairly conjectured from _that_, though Elizabeth, who - was by this time tolerably well acquainted with her own feelings, - was perfectly aware that, had she known nothing of Darcy, she - could have borne the dread of Lydia’s infamy somewhat better. It - would have spared her, she thought, one sleepless night out of - two. - - When Mr. Bennet arrived, he had all the appearance of his usual - philosophic composure. He said as little as he had ever been in - the habit of saying; made no mention of the business that had - taken him away, and it was some time before his daughters had - courage to speak of it. - - It was not till the afternoon, when he had joined them at tea, - that Elizabeth ventured to introduce the subject; and then, on - her briefly expressing her sorrow for what he must have endured, - he replied, “Say nothing of that. Who should suffer but myself? - It has been my own doing, and I ought to feel it.” - - “You must not be too severe upon yourself,” replied Elizabeth. - - “You may well warn me against such an evil. Human nature is so - prone to fall into it! No, Lizzy, let me once in my life feel how - much I have been to blame. I am not afraid of being overpowered - by the impression. It will pass away soon enough.” - - “Do you suppose them to be in London?” - - “Yes; where else can they be so well concealed?” - - “And Lydia used to want to go to London,” added Kitty. - - “She is happy then,” said her father drily; “and her residence - there will probably be of some duration.” - - Then after a short silence he continued: - - “Lizzy, I bear you no ill-will for being justified in your advice - to me last May, which, considering the event, shows some - greatness of mind.” - - They were interrupted by Miss Bennet, who came to fetch her - mother’s tea. - - “This is a parade,” he cried, “which does one good; it gives such - an elegance to misfortune! Another day I will do the same; I will - sit in my library, in my nightcap and powdering gown, and give as - much trouble as I can; or, perhaps, I may defer it till Kitty - runs away.” - - “I am not going to run away, papa,” said Kitty fretfully. “If _I_ - should ever go to Brighton, I would behave better than Lydia.” - - “_You_ go to Brighton. I would not trust you so near it as - Eastbourne for fifty pounds! No, Kitty, I have at last learnt to - be cautious, and you will feel the effects of it. No officer is - ever to enter into my house again, nor even to pass through the - village. Balls will be absolutely prohibited, unless you stand up - with one of your sisters. And you are never to stir out of doors - till you can prove that you have spent ten minutes of every day - in a rational manner.” - - Kitty, who took all these threats in a serious light, began to - cry. - - “Well, well,” said he, “do not make yourself unhappy. If you are - a good girl for the next ten years, I will take you to a review - at the end of them.” - - - - - Chapter 49 - - Two days after Mr. Bennet’s return, as Jane and Elizabeth were - walking together in the shrubbery behind the house, they saw the - housekeeper coming towards them, and, concluding that she came to - call them to their mother, went forward to meet her; but, instead - of the expected summons, when they approached her, she said to - Miss Bennet, “I beg your pardon, madam, for interrupting you, but - I was in hopes you might have got some good news from town, so I - took the liberty of coming to ask.” - - “What do you mean, Hill? We have heard nothing from town.” - - “Dear madam,” cried Mrs. Hill, in great astonishment, “don’t you - know there is an express come for master from Mr. Gardiner? He - has been here this half-hour, and master has had a letter.” - - Away ran the girls, too eager to get in to have time for speech. - They ran through the vestibule into the breakfast-room; from - thence to the library; their father was in neither; and they were - on the point of seeking him up stairs with their mother, when - they were met by the butler, who said: - - “If you are looking for my master, ma’am, he is walking towards - the little copse.” - - Upon this information, they instantly passed through the hall - once more, and ran across the lawn after their father, who was - deliberately pursuing his way towards a small wood on one side of - the paddock. - - Jane, who was not so light nor so much in the habit of running as - Elizabeth, soon lagged behind, while her sister, panting for - breath, came up with him, and eagerly cried out: - - “Oh, papa, what news—what news? Have you heard from my uncle?” - - “Yes I have had a letter from him by express.” - - “Well, and what news does it bring—good or bad?” - - “What is there of good to be expected?” said he, taking the - letter from his pocket. “But perhaps you would like to read it.” - - Elizabeth impatiently caught it from his hand. Jane now came up. - - “Read it aloud,” said their father, “for I hardly know myself - what it is about.” - - “Gracechurch Street, _Monday, August_ 2. - - “My dear Brother, - “At last I am able to send you some tidings of my niece, and such - as, upon the whole, I hope it will give you satisfaction. Soon - after you left me on Saturday, I was fortunate enough to find out - in what part of London they were. The particulars I reserve till - we meet; it is enough to know they are discovered. I have seen - them both—” - “Then it is as I always hoped,” cried Jane; “they are - married!” - - Elizabeth read on: - - “I have seen them both. They are not married, nor can I find - there was any intention of being so; but if you are willing to - perform the engagements which I have ventured to make on your - side, I hope it will not be long before they are. All that is - required of you is, to assure to your daughter, by settlement, - her equal share of the five thousand pounds secured among your - children after the decease of yourself and my sister; and, - moreover, to enter into an engagement of allowing her, during - your life, one hundred pounds per annum. These are conditions - which, considering everything, I had no hesitation in complying - with, as far as I thought myself privileged, for you. I shall - send this by express, that no time may be lost in bringing me - your answer. You will easily comprehend, from these particulars, - that Mr. Wickham’s circumstances are not so hopeless as they are - generally believed to be. The world has been deceived in that - respect; and I am happy to say there will be some little money, - even when all his debts are discharged, to settle on my niece, in - addition to her own fortune. If, as I conclude will be the case, - you send me full powers to act in your name throughout the whole - of this business, I will immediately give directions to - Haggerston for preparing a proper settlement. There will not be - the smallest occasion for your coming to town again; therefore - stay quiet at Longbourn, and depend on my diligence and care. - Send back your answer as fast as you can, and be careful to write - explicitly. We have judged it best that my niece should be - married from this house, of which I hope you will approve. She - comes to us to-day. I shall write again as soon as anything more - is determined on. Yours, etc., - - “EDW. GARDINER.” - - “Is it possible?” cried Elizabeth, when she had finished. “Can it - be possible that he will marry her?” - - “Wickham is not so undeserving, then, as we thought him,” said - her sister. “My dear father, I congratulate you.” - - “And have you answered the letter?” cried Elizabeth. - - “No; but it must be done soon.” - - Most earnestly did she then entreat him to lose no more time - before he wrote. - - “Oh! my dear father,” she cried, “come back and write - immediately. Consider how important every moment is in such a - case.” - - “Let me write for you,” said Jane, “if you dislike the trouble - yourself.” - - “I dislike it very much,” he replied; “but it must be done.” - - And so saying, he turned back with them, and walked towards the - house. - - “And may I ask—” said Elizabeth; “but the terms, I suppose, must - be complied with.” - - “Complied with! I am only ashamed of his asking so little.” - - “And they _must_ marry! Yet he is _such_ a man!” - - “Yes, yes, they must marry. There is nothing else to be done. But - there are two things that I want very much to know; one is, how - much money your uncle has laid down to bring it about; and the - other, how am I ever to pay him.” - - “Money! My uncle!” cried Jane, “what do you mean, sir?” - - “I mean, that no man in his senses would marry Lydia on so slight - a temptation as one hundred a year during my life, and fifty - after I am gone.” - - “That is very true,” said Elizabeth; “though it had not occurred - to me before. His debts to be discharged, and something still to - remain! Oh! it must be my uncle’s doings! Generous, good man, I - am afraid he has distressed himself. A small sum could not do all - this.” - - “No,” said her father; “Wickham’s a fool if he takes her with a - farthing less than ten thousand pounds. I should be sorry to - think so ill of him, in the very beginning of our relationship.” - - “Ten thousand pounds! Heaven forbid! How is half such a sum to be - repaid?” - - Mr. Bennet made no answer, and each of them, deep in thought, - continued silent till they reached the house. Their father then - went on to the library to write, and the girls walked into the - breakfast-room. - - “And they are really to be married!” cried Elizabeth, as soon as - they were by themselves. “How strange this is! And for _this_ we - are to be thankful. That they should marry, small as is their - chance of happiness, and wretched as is his character, we are - forced to rejoice. Oh, Lydia!” - - “I comfort myself with thinking,” replied Jane, “that he - certainly would not marry Lydia if he had not a real regard for - her. Though our kind uncle has done something towards clearing - him, I cannot believe that ten thousand pounds, or anything like - it, has been advanced. He has children of his own, and may have - more. How could he spare half ten thousand pounds?” - - “If he were ever able to learn what Wickham’s debts have been,” - said Elizabeth, “and how much is settled on his side on our - sister, we shall exactly know what Mr. Gardiner has done for - them, because Wickham has not sixpence of his own. The kindness - of my uncle and aunt can never be requited. Their taking her - home, and affording her their personal protection and - countenance, is such a sacrifice to her advantage as years of - gratitude cannot enough acknowledge. By this time she is actually - with them! If such goodness does not make her miserable now, she - will never deserve to be happy! What a meeting for her, when she - first sees my aunt!” - - “We must endeavour to forget all that has passed on either side,” - said Jane: “I hope and trust they will yet be happy. His - consenting to marry her is a proof, I will believe, that he is - come to a right way of thinking. Their mutual affection will - steady them; and I flatter myself they will settle so quietly, - and live in so rational a manner, as may in time make their past - imprudence forgotten.” - - “Their conduct has been such,” replied Elizabeth, “as neither - you, nor I, nor anybody can ever forget. It is useless to talk of - it.” - - It now occurred to the girls that their mother was in all - likelihood perfectly ignorant of what had happened. They went to - the library, therefore, and asked their father whether he would - not wish them to make it known to her. He was writing and, - without raising his head, coolly replied: - - “Just as you please.” - - “May we take my uncle’s letter to read to her?” - - “Take whatever you like, and get away.” - - Elizabeth took the letter from his writing-table, and they went - up stairs together. Mary and Kitty were both with Mrs. Bennet: - one communication would, therefore, do for all. After a slight - preparation for good news, the letter was read aloud. Mrs. Bennet - could hardly contain herself. As soon as Jane had read Mr. - Gardiner’s hope of Lydia’s being soon married, her joy burst - forth, and every following sentence added to its exuberance. She - was now in an irritation as violent from delight, as she had ever - been fidgety from alarm and vexation. To know that her daughter - would be married was enough. She was disturbed by no fear for her - felicity, nor humbled by any remembrance of her misconduct. - - “My dear, dear Lydia!” she cried. “This is delightful indeed! She - will be married! I shall see her again! She will be married at - sixteen! My good, kind brother! I knew how it would be. I knew he - would manage everything! How I long to see her! and to see dear - Wickham too! But the clothes, the wedding clothes! I will write - to my sister Gardiner about them directly. Lizzy, my dear, run - down to your father, and ask him how much he will give her. Stay, - stay, I will go myself. Ring the bell, Kitty, for Hill. I will - put on my things in a moment. My dear, dear Lydia! How merry we - shall be together when we meet!” - - Her eldest daughter endeavoured to give some relief to the - violence of these transports, by leading her thoughts to the - obligations which Mr. Gardiner’s behaviour laid them all under. - - “For we must attribute this happy conclusion,” she added, “in a - great measure to his kindness. We are persuaded that he has - pledged himself to assist Mr. Wickham with money.” - - “Well,” cried her mother, “it is all very right; who should do it - but her own uncle? If he had not had a family of his own, I and - my children must have had all his money, you know; and it is the - first time we have ever had anything from him, except a few - presents. Well! I am so happy! In a short time I shall have a - daughter married. Mrs. Wickham! How well it sounds! And she was - only sixteen last June. My dear Jane, I am in such a flutter, - that I am sure I can’t write; so I will dictate, and you write - for me. We will settle with your father about the money - afterwards; but the things should be ordered immediately.” - - She was then proceeding to all the particulars of calico, muslin, - and cambric, and would shortly have dictated some very plentiful - orders, had not Jane, though with some difficulty, persuaded her - to wait till her father was at leisure to be consulted. One day’s - delay, she observed, would be of small importance; and her mother - was too happy to be quite so obstinate as usual. Other schemes, - too, came into her head. - - “I will go to Meryton,” said she, “as soon as I am dressed, and - tell the good, good news to my sister Philips. And as I come - back, I can call on Lady Lucas and Mrs. Long. Kitty, run down and - order the carriage. An airing would do me a great deal of good, I - am sure. Girls, can I do anything for you in Meryton? Oh! Here - comes Hill! My dear Hill, have you heard the good news? Miss - Lydia is going to be married; and you shall all have a bowl of - punch to make merry at her wedding.” - - Mrs. Hill began instantly to express her joy. Elizabeth received - her congratulations amongst the rest, and then, sick of this - folly, took refuge in her own room, that she might think with - freedom. - - Poor Lydia’s situation must, at best, be bad enough; but that it - was no worse, she had need to be thankful. She felt it so; and - though, in looking forward, neither rational happiness nor - worldly prosperity could be justly expected for her sister, in - looking back to what they had feared, only two hours ago, she - felt all the advantages of what they had gained. - - - - - Chapter 50 - - Mr. Bennet had very often wished before this period of his life - that, instead of spending his whole income, he had laid by an - annual sum for the better provision of his children, and of his - wife, if she survived him. He now wished it more than ever. Had - he done his duty in that respect, Lydia need not have been - indebted to her uncle for whatever of honour or credit could now - be purchased for her. The satisfaction of prevailing on one of - the most worthless young men in Great Britain to be her husband - might then have rested in its proper place. - - He was seriously concerned that a cause of so little advantage to - anyone should be forwarded at the sole expense of his - brother-in-law, and he was determined, if possible, to find out - the extent of his assistance, and to discharge the obligation as - soon as he could. - - When first Mr. Bennet had married, economy was held to be - perfectly useless, for, of course, they were to have a son. The - son was to join in cutting off the entail, as soon as he should - be of age, and the widow and younger children would by that means - be provided for. Five daughters successively entered the world, - but yet the son was to come; and Mrs. Bennet, for many years - after Lydia’s birth, had been certain that he would. This event - had at last been despaired of, but it was then too late to be - saving. Mrs. Bennet had no turn for economy, and her husband’s - love of independence had alone prevented their exceeding their - income. - - Five thousand pounds was settled by marriage articles on Mrs. - Bennet and the children. But in what proportions it should be - divided amongst the latter depended on the will of the parents. - This was one point, with regard to Lydia, at least, which was now - to be settled, and Mr. Bennet could have no hesitation in - acceding to the proposal before him. In terms of grateful - acknowledgment for the kindness of his brother, though expressed - most concisely, he then delivered on paper his perfect - approbation of all that was done, and his willingness to fulfil - the engagements that had been made for him. He had never before - supposed that, could Wickham be prevailed on to marry his - daughter, it would be done with so little inconvenience to - himself as by the present arrangement. He would scarcely be ten - pounds a year the loser by the hundred that was to be paid them; - for, what with her board and pocket allowance, and the continual - presents in money which passed to her through her mother’s hands, - Lydia’s expenses had been very little within that sum. - - That it would be done with such trifling exertion on his side, - too, was another very welcome surprise; for his wish at present - was to have as little trouble in the business as possible. When - the first transports of rage which had produced his activity in - seeking her were over, he naturally returned to all his former - indolence. His letter was soon dispatched; for, though dilatory - in undertaking business, he was quick in its execution. He begged - to know further particulars of what he was indebted to his - brother, but was too angry with Lydia to send any message to her. - - The good news spread quickly through the house, and with - proportionate speed through the neighbourhood. It was borne in - the latter with decent philosophy. To be sure, it would have been - more for the advantage of conversation had Miss Lydia Bennet come - upon the town; or, as the happiest alternative, been secluded - from the world, in some distant farmhouse. But there was much to - be talked of in marrying her; and the good-natured wishes for her - well-doing which had proceeded before from all the spiteful old - ladies in Meryton lost but a little of their spirit in this - change of circumstances, because with such an husband her misery - was considered certain. - - It was a fortnight since Mrs. Bennet had been downstairs; but on - this happy day she again took her seat at the head of her table, - and in spirits oppressively high. No sentiment of shame gave a - damp to her triumph. The marriage of a daughter, which had been - the first object of her wishes since Jane was sixteen, was now on - the point of accomplishment, and her thoughts and her words ran - wholly on those attendants of elegant nuptials, fine muslins, new - carriages, and servants. She was busily searching through the - neighbourhood for a proper situation for her daughter, and, - without knowing or considering what their income might be, - rejected many as deficient in size and importance. - - “Haye Park might do,” said she, “if the Gouldings could quit - it—or the great house at Stoke, if the drawing-room were larger; - but Ashworth is too far off! I could not bear to have her ten - miles from me; and as for Pulvis Lodge, the attics are dreadful.” - - Her husband allowed her to talk on without interruption while the - servants remained. But when they had withdrawn, he said to her: - “Mrs. Bennet, before you take any or all of these houses for your - son and daughter, let us come to a right understanding. Into - _one_ house in this neighbourhood they shall never have - admittance. I will not encourage the impudence of either, by - receiving them at Longbourn.” - - A long dispute followed this declaration; but Mr. Bennet was - firm. It soon led to another; and Mrs. Bennet found, with - amazement and horror, that her husband would not advance a guinea - to buy clothes for his daughter. He protested that she should - receive from him no mark of affection whatever on the occasion. - Mrs. Bennet could hardly comprehend it. That his anger could be - carried to such a point of inconceivable resentment as to refuse - his daughter a privilege without which her marriage would - scarcely seem valid, exceeded all she could believe possible. She - was more alive to the disgrace which her want of new clothes must - reflect on her daughter’s nuptials, than to any sense of shame at - her eloping and living with Wickham a fortnight before they took - place. - - Elizabeth was now most heartily sorry that she had, from the - distress of the moment, been led to make Mr. Darcy acquainted - with their fears for her sister; for since her marriage would so - shortly give the proper termination to the elopement, they might - hope to conceal its unfavourable beginning from all those who - were not immediately on the spot. - - She had no fear of its spreading farther through his means. There - were few people on whose secrecy she would have more confidently - depended; but, at the same time, there was no one whose knowledge - of a sister’s frailty would have mortified her so much—not, - however, from any fear of disadvantage from it individually to - herself, for, at any rate, there seemed a gulf impassable between - them. Had Lydia’s marriage been concluded on the most honourable - terms, it was not to be supposed that Mr. Darcy would connect - himself with a family where, to every other objection, would now - be added an alliance and relationship of the nearest kind with a - man whom he so justly scorned. - - From such a connection she could not wonder that he would shrink. - The wish of procuring her regard, which she had assured herself - of his feeling in Derbyshire, could not in rational expectation - survive such a blow as this. She was humbled, she was grieved; - she repented, though she hardly knew of what. She became jealous - of his esteem, when she could no longer hope to be benefited by - it. She wanted to hear of him, when there seemed the least chance - of gaining intelligence. She was convinced that she could have - been happy with him, when it was no longer likely they should - meet. - - What a triumph for him, as she often thought, could he know that - the proposals which she had proudly spurned only four months ago, - would now have been most gladly and gratefully received! He was - as generous, she doubted not, as the most generous of his sex; - but while he was mortal, there must be a triumph. - - She began now to comprehend that he was exactly the man who, in - disposition and talents, would most suit her. His understanding - and temper, though unlike her own, would have answered all her - wishes. It was an union that must have been to the advantage of - both; by her ease and liveliness, his mind might have been - softened, his manners improved; and from his judgement, - information, and knowledge of the world, she must have received - benefit of greater importance. - - But no such happy marriage could now teach the admiring multitude - what connubial felicity really was. An union of a different - tendency, and precluding the possibility of the other, was soon - to be formed in their family. - - How Wickham and Lydia were to be supported in tolerable - independence, she could not imagine. But how little of permanent - happiness could belong to a couple who were only brought together - because their passions were stronger than their virtue, she could - easily conjecture. - - Mr. Gardiner soon wrote again to his brother. To Mr. Bennet’s - acknowledgments he briefly replied, with assurance of his - eagerness to promote the welfare of any of his family; and - concluded with entreaties that the subject might never be - mentioned to him again. The principal purport of his letter was - to inform them that Mr. Wickham had resolved on quitting the - militia. - - “It was greatly my wish that he should do so,” he added, “as soon - as his marriage was fixed on. And I think you will agree with me, - in considering the removal from that corps as highly advisable, - both on his account and my niece’s. It is Mr. Wickham’s intention - to go into the regulars; and among his former friends, there are - still some who are able and willing to assist him in the army. He - has the promise of an ensigncy in General ——’s regiment, now - quartered in the North. It is an advantage to have it so far from - this part of the kingdom. He promises fairly; and I hope among - different people, where they may each have a character to - preserve, they will both be more prudent. I have written to - Colonel Forster, to inform him of our present arrangements, and - to request that he will satisfy the various creditors of Mr. - Wickham in and near Brighton, with assurances of speedy payment, - for which I have pledged myself. And will you give yourself the - trouble of carrying similar assurances to his creditors in - Meryton, of whom I shall subjoin a list according to his - information? He has given in all his debts; I hope at least he - has not deceived us. Haggerston has our directions, and all will - be completed in a week. They will then join his regiment, unless - they are first invited to Longbourn; and I understand from Mrs. - Gardiner, that my niece is very desirous of seeing you all before - she leaves the South. She is well, and begs to be dutifully - remembered to you and her mother.—Yours, etc., - - “E. GARDINER.” - - Mr. Bennet and his daughters saw all the advantages of Wickham’s - removal from the ——shire as clearly as Mr. Gardiner could do. But - Mrs. Bennet was not so well pleased with it. Lydia’s being - settled in the North, just when she had expected most pleasure - and pride in her company, for she had by no means given up her - plan of their residing in Hertfordshire, was a severe - disappointment; and, besides, it was such a pity that Lydia - should be taken from a regiment where she was acquainted with - everybody, and had so many favourites. - - “She is so fond of Mrs. Forster,” said she, “it will be quite - shocking to send her away! And there are several of the young - men, too, that she likes very much. The officers may not be so - pleasant in General ——’s regiment.” - - His daughter’s request, for such it might be considered, of being - admitted into her family again before she set off for the North, - received at first an absolute negative. But Jane and Elizabeth, - who agreed in wishing, for the sake of their sister’s feelings - and consequence, that she should be noticed on her marriage by - her parents, urged him so earnestly yet so rationally and so - mildly, to receive her and her husband at Longbourn, as soon as - they were married, that he was prevailed on to think as they - thought, and act as they wished. And their mother had the - satisfaction of knowing that she would be able to show her - married daughter in the neighbourhood before she was banished to - the North. When Mr. Bennet wrote again to his brother, therefore, - he sent his permission for them to come; and it was settled, that - as soon as the ceremony was over, they should proceed to - Longbourn. Elizabeth was surprised, however, that Wickham should - consent to such a scheme, and had she consulted only her own - inclination, any meeting with him would have been the last object - of her wishes. - - - - - Chapter 51 - - Their sister’s wedding day arrived; and Jane and Elizabeth felt - for her probably more than she felt for herself. The carriage was - sent to meet them at ——, and they were to return in it by - dinner-time. Their arrival was dreaded by the elder Miss Bennets, - and Jane more especially, who gave Lydia the feelings which would - have attended herself, had _she_ been the culprit, and was - wretched in the thought of what her sister must endure. - - They came. The family were assembled in the breakfast room to - receive them. Smiles decked the face of Mrs. Bennet as the - carriage drove up to the door; her husband looked impenetrably - grave; her daughters, alarmed, anxious, uneasy. - - Lydia’s voice was heard in the vestibule; the door was thrown - open, and she ran into the room. Her mother stepped forwards, - embraced her, and welcomed her with rapture; gave her hand, with - an affectionate smile, to Wickham, who followed his lady; and - wished them both joy with an alacrity which shewed no doubt of - their happiness. - - Their reception from Mr. Bennet, to whom they then turned, was - not quite so cordial. His countenance rather gained in austerity; - and he scarcely opened his lips. The easy assurance of the young - couple, indeed, was enough to provoke him. Elizabeth was - disgusted, and even Miss Bennet was shocked. Lydia was Lydia - still; untamed, unabashed, wild, noisy, and fearless. She turned - from sister to sister, demanding their congratulations; and when - at length they all sat down, looked eagerly round the room, took - notice of some little alteration in it, and observed, with a - laugh, that it was a great while since she had been there. - - Wickham was not at all more distressed than herself, but his - manners were always so pleasing, that had his character and his - marriage been exactly what they ought, his smiles and his easy - address, while he claimed their relationship, would have - delighted them all. Elizabeth had not before believed him quite - equal to such assurance; but she sat down, resolving within - herself to draw no limits in future to the impudence of an - impudent man. _She_ blushed, and Jane blushed; but the cheeks of - the two who caused their confusion suffered no variation of - colour. - - There was no want of discourse. The bride and her mother could - neither of them talk fast enough; and Wickham, who happened to - sit near Elizabeth, began inquiring after his acquaintance in - that neighbourhood, with a good humoured ease which she felt very - unable to equal in her replies. They seemed each of them to have - the happiest memories in the world. Nothing of the past was - recollected with pain; and Lydia led voluntarily to subjects - which her sisters would not have alluded to for the world. - - “Only think of its being three months,” she cried, “since I went - away; it seems but a fortnight I declare; and yet there have been - things enough happened in the time. Good gracious! when I went - away, I am sure I had no more idea of being married till I came - back again! though I thought it would be very good fun if I was.” - - Her father lifted up his eyes. Jane was distressed. Elizabeth - looked expressively at Lydia; but she, who never heard nor saw - anything of which she chose to be insensible, gaily continued, - “Oh! mamma, do the people hereabouts know I am married to-day? I - was afraid they might not; and we overtook William Goulding in - his curricle, so I was determined he should know it, and so I let - down the side-glass next to him, and took off my glove, and let - my hand just rest upon the window frame, so that he might see the - ring, and then I bowed and smiled like anything.” - - Elizabeth could bear it no longer. She got up, and ran out of the - room; and returned no more, till she heard them passing through - the hall to the dining parlour. She then joined them soon enough - to see Lydia, with anxious parade, walk up to her mother’s right - hand, and hear her say to her eldest sister, “Ah! Jane, I take - your place now, and you must go lower, because I am a married - woman.” - - It was not to be supposed that time would give Lydia that - embarrassment from which she had been so wholly free at first. - Her ease and good spirits increased. She longed to see Mrs. - Phillips, the Lucases, and all their other neighbours, and to - hear herself called “Mrs. Wickham” by each of them; and in the - mean time, she went after dinner to show her ring, and boast of - being married, to Mrs. Hill and the two housemaids. - - “Well, mamma,” said she, when they were all returned to the - breakfast room, “and what do you think of my husband? Is not he a - charming man? I am sure my sisters must all envy me. I only hope - they may have half my good luck. They must all go to Brighton. - That is the place to get husbands. What a pity it is, mamma, we - did not all go.” - - “Very true; and if I had my will, we should. But my dear Lydia, I - don’t at all like your going such a way off. Must it be so?” - - “Oh, lord! yes;—there is nothing in that. I shall like it of all - things. You and papa, and my sisters, must come down and see us. - We shall be at Newcastle all the winter, and I dare say there - will be some balls, and I will take care to get good partners for - them all.” - - “I should like it beyond anything!” said her mother. - - “And then when you go away, you may leave one or two of my - sisters behind you; and I dare say I shall get husbands for them - before the winter is over.” - - “I thank you for my share of the favour,” said Elizabeth; “but I - do not particularly like your way of getting husbands.” - - Their visitors were not to remain above ten days with them. Mr. - Wickham had received his commission before he left London, and he - was to join his regiment at the end of a fortnight. - - No one but Mrs. Bennet regretted that their stay would be so - short; and she made the most of the time by visiting about with - her daughter, and having very frequent parties at home. These - parties were acceptable to all; to avoid a family circle was even - more desirable to such as did think, than such as did not. - - Wickham’s affection for Lydia was just what Elizabeth had - expected to find it; not equal to Lydia’s for him. She had - scarcely needed her present observation to be satisfied, from the - reason of things, that their elopement had been brought on by the - strength of her love, rather than by his; and she would have - wondered why, without violently caring for her, he chose to elope - with her at all, had she not felt certain that his flight was - rendered necessary by distress of circumstances; and if that were - the case, he was not the young man to resist an opportunity of - having a companion. - - Lydia was exceedingly fond of him. He was her dear Wickham on - every occasion; no one was to be put in competition with him. He - did every thing best in the world; and she was sure he would kill - more birds on the first of September, than any body else in the - country. - - One morning, soon after their arrival, as she was sitting with - her two elder sisters, she said to Elizabeth: - - “Lizzy, I never gave _you_ an account of my wedding, I believe. - You were not by, when I told mamma and the others all about it. - Are not you curious to hear how it was managed?” - - “No really,” replied Elizabeth; “I think there cannot be too - little said on the subject.” - - “La! You are so strange! But I must tell you how it went off. We - were married, you know, at St. Clement’s, because Wickham’s - lodgings were in that parish. And it was settled that we should - all be there by eleven o’clock. My uncle and aunt and I were to - go together; and the others were to meet us at the church. Well, - Monday morning came, and I was in such a fuss! I was so afraid, - you know, that something would happen to put it off, and then I - should have gone quite distracted. And there was my aunt, all the - time I was dressing, preaching and talking away just as if she - was reading a sermon. However, I did not hear above one word in - ten, for I was thinking, you may suppose, of my dear Wickham. I - longed to know whether he would be married in his blue coat.” - - “Well, and so we breakfasted at ten as usual; I thought it would - never be over; for, by the bye, you are to understand, that my - uncle and aunt were horrid unpleasant all the time I was with - them. If you’ll believe me, I did not once put my foot out of - doors, though I was there a fortnight. Not one party, or scheme, - or anything. To be sure London was rather thin, but, however, the - Little Theatre was open. Well, and so just as the carriage came - to the door, my uncle was called away upon business to that - horrid man Mr. Stone. And then, you know, when once they get - together, there is no end of it. Well, I was so frightened I did - not know what to do, for my uncle was to give me away; and if we - were beyond the hour, we could not be married all day. But, - luckily, he came back again in ten minutes’ time, and then we all - set out. However, I recollected afterwards that if he _had_ been - prevented going, the wedding need not be put off, for Mr. Darcy - might have done as well.” - - “Mr. Darcy!” repeated Elizabeth, in utter amazement. - - “Oh, yes!—he was to come there with Wickham, you know. But - gracious me! I quite forgot! I ought not to have said a word - about it. I promised them so faithfully! What will Wickham say? - It was to be such a secret!” - - “If it was to be secret,” said Jane, “say not another word on the - subject. You may depend upon my seeking no further.” - - “Oh! certainly,” said Elizabeth, though burning with curiosity; - “we will ask you no questions.” - - “Thank you,” said Lydia, “for if you did, I should certainly tell - you all, and then Wickham would be angry.” - - On such encouragement to ask, Elizabeth was forced to put it out - of her power, by running away. - - But to live in ignorance on such a point was impossible; or at - least it was impossible not to try for information. Mr. Darcy had - been at her sister’s wedding. It was exactly a scene, and exactly - among people, where he had apparently least to do, and least - temptation to go. Conjectures as to the meaning of it, rapid and - wild, hurried into her brain; but she was satisfied with none. - Those that best pleased her, as placing his conduct in the - noblest light, seemed most improbable. She could not bear such - suspense; and hastily seizing a sheet of paper, wrote a short - letter to her aunt, to request an explanation of what Lydia had - dropt, if it were compatible with the secrecy which had been - intended. - - “You may readily comprehend,” she added, “what my curiosity must - be to know how a person unconnected with any of us, and - (comparatively speaking) a stranger to our family, should have - been amongst you at such a time. Pray write instantly, and let me - understand it—unless it is, for very cogent reasons, to remain in - the secrecy which Lydia seems to think necessary; and then I must - endeavour to be satisfied with ignorance.” - - “Not that I _shall_, though,” she added to herself, as she - finished the letter; “and my dear aunt, if you do not tell me in - an honourable manner, I shall certainly be reduced to tricks and - stratagems to find it out.” - - Jane’s delicate sense of honour would not allow her to speak to - Elizabeth privately of what Lydia had let fall; Elizabeth was - glad of it;—till it appeared whether her inquiries would receive - any satisfaction, she had rather be without a confidante. - - - - - Chapter 52 - - Elizabeth had the satisfaction of receiving an answer to her - letter as soon as she possibly could. She was no sooner in - possession of it than, hurrying into the little copse, where she - was least likely to be interrupted, she sat down on one of the - benches and prepared to be happy; for the length of the letter - convinced her that it did not contain a denial. - - “Gracechurch Street, _Sept_. 6. - - “My dear Niece, - - “I have just received your letter, and shall devote this whole - morning to answering it, as I foresee that a _little_ writing - will not comprise what I have to tell you. I must confess myself - surprised by your application; I did not expect it from _you_. - Don’t think me angry, however, for I only mean to let you know - that I had not imagined such inquiries to be necessary on _your_ - side. If you do not choose to understand me, forgive my - impertinence. Your uncle is as much surprised as I am—and nothing - but the belief of your being a party concerned would have allowed - him to act as he has done. But if you are really innocent and - ignorant, I must be more explicit. - - “On the very day of my coming home from Longbourn, your uncle had - a most unexpected visitor. Mr. Darcy called, and was shut up with - him several hours. It was all over before I arrived; so my - curiosity was not so dreadfully racked as _yours_ seems to have - been. He came to tell Mr. Gardiner that he had found out where - your sister and Mr. Wickham were, and that he had seen and talked - with them both; Wickham repeatedly, Lydia once. From what I can - collect, he left Derbyshire only one day after ourselves, and - came to town with the resolution of hunting for them. The motive - professed was his conviction of its being owing to himself that - Wickham’s worthlessness had not been so well known as to make it - impossible for any young woman of character to love or confide in - him. He generously imputed the whole to his mistaken pride, and - confessed that he had before thought it beneath him to lay his - private actions open to the world. His character was to speak for - itself. He called it, therefore, his duty to step forward, and - endeavour to remedy an evil which had been brought on by himself. - If he _had another_ motive, I am sure it would never disgrace - him. He had been some days in town, before he was able to - discover them; but he had something to direct his search, which - was more than _we_ had; and the consciousness of this was another - reason for his resolving to follow us. - - “There is a lady, it seems, a Mrs. Younge, who was some time ago - governess to Miss Darcy, and was dismissed from her charge on - some cause of disapprobation, though he did not say what. She - then took a large house in Edward-street, and has since - maintained herself by letting lodgings. This Mrs. Younge was, he - knew, intimately acquainted with Wickham; and he went to her for - intelligence of him as soon as he got to town. But it was two or - three days before he could get from her what he wanted. She would - not betray her trust, I suppose, without bribery and corruption, - for she really did know where her friend was to be found. Wickham - indeed had gone to her on their first arrival in London, and had - she been able to receive them into her house, they would have - taken up their abode with her. At length, however, our kind - friend procured the wished-for direction. They were in —— street. - He saw Wickham, and afterwards insisted on seeing Lydia. His - first object with her, he acknowledged, had been to persuade her - to quit her present disgraceful situation, and return to her - friends as soon as they could be prevailed on to receive her, - offering his assistance, as far as it would go. But he found - Lydia absolutely resolved on remaining where she was. She cared - for none of her friends; she wanted no help of his; she would not - hear of leaving Wickham. She was sure they should be married some - time or other, and it did not much signify when. Since such were - her feelings, it only remained, he thought, to secure and - expedite a marriage, which, in his very first conversation with - Wickham, he easily learnt had never been _his_ design. He - confessed himself obliged to leave the regiment, on account of - some debts of honour, which were very pressing; and scrupled not - to lay all the ill-consequences of Lydia’s flight on her own - folly alone. He meant to resign his commission immediately; and - as to his future situation, he could conjecture very little about - it. He must go somewhere, but he did not know where, and he knew - he should have nothing to live on. - - “Mr. Darcy asked him why he had not married your sister at once. - Though Mr. Bennet was not imagined to be very rich, he would have - been able to do something for him, and his situation must have - been benefited by marriage. But he found, in reply to this - question, that Wickham still cherished the hope of more - effectually making his fortune by marriage in some other country. - Under such circumstances, however, he was not likely to be proof - against the temptation of immediate relief. - - “They met several times, for there was much to be discussed. - Wickham of course wanted more than he could get; but at length - was reduced to be reasonable. - - “Everything being settled between _them_, Mr. Darcy’s next step - was to make your uncle acquainted with it, and he first called in - Gracechurch street the evening before I came home. But Mr. - Gardiner could not be seen, and Mr. Darcy found, on further - inquiry, that your father was still with him, but would quit town - the next morning. He did not judge your father to be a person - whom he could so properly consult as your uncle, and therefore - readily postponed seeing him till after the departure of the - former. He did not leave his name, and till the next day it was - only known that a gentleman had called on business. - - “On Saturday he came again. Your father was gone, your uncle at - home, and, as I said before, they had a great deal of talk - together. - - “They met again on Sunday, and then _I_ saw him too. It was not - all settled before Monday: as soon as it was, the express was - sent off to Longbourn. But our visitor was very obstinate. I - fancy, Lizzy, that obstinacy is the real defect of his character, - after all. He has been accused of many faults at different times, - but _this_ is the true one. Nothing was to be done that he did - not do himself; though I am sure (and I do not speak it to be - thanked, therefore say nothing about it), your uncle would most - readily have settled the whole. - - “They battled it together for a long time, which was more than - either the gentleman or lady concerned in it deserved. But at - last your uncle was forced to yield, and instead of being allowed - to be of use to his niece, was forced to put up with only having - the probable credit of it, which went sorely against the grain; - and I really believe your letter this morning gave him great - pleasure, because it required an explanation that would rob him - of his borrowed feathers, and give the praise where it was due. - But, Lizzy, this must go no farther than yourself, or Jane at - most. - - “You know pretty well, I suppose, what has been done for the - young people. His debts are to be paid, amounting, I believe, to - considerably more than a thousand pounds, another thousand in - addition to her own settled upon _her_, and his commission - purchased. The reason why all this was to be done by him alone, - was such as I have given above. It was owing to him, to his - reserve and want of proper consideration, that Wickham’s - character had been so misunderstood, and consequently that he had - been received and noticed as he was. Perhaps there was some truth - in _this_; though I doubt whether _his_ reserve, or _anybody’s_ - reserve, can be answerable for the event. But in spite of all - this fine talking, my dear Lizzy, you may rest perfectly assured - that your uncle would never have yielded, if we had not given him - credit for _another interest_ in the affair. - - “When all this was resolved on, he returned again to his friends, - who were still staying at Pemberley; but it was agreed that he - should be in London once more when the wedding took place, and - all money matters were then to receive the last finish. - - “I believe I have now told you every thing. It is a relation - which you tell me is to give you great surprise; I hope at least - it will not afford you any displeasure. Lydia came to us; and - Wickham had constant admission to the house. _He_ was exactly - what he had been, when I knew him in Hertfordshire; but I would - not tell you how little I was satisfied with _her_ behaviour - while she staid with us, if I had not perceived, by Jane’s letter - last Wednesday, that her conduct on coming home was exactly of a - piece with it, and therefore what I now tell you can give you no - fresh pain. I talked to her repeatedly in the most serious - manner, representing to her all the wickedness of what she had - done, and all the unhappiness she had brought on her family. If - she heard me, it was by good luck, for I am sure she did not - listen. I was sometimes quite provoked, but then I recollected my - dear Elizabeth and Jane, and for their sakes had patience with - her. - - “Mr. Darcy was punctual in his return, and as Lydia informed you, - attended the wedding. He dined with us the next day, and was to - leave town again on Wednesday or Thursday. Will you be very angry - with me, my dear Lizzy, if I take this opportunity of saying - (what I was never bold enough to say before) how much I like him. - His behaviour to us has, in every respect, been as pleasing as - when we were in Derbyshire. His understanding and opinions all - please me; he wants nothing but a little more liveliness, and - _that_, if he marry _prudently_, his wife may teach him. I - thought him very sly;—he hardly ever mentioned your name. But - slyness seems the fashion. - - “Pray forgive me if I have been very presuming, or at least do - not punish me so far as to exclude me from P. I shall never be - quite happy till I have been all round the park. A low phaeton, - with a nice little pair of ponies, would be the very thing. - - “But I must write no more. The children have been wanting me this - half hour. - - “Yours, very sincerely, - “M. GARDINER.” - - The contents of this letter threw Elizabeth into a flutter of - spirits, in which it was difficult to determine whether pleasure - or pain bore the greatest share. The vague and unsettled - suspicions which uncertainty had produced of what Mr. Darcy might - have been doing to forward her sister’s match, which she had - feared to encourage as an exertion of goodness too great to be - probable, and at the same time dreaded to be just, from the pain - of obligation, were proved beyond their greatest extent to be - true! He had followed them purposely to town, he had taken on - himself all the trouble and mortification attendant on such a - research; in which supplication had been necessary to a woman - whom he must abominate and despise, and where he was reduced to - meet, frequently meet, reason with, persuade, and finally bribe, - the man whom he always most wished to avoid, and whose very name - it was punishment to him to pronounce. He had done all this for a - girl whom he could neither regard nor esteem. Her heart did - whisper that he had done it for her. But it was a hope shortly - checked by other considerations, and she soon felt that even her - vanity was insufficient, when required to depend on his affection - for her—for a woman who had already refused him—as able to - overcome a sentiment so natural as abhorrence against - relationship with Wickham. Brother-in-law of Wickham! Every kind - of pride must revolt from the connection. He had, to be sure, - done much. She was ashamed to think how much. But he had given a - reason for his interference, which asked no extraordinary stretch - of belief. It was reasonable that he should feel he had been - wrong; he had liberality, and he had the means of exercising it; - and though she would not place herself as his principal - inducement, she could, perhaps, believe that remaining partiality - for her might assist his endeavours in a cause where her peace of - mind must be materially concerned. It was painful, exceedingly - painful, to know that they were under obligations to a person who - could never receive a return. They owed the restoration of Lydia, - her character, every thing, to him. Oh! how heartily did she - grieve over every ungracious sensation she had ever encouraged, - every saucy speech she had ever directed towards him. For herself - she was humbled; but she was proud of him. Proud that in a cause - of compassion and honour, he had been able to get the better of - himself. She read over her aunt’s commendation of him again and - again. It was hardly enough; but it pleased her. She was even - sensible of some pleasure, though mixed with regret, on finding - how steadfastly both she and her uncle had been persuaded that - affection and confidence subsisted between Mr. Darcy and herself. - - She was roused from her seat, and her reflections, by some one’s - approach; and before she could strike into another path, she was - overtaken by Wickham. - - “I am afraid I interrupt your solitary ramble, my dear sister?” - said he, as he joined her. - - “You certainly do,” she replied with a smile; “but it does not - follow that the interruption must be unwelcome.” - - “I should be sorry indeed, if it were. _We_ were always good - friends; and now we are better.” - - “True. Are the others coming out?” - - “I do not know. Mrs. Bennet and Lydia are going in the carriage - to Meryton. And so, my dear sister, I find, from our uncle and - aunt, that you have actually seen Pemberley.” - - She replied in the affirmative. - - “I almost envy you the pleasure, and yet I believe it would be - too much for me, or else I could take it in my way to Newcastle. - And you saw the old housekeeper, I suppose? Poor Reynolds, she - was always very fond of me. But of course she did not mention my - name to you.” - - “Yes, she did.” - - “And what did she say?” - - “That you were gone into the army, and she was afraid had—not - turned out well. At such a distance as _that_, you know, things - are strangely misrepresented.” - - “Certainly,” he replied, biting his lips. Elizabeth hoped she had - silenced him; but he soon afterwards said: - - “I was surprised to see Darcy in town last month. We passed each - other several times. I wonder what he can be doing there.” - - “Perhaps preparing for his marriage with Miss de Bourgh,” said - Elizabeth. “It must be something particular, to take him there at - this time of year.” - - “Undoubtedly. Did you see him while you were at Lambton? I - thought I understood from the Gardiners that you had.” - - “Yes; he introduced us to his sister.” - - “And do you like her?” - - “Very much.” - - “I have heard, indeed, that she is uncommonly improved within - this year or two. When I last saw her, she was not very - promising. I am very glad you liked her. I hope she will turn out - well.” - - “I dare say she will; she has got over the most trying age.” - - “Did you go by the village of Kympton?” - - “I do not recollect that we did.” - - “I mention it, because it is the living which I ought to have - had. A most delightful place!—Excellent Parsonage House! It would - have suited me in every respect.” - - “How should you have liked making sermons?” - - “Exceedingly well. I should have considered it as part of my - duty, and the exertion would soon have been nothing. One ought - not to repine;—but, to be sure, it would have been such a thing - for me! The quiet, the retirement of such a life would have - answered all my ideas of happiness! But it was not to be. Did you - ever hear Darcy mention the circumstance, when you were in Kent?” - - “I _have_ heard from authority, which I thought _as good_, that - it was left you conditionally only, and at the will of the - present patron.” - - “You have. Yes, there was something in _that_; I told you so from - the first, you may remember.” - - “I _did_ hear, too, that there was a time, when sermon-making was - not so palatable to you as it seems to be at present; that you - actually declared your resolution of never taking orders, and - that the business had been compromised accordingly.” - - “You did! and it was not wholly without foundation. You may - remember what I told you on that point, when first we talked of - it.” - - They were now almost at the door of the house, for she had walked - fast to get rid of him; and unwilling, for her sister’s sake, to - provoke him, she only said in reply, with a good-humoured smile: - - “Come, Mr. Wickham, we are brother and sister, you know. Do not - let us quarrel about the past. In future, I hope we shall be - always of one mind.” - - She held out her hand; he kissed it with affectionate gallantry, - though he hardly knew how to look, and they entered the house. - - - - - Chapter 53 - - Mr. Wickham was so perfectly satisfied with this conversation - that he never again distressed himself, or provoked his dear - sister Elizabeth, by introducing the subject of it; and she was - pleased to find that she had said enough to keep him quiet. - - The day of his and Lydia’s departure soon came, and Mrs. Bennet - was forced to submit to a separation, which, as her husband by no - means entered into her scheme of their all going to Newcastle, - was likely to continue at least a twelvemonth. - - “Oh! my dear Lydia,” she cried, “when shall we meet again?” - - “Oh, lord! I don’t know. Not these two or three years, perhaps.” - - “Write to me very often, my dear.” - - “As often as I can. But you know married women have never much - time for writing. My sisters may write to _me_. They will have - nothing else to do.” - - Mr. Wickham’s adieus were much more affectionate than his wife’s. - He smiled, looked handsome, and said many pretty things. - - “He is as fine a fellow,” said Mr. Bennet, as soon as they were - out of the house, “as ever I saw. He simpers, and smirks, and - makes love to us all. I am prodigiously proud of him. I defy even - Sir William Lucas himself to produce a more valuable son-in-law.” - - The loss of her daughter made Mrs. Bennet very dull for several - days. - - “I often think,” said she, “that there is nothing so bad as - parting with one’s friends. One seems so forlorn without them.” - - “This is the consequence, you see, Madam, of marrying a - daughter,” said Elizabeth. “It must make you better satisfied - that your other four are single.” - - “It is no such thing. Lydia does not leave me because she is - married, but only because her husband’s regiment happens to be so - far off. If that had been nearer, she would not have gone so - soon.” - - But the spiritless condition which this event threw her into was - shortly relieved, and her mind opened again to the agitation of - hope, by an article of news which then began to be in - circulation. The housekeeper at Netherfield had received orders - to prepare for the arrival of her master, who was coming down in - a day or two, to shoot there for several weeks. Mrs. Bennet was - quite in the fidgets. She looked at Jane, and smiled and shook - her head by turns. - - “Well, well, and so Mr. Bingley is coming down, sister,” (for - Mrs. Phillips first brought her the news). “Well, so much the - better. Not that I care about it, though. He is nothing to us, - you know, and I am sure I never want to see him again. But, - however, he is very welcome to come to Netherfield, if he likes - it. And who knows what _may_ happen? But that is nothing to us. - You know, sister, we agreed long ago never to mention a word - about it. And so, is it quite certain he is coming?” - - “You may depend on it,” replied the other, “for Mrs. Nicholls was - in Meryton last night; I saw her passing by, and went out myself - on purpose to know the truth of it; and she told me that it was - certain true. He comes down on Thursday at the latest, very - likely on Wednesday. She was going to the butcher’s, she told me, - on purpose to order in some meat on Wednesday, and she has got - three couple of ducks just fit to be killed.” - - Miss Bennet had not been able to hear of his coming without - changing colour. It was many months since she had mentioned his - name to Elizabeth; but now, as soon as they were alone together, - she said: - - “I saw you look at me to-day, Lizzy, when my aunt told us of the - present report; and I know I appeared distressed. But don’t - imagine it was from any silly cause. I was only confused for the - moment, because I felt that I _should_ be looked at. I do assure - you that the news does not affect me either with pleasure or - pain. I am glad of one thing, that he comes alone; because we - shall see the less of him. Not that I am afraid of _myself_, but - I dread other people’s remarks.” - - Elizabeth did not know what to make of it. Had she not seen him - in Derbyshire, she might have supposed him capable of coming - there with no other view than what was acknowledged; but she - still thought him partial to Jane, and she wavered as to the - greater probability of his coming there _with_ his friend’s - permission, or being bold enough to come without it. - - “Yet it is hard,” she sometimes thought, “that this poor man - cannot come to a house which he has legally hired, without - raising all this speculation! I _will_ leave him to himself.” - - In spite of what her sister declared, and really believed to be - her feelings in the expectation of his arrival, Elizabeth could - easily perceive that her spirits were affected by it. They were - more disturbed, more unequal, than she had often seen them. - - The subject which had been so warmly canvassed between their - parents, about a twelvemonth ago, was now brought forward again. - - “As soon as ever Mr. Bingley comes, my dear,” said Mrs. Bennet, - “you will wait on him of course.” - - “No, no. You forced me into visiting him last year, and promised, - if I went to see him, he should marry one of my daughters. But it - ended in nothing, and I will not be sent on a fool’s errand - again.” - - His wife represented to him how absolutely necessary such an - attention would be from all the neighbouring gentlemen, on his - returning to Netherfield. - - “’Tis an _etiquette_ I despise,” said he. “If he wants our - society, let him seek it. He knows where we live. I will not - spend _my_ hours in running after my neighbours every time they - go away and come back again.” - - “Well, all I know is, that it will be abominably rude if you do - not wait on him. But, however, that shan’t prevent my asking him - to dine here, I am determined. We must have Mrs. Long and the - Gouldings soon. That will make thirteen with ourselves, so there - will be just room at table for him.” - - Consoled by this resolution, she was the better able to bear her - husband’s incivility; though it was very mortifying to know that - her neighbours might all see Mr. Bingley, in consequence of it, - before _they_ did. As the day of his arrival drew near,— - - “I begin to be sorry that he comes at all,” said Jane to her - sister. “It would be nothing; I could see him with perfect - indifference, but I can hardly bear to hear it thus perpetually - talked of. My mother means well; but she does not know, no one - can know, how much I suffer from what she says. Happy shall I be, - when his stay at Netherfield is over!” - - “I wish I could say anything to comfort you,” replied Elizabeth; - “but it is wholly out of my power. You must feel it; and the - usual satisfaction of preaching patience to a sufferer is denied - me, because you have always so much.” - - Mr. Bingley arrived. Mrs. Bennet, through the assistance of - servants, contrived to have the earliest tidings of it, that the - period of anxiety and fretfulness on her side might be as long as - it could. She counted the days that must intervene before their - invitation could be sent; hopeless of seeing him before. But on - the third morning after his arrival in Hertfordshire, she saw - him, from her dressing-room window, enter the paddock and ride - towards the house. - - Her daughters were eagerly called to partake of her joy. Jane - resolutely kept her place at the table; but Elizabeth, to satisfy - her mother, went to the window—she looked,—she saw Mr. Darcy with - him, and sat down again by her sister. - - “There is a gentleman with him, mamma,” said Kitty; “who can it - be?” - - “Some acquaintance or other, my dear, I suppose; I am sure I do - not know.” - - “La!” replied Kitty, “it looks just like that man that used to be - with him before. Mr. what’s-his-name. That tall, proud man.” - - “Good gracious! Mr. Darcy!—and so it does, I vow. Well, any - friend of Mr. Bingley’s will always be welcome here, to be sure; - but else I must say that I hate the very sight of him.” - - Jane looked at Elizabeth with surprise and concern. She knew but - little of their meeting in Derbyshire, and therefore felt for the - awkwardness which must attend her sister, in seeing him almost - for the first time after receiving his explanatory letter. Both - sisters were uncomfortable enough. Each felt for the other, and - of course for themselves; and their mother talked on, of her - dislike of Mr. Darcy, and her resolution to be civil to him only - as Mr. Bingley’s friend, without being heard by either of them. - But Elizabeth had sources of uneasiness which could not be - suspected by Jane, to whom she had never yet had courage to shew - Mrs. Gardiner’s letter, or to relate her own change of sentiment - towards him. To Jane, he could be only a man whose proposals she - had refused, and whose merit she had undervalued; but to her own - more extensive information, he was the person to whom the whole - family were indebted for the first of benefits, and whom she - regarded herself with an interest, if not quite so tender, at - least as reasonable and just as what Jane felt for Bingley. Her - astonishment at his coming—at his coming to Netherfield, to - Longbourn, and voluntarily seeking her again, was almost equal to - what she had known on first witnessing his altered behaviour in - Derbyshire. - - The colour which had been driven from her face, returned for half - a minute with an additional glow, and a smile of delight added - lustre to her eyes, as she thought for that space of time that - his affection and wishes must still be unshaken. But she would - not be secure. - - “Let me first see how he behaves,” said she; “it will then be - early enough for expectation.” - - She sat intently at work, striving to be composed, and without - daring to lift up her eyes, till anxious curiosity carried them - to the face of her sister as the servant was approaching the - door. Jane looked a little paler than usual, but more sedate than - Elizabeth had expected. On the gentlemen’s appearing, her colour - increased; yet she received them with tolerable ease, and with a - propriety of behaviour equally free from any symptom of - resentment or any unnecessary complaisance. - - Elizabeth said as little to either as civility would allow, and - sat down again to her work, with an eagerness which it did not - often command. She had ventured only one glance at Darcy. He - looked serious, as usual; and, she thought, more as he had been - used to look in Hertfordshire, than as she had seen him at - Pemberley. But, perhaps he could not in her mother’s presence be - what he was before her uncle and aunt. It was a painful, but not - an improbable, conjecture. - - Bingley, she had likewise seen for an instant, and in that short - period saw him looking both pleased and embarrassed. He was - received by Mrs. Bennet with a degree of civility which made her - two daughters ashamed, especially when contrasted with the cold - and ceremonious politeness of her curtsey and address to his - friend. - - Elizabeth, particularly, who knew that her mother owed to the - latter the preservation of her favourite daughter from - irremediable infamy, was hurt and distressed to a most painful - degree by a distinction so ill applied. - - Darcy, after inquiring of her how Mr. and Mrs. Gardiner did, a - question which she could not answer without confusion, said - scarcely anything. He was not seated by her; perhaps that was the - reason of his silence; but it had not been so in Derbyshire. - There he had talked to her friends, when he could not to herself. - But now several minutes elapsed without bringing the sound of his - voice; and when occasionally, unable to resist the impulse of - curiosity, she raised her eyes to his face, she as often found - him looking at Jane as at herself, and frequently on no object - but the ground. More thoughtfulness and less anxiety to please, - than when they last met, were plainly expressed. She was - disappointed, and angry with herself for being so. - - “Could I expect it to be otherwise!” said she. “Yet why did he - come?” - - She was in no humour for conversation with anyone but himself; - and to him she had hardly courage to speak. - - She inquired after his sister, but could do no more. - - “It is a long time, Mr. Bingley, since you went away,” said Mrs. - Bennet. - - He readily agreed to it. - - “I began to be afraid you would never come back again. People - _did_ say you meant to quit the place entirely at Michaelmas; - but, however, I hope it is not true. A great many changes have - happened in the neighbourhood, since you went away. Miss Lucas is - married and settled. And one of my own daughters. I suppose you - have heard of it; indeed, you must have seen it in the papers. It - was in The Times and The Courier, I know; though it was not put - in as it ought to be. It was only said, ‘Lately, George Wickham, - Esq. to Miss Lydia Bennet,’ without there being a syllable said - of her father, or the place where she lived, or anything. It was - my brother Gardiner’s drawing up too, and I wonder how he came to - make such an awkward business of it. Did you see it?” - - Bingley replied that he did, and made his congratulations. - Elizabeth dared not lift up her eyes. How Mr. Darcy looked, - therefore, she could not tell. - - “It is a delightful thing, to be sure, to have a daughter well - married,” continued her mother, “but at the same time, Mr. - Bingley, it is very hard to have her taken such a way from me. - They are gone down to Newcastle, a place quite northward, it - seems, and there they are to stay I do not know how long. His - regiment is there; for I suppose you have heard of his leaving - the ——shire, and of his being gone into the regulars. Thank - Heaven! he has _some_ friends, though perhaps not so many as he - deserves.” - - Elizabeth, who knew this to be levelled at Mr. Darcy, was in such - misery of shame, that she could hardly keep her seat. It drew - from her, however, the exertion of speaking, which nothing else - had so effectually done before; and she asked Bingley whether he - meant to make any stay in the country at present. A few weeks, he - believed. - - “When you have killed all your own birds, Mr. Bingley,” said her - mother, “I beg you will come here, and shoot as many as you - please on Mr. Bennet’s manor. I am sure he will be vastly happy - to oblige you, and will save all the best of the covies for you.” - - Elizabeth’s misery increased, at such unnecessary, such officious - attention! Were the same fair prospect to arise at present as had - flattered them a year ago, every thing, she was persuaded, would - be hastening to the same vexatious conclusion. At that instant, - she felt that years of happiness could not make Jane or herself - amends for moments of such painful confusion. - - “The first wish of my heart,” said she to herself, “is never more - to be in company with either of them. Their society can afford no - pleasure that will atone for such wretchedness as this! Let me - never see either one or the other again!” - - Yet the misery, for which years of happiness were to offer no - compensation, received soon afterwards material relief, from - observing how much the beauty of her sister re-kindled the - admiration of her former lover. When first he came in, he had - spoken to her but little; but every five minutes seemed to be - giving her more of his attention. He found her as handsome as she - had been last year; as good natured, and as unaffected, though - not quite so chatty. Jane was anxious that no difference should - be perceived in her at all, and was really persuaded that she - talked as much as ever. But her mind was so busily engaged, that - she did not always know when she was silent. - - When the gentlemen rose to go away, Mrs. Bennet was mindful of - her intended civility, and they were invited and engaged to dine - at Longbourn in a few days time. - - “You are quite a visit in my debt, Mr. Bingley,” she added, “for - when you went to town last winter, you promised to take a family - dinner with us, as soon as you returned. I have not forgot, you - see; and I assure you, I was very much disappointed that you did - not come back and keep your engagement.” - - Bingley looked a little silly at this reflection, and said - something of his concern at having been prevented by business. - They then went away. - - Mrs. Bennet had been strongly inclined to ask them to stay and - dine there that day; but, though she always kept a very good - table, she did not think anything less than two courses could be - good enough for a man on whom she had such anxious designs, or - satisfy the appetite and pride of one who had ten thousand a - year. - - - - - Chapter 54 - - As soon as they were gone, Elizabeth walked out to recover her - spirits; or in other words, to dwell without interruption on - those subjects that must deaden them more. Mr. Darcy’s behaviour - astonished and vexed her. - - “Why, if he came only to be silent, grave, and indifferent,” said - she, “did he come at all?” - - She could settle it in no way that gave her pleasure. - - “He could be still amiable, still pleasing, to my uncle and aunt, - when he was in town; and why not to me? If he fears me, why come - hither? If he no longer cares for me, why silent? Teasing, - teasing, man! I will think no more about him.” - - Her resolution was for a short time involuntarily kept by the - approach of her sister, who joined her with a cheerful look, - which showed her better satisfied with their visitors, than - Elizabeth. - - “Now,” said she, “that this first meeting is over, I feel - perfectly easy. I know my own strength, and I shall never be - embarrassed again by his coming. I am glad he dines here on - Tuesday. It will then be publicly seen that, on both sides, we - meet only as common and indifferent acquaintance.” - - “Yes, very indifferent indeed,” said Elizabeth, laughingly. “Oh, - Jane, take care.” - - “My dear Lizzy, you cannot think me so weak, as to be in danger - now?” - - “I think you are in very great danger of making him as much in - love with you as ever.” - - They did not see the gentlemen again till Tuesday; and Mrs. - Bennet, in the meanwhile, was giving way to all the happy - schemes, which the good humour and common politeness of Bingley, - in half an hour’s visit, had revived. - - On Tuesday there was a large party assembled at Longbourn; and - the two who were most anxiously expected, to the credit of their - punctuality as sportsmen, were in very good time. When they - repaired to the dining-room, Elizabeth eagerly watched to see - whether Bingley would take the place, which, in all their former - parties, had belonged to him, by her sister. Her prudent mother, - occupied by the same ideas, forbore to invite him to sit by - herself. On entering the room, he seemed to hesitate; but Jane - happened to look round, and happened to smile: it was decided. He - placed himself by her. - - Elizabeth, with a triumphant sensation, looked towards his - friend. He bore it with noble indifference, and she would have - imagined that Bingley had received his sanction to be happy, had - she not seen his eyes likewise turned towards Mr. Darcy, with an - expression of half-laughing alarm. - - His behaviour to her sister was such, during dinner time, as - showed an admiration of her, which, though more guarded than - formerly, persuaded Elizabeth, that if left wholly to himself, - Jane’s happiness, and his own, would be speedily secured. Though - she dared not depend upon the consequence, she yet received - pleasure from observing his behaviour. It gave her all the - animation that her spirits could boast; for she was in no - cheerful humour. Mr. Darcy was almost as far from her as the - table could divide them. He was on one side of her mother. She - knew how little such a situation would give pleasure to either, - or make either appear to advantage. She was not near enough to - hear any of their discourse, but she could see how seldom they - spoke to each other, and how formal and cold was their manner - whenever they did. Her mother’s ungraciousness, made the sense of - what they owed him more painful to Elizabeth’s mind; and she - would, at times, have given anything to be privileged to tell him - that his kindness was neither unknown nor unfelt by the whole of - the family. - - She was in hopes that the evening would afford some opportunity - of bringing them together; that the whole of the visit would not - pass away without enabling them to enter into something more of - conversation than the mere ceremonious salutation attending his - entrance. Anxious and uneasy, the period which passed in the - drawing-room, before the gentlemen came, was wearisome and dull - to a degree that almost made her uncivil. She looked forward to - their entrance as the point on which all her chance of pleasure - for the evening must depend. - - “If he does not come to me, _then_,” said she, “I shall give him - up for ever.” - - The gentlemen came; and she thought he looked as if he would have - answered her hopes; but, alas! the ladies had crowded round the - table, where Miss Bennet was making tea, and Elizabeth pouring - out the coffee, in so close a confederacy that there was not a - single vacancy near her which would admit of a chair. And on the - gentlemen’s approaching, one of the girls moved closer to her - than ever, and said, in a whisper: - - “The men shan’t come and part us, I am determined. We want none - of them; do we?” - - Darcy had walked away to another part of the room. She followed - him with her eyes, envied everyone to whom he spoke, had scarcely - patience enough to help anybody to coffee; and then was enraged - against herself for being so silly! - - “A man who has once been refused! How could I ever be foolish - enough to expect a renewal of his love? Is there one among the - sex, who would not protest against such a weakness as a second - proposal to the same woman? There is no indignity so abhorrent to - their feelings!” - - She was a little revived, however, by his bringing back his - coffee cup himself; and she seized the opportunity of saying: - - “Is your sister at Pemberley still?” - - “Yes, she will remain there till Christmas.” - - “And quite alone? Have all her friends left her?” - - “Mrs. Annesley is with her. The others have been gone on to - Scarborough, these three weeks.” - - She could think of nothing more to say; but if he wished to - converse with her, he might have better success. He stood by her, - however, for some minutes, in silence; and, at last, on the young - lady’s whispering to Elizabeth again, he walked away. - - When the tea-things were removed, and the card-tables placed, the - ladies all rose, and Elizabeth was then hoping to be soon joined - by him, when all her views were overthrown by seeing him fall a - victim to her mother’s rapacity for whist players, and in a few - moments after seated with the rest of the party. She now lost - every expectation of pleasure. They were confined for the evening - at different tables, and she had nothing to hope, but that his - eyes were so often turned towards her side of the room, as to - make him play as unsuccessfully as herself. - - Mrs. Bennet had designed to keep the two Netherfield gentlemen to - supper; but their carriage was unluckily ordered before any of - the others, and she had no opportunity of detaining them. - - “Well girls,” said she, as soon as they were left to themselves, - “What say you to the day? I think every thing has passed off - uncommonly well, I assure you. The dinner was as well dressed as - any I ever saw. The venison was roasted to a turn—and everybody - said they never saw so fat a haunch. The soup was fifty times - better than what we had at the Lucases’ last week; and even Mr. - Darcy acknowledged, that the partridges were remarkably well - done; and I suppose he has two or three French cooks at least. - And, my dear Jane, I never saw you look in greater beauty. Mrs. - Long said so too, for I asked her whether you did not. And what - do you think she said besides? ‘Ah! Mrs. Bennet, we shall have - her at Netherfield at last.’ She did indeed. I do think Mrs. Long - is as good a creature as ever lived—and her nieces are very - pretty behaved girls, and not at all handsome: I like them - prodigiously.” - - Mrs. Bennet, in short, was in very great spirits; she had seen - enough of Bingley’s behaviour to Jane, to be convinced that she - would get him at last; and her expectations of advantage to her - family, when in a happy humour, were so far beyond reason, that - she was quite disappointed at not seeing him there again the next - day, to make his proposals. - - “It has been a very agreeable day,” said Miss Bennet to - Elizabeth. “The party seemed so well selected, so suitable one - with the other. I hope we may often meet again.” - - Elizabeth smiled. - - “Lizzy, you must not do so. You must not suspect me. It mortifies - me. I assure you that I have now learnt to enjoy his conversation - as an agreeable and sensible young man, without having a wish - beyond it. I am perfectly satisfied, from what his manners now - are, that he never had any design of engaging my affection. It is - only that he is blessed with greater sweetness of address, and a - stronger desire of generally pleasing, than any other man.” - - “You are very cruel,” said her sister, “you will not let me - smile, and are provoking me to it every moment.” - - “How hard it is in some cases to be believed!” - - “And how impossible in others!” - - “But why should you wish to persuade me that I feel more than I - acknowledge?” - - “That is a question which I hardly know how to answer. We all - love to instruct, though we can teach only what is not worth - knowing. Forgive me; and if you persist in indifference, do not - make _me_ your confidante.” - - - - - Chapter 55 - - A few days after this visit, Mr. Bingley called again, and alone. - His friend had left him that morning for London, but was to - return home in ten days time. He sat with them above an hour, and - was in remarkably good spirits. Mrs. Bennet invited him to dine - with them; but, with many expressions of concern, he confessed - himself engaged elsewhere. - - “Next time you call,” said she, “I hope we shall be more lucky.” - - He should be particularly happy at any time, etc. etc.; and if - she would give him leave, would take an early opportunity of - waiting on them. - - “Can you come to-morrow?” - - Yes, he had no engagement at all for to-morrow; and her - invitation was accepted with alacrity. - - He came, and in such very good time that the ladies were none of - them dressed. In ran Mrs. Bennet to her daughter’s room, in her - dressing gown, and with her hair half finished, crying out: - - “My dear Jane, make haste and hurry down. He is come—Mr. Bingley - is come. He is, indeed. Make haste, make haste. Here, Sarah, come - to Miss Bennet this moment, and help her on with her gown. Never - mind Miss Lizzy’s hair.” - - “We will be down as soon as we can,” said Jane; “but I dare say - Kitty is forwarder than either of us, for she went up stairs half - an hour ago.” - - “Oh! hang Kitty! what has she to do with it? Come be quick, be - quick! Where is your sash, my dear?” - - But when her mother was gone, Jane would not be prevailed on to - go down without one of her sisters. - - The same anxiety to get them by themselves was visible again in - the evening. After tea, Mr. Bennet retired to the library, as was - his custom, and Mary went up stairs to her instrument. Two - obstacles of the five being thus removed, Mrs. Bennet sat looking - and winking at Elizabeth and Catherine for a considerable time, - without making any impression on them. Elizabeth would not - observe her; and when at last Kitty did, she very innocently - said, “What is the matter mamma? What do you keep winking at me - for? What am I to do?” - - “Nothing child, nothing. I did not wink at you.” She then sat - still five minutes longer; but unable to waste such a precious - occasion, she suddenly got up, and saying to Kitty, “Come here, - my love, I want to speak to you,” took her out of the room. Jane - instantly gave a look at Elizabeth which spoke her distress at - such premeditation, and her entreaty that _she_ would not give in - to it. In a few minutes, Mrs. Bennet half-opened the door and - called out: - - “Lizzy, my dear, I want to speak with you.” - - Elizabeth was forced to go. - - “We may as well leave them by themselves you know;” said her - mother, as soon as she was in the hall. “Kitty and I are going up - stairs to sit in my dressing-room.” - - Elizabeth made no attempt to reason with her mother, but remained - quietly in the hall, till she and Kitty were out of sight, then - returned into the drawing-room. - - Mrs. Bennet’s schemes for this day were ineffectual. Bingley was - every thing that was charming, except the professed lover of her - daughter. His ease and cheerfulness rendered him a most agreeable - addition to their evening party; and he bore with the ill-judged - officiousness of the mother, and heard all her silly remarks with - a forbearance and command of countenance particularly grateful to - the daughter. - - He scarcely needed an invitation to stay supper; and before he - went away, an engagement was formed, chiefly through his own and - Mrs. Bennet’s means, for his coming next morning to shoot with - her husband. - - After this day, Jane said no more of her indifference. Not a word - passed between the sisters concerning Bingley; but Elizabeth went - to bed in the happy belief that all must speedily be concluded, - unless Mr. Darcy returned within the stated time. Seriously, - however, she felt tolerably persuaded that all this must have - taken place with that gentleman’s concurrence. - - Bingley was punctual to his appointment; and he and Mr. Bennet - spent the morning together, as had been agreed on. The latter was - much more agreeable than his companion expected. There was - nothing of presumption or folly in Bingley that could provoke his - ridicule, or disgust him into silence; and he was more - communicative, and less eccentric, than the other had ever seen - him. Bingley of course returned with him to dinner; and in the - evening Mrs. Bennet’s invention was again at work to get every - body away from him and her daughter. Elizabeth, who had a letter - to write, went into the breakfast room for that purpose soon - after tea; for as the others were all going to sit down to cards, - she could not be wanted to counteract her mother’s schemes. - - But on returning to the drawing-room, when her letter was - finished, she saw, to her infinite surprise, there was reason to - fear that her mother had been too ingenious for her. On opening - the door, she perceived her sister and Bingley standing together - over the hearth, as if engaged in earnest conversation; and had - this led to no suspicion, the faces of both, as they hastily - turned round and moved away from each other, would have told it - all. _Their_ situation was awkward enough; but _hers_ she thought - was still worse. Not a syllable was uttered by either; and - Elizabeth was on the point of going away again, when Bingley, who - as well as the other had sat down, suddenly rose, and whispering - a few words to her sister, ran out of the room. - - Jane could have no reserves from Elizabeth, where confidence - would give pleasure; and instantly embracing her, acknowledged, - with the liveliest emotion, that she was the happiest creature in - the world. - - “’Tis too much!” she added, “by far too much. I do not deserve - it. Oh! why is not everybody as happy?” - - Elizabeth’s congratulations were given with a sincerity, a - warmth, a delight, which words could but poorly express. Every - sentence of kindness was a fresh source of happiness to Jane. But - she would not allow herself to stay with her sister, or say half - that remained to be said for the present. - - “I must go instantly to my mother;” she cried. “I would not on - any account trifle with her affectionate solicitude; or allow her - to hear it from anyone but myself. He is gone to my father - already. Oh! Lizzy, to know that what I have to relate will give - such pleasure to all my dear family! how shall I bear so much - happiness!” - - She then hastened away to her mother, who had purposely broken up - the card party, and was sitting up stairs with Kitty. - - Elizabeth, who was left by herself, now smiled at the rapidity - and ease with which an affair was finally settled, that had given - them so many previous months of suspense and vexation. - - “And this,” said she, “is the end of all his friend’s anxious - circumspection! of all his sister’s falsehood and contrivance! - the happiest, wisest, most reasonable end!” - - In a few minutes she was joined by Bingley, whose conference with - her father had been short and to the purpose. - - “Where is your sister?” said he hastily, as he opened the door. - - “With my mother up stairs. She will be down in a moment, I dare - say.” - - He then shut the door, and, coming up to her, claimed the good - wishes and affection of a sister. Elizabeth honestly and heartily - expressed her delight in the prospect of their relationship. They - shook hands with great cordiality; and then, till her sister came - down, she had to listen to all he had to say of his own - happiness, and of Jane’s perfections; and in spite of his being a - lover, Elizabeth really believed all his expectations of felicity - to be rationally founded, because they had for basis the - excellent understanding, and super-excellent disposition of Jane, - and a general similarity of feeling and taste between her and - himself. - - It was an evening of no common delight to them all; the - satisfaction of Miss Bennet’s mind gave a glow of such sweet - animation to her face, as made her look handsomer than ever. - Kitty simpered and smiled, and hoped her turn was coming soon. - Mrs. Bennet could not give her consent or speak her approbation - in terms warm enough to satisfy her feelings, though she talked - to Bingley of nothing else for half an hour; and when Mr. Bennet - joined them at supper, his voice and manner plainly showed how - really happy he was. - - Not a word, however, passed his lips in allusion to it, till - their visitor took his leave for the night; but as soon as he was - gone, he turned to his daughter, and said: - - “Jane, I congratulate you. You will be a very happy woman.” - - Jane went to him instantly, kissed him, and thanked him for his - goodness. - - “You are a good girl;” he replied, “and I have great pleasure in - thinking you will be so happily settled. I have not a doubt of - your doing very well together. Your tempers are by no means - unlike. You are each of you so complying, that nothing will ever - be resolved on; so easy, that every servant will cheat you; and - so generous, that you will always exceed your income.” - - “I hope not so. Imprudence or thoughtlessness in money matters - would be unpardonable in _me_.” - - “Exceed their income! My dear Mr. Bennet,” cried his wife, “what - are you talking of? Why, he has four or five thousand a year, and - very likely more.” Then addressing her daughter, “Oh! my dear, - dear Jane, I am so happy! I am sure I shan’t get a wink of sleep - all night. I knew how it would be. I always said it must be so, - at last. I was sure you could not be so beautiful for nothing! I - remember, as soon as ever I saw him, when he first came into - Hertfordshire last year, I thought how likely it was that you - should come together. Oh! he is the handsomest young man that - ever was seen!” - - Wickham, Lydia, were all forgotten. Jane was beyond competition - her favourite child. At that moment, she cared for no other. Her - younger sisters soon began to make interest with her for objects - of happiness which she might in future be able to dispense. - - Mary petitioned for the use of the library at Netherfield; and - Kitty begged very hard for a few balls there every winter. - - Bingley, from this time, was of course a daily visitor at - Longbourn; coming frequently before breakfast, and always - remaining till after supper; unless when some barbarous - neighbour, who could not be enough detested, had given him an - invitation to dinner which he thought himself obliged to accept. - - Elizabeth had now but little time for conversation with her - sister; for while he was present, Jane had no attention to bestow - on anyone else; but she found herself considerably useful to both - of them in those hours of separation that must sometimes occur. - In the absence of Jane, he always attached himself to Elizabeth, - for the pleasure of talking of her; and when Bingley was gone, - Jane constantly sought the same means of relief. - - “He has made me so happy,” said she, one evening, “by telling me - that he was totally ignorant of my being in town last spring! I - had not believed it possible.” - - “I suspected as much,” replied Elizabeth. “But how did he account - for it?” - - “It must have been his sister’s doing. They were certainly no - friends to his acquaintance with me, which I cannot wonder at, - since he might have chosen so much more advantageously in many - respects. But when they see, as I trust they will, that their - brother is happy with me, they will learn to be contented, and we - shall be on good terms again; though we can never be what we once - were to each other.” - - “That is the most unforgiving speech,” said Elizabeth, “that I - ever heard you utter. Good girl! It would vex me, indeed, to see - you again the dupe of Miss Bingley’s pretended regard.” - - “Would you believe it, Lizzy, that when he went to town last - November, he really loved me, and nothing but a persuasion of - _my_ being indifferent would have prevented his coming down - again!” - - “He made a little mistake to be sure; but it is to the credit of - his modesty.” - - This naturally introduced a panegyric from Jane on his - diffidence, and the little value he put on his own good - qualities. Elizabeth was pleased to find that he had not betrayed - the interference of his friend; for, though Jane had the most - generous and forgiving heart in the world, she knew it was a - circumstance which must prejudice her against him. - - “I am certainly the most fortunate creature that ever existed!” - cried Jane. “Oh! Lizzy, why am I thus singled from my family, and - blessed above them all! If I could but see you as happy! If there - were but such another man for you!” - - “If you were to give me forty such men, I never could be so happy - as you. Till I have your disposition, your goodness, I never can - have your happiness. No, no, let me shift for myself; and, - perhaps, if I have very good luck, I may meet with another Mr. - Collins in time.” - - The situation of affairs in the Longbourn family could not be - long a secret. Mrs. Bennet was privileged to whisper it to Mrs. - Phillips, and she ventured, without any permission, to do the - same by all her neighbours in Meryton. - - The Bennets were speedily pronounced to be the luckiest family in - the world, though only a few weeks before, when Lydia had first - run away, they had been generally proved to be marked out for - misfortune. - - - - - Chapter 56 - - One morning, about a week after Bingley’s engagement with Jane - had been formed, as he and the females of the family were sitting - together in the dining-room, their attention was suddenly drawn - to the window, by the sound of a carriage; and they perceived a - chaise and four driving up the lawn. It was too early in the - morning for visitors, and besides, the equipage did not answer to - that of any of their neighbours. The horses were post; and - neither the carriage, nor the livery of the servant who preceded - it, were familiar to them. As it was certain, however, that - somebody was coming, Bingley instantly prevailed on Miss Bennet - to avoid the confinement of such an intrusion, and walk away with - him into the shrubbery. They both set off, and the conjectures of - the remaining three continued, though with little satisfaction, - till the door was thrown open and their visitor entered. It was - Lady Catherine de Bourgh. - - They were of course all intending to be surprised; but their - astonishment was beyond their expectation; and on the part of - Mrs. Bennet and Kitty, though she was perfectly unknown to them, - even inferior to what Elizabeth felt. - - She entered the room with an air more than usually ungracious, - made no other reply to Elizabeth’s salutation than a slight - inclination of the head, and sat down without saying a word. - Elizabeth had mentioned her name to her mother on her ladyship’s - entrance, though no request of introduction had been made. - - Mrs. Bennet, all amazement, though flattered by having a guest of - such high importance, received her with the utmost politeness. - After sitting for a moment in silence, she said very stiffly to - Elizabeth, - - “I hope you are well, Miss Bennet. That lady, I suppose, is your - mother.” - - Elizabeth replied very concisely that she was. - - “And _that_ I suppose is one of your sisters.” - - “Yes, madam,” said Mrs. Bennet, delighted to speak to Lady - Catherine. “She is my youngest girl but one. My youngest of all - is lately married, and my eldest is somewhere about the grounds, - walking with a young man who, I believe, will soon become a part - of the family.” - - “You have a very small park here,” returned Lady Catherine after - a short silence. - - “It is nothing in comparison of Rosings, my lady, I dare say; but - I assure you it is much larger than Sir William Lucas’s.” - - “This must be a most inconvenient sitting room for the evening, - in summer; the windows are full west.” - - Mrs. Bennet assured her that they never sat there after dinner, - and then added: - - “May I take the liberty of asking your ladyship whether you left - Mr. and Mrs. Collins well.” - - “Yes, very well. I saw them the night before last.” - - Elizabeth now expected that she would produce a letter for her - from Charlotte, as it seemed the only probable motive for her - calling. But no letter appeared, and she was completely puzzled. - - Mrs. Bennet, with great civility, begged her ladyship to take - some refreshment; but Lady Catherine very resolutely, and not - very politely, declined eating anything; and then, rising up, - said to Elizabeth, - - “Miss Bennet, there seemed to be a prettyish kind of a little - wilderness on one side of your lawn. I should be glad to take a - turn in it, if you will favour me with your company.” - - “Go, my dear,” cried her mother, “and show her ladyship about the - different walks. I think she will be pleased with the hermitage.” - - Elizabeth obeyed, and running into her own room for her parasol, - attended her noble guest downstairs. As they passed through the - hall, Lady Catherine opened the doors into the dining-parlour and - drawing-room, and pronouncing them, after a short survey, to be - decent looking rooms, walked on. - - Her carriage remained at the door, and Elizabeth saw that her - waiting-woman was in it. They proceeded in silence along the - gravel walk that led to the copse; Elizabeth was determined to - make no effort for conversation with a woman who was now more - than usually insolent and disagreeable. - - “How could I ever think her like her nephew?” said she, as she - looked in her face. - - As soon as they entered the copse, Lady Catherine began in the - following manner:— - - “You can be at no loss, Miss Bennet, to understand the reason of - my journey hither. Your own heart, your own conscience, must tell - you why I come.” - - Elizabeth looked with unaffected astonishment. - - “Indeed, you are mistaken, Madam. I have not been at all able to - account for the honour of seeing you here.” - - “Miss Bennet,” replied her ladyship, in an angry tone, “you ought - to know, that I am not to be trifled with. But however insincere - _you_ may choose to be, you shall not find _me_ so. My character - has ever been celebrated for its sincerity and frankness, and in - a cause of such moment as this, I shall certainly not depart from - it. A report of a most alarming nature reached me two days ago. I - was told that not only your sister was on the point of being most - advantageously married, but that you, that Miss Elizabeth Bennet, - would, in all likelihood, be soon afterwards united to my nephew, - my own nephew, Mr. Darcy. Though I _know_ it must be a scandalous - falsehood, though I would not injure him so much as to suppose - the truth of it possible, I instantly resolved on setting off for - this place, that I might make my sentiments known to you.” - - “If you believed it impossible to be true,” said Elizabeth, - colouring with astonishment and disdain, “I wonder you took the - trouble of coming so far. What could your ladyship propose by - it?” - - “At once to insist upon having such a report universally - contradicted.” - - “Your coming to Longbourn, to see me and my family,” said - Elizabeth coolly, “will be rather a confirmation of it; if, - indeed, such a report is in existence.” - - “If! Do you then pretend to be ignorant of it? Has it not been - industriously circulated by yourselves? Do you not know that such - a report is spread abroad?” - - “I never heard that it was.” - - “And can you likewise declare, that there is no _foundation_ for - it?” - - “I do not pretend to possess equal frankness with your ladyship. - _You_ may ask questions which _I_ shall not choose to answer.” - - “This is not to be borne. Miss Bennet, I insist on being - satisfied. Has he, has my nephew, made you an offer of marriage?” - - “Your ladyship has declared it to be impossible.” - - “It ought to be so; it must be so, while he retains the use of - his reason. But _your_ arts and allurements may, in a moment of - infatuation, have made him forget what he owes to himself and to - all his family. You may have drawn him in.” - - “If I have, I shall be the last person to confess it.” - - “Miss Bennet, do you know who I am? I have not been accustomed to - such language as this. I am almost the nearest relation he has in - the world, and am entitled to know all his dearest concerns.” - - “But you are not entitled to know _mine;_ nor will such behaviour - as this, ever induce me to be explicit.” - - “Let me be rightly understood. This match, to which you have the - presumption to aspire, can never take place. No, never. Mr. Darcy - is engaged to _my daughter_. Now what have you to say?” - - “Only this; that if he is so, you can have no reason to suppose - he will make an offer to me.” - - Lady Catherine hesitated for a moment, and then replied: - - “The engagement between them is of a peculiar kind. From their - infancy, they have been intended for each other. It was the - favourite wish of _his_ mother, as well as of hers. While in - their cradles, we planned the union: and now, at the moment when - the wishes of both sisters would be accomplished in their - marriage, to be prevented by a young woman of inferior birth, of - no importance in the world, and wholly unallied to the family! Do - you pay no regard to the wishes of his friends? To his tacit - engagement with Miss de Bourgh? Are you lost to every feeling of - propriety and delicacy? Have you not heard me say that from his - earliest hours he was destined for his cousin?” - - “Yes, and I had heard it before. But what is that to me? If there - is no other objection to my marrying your nephew, I shall - certainly not be kept from it by knowing that his mother and aunt - wished him to marry Miss de Bourgh. You both did as much as you - could in planning the marriage. Its completion depended on - others. If Mr. Darcy is neither by honour nor inclination - confined to his cousin, why is not he to make another choice? And - if I am that choice, why may not I accept him?” - - “Because honour, decorum, prudence, nay, interest, forbid it. - Yes, Miss Bennet, interest; for do not expect to be noticed by - his family or friends, if you wilfully act against the - inclinations of all. You will be censured, slighted, and - despised, by everyone connected with him. Your alliance will be a - disgrace; your name will never even be mentioned by any of us.” - - “These are heavy misfortunes,” replied Elizabeth. “But the wife - of Mr. Darcy must have such extraordinary sources of happiness - necessarily attached to her situation, that she could, upon the - whole, have no cause to repine.” - - “Obstinate, headstrong girl! I am ashamed of you! Is this your - gratitude for my attentions to you last spring? Is nothing due to - me on that score? Let us sit down. You are to understand, Miss - Bennet, that I came here with the determined resolution of - carrying my purpose; nor will I be dissuaded from it. I have not - been used to submit to any person’s whims. I have not been in the - habit of brooking disappointment.” - - “_That_ will make your ladyship’s situation at present more - pitiable; but it will have no effect on _me_.” - - “I will not be interrupted. Hear me in silence. My daughter and - my nephew are formed for each other. They are descended, on the - maternal side, from the same noble line; and, on the father’s, - from respectable, honourable, and ancient—though - untitled—families. Their fortune on both sides is splendid. They - are destined for each other by the voice of every member of their - respective houses; and what is to divide them? The upstart - pretensions of a young woman without family, connections, or - fortune. Is this to be endured! But it must not, shall not be. If - you were sensible of your own good, you would not wish to quit - the sphere in which you have been brought up.” - - “In marrying your nephew, I should not consider myself as - quitting that sphere. He is a gentleman; I am a gentleman’s - daughter; so far we are equal.” - - “True. You _are_ a gentleman’s daughter. But who was your mother? - Who are your uncles and aunts? Do not imagine me ignorant of - their condition.” - - “Whatever my connections may be,” said Elizabeth, “if your nephew - does not object to them, they can be nothing to _you_.” - - “Tell me once for all, are you engaged to him?” - - Though Elizabeth would not, for the mere purpose of obliging Lady - Catherine, have answered this question, she could not but say, - after a moment’s deliberation: - - “I am not.” - - Lady Catherine seemed pleased. - - “And will you promise me, never to enter into such an - engagement?” - - “I will make no promise of the kind.” - - “Miss Bennet I am shocked and astonished. I expected to find a - more reasonable young woman. But do not deceive yourself into a - belief that I will ever recede. I shall not go away till you have - given me the assurance I require.” - - “And I certainly _never_ shall give it. I am not to be - intimidated into anything so wholly unreasonable. Your ladyship - wants Mr. Darcy to marry your daughter; but would my giving you - the wished-for promise make _their_ marriage at all more - probable? Supposing him to be attached to me, would _my_ refusing - to accept his hand make him wish to bestow it on his cousin? - Allow me to say, Lady Catherine, that the arguments with which - you have supported this extraordinary application have been as - frivolous as the application was ill-judged. You have widely - mistaken my character, if you think I can be worked on by such - persuasions as these. How far your nephew might approve of your - interference in _his_ affairs, I cannot tell; but you have - certainly no right to concern yourself in mine. I must beg, - therefore, to be importuned no farther on the subject.” - - “Not so hasty, if you please. I have by no means done. To all the - objections I have already urged, I have still another to add. I - am no stranger to the particulars of your youngest sister’s - infamous elopement. I know it all; that the young man’s marrying - her was a patched-up business, at the expence of your father and - uncles. And is _such_ a girl to be my nephew’s sister? Is _her_ - husband, who is the son of his late father’s steward, to be his - brother? Heaven and earth!—of what are you thinking? Are the - shades of Pemberley to be thus polluted?” - - “You can _now_ have nothing further to say,” she resentfully - answered. “You have insulted me in every possible method. I must - beg to return to the house.” - - And she rose as she spoke. Lady Catherine rose also, and they - turned back. Her ladyship was highly incensed. - - “You have no regard, then, for the honour and credit of my - nephew! Unfeeling, selfish girl! Do you not consider that a - connection with you must disgrace him in the eyes of everybody?” - - “Lady Catherine, I have nothing further to say. You know my - sentiments.” - - “You are then resolved to have him?” - - “I have said no such thing. I am only resolved to act in that - manner, which will, in my own opinion, constitute my happiness, - without reference to _you_, or to any person so wholly - unconnected with me.” - - “It is well. You refuse, then, to oblige me. You refuse to obey - the claims of duty, honour, and gratitude. You are determined to - ruin him in the opinion of all his friends, and make him the - contempt of the world.” - - “Neither duty, nor honour, nor gratitude,” replied Elizabeth, - “have any possible claim on me, in the present instance. No - principle of either would be violated by my marriage with Mr. - Darcy. And with regard to the resentment of his family, or the - indignation of the world, if the former _were_ excited by his - marrying me, it would not give me one moment’s concern—and the - world in general would have too much sense to join in the scorn.” - - “And this is your real opinion! This is your final resolve! Very - well. I shall now know how to act. Do not imagine, Miss Bennet, - that your ambition will ever be gratified. I came to try you. I - hoped to find you reasonable; but, depend upon it, I will carry - my point.” - - In this manner Lady Catherine talked on, till they were at the - door of the carriage, when, turning hastily round, she added, “I - take no leave of you, Miss Bennet. I send no compliments to your - mother. You deserve no such attention. I am most seriously - displeased.” - - Elizabeth made no answer; and without attempting to persuade her - ladyship to return into the house, walked quietly into it - herself. She heard the carriage drive away as she proceeded up - stairs. Her mother impatiently met her at the door of the - dressing-room, to ask why Lady Catherine would not come in again - and rest herself. - - “She did not choose it,” said her daughter, “she would go.” - - “She is a very fine-looking woman! and her calling here was - prodigiously civil! for she only came, I suppose, to tell us the - Collinses were well. She is on her road somewhere, I dare say, - and so, passing through Meryton, thought she might as well call - on you. I suppose she had nothing particular to say to you, - Lizzy?” - - Elizabeth was forced to give into a little falsehood here; for to - acknowledge the substance of their conversation was impossible. - - - - - Chapter 57 - - The discomposure of spirits which this extraordinary visit threw - Elizabeth into, could not be easily overcome; nor could she, for - many hours, learn to think of it less than incessantly. Lady - Catherine, it appeared, had actually taken the trouble of this - journey from Rosings, for the sole purpose of breaking off her - supposed engagement with Mr. Darcy. It was a rational scheme, to - be sure! but from what the report of their engagement could - originate, Elizabeth was at a loss to imagine; till she - recollected that _his_ being the intimate friend of Bingley, and - _her_ being the sister of Jane, was enough, at a time when the - expectation of one wedding made everybody eager for another, to - supply the idea. She had not herself forgotten to feel that the - marriage of her sister must bring them more frequently together. - And her neighbours at Lucas Lodge, therefore (for through their - communication with the Collinses, the report, she concluded, had - reached Lady Catherine), had only set _that_ down as almost - certain and immediate, which _she_ had looked forward to as - possible at some future time. - - In revolving Lady Catherine’s expressions, however, she could not - help feeling some uneasiness as to the possible consequence of - her persisting in this interference. From what she had said of - her resolution to prevent their marriage, it occurred to - Elizabeth that she must meditate an application to her nephew; - and how he might take a similar representation of the evils - attached to a connection with her, she dared not pronounce. She - knew not the exact degree of his affection for his aunt, or his - dependence on her judgment, but it was natural to suppose that he - thought much higher of her ladyship than _she_ could do; and it - was certain that, in enumerating the miseries of a marriage with - _one_, whose immediate connections were so unequal to his own, - his aunt would address him on his weakest side. With his notions - of dignity, he would probably feel that the arguments, which to - Elizabeth had appeared weak and ridiculous, contained much good - sense and solid reasoning. - - If he had been wavering before as to what he should do, which had - often seemed likely, the advice and entreaty of so near a - relation might settle every doubt, and determine him at once to - be as happy as dignity unblemished could make him. In that case - he would return no more. Lady Catherine might see him in her way - through town; and his engagement to Bingley of coming again to - Netherfield must give way. - - “If, therefore, an excuse for not keeping his promise should come - to his friend within a few days,” she added, “I shall know how to - understand it. I shall then give over every expectation, every - wish of his constancy. If he is satisfied with only regretting - me, when he might have obtained my affections and hand, I shall - soon cease to regret him at all.” - - The surprise of the rest of the family, on hearing who their - visitor had been, was very great; but they obligingly satisfied - it, with the same kind of supposition which had appeased Mrs. - Bennet’s curiosity; and Elizabeth was spared from much teasing on - the subject. - - The next morning, as she was going downstairs, she was met by her - father, who came out of his library with a letter in his hand. - - “Lizzy,” said he, “I was going to look for you; come into my - room.” - - She followed him thither; and her curiosity to know what he had - to tell her was heightened by the supposition of its being in - some manner connected with the letter he held. It suddenly struck - her that it might be from Lady Catherine; and she anticipated - with dismay all the consequent explanations. - - She followed her father to the fire place, and they both sat - down. He then said, - - “I have received a letter this morning that has astonished me - exceedingly. As it principally concerns yourself, you ought to - know its contents. I did not know before, that I had _two_ - daughters on the brink of matrimony. Let me congratulate you on a - very important conquest.” - - The colour now rushed into Elizabeth’s cheeks in the - instantaneous conviction of its being a letter from the nephew, - instead of the aunt; and she was undetermined whether most to be - pleased that he explained himself at all, or offended that his - letter was not rather addressed to herself; when her father - continued: - - “You look conscious. Young ladies have great penetration in such - matters as these; but I think I may defy even _your_ sagacity, to - discover the name of your admirer. This letter is from Mr. - Collins.” - - “From Mr. Collins! and what can _he_ have to say?” - - “Something very much to the purpose of course. He begins with - congratulations on the approaching nuptials of my eldest - daughter, of which, it seems, he has been told by some of the - good-natured, gossiping Lucases. I shall not sport with your - impatience, by reading what he says on that point. What relates - to yourself, is as follows: ‘Having thus offered you the sincere - congratulations of Mrs. Collins and myself on this happy event, - let me now add a short hint on the subject of another; of which - we have been advertised by the same authority. Your daughter - Elizabeth, it is presumed, will not long bear the name of Bennet, - after her elder sister has resigned it, and the chosen partner of - her fate may be reasonably looked up to as one of the most - illustrious personages in this land.’ - - “Can you possibly guess, Lizzy, who is meant by this? ‘This young - gentleman is blessed, in a peculiar way, with every thing the - heart of mortal can most desire,—splendid property, noble - kindred, and extensive patronage. Yet in spite of all these - temptations, let me warn my cousin Elizabeth, and yourself, of - what evils you may incur by a precipitate closure with this - gentleman’s proposals, which, of course, you will be inclined to - take immediate advantage of.’ - - “Have you any idea, Lizzy, who this gentleman is? But now it - comes out: - - “‘My motive for cautioning you is as follows. We have reason to - imagine that his aunt, Lady Catherine de Bourgh, does not look on - the match with a friendly eye.’ - - “_Mr. Darcy_, you see, is the man! Now, Lizzy, I think I _have_ - surprised you. Could he, or the Lucases, have pitched on any man - within the circle of our acquaintance, whose name would have - given the lie more effectually to what they related? Mr. Darcy, - who never looks at any woman but to see a blemish, and who - probably never looked at _you_ in his life! It is admirable!” - - Elizabeth tried to join in her father’s pleasantry, but could - only force one most reluctant smile. Never had his wit been - directed in a manner so little agreeable to her. - - “Are you not diverted?” - - “Oh! yes. Pray read on.” - - “‘After mentioning the likelihood of this marriage to her - ladyship last night, she immediately, with her usual - condescension, expressed what she felt on the occasion; when it - became apparent, that on the score of some family objections on - the part of my cousin, she would never give her consent to what - she termed so disgraceful a match. I thought it my duty to give - the speediest intelligence of this to my cousin, that she and her - noble admirer may be aware of what they are about, and not run - hastily into a marriage which has not been properly sanctioned.’ - Mr. Collins moreover adds, ‘I am truly rejoiced that my cousin - Lydia’s sad business has been so well hushed up, and am only - concerned that their living together before the marriage took - place should be so generally known. I must not, however, neglect - the duties of my station, or refrain from declaring my amazement - at hearing that you received the young couple into your house as - soon as they were married. It was an encouragement of vice; and - had I been the rector of Longbourn, I should very strenuously - have opposed it. You ought certainly to forgive them, as a - Christian, but never to admit them in your sight, or allow their - names to be mentioned in your hearing.’ _That_ is his notion of - Christian forgiveness! The rest of his letter is only about his - dear Charlotte’s situation, and his expectation of a young - olive-branch. But, Lizzy, you look as if you did not enjoy it. - You are not going to be _missish_, I hope, and pretend to be - affronted at an idle report. For what do we live, but to make - sport for our neighbours, and laugh at them in our turn?” - - “Oh!” cried Elizabeth, “I am excessively diverted. But it is so - strange!” - - “Yes—_that_ is what makes it amusing. Had they fixed on any other - man it would have been nothing; but _his_ perfect indifference, - and _your_ pointed dislike, make it so delightfully absurd! Much - as I abominate writing, I would not give up Mr. Collins’s - correspondence for any consideration. Nay, when I read a letter - of his, I cannot help giving him the preference even over - Wickham, much as I value the impudence and hypocrisy of my - son-in-law. And pray, Lizzy, what said Lady Catherine about this - report? Did she call to refuse her consent?” - - To this question his daughter replied only with a laugh; and as - it had been asked without the least suspicion, she was not - distressed by his repeating it. Elizabeth had never been more at - a loss to make her feelings appear what they were not. It was - necessary to laugh, when she would rather have cried. Her father - had most cruelly mortified her, by what he said of Mr. Darcy’s - indifference, and she could do nothing but wonder at such a want - of penetration, or fear that perhaps, instead of his seeing too - _little_, she might have fancied too _much_. - - - - - Chapter 58 - - Instead of receiving any such letter of excuse from his friend, - as Elizabeth half expected Mr. Bingley to do, he was able to - bring Darcy with him to Longbourn before many days had passed - after Lady Catherine’s visit. The gentlemen arrived early; and, - before Mrs. Bennet had time to tell him of their having seen his - aunt, of which her daughter sat in momentary dread, Bingley, who - wanted to be alone with Jane, proposed their all walking out. It - was agreed to. Mrs. Bennet was not in the habit of walking; Mary - could never spare time; but the remaining five set off together. - Bingley and Jane, however, soon allowed the others to outstrip - them. They lagged behind, while Elizabeth, Kitty, and Darcy were - to entertain each other. Very little was said by either; Kitty - was too much afraid of him to talk; Elizabeth was secretly - forming a desperate resolution; and perhaps he might be doing the - same. - - They walked towards the Lucases, because Kitty wished to call - upon Maria; and as Elizabeth saw no occasion for making it a - general concern, when Kitty left them she went boldly on with him - alone. Now was the moment for her resolution to be executed, and, - while her courage was high, she immediately said: - - “Mr. Darcy, I am a very selfish creature; and, for the sake of - giving relief to my own feelings, care not how much I may be - wounding yours. I can no longer help thanking you for your - unexampled kindness to my poor sister. Ever since I have known - it, I have been most anxious to acknowledge to you how gratefully - I feel it. Were it known to the rest of my family, I should not - have merely my own gratitude to express.” - - “I am sorry, exceedingly sorry,” replied Darcy, in a tone of - surprise and emotion, “that you have ever been informed of what - may, in a mistaken light, have given you uneasiness. I did not - think Mrs. Gardiner was so little to be trusted.” - - “You must not blame my aunt. Lydia’s thoughtlessness first - betrayed to me that you had been concerned in the matter; and, of - course, I could not rest till I knew the particulars. Let me - thank you again and again, in the name of all my family, for that - generous compassion which induced you to take so much trouble, - and bear so many mortifications, for the sake of discovering - them.” - - “If you _will_ thank me,” he replied, “let it be for yourself - alone. That the wish of giving happiness to you might add force - to the other inducements which led me on, I shall not attempt to - deny. But your _family_ owe me nothing. Much as I respect them, I - believe I thought only of _you_.” - - Elizabeth was too much embarrassed to say a word. After a short - pause, her companion added, “You are too generous to trifle with - me. If your feelings are still what they were last April, tell me - so at once. _My_ affections and wishes are unchanged, but one - word from you will silence me on this subject for ever.” - - Elizabeth, feeling all the more than common awkwardness and - anxiety of his situation, now forced herself to speak; and - immediately, though not very fluently, gave him to understand - that her sentiments had undergone so material a change, since the - period to which he alluded, as to make her receive with gratitude - and pleasure his present assurances. The happiness which this - reply produced, was such as he had probably never felt before; - and he expressed himself on the occasion as sensibly and as - warmly as a man violently in love can be supposed to do. Had - Elizabeth been able to encounter his eye, she might have seen how - well the expression of heartfelt delight, diffused over his face, - became him; but, though she could not look, she could listen, and - he told her of feelings, which, in proving of what importance she - was to him, made his affection every moment more valuable. - - They walked on, without knowing in what direction. There was too - much to be thought, and felt, and said, for attention to any - other objects. She soon learnt that they were indebted for their - present good understanding to the efforts of his aunt, who _did_ - call on him in her return through London, and there relate her - journey to Longbourn, its motive, and the substance of her - conversation with Elizabeth; dwelling emphatically on every - expression of the latter which, in her ladyship’s apprehension, - peculiarly denoted her perverseness and assurance; in the belief - that such a relation must assist her endeavours to obtain that - promise from her nephew which _she_ had refused to give. But, - unluckily for her ladyship, its effect had been exactly - contrariwise. - - “It taught me to hope,” said he, “as I had scarcely ever allowed - myself to hope before. I knew enough of your disposition to be - certain that, had you been absolutely, irrevocably decided - against me, you would have acknowledged it to Lady Catherine, - frankly and openly.” - - Elizabeth coloured and laughed as she replied, “Yes, you know - enough of my _frankness_ to believe me capable of _that_. After - abusing you so abominably to your face, I could have no scruple - in abusing you to all your relations.” - - “What did you say of me, that I did not deserve? For, though your - accusations were ill-founded, formed on mistaken premises, my - behaviour to you at the time had merited the severest reproof. It - was unpardonable. I cannot think of it without abhorrence.” - - “We will not quarrel for the greater share of blame annexed to - that evening,” said Elizabeth. “The conduct of neither, if - strictly examined, will be irreproachable; but since then, we - have both, I hope, improved in civility.” - - “I cannot be so easily reconciled to myself. The recollection of - what I then said, of my conduct, my manners, my expressions - during the whole of it, is now, and has been many months, - inexpressibly painful to me. Your reproof, so well applied, I - shall never forget: ‘had you behaved in a more gentlemanlike - manner.’ Those were your words. You know not, you can scarcely - conceive, how they have tortured me;—though it was some time, I - confess, before I was reasonable enough to allow their justice.” - - “I was certainly very far from expecting them to make so strong - an impression. I had not the smallest idea of their being ever - felt in such a way.” - - “I can easily believe it. You thought me then devoid of every - proper feeling, I am sure you did. The turn of your countenance I - shall never forget, as you said that I could not have addressed - you in any possible way that would induce you to accept me.” - - “Oh! do not repeat what I then said. These recollections will not - do at all. I assure you that I have long been most heartily - ashamed of it.” - - Darcy mentioned his letter. “Did it,” said he, “did it soon make - you think better of me? Did you, on reading it, give any credit - to its contents?” - - She explained what its effect on her had been, and how gradually - all her former prejudices had been removed. - - “I knew,” said he, “that what I wrote must give you pain, but it - was necessary. I hope you have destroyed the letter. There was - one part especially, the opening of it, which I should dread your - having the power of reading again. I can remember some - expressions which might justly make you hate me.” - - “The letter shall certainly be burnt, if you believe it essential - to the preservation of my regard; but, though we have both reason - to think my opinions not entirely unalterable, they are not, I - hope, quite so easily changed as that implies.” - - “When I wrote that letter,” replied Darcy, “I believed myself - perfectly calm and cool, but I am since convinced that it was - written in a dreadful bitterness of spirit.” - - “The letter, perhaps, began in bitterness, but it did not end so. - The adieu is charity itself. But think no more of the letter. The - feelings of the person who wrote, and the person who received it, - are now so widely different from what they were then, that every - unpleasant circumstance attending it ought to be forgotten. You - must learn some of my philosophy. Think only of the past as its - remembrance gives you pleasure.” - - “I cannot give you credit for any philosophy of the kind. _Your_ - retrospections must be so totally void of reproach, that the - contentment arising from them is not of philosophy, but, what is - much better, of innocence. But with _me_, it is not so. Painful - recollections will intrude which cannot, which ought not, to be - repelled. I have been a selfish being all my life, in practice, - though not in principle. As a child I was taught what was - _right_, but I was not taught to correct my temper. I was given - good principles, but left to follow them in pride and conceit. - Unfortunately an only son (for many years an only _child_), I was - spoilt by my parents, who, though good themselves (my father, - particularly, all that was benevolent and amiable), allowed, - encouraged, almost taught me to be selfish and overbearing; to - care for none beyond my own family circle; to think meanly of all - the rest of the world; to _wish_ at least to think meanly of - their sense and worth compared with my own. Such I was, from - eight to eight and twenty; and such I might still have been but - for you, dearest, loveliest Elizabeth! What do I not owe you! You - taught me a lesson, hard indeed at first, but most advantageous. - By you, I was properly humbled. I came to you without a doubt of - my reception. You showed me how insufficient were all my - pretensions to please a woman worthy of being pleased.” - - “Had you then persuaded yourself that I should?” - - “Indeed I had. What will you think of my vanity? I believed you - to be wishing, expecting my addresses.” - - “My manners must have been in fault, but not intentionally, I - assure you. I never meant to deceive you, but my spirits might - often lead me wrong. How you must have hated me after _that_ - evening?” - - “Hate you! I was angry perhaps at first, but my anger soon began - to take a proper direction.” - - “I am almost afraid of asking what you thought of me, when we met - at Pemberley. You blamed me for coming?” - - “No indeed; I felt nothing but surprise.” - - “Your surprise could not be greater than _mine_ in being noticed - by you. My conscience told me that I deserved no extraordinary - politeness, and I confess that I did not expect to receive _more_ - than my due.” - - “My object _then_,” replied Darcy, “was to show you, by every - civility in my power, that I was not so mean as to resent the - past; and I hoped to obtain your forgiveness, to lessen your ill - opinion, by letting you see that your reproofs had been attended - to. How soon any other wishes introduced themselves I can hardly - tell, but I believe in about half an hour after I had seen you.” - - He then told her of Georgiana’s delight in her acquaintance, and - of her disappointment at its sudden interruption; which naturally - leading to the cause of that interruption, she soon learnt that - his resolution of following her from Derbyshire in quest of her - sister had been formed before he quitted the inn, and that his - gravity and thoughtfulness there had arisen from no other - struggles than what such a purpose must comprehend. - - She expressed her gratitude again, but it was too painful a - subject to each, to be dwelt on farther. - - After walking several miles in a leisurely manner, and too busy - to know anything about it, they found at last, on examining their - watches, that it was time to be at home. - - “What could become of Mr. Bingley and Jane!” was a wonder which - introduced the discussion of _their_ affairs. Darcy was delighted - with their engagement; his friend had given him the earliest - information of it. - - “I must ask whether you were surprised?” said Elizabeth. - - “Not at all. When I went away, I felt that it would soon happen.” - - “That is to say, you had given your permission. I guessed as - much.” And though he exclaimed at the term, she found that it had - been pretty much the case. - - “On the evening before my going to London,” said he, “I made a - confession to him, which I believe I ought to have made long ago. - I told him of all that had occurred to make my former - interference in his affairs absurd and impertinent. His surprise - was great. He had never had the slightest suspicion. I told him, - moreover, that I believed myself mistaken in supposing, as I had - done, that your sister was indifferent to him; and as I could - easily perceive that his attachment to her was unabated, I felt - no doubt of their happiness together.” - - Elizabeth could not help smiling at his easy manner of directing - his friend. - - “Did you speak from your own observation,” said she, “when you - told him that my sister loved him, or merely from my information - last spring?” - - “From the former. I had narrowly observed her during the two - visits which I had lately made here; and I was convinced of her - affection.” - - “And your assurance of it, I suppose, carried immediate - conviction to him.” - - “It did. Bingley is most unaffectedly modest. His diffidence had - prevented his depending on his own judgment in so anxious a case, - but his reliance on mine made every thing easy. I was obliged to - confess one thing, which for a time, and not unjustly, offended - him. I could not allow myself to conceal that your sister had - been in town three months last winter, that I had known it, and - purposely kept it from him. He was angry. But his anger, I am - persuaded, lasted no longer than he remained in any doubt of your - sister’s sentiments. He has heartily forgiven me now.” - - Elizabeth longed to observe that Mr. Bingley had been a most - delightful friend; so easily guided that his worth was - invaluable; but she checked herself. She remembered that he had - yet to learn to be laughed at, and it was rather too early to - begin. In anticipating the happiness of Bingley, which of course - was to be inferior only to his own, he continued the conversation - till they reached the house. In the hall they parted. - - - - - Chapter 59 - - “My dear Lizzy, where can you have been walking to?” was a - question which Elizabeth received from Jane as soon as she - entered their room, and from all the others when they sat down to - table. She had only to say in reply, that they had wandered - about, till she was beyond her own knowledge. She coloured as she - spoke; but neither that, nor anything else, awakened a suspicion - of the truth. - - The evening passed quietly, unmarked by anything extraordinary. - The acknowledged lovers talked and laughed, the unacknowledged - were silent. Darcy was not of a disposition in which happiness - overflows in mirth; and Elizabeth, agitated and confused, rather - _knew_ that she was happy than _felt_ herself to be so; for, - besides the immediate embarrassment, there were other evils - before her. She anticipated what would be felt in the family when - her situation became known; she was aware that no one liked him - but Jane; and even feared that with the others it was a _dislike_ - which not all his fortune and consequence might do away. - - At night she opened her heart to Jane. Though suspicion was very - far from Miss Bennet’s general habits, she was absolutely - incredulous here. - - “You are joking, Lizzy. This cannot be!—engaged to Mr. Darcy! No, - no, you shall not deceive me. I know it to be impossible.” - - “This is a wretched beginning indeed! My sole dependence was on - you; and I am sure nobody else will believe me, if you do not. - Yet, indeed, I am in earnest. I speak nothing but the truth. He - still loves me, and we are engaged.” - - Jane looked at her doubtingly. “Oh, Lizzy! it cannot be. I know - how much you dislike him.” - - “You know nothing of the matter. _That_ is all to be forgot. - Perhaps I did not always love him so well as I do now. But in - such cases as these, a good memory is unpardonable. This is the - last time I shall ever remember it myself.” - - Miss Bennet still looked all amazement. Elizabeth again, and more - seriously assured her of its truth. - - “Good Heaven! can it be really so! Yet now I must believe you,” - cried Jane. “My dear, dear Lizzy, I would—I do congratulate - you—but are you certain? forgive the question—are you quite - certain that you can be happy with him?” - - “There can be no doubt of that. It is settled between us already, - that we are to be the happiest couple in the world. But are you - pleased, Jane? Shall you like to have such a brother?” - - “Very, very much. Nothing could give either Bingley or myself - more delight. But we considered it, we talked of it as - impossible. And do you really love him quite well enough? Oh, - Lizzy! do anything rather than marry without affection. Are you - quite sure that you feel what you ought to do?” - - “Oh, yes! You will only think I feel _more_ than I ought to do, - when I tell you all.” - - “What do you mean?” - - “Why, I must confess that I love him better than I do Bingley. I - am afraid you will be angry.” - - “My dearest sister, now _be_ serious. I want to talk very - seriously. Let me know every thing that I am to know, without - delay. Will you tell me how long you have loved him?” - - “It has been coming on so gradually, that I hardly know when it - began. But I believe I must date it from my first seeing his - beautiful grounds at Pemberley.” - - Another entreaty that she would be serious, however, produced the - desired effect; and she soon satisfied Jane by her solemn - assurances of attachment. When convinced on that article, Miss - Bennet had nothing further to wish. - - “Now I am quite happy,” said she, “for you will be as happy as - myself. I always had a value for him. Were it for nothing but his - love of you, I must always have esteemed him; but now, as - Bingley’s friend and your husband, there can be only Bingley and - yourself more dear to me. But Lizzy, you have been very sly, very - reserved with me. How little did you tell me of what passed at - Pemberley and Lambton! I owe all that I know of it to another, - not to you.” - - Elizabeth told her the motives of her secrecy. She had been - unwilling to mention Bingley; and the unsettled state of her own - feelings had made her equally avoid the name of his friend. But - now she would no longer conceal from her his share in Lydia’s - marriage. All was acknowledged, and half the night spent in - conversation. - - “Good gracious!” cried Mrs. Bennet, as she stood at a window the - next morning, “if that disagreeable Mr. Darcy is not coming here - again with our dear Bingley! What can he mean by being so - tiresome as to be always coming here? I had no notion but he - would go a-shooting, or something or other, and not disturb us - with his company. What shall we do with him? Lizzy, you must walk - out with him again, that he may not be in Bingley’s way.” - - Elizabeth could hardly help laughing at so convenient a proposal; - yet was really vexed that her mother should be always giving him - such an epithet. - - As soon as they entered, Bingley looked at her so expressively, - and shook hands with such warmth, as left no doubt of his good - information; and he soon afterwards said aloud, “Mrs. Bennet, - have you no more lanes hereabouts in which Lizzy may lose her way - again to-day?” - - “I advise Mr. Darcy, and Lizzy, and Kitty,” said Mrs. Bennet, “to - walk to Oakham Mount this morning. It is a nice long walk, and - Mr. Darcy has never seen the view.” - - “It may do very well for the others,” replied Mr. Bingley; “but I - am sure it will be too much for Kitty. Won’t it, Kitty?” Kitty - owned that she had rather stay at home. Darcy professed a great - curiosity to see the view from the Mount, and Elizabeth silently - consented. As she went up stairs to get ready, Mrs. Bennet - followed her, saying: - - “I am quite sorry, Lizzy, that you should be forced to have that - disagreeable man all to yourself. But I hope you will not mind - it: it is all for Jane’s sake, you know; and there is no occasion - for talking to him, except just now and then. So, do not put - yourself to inconvenience.” - - During their walk, it was resolved that Mr. Bennet’s consent - should be asked in the course of the evening. Elizabeth reserved - to herself the application for her mother’s. She could not - determine how her mother would take it; sometimes doubting - whether all his wealth and grandeur would be enough to overcome - her abhorrence of the man. But whether she were violently set - against the match, or violently delighted with it, it was certain - that her manner would be equally ill adapted to do credit to her - sense; and she could no more bear that Mr. Darcy should hear the - first raptures of her joy, than the first vehemence of her - disapprobation. - - In the evening, soon after Mr. Bennet withdrew to the library, - she saw Mr. Darcy rise also and follow him, and her agitation on - seeing it was extreme. She did not fear her father’s opposition, - but he was going to be made unhappy; and that it should be - through her means—that _she_, his favourite child, should be - distressing him by her choice, should be filling him with fears - and regrets in disposing of her—was a wretched reflection, and - she sat in misery till Mr. Darcy appeared again, when, looking at - him, she was a little relieved by his smile. In a few minutes he - approached the table where she was sitting with Kitty; and, while - pretending to admire her work said in a whisper, “Go to your - father, he wants you in the library.” She was gone directly. - - Her father was walking about the room, looking grave and anxious. - “Lizzy,” said he, “what are you doing? Are you out of your - senses, to be accepting this man? Have not you always hated him?” - - How earnestly did she then wish that her former opinions had been - more reasonable, her expressions more moderate! It would have - spared her from explanations and professions which it was - exceedingly awkward to give; but they were now necessary, and she - assured him, with some confusion, of her attachment to Mr. Darcy. - - “Or, in other words, you are determined to have him. He is rich, - to be sure, and you may have more fine clothes and fine carriages - than Jane. But will they make you happy?” - - “Have you any other objection,” said Elizabeth, “than your belief - of my indifference?” - - “None at all. We all know him to be a proud, unpleasant sort of - man; but this would be nothing if you really liked him.” - - “I do, I do like him,” she replied, with tears in her eyes, “I - love him. Indeed he has no improper pride. He is perfectly - amiable. You do not know what he really is; then pray do not pain - me by speaking of him in such terms.” - - “Lizzy,” said her father, “I have given him my consent. He is the - kind of man, indeed, to whom I should never dare refuse anything, - which he condescended to ask. I now give it to _you_, if you are - resolved on having him. But let me advise you to think better of - it. I know your disposition, Lizzy. I know that you could be - neither happy nor respectable, unless you truly esteemed your - husband; unless you looked up to him as a superior. Your lively - talents would place you in the greatest danger in an unequal - marriage. You could scarcely escape discredit and misery. My - child, let me not have the grief of seeing _you_ unable to - respect your partner in life. You know not what you are about.” - - Elizabeth, still more affected, was earnest and solemn in her - reply; and at length, by repeated assurances that Mr. Darcy was - really the object of her choice, by explaining the gradual change - which her estimation of him had undergone, relating her absolute - certainty that his affection was not the work of a day, but had - stood the test of many months’ suspense, and enumerating with - energy all his good qualities, she did conquer her father’s - incredulity, and reconcile him to the match. - - “Well, my dear,” said he, when she ceased speaking, “I have no - more to say. If this be the case, he deserves you. I could not - have parted with you, my Lizzy, to anyone less worthy.” - - To complete the favourable impression, she then told him what Mr. - Darcy had voluntarily done for Lydia. He heard her with - astonishment. - - “This is an evening of wonders, indeed! And so, Darcy did every - thing; made up the match, gave the money, paid the fellow’s - debts, and got him his commission! So much the better. It will - save me a world of trouble and economy. Had it been your uncle’s - doing, I must and _would_ have paid him; but these violent young - lovers carry every thing their own way. I shall offer to pay him - to-morrow; he will rant and storm about his love for you, and - there will be an end of the matter.” - - He then recollected her embarrassment a few days before, on his - reading Mr. Collins’s letter; and after laughing at her some - time, allowed her at last to go—saying, as she quitted the room, - “If any young men come for Mary or Kitty, send them in, for I am - quite at leisure.” - - Elizabeth’s mind was now relieved from a very heavy weight; and, - after half an hour’s quiet reflection in her own room, she was - able to join the others with tolerable composure. Every thing was - too recent for gaiety, but the evening passed tranquilly away; - there was no longer anything material to be dreaded, and the - comfort of ease and familiarity would come in time. - - When her mother went up to her dressing-room at night, she - followed her, and made the important communication. Its effect - was most extraordinary; for on first hearing it, Mrs. Bennet sat - quite still, and unable to utter a syllable. Nor was it under - many, many minutes that she could comprehend what she heard; - though not in general backward to credit what was for the - advantage of her family, or that came in the shape of a lover to - any of them. She began at length to recover, to fidget about in - her chair, get up, sit down again, wonder, and bless herself. - - “Good gracious! Lord bless me! only think! dear me! Mr. Darcy! - Who would have thought it! And is it really true? Oh! my sweetest - Lizzy! how rich and how great you will be! What pin-money, what - jewels, what carriages you will have! Jane’s is nothing to - it—nothing at all. I am so pleased—so happy. Such a charming - man!—so handsome! so tall!—Oh, my dear Lizzy! pray apologise for - my having disliked him so much before. I hope he will overlook - it. Dear, dear Lizzy. A house in town! Every thing that is - charming! Three daughters married! Ten thousand a year! Oh, Lord! - What will become of me. I shall go distracted.” - - This was enough to prove that her approbation need not be - doubted: and Elizabeth, rejoicing that such an effusion was heard - only by herself, soon went away. But before she had been three - minutes in her own room, her mother followed her. - - “My dearest child,” she cried, “I can think of nothing else! Ten - thousand a year, and very likely more! ’Tis as good as a Lord! - And a special licence. You must and shall be married by a special - licence. But my dearest love, tell me what dish Mr. Darcy is - particularly fond of, that I may have it to-morrow.” - - This was a sad omen of what her mother’s behaviour to the - gentleman himself might be; and Elizabeth found that, though in - the certain possession of his warmest affection, and secure of - her relations’ consent, there was still something to be wished - for. But the morrow passed off much better than she expected; for - Mrs. Bennet luckily stood in such awe of her intended son-in-law - that she ventured not to speak to him, unless it was in her power - to offer him any attention, or mark her deference for his - opinion. - - Elizabeth had the satisfaction of seeing her father taking pains - to get acquainted with him; and Mr. Bennet soon assured her that - he was rising every hour in his esteem. - - “I admire all my three sons-in-law highly,” said he. “Wickham, - perhaps, is my favourite; but I think I shall like _your_ husband - quite as well as Jane’s.” - - - - - Chapter 60 - - Elizabeth’s spirits soon rising to playfulness again, she wanted - Mr. Darcy to account for his having ever fallen in love with her. - “How could you begin?” said she. “I can comprehend your going on - charmingly, when you had once made a beginning; but what could - set you off in the first place?” - - “I cannot fix on the hour, or the spot, or the look, or the - words, which laid the foundation. It is too long ago. I was in - the middle before I knew that I _had_ begun.” - - “My beauty you had early withstood, and as for my manners—my - behaviour to _you_ was at least always bordering on the uncivil, - and I never spoke to you without rather wishing to give you pain - than not. Now be sincere; did you admire me for my impertinence?” - - “For the liveliness of your mind, I did.” - - “You may as well call it impertinence at once. It was very little - less. The fact is, that you were sick of civility, of deference, - of officious attention. You were disgusted with the women who - were always speaking, and looking, and thinking for _your_ - approbation alone. I roused, and interested you, because I was so - unlike _them_. Had you not been really amiable, you would have - hated me for it; but in spite of the pains you took to disguise - yourself, your feelings were always noble and just; and in your - heart, you thoroughly despised the persons who so assiduously - courted you. There—I have saved you the trouble of accounting for - it; and really, all things considered, I begin to think it - perfectly reasonable. To be sure, you knew no actual good of - me—but nobody thinks of _that_ when they fall in love.” - - “Was there no good in your affectionate behaviour to Jane while - she was ill at Netherfield?” - - “Dearest Jane! who could have done less for her? But make a - virtue of it by all means. My good qualities are under your - protection, and you are to exaggerate them as much as possible; - and, in return, it belongs to me to find occasions for teasing - and quarrelling with you as often as may be; and I shall begin - directly by asking you what made you so unwilling to come to the - point at last. What made you so shy of me, when you first called, - and afterwards dined here? Why, especially, when you called, did - you look as if you did not care about me?” - - “Because you were grave and silent, and gave me no - encouragement.” - - “But I was embarrassed.” - - “And so was I.” - - “You might have talked to me more when you came to dinner.” - - “A man who had felt less, might.” - - “How unlucky that you should have a reasonable answer to give, - and that I should be so reasonable as to admit it! But I wonder - how long you _would_ have gone on, if you had been left to - yourself. I wonder when you _would_ have spoken, if I had not - asked you! My resolution of thanking you for your kindness to - Lydia had certainly great effect. _Too much_, I am afraid; for - what becomes of the moral, if our comfort springs from a breach - of promise? for I ought not to have mentioned the subject. This - will never do.” - - “You need not distress yourself. The moral will be perfectly - fair. Lady Catherine’s unjustifiable endeavours to separate us - were the means of removing all my doubts. I am not indebted for - my present happiness to your eager desire of expressing your - gratitude. I was not in a humour to wait for any opening of - yours. My aunt’s intelligence had given me hope, and I was - determined at once to know every thing.” - - “Lady Catherine has been of infinite use, which ought to make her - happy, for she loves to be of use. But tell me, what did you come - down to Netherfield for? Was it merely to ride to Longbourn and - be embarrassed? or had you intended any more serious - consequence?” - - “My real purpose was to see _you_, and to judge, if I could, - whether I might ever hope to make you love me. My avowed one, or - what I avowed to myself, was to see whether your sister were - still partial to Bingley, and if she were, to make the confession - to him which I have since made.” - - “Shall you ever have courage to announce to Lady Catherine what - is to befall her?” - - “I am more likely to want more time than courage, Elizabeth. But - it ought to be done, and if you will give me a sheet of paper, it - shall be done directly.” - - “And if I had not a letter to write myself, I might sit by you - and admire the evenness of your writing, as another young lady - once did. But I have an aunt, too, who must not be longer - neglected.” - - From an unwillingness to confess how much her intimacy with Mr. - Darcy had been over-rated, Elizabeth had never yet answered Mrs. - Gardiner’s long letter; but now, having _that_ to communicate - which she knew would be most welcome, she was almost ashamed to - find that her uncle and aunt had already lost three days of - happiness, and immediately wrote as follows: - - “I would have thanked you before, my dear aunt, as I ought to - have done, for your long, kind, satisfactory, detail of - particulars; but to say the truth, I was too cross to write. You - supposed more than really existed. But _now_ suppose as much as - you choose; give a loose rein to your fancy, indulge your - imagination in every possible flight which the subject will - afford, and unless you believe me actually married, you cannot - greatly err. You must write again very soon, and praise him a - great deal more than you did in your last. I thank you, again and - again, for not going to the Lakes. How could I be so silly as to - wish it! Your idea of the ponies is delightful. We will go round - the Park every day. I am the happiest creature in the world. - Perhaps other people have said so before, but not one with such - justice. I am happier even than Jane; she only smiles, I laugh. - Mr. Darcy sends you all the love in the world that he can spare - from me. You are all to come to Pemberley at Christmas. Yours, - etc.” - - Mr. Darcy’s letter to Lady Catherine was in a different style; - and still different from either was what Mr. Bennet sent to Mr. - Collins, in reply to his last. - - “Dear Sir, - “I must trouble you once more for congratulations. Elizabeth will - soon be the wife of Mr. Darcy. Console Lady Catherine as well as - you can. But, if I were you, I would stand by the nephew. He has - more to give. - - “Yours sincerely, etc.” - - Miss Bingley’s congratulations to her brother, on his approaching - marriage, were all that was affectionate and insincere. She wrote - even to Jane on the occasion, to express her delight, and repeat - all her former professions of regard. Jane was not deceived, but - she was affected; and though feeling no reliance on her, could - not help writing her a much kinder answer than she knew was - deserved. - - The joy which Miss Darcy expressed on receiving similar - information, was as sincere as her brother’s in sending it. Four - sides of paper were insufficient to contain all her delight, and - all her earnest desire of being loved by her sister. - - Before any answer could arrive from Mr. Collins, or any - congratulations to Elizabeth from his wife, the Longbourn family - heard that the Collinses were come themselves to Lucas Lodge. The - reason of this sudden removal was soon evident. Lady Catherine - had been rendered so exceedingly angry by the contents of her - nephew’s letter, that Charlotte, really rejoicing in the match, - was anxious to get away till the storm was blown over. At such a - moment, the arrival of her friend was a sincere pleasure to - Elizabeth, though in the course of their meetings she must - sometimes think the pleasure dearly bought, when she saw Mr. - Darcy exposed to all the parading and obsequious civility of her - husband. He bore it, however, with admirable calmness. He could - even listen to Sir William Lucas, when he complimented him on - carrying away the brightest jewel of the country, and expressed - his hopes of their all meeting frequently at St. James’s, with - very decent composure. If he did shrug his shoulders, it was not - till Sir William was out of sight. - - Mrs. Phillips’s vulgarity was another, and perhaps a greater, tax - on his forbearance; and though Mrs. Phillips, as well as her - sister, stood in too much awe of him to speak with the - familiarity which Bingley’s good humour encouraged, yet, whenever - she _did_ speak, she must be vulgar. Nor was her respect for him, - though it made her more quiet, at all likely to make her more - elegant. Elizabeth did all she could to shield him from the - frequent notice of either, and was ever anxious to keep him to - herself, and to those of her family with whom he might converse - without mortification; and though the uncomfortable feelings - arising from all this took from the season of courtship much of - its pleasure, it added to the hope of the future; and she looked - forward with delight to the time when they should be removed from - society so little pleasing to either, to all the comfort and - elegance of their family party at Pemberley. - - - - - Chapter 61 - - Happy for all her maternal feelings was the day on which Mrs. - Bennet got rid of her two most deserving daughters. With what - delighted pride she afterwards visited Mrs. Bingley, and talked - of Mrs. Darcy, may be guessed. I wish I could say, for the sake - of her family, that the accomplishment of her earnest desire in - the establishment of so many of her children produced so happy an - effect as to make her a sensible, amiable, well-informed woman - for the rest of her life; though perhaps it was lucky for her - husband, who might not have relished domestic felicity in so - unusual a form, that she still was occasionally nervous and - invariably silly. - - Mr. Bennet missed his second daughter exceedingly; his affection - for her drew him oftener from home than anything else could do. - He delighted in going to Pemberley, especially when he was least - expected. - - Mr. Bingley and Jane remained at Netherfield only a twelvemonth. - So near a vicinity to her mother and Meryton relations was not - desirable even to _his_ easy temper, or _her_ affectionate heart. - The darling wish of his sisters was then gratified; he bought an - estate in a neighbouring county to Derbyshire, and Jane and - Elizabeth, in addition to every other source of happiness, were - within thirty miles of each other. - - Kitty, to her very material advantage, spent the chief of her - time with her two elder sisters. In society so superior to what - she had generally known, her improvement was great. She was not - of so ungovernable a temper as Lydia; and, removed from the - influence of Lydia’s example, she became, by proper attention and - management, less irritable, less ignorant, and less insipid. From - the further disadvantage of Lydia’s society she was of course - carefully kept, and though Mrs. Wickham frequently invited her to - come and stay with her, with the promise of balls and young men, - her father would never consent to her going. - - Mary was the only daughter who remained at home; and she was - necessarily drawn from the pursuit of accomplishments by Mrs. - Bennet’s being quite unable to sit alone. Mary was obliged to mix - more with the world, but she could still moralize over every - morning visit; and as she was no longer mortified by comparisons - between her sisters’ beauty and her own, it was suspected by her - father that she submitted to the change without much reluctance. - - As for Wickham and Lydia, their characters suffered no revolution - from the marriage of her sisters. He bore with philosophy the - conviction that Elizabeth must now become acquainted with - whatever of his ingratitude and falsehood had before been unknown - to her; and in spite of every thing, was not wholly without hope - that Darcy might yet be prevailed on to make his fortune. The - congratulatory letter which Elizabeth received from Lydia on her - marriage, explained to her that, by his wife at least, if not by - himself, such a hope was cherished. The letter was to this - effect: - - “My dear Lizzy, - “I wish you joy. If you love Mr. Darcy half as well as I do my - dear Wickham, you must be very happy. It is a great comfort to - have you so rich, and when you have nothing else to do, I hope - you will think of us. I am sure Wickham would like a place at - court very much, and I do not think we shall have quite money - enough to live upon without some help. Any place would do, of - about three or four hundred a year; but however, do not speak to - Mr. Darcy about it, if you had rather not. - - “Yours, etc.” - - As it happened that Elizabeth had much rather not, she - endeavoured in her answer to put an end to every entreaty and - expectation of the kind. Such relief, however, as it was in her - power to afford, by the practice of what might be called economy - in her own private expences, she frequently sent them. It had - always been evident to her that such an income as theirs, under - the direction of two persons so extravagant in their wants, and - heedless of the future, must be very insufficient to their - support; and whenever they changed their quarters, either Jane or - herself were sure of being applied to for some little assistance - towards discharging their bills. Their manner of living, even - when the restoration of peace dismissed them to a home, was - unsettled in the extreme. They were always moving from place to - place in quest of a cheap situation, and always spending more - than they ought. His affection for her soon sunk into - indifference; hers lasted a little longer; and in spite of her - youth and her manners, she retained all the claims to reputation - which her marriage had given her. - - Though Darcy could never receive _him_ at Pemberley, yet, for - Elizabeth’s sake, he assisted him further in his profession. - Lydia was occasionally a visitor there, when her husband was gone - to enjoy himself in London or Bath; and with the Bingleys they - both of them frequently staid so long, that even Bingley’s good - humour was overcome, and he proceeded so far as to _talk_ of - giving them a hint to be gone. - - Miss Bingley was very deeply mortified by Darcy’s marriage; but - as she thought it advisable to retain the right of visiting at - Pemberley, she dropt all her resentment; was fonder than ever of - Georgiana, almost as attentive to Darcy as heretofore, and paid - off every arrear of civility to Elizabeth. - - Pemberley was now Georgiana’s home; and the attachment of the - sisters was exactly what Darcy had hoped to see. They were able - to love each other even as well as they intended. Georgiana had - the highest opinion in the world of Elizabeth; though at first - she often listened with an astonishment bordering on alarm at her - lively, sportive, manner of talking to her brother. He, who had - always inspired in herself a respect which almost overcame her - affection, she now saw the object of open pleasantry. Her mind - received knowledge which had never before fallen in her way. By - Elizabeth’s instructions, she began to comprehend that a woman - may take liberties with her husband which a brother will not - always allow in a sister more than ten years younger than - himself. - - Lady Catherine was extremely indignant on the marriage of her - nephew; and as she gave way to all the genuine frankness of her - character in her reply to the letter which announced its - arrangement, she sent him language so very abusive, especially of - Elizabeth, that for some time all intercourse was at an end. But - at length, by Elizabeth’s persuasion, he was prevailed on to - overlook the offence, and seek a reconciliation; and, after a - little further resistance on the part of his aunt, her resentment - gave way, either to her affection for him, or her curiosity to - see how his wife conducted herself; and she condescended to wait - on them at Pemberley, in spite of that pollution which its woods - had received, not merely from the presence of such a mistress, - but the visits of her uncle and aunt from the city. - - With the Gardiners, they were always on the most intimate terms. - Darcy, as well as Elizabeth, really loved them; and they were - both ever sensible of the warmest gratitude towards the persons - who, by bringing her into Derbyshire, had been the means of - uniting them. - - - - -End of the Project Gutenberg EBook of Pride and Prejudice, by Jane Austen - -*** END OF THIS PROJECT GUTENBERG EBOOK PRIDE AND PREJUDICE *** - -***** This file should be named 1342-0.txt or 1342-0.zip ***** -This and all associated files of various formats will be found in: - http://www.gutenberg.org/1/3/4/1342/ - -Produced by Anonymous Volunteers, and David Widger - -Updated editions will replace the previous one--the old editions -will be renamed. - -Creating the works from public domain print editions means that no -one owns a United States copyright in these works, so the Foundation -(and you!) can copy and distribute it in the United States without -permission and without paying copyright royalties. Special rules, -set forth in the General Terms of Use part of this license, apply to -copying and distributing Project Gutenberg-tm electronic works to -protect the PROJECT GUTENBERG-tm concept and trademark. Project -Gutenberg is a registered trademark, and may not be used if you -charge for the eBooks, unless you receive specific permission. If you -do not charge anything for copies of this eBook, complying with the -rules is very easy. You may use this eBook for nearly any purpose -such as creation of derivative works, reports, performances and -research. They may be modified and printed and given away--you may do -practically ANYTHING with public domain eBooks. Redistribution is -subject to the trademark license, especially commercial -redistribution. - - - -*** START: FULL LICENSE *** - -THE FULL PROJECT GUTENBERG LICENSE -PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK - -To protect the Project Gutenberg-tm mission of promoting the free -distribution of electronic works, by using or distributing this work -(or any other work associated in any way with the phrase “Project -Gutenberg”), you agree to comply with all the terms of the Full Project -Gutenberg-tm License (available with this file or online at -http://gutenberg.org/license). - - -Section 1. General Terms of Use and Redistributing Project Gutenberg-tm -electronic works - -1.A. By reading or using any part of this Project Gutenberg-tm -electronic work, you indicate that you have read, understand, agree to -and accept all the terms of this license and intellectual property -(trademark/copyright) agreement. If you do not agree to abide by all -the terms of this agreement, you must cease using and return or destroy -all copies of Project Gutenberg-tm electronic works in your possession. -If you paid a fee for obtaining a copy of or access to a Project -Gutenberg-tm electronic work and you do not agree to be bound by the -terms of this agreement, you may obtain a refund from the person or -entity to whom you paid the fee as set forth in paragraph 1.E.8. - -1.B. “Project Gutenberg” is a registered trademark. It may only be -used on or associated in any way with an electronic work by people who -agree to be bound by the terms of this agreement. There are a few -things that you can do with most Project Gutenberg-tm electronic works -even without complying with the full terms of this agreement. See -paragraph 1.C below. There are a lot of things you can do with Project -Gutenberg-tm electronic works if you follow the terms of this agreement -and help preserve free future access to Project Gutenberg-tm electronic -works. See paragraph 1.E below. - -1.C. The Project Gutenberg Literary Archive Foundation (“the Foundation” - or PGLAF), owns a compilation copyright in the collection of Project -Gutenberg-tm electronic works. Nearly all the individual works in the -collection are in the public domain in the United States. If an -individual work is in the public domain in the United States and you are -located in the United States, we do not claim a right to prevent you from -copying, distributing, performing, displaying or creating derivative -works based on the work as long as all references to Project Gutenberg -are removed. Of course, we hope that you will support the Project -Gutenberg-tm mission of promoting free access to electronic works by -freely sharing Project Gutenberg-tm works in compliance with the terms of -this agreement for keeping the Project Gutenberg-tm name associated with -the work. You can easily comply with the terms of this agreement by -keeping this work in the same format with its attached full Project -Gutenberg-tm License when you share it without charge with others. - -1.D. The copyright laws of the place where you are located also govern -what you can do with this work. Copyright laws in most countries are in -a constant state of change. If you are outside the United States, check -the laws of your country in addition to the terms of this agreement -before downloading, copying, displaying, performing, distributing or -creating derivative works based on this work or any other Project -Gutenberg-tm work. The Foundation makes no representations concerning -the copyright status of any work in any country outside the United -States. - -1.E. Unless you have removed all references to Project Gutenberg: - -1.E.1. The following sentence, with active links to, or other immediate -access to, the full Project Gutenberg-tm License must appear prominently -whenever any copy of a Project Gutenberg-tm work (any work on which the -phrase “Project Gutenberg” appears, or with which the phrase “Project -Gutenberg” is associated) is accessed, displayed, performed, viewed, -copied or distributed: - -This eBook is for the use of anyone anywhere at no cost and with -almost no restrictions whatsoever. You may copy it, give it away or -re-use it under the terms of the Project Gutenberg License included -with this eBook or online at www.gutenberg.org - -1.E.2. If an individual Project Gutenberg-tm electronic work is derived -from the public domain (does not contain a notice indicating that it is -posted with permission of the copyright holder), the work can be copied -and distributed to anyone in the United States without paying any fees -or charges. If you are redistributing or providing access to a work -with the phrase “Project Gutenberg” associated with or appearing on the -work, you must comply either with the requirements of paragraphs 1.E.1 -through 1.E.7 or obtain permission for the use of the work and the -Project Gutenberg-tm trademark as set forth in paragraphs 1.E.8 or -1.E.9. - -1.E.3. If an individual Project Gutenberg-tm electronic work is posted -with the permission of the copyright holder, your use and distribution -must comply with both paragraphs 1.E.1 through 1.E.7 and any additional -terms imposed by the copyright holder. Additional terms will be linked -to the Project Gutenberg-tm License for all works posted with the -permission of the copyright holder found at the beginning of this work. - -1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm -License terms from this work, or any files containing a part of this -work or any other work associated with Project Gutenberg-tm. - -1.E.5. Do not copy, display, perform, distribute or redistribute this -electronic work, or any part of this electronic work, without -prominently displaying the sentence set forth in paragraph 1.E.1 with -active links or immediate access to the full terms of the Project -Gutenberg-tm License. - -1.E.6. You may convert to and distribute this work in any binary, -compressed, marked up, nonproprietary or proprietary form, including any -word processing or hypertext form. However, if you provide access to or -distribute copies of a Project Gutenberg-tm work in a format other than -“Plain Vanilla ASCII” or other format used in the official version -posted on the official Project Gutenberg-tm web site (www.gutenberg.org), -you must, at no additional cost, fee or expense to the user, provide a -copy, a means of exporting a copy, or a means of obtaining a copy upon -request, of the work in its original “Plain Vanilla ASCII” or other -form. Any alternate format must include the full Project Gutenberg-tm -License as specified in paragraph 1.E.1. - -1.E.7. Do not charge a fee for access to, viewing, displaying, -performing, copying or distributing any Project Gutenberg-tm works -unless you comply with paragraph 1.E.8 or 1.E.9. - -1.E.8. You may charge a reasonable fee for copies of or providing -access to or distributing Project Gutenberg-tm electronic works provided -that - -- You pay a royalty fee of 20% of the gross profits you derive from - the use of Project Gutenberg-tm works calculated using the method - you already use to calculate your applicable taxes. The fee is - owed to the owner of the Project Gutenberg-tm trademark, but he - has agreed to donate royalties under this paragraph to the - Project Gutenberg Literary Archive Foundation. Royalty payments - must be paid within 60 days following each date on which you - prepare (or are legally required to prepare) your periodic tax - returns. Royalty payments should be clearly marked as such and - sent to the Project Gutenberg Literary Archive Foundation at the - address specified in Section 4, “Information about donations to - the Project Gutenberg Literary Archive Foundation.” - -- You provide a full refund of any money paid by a user who notifies - you in writing (or by e-mail) within 30 days of receipt that s/he - does not agree to the terms of the full Project Gutenberg-tm - License. You must require such a user to return or - destroy all copies of the works possessed in a physical medium - and discontinue all use of and all access to other copies of - Project Gutenberg-tm works. - -- You provide, in accordance with paragraph 1.F.3, a full refund of any - money paid for a work or a replacement copy, if a defect in the - electronic work is discovered and reported to you within 90 days - of receipt of the work. - -- You comply with all other terms of this agreement for free - distribution of Project Gutenberg-tm works. - -1.E.9. If you wish to charge a fee or distribute a Project Gutenberg-tm -electronic work or group of works on different terms than are set -forth in this agreement, you must obtain permission in writing from -both the Project Gutenberg Literary Archive Foundation and Michael -Hart, the owner of the Project Gutenberg-tm trademark. Contact the -Foundation as set forth in Section 3 below. - -1.F. - -1.F.1. Project Gutenberg volunteers and employees expend considerable -effort to identify, do copyright research on, transcribe and proofread -public domain works in creating the Project Gutenberg-tm -collection. Despite these efforts, Project Gutenberg-tm electronic -works, and the medium on which they may be stored, may contain -“Defects,” such as, but not limited to, incomplete, inaccurate or -corrupt data, transcription errors, a copyright or other intellectual -property infringement, a defective or damaged disk or other medium, a -computer virus, or computer codes that damage or cannot be read by -your equipment. - -1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the “Right -of Replacement or Refund” described in paragraph 1.F.3, the Project -Gutenberg Literary Archive Foundation, the owner of the Project -Gutenberg-tm trademark, and any other party distributing a Project -Gutenberg-tm electronic work under this agreement, disclaim all -liability to you for damages, costs and expenses, including legal -fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT -LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE -PROVIDED IN PARAGRAPH F3. YOU AGREE THAT THE FOUNDATION, THE -TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE -LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR -INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH -DAMAGE. - -1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a -defect in this electronic work within 90 days of receiving it, you can -receive a refund of the money (if any) you paid for it by sending a -written explanation to the person you received the work from. If you -received the work on a physical medium, you must return the medium with -your written explanation. The person or entity that provided you with -the defective work may elect to provide a replacement copy in lieu of a -refund. If you received the work electronically, the person or entity -providing it to you may choose to give you a second opportunity to -receive the work electronically in lieu of a refund. If the second copy -is also defective, you may demand a refund in writing without further -opportunities to fix the problem. - -1.F.4. Except for the limited right of replacement or refund set forth -in paragraph 1.F.3, this work is provided to you 'AS-IS' WITH NO OTHER -WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR ANY PURPOSE. - -1.F.5. Some states do not allow disclaimers of certain implied -warranties or the exclusion or limitation of certain types of damages. -If any disclaimer or limitation set forth in this agreement violates the -law of the state applicable to this agreement, the agreement shall be -interpreted to make the maximum disclaimer or limitation permitted by -the applicable state law. The invalidity or unenforceability of any -provision of this agreement shall not void the remaining provisions. - -1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the -trademark owner, any agent or employee of the Foundation, anyone -providing copies of Project Gutenberg-tm electronic works in accordance -with this agreement, and any volunteers associated with the production, -promotion and distribution of Project Gutenberg-tm electronic works, -harmless from all liability, costs and expenses, including legal fees, -that arise directly or indirectly from any of the following which you do -or cause to occur: (a) distribution of this or any Project Gutenberg-tm -work, (b) alteration, modification, or additions or deletions to any -Project Gutenberg-tm work, and (c) any Defect you cause. - - -Section 2. Information about the Mission of Project Gutenberg-tm - -Project Gutenberg-tm is synonymous with the free distribution of -electronic works in formats readable by the widest variety of computers -including obsolete, old, middle-aged and new computers. It exists -because of the efforts of hundreds of volunteers and donations from -people in all walks of life. - -Volunteers and financial support to provide volunteers with the -assistance they need, are critical to reaching Project Gutenberg-tm’s -goals and ensuring that the Project Gutenberg-tm collection will -remain freely available for generations to come. In 2001, the Project -Gutenberg Literary Archive Foundation was created to provide a secure -and permanent future for Project Gutenberg-tm and future generations. -To learn more about the Project Gutenberg Literary Archive Foundation -and how your efforts and donations can help, see Sections 3 and 4 -and the Foundation web page at http://www.pglaf.org. - - -Section 3. Information about the Project Gutenberg Literary Archive -Foundation - -The Project Gutenberg Literary Archive Foundation is a non profit -501(c)(3) educational corporation organized under the laws of the -state of Mississippi and granted tax exempt status by the Internal -Revenue Service. The Foundation’s EIN or federal tax identification -number is 64-6221541. Its 501(c)(3) letter is posted at -http://pglaf.org/fundraising. Contributions to the Project Gutenberg -Literary Archive Foundation are tax deductible to the full extent -permitted by U.S. federal laws and your state’s laws. - -The Foundation’s principal office is located at 4557 Melan Dr. S. -Fairbanks, AK, 99712., but its volunteers and employees are scattered -throughout numerous locations. Its business office is located at -809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887, email -business@pglaf.org. Email contact links and up to date contact -information can be found at the Foundation’s web site and official -page at http://pglaf.org - -For additional contact information: - Dr. Gregory B. Newby - Chief Executive and Director - gbnewby@pglaf.org - - -Section 4. Information about Donations to the Project Gutenberg -Literary Archive Foundation - -Project Gutenberg-tm depends upon and cannot survive without wide -spread public support and donations to carry out its mission of -increasing the number of public domain and licensed works that can be -freely distributed in machine readable form accessible by the widest -array of equipment including outdated equipment. Many small donations -($1 to $5,000) are particularly important to maintaining tax exempt -status with the IRS. - -The Foundation is committed to complying with the laws regulating -charities and charitable donations in all 50 states of the United -States. Compliance requirements are not uniform and it takes a -considerable effort, much paperwork and many fees to meet and keep up -with these requirements. We do not solicit donations in locations -where we have not received written confirmation of compliance. To -SEND DONATIONS or determine the status of compliance for any -particular state visit http://pglaf.org - -While we cannot and do not solicit contributions from states where we -have not met the solicitation requirements, we know of no prohibition -against accepting unsolicited donations from donors in such states who -approach us with offers to donate. - -International donations are gratefully accepted, but we cannot make -any statements concerning tax treatment of donations received from -outside the United States. U.S. laws alone swamp our small staff. - -Please check the Project Gutenberg Web pages for current donation -methods and addresses. Donations are accepted in a number of other -ways including checks, online payments and credit card donations. -To donate, please visit: http://pglaf.org/donate - - -Section 5. General Information About Project Gutenberg-tm electronic -works. - -Professor Michael S. Hart is the originator of the Project Gutenberg-tm -concept of a library of electronic works that could be freely shared -with anyone. For thirty years, he produced and distributed Project -Gutenberg-tm eBooks with only a loose network of volunteer support. - - -Project Gutenberg-tm eBooks are often created from several printed -editions, all of which are confirmed as Public Domain in the U.S. -unless a copyright notice is included. Thus, we do not necessarily -keep eBooks in compliance with any particular paper edition. - - -Most people start at our Web site which has the main PG search facility: - - http://www.gutenberg.org - -This Web site includes information about Project Gutenberg-tm, -including how to make donations to the Project Gutenberg Literary -Archive Foundation, how to help produce our new eBooks, and how to -subscribe to our email newsletter to hear about new eBooks. -` diff --git a/toolkit/stringutils/highlight.go b/toolkit/stringutils/highlight.go deleted file mode 100644 index c609cf2d..00000000 --- a/toolkit/stringutils/highlight.go +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "strings" -) - -// HighlightString takes in some content and locations and then inserts in/out -// strings which can be used for highlighting around matching terms. For example -// you could pass in "test" and have it return "test" -// locations accepts output from regex.FindAllIndex IndexAllIgnoreCase or IndexAll -func HighlightString(content string, locations [][]int, in string, out string) string { - var str strings.Builder - - end := -1 - var found bool - - // Profiles show that most time is spent looking against the locations - // so we generated a cache quickly to speed that process up - highlightCache := map[int]bool{} - for _, val := range locations { - highlightCache[val[0]] = true - } - - // Range over str which is rune aware so even if we get invalid - // locations we should hopefully ignore them as the byte offset wont - // match - for i, x := range content { - found = false - - _, ok := highlightCache[i] - // Find which of the locations match - // and if so write the start str - if ok { - for _, val := range locations { - - // We have a match where the outer index matches - // against the val[0] which contains the location of the match - if i == val[0] { - // We only write the found str once per match and - // only if we are not in the middle of one - if !found && end <= 0 { - str.WriteString(in) - found = true - } - - // Determine the expected end location for this match - // and only if its further than the expected end do we - // change to deal with overlaps if say we are trying to match - // on t and tes against test where we want tes as the longest - // match to be the end that's written - y := val[1] - 1 // val[1] in this case is the length of the match - if y > end { - end = y - } - } - } - } - - // This deals with characters that are multi-byte and as such we never range over - // the rest and as such we need to remember to close them off if we have gone past - // their end. As such this needs to come before we write the current byte - if end > 0 && i > end { - str.WriteString(out) - end = 0 - } - - str.WriteString(string(x)) - - // If at the end, and its not -1 meaning the first char - // which should never happen (I hope!) then write the end str - if i == end && end != -1 { - str.WriteString(out) - end = 0 - } - } - - return str.String() -} diff --git a/toolkit/stringutils/highlight_test.go b/toolkit/stringutils/highlight_test.go deleted file mode 100644 index 283c3336..00000000 --- a/toolkit/stringutils/highlight_test.go +++ /dev/null @@ -1,169 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "regexp" - "testing" -) - -func TestHighlightStringSimple(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 4}) - - got := HighlightString("this", loc, "[in]", "[out]") - - expected := "[in]this[out]" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringCheckInOut(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 4}) - - got := HighlightString("this", loc, "__", "__") - - expected := "__this__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringCheck2(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 4}) - - got := HighlightString("bing", loc, "__", "__") - - expected := "__bing__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringCheckTwoWords(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 4}) - loc = append(loc, []int{5, 9}) - - got := HighlightString("this this", loc, "__", "__") - - expected := "__this__ __this__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringCheckMixedWords(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 4}) - loc = append(loc, []int{5, 9}) - loc = append(loc, []int{10, 19}) - - got := HighlightString("this this something", loc, "__", "__") - - expected := "__this__ __this__ __something__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringOverlapStart(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 1}) - loc = append(loc, []int{0, 4}) - - got := HighlightString("THIS", loc, "__", "__") - - expected := "__THIS__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringOverlapMiddle(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 4}) - loc = append(loc, []int{1, 2}) - - got := HighlightString("this", loc, "__", "__") - - expected := "__this__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringNoOverlapMiddleNextSame(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 1}) - loc = append(loc, []int{1, 2}) - - got := HighlightString("this", loc, "__", "__") - - expected := "__t____h__is" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestHighlightStringOverlapMiddleLonger(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{0, 2}) - loc = append(loc, []int{1, 4}) - - got := HighlightString("this", loc, "__", "__") - - expected := "__this__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestBugOne(t *testing.T) { - loc := [][]int{} - loc = append(loc, []int{10, 18}) - - got := HighlightString("this is unexpected", loc, "__", "__") - - expected := "this is un__expected__" - if got != expected { - t.Error("Expected", expected, "got", got) - } -} - -func TestIntegrationRegex(t *testing.T) { - r := regexp.MustCompile(`1`) - haystack := "111" - - loc := r.FindAllIndex([]byte(haystack), -1) - got := HighlightString(haystack, loc, "__", "__") - - if got != "__1____1____1__" { - t.Error("Expected", "__1____1____1__", "got", got) - } -} - -func TestIntegrationIndexAll(t *testing.T) { - haystack := "111" - - loc := IndexAll(haystack, "1", -1) - got := HighlightString(haystack, loc, "__", "__") - - if got != "__1____1____1__" { - t.Error("Expected", "__1____1____1__", "got", got) - } -} - -func TestIntegrationIndexAllIgnoreCaseUnicode(t *testing.T) { - haystack := "111" - - loc := IndexAllIgnoreCase(haystack, "1", -1) - got := HighlightString(haystack, loc, "__", "__") - - if got != "__1____1____1__" { - t.Error("Expected", "__1____1____1__", "got", got) - } -} diff --git a/toolkit/stringutils/index.go b/toolkit/stringutils/index.go deleted file mode 100644 index 29ac8e32..00000000 --- a/toolkit/stringutils/index.go +++ /dev/null @@ -1,318 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "math" - "sort" - "strings" - "sync" - "unicode/utf8" -) - -// IndexAll extracts all of the locations of a string inside another string -// up-to the defined limit and does so without regular expressions -// which makes it faster than FindAllIndex in most situations while -// not being any slower. It performs worst when working against random -// data. -// -// Some benchmark results to illustrate the point (find more in index_benchmark_test.go) -// -// BenchmarkFindAllIndex-8 2458844 480.0 ns/op -// BenchmarkIndexAll-8 14819680 79.6 ns/op -// -// For pure literal searches IE no regular expression logic this method -// is a drop in replacement for re.FindAllIndex but generally much faster. -// -// Similar to how FindAllIndex the limit option can be passed -1 -// to get all matches. -// -// Note that this method is explicitly case sensitive in its matching. -// A return value of nil indicates no match. -func IndexAll(haystack string, needle string, limit int) [][]int { - // The below needed to avoid timeout crash found using go-fuzz - if len(haystack) == 0 || len(needle) == 0 { - return nil - } - - // Return contains a slice of slices where index 0 is the location of the match in bytes - // and index 1 contains the end location in bytes of the match - var locs [][]int - - // Perform the first search outside the main loop to make the method - // easier to understand - searchText := haystack - offSet := 0 - loc := strings.Index(searchText, needle) - - if limit <= -1 { - // Similar to how regex FindAllString works - // if we have -1 as the limit set to max to - // try to get everything - limit = math.MaxInt32 - } else { - // Increment by one because we do count++ at the start of the loop - // and as such there is a off by 1 error in the return otherwise - limit++ - } - - var count int - for loc != -1 { - count++ - - if count == limit { - break - } - - // trim off the portion we already searched, and look from there - searchText = searchText[loc+len(needle):] - locs = append(locs, []int{loc + offSet, loc + offSet + len(needle)}) - - // We need to keep the offset of the match so we continue searching - offSet += loc + len(needle) - - // strings.Index does checks of if the string is empty so we don't need - // to explicitly do it ourselves - loc = strings.Index(searchText, needle) - } - - // Retain compatibility with FindAllIndex method - if len(locs) == 0 { - return nil - } - - return locs -} - -// if the IndexAllIgnoreCase method is called frequently with the same patterns -// (which is a common case) this is here to speed up the case permutations -// it is limited to a size of 10 so it never gets that large but really -// allows things to run faster -var _permuteCache = map[string][]string{} -var _permuteCacheLock = sync.Mutex{} - -// CacheSize this is public so it can be modified depending on project needs -// you can increase this value to cache more of the case permutations which -// can improve performance if doing the same searches over and over -var CacheSize = 10 - -// IndexAllIgnoreCase extracts all of the locations of a string inside another string -// up-to the defined limit. It is designed to be faster than uses of FindAllIndex with -// case insensitive matching enabled, by looking for string literals first and then -// checking for exact matches. It also does so in a unicode aware way such that a search -// for S will search for S s and Åŋ which a simple strings.ToLower over the haystack -// and the needle will not. -// -// The result is the ability to search for literals without hitting the regex engine -// which can at times be horribly slow. This by contrast is much faster. See -// index_ignorecase_benchmark_test.go for some head to head results. Generally -// so long as we aren't dealing with random data this method should be considerably -// faster (in some cases thousands of times) or just as fast. Of course it cannot -// do regular expressions, but that's fine. -// -// For pure literal searches IE no regular expression logic this method -// is a drop in replacement for re.FindAllIndex but generally much faster. -func IndexAllIgnoreCase(haystack string, needle string, limit int) [][]int { - // The below needed to avoid timeout crash found using go-fuzz - if len(haystack) == 0 || len(needle) == 0 { - return nil - } - - // One of the problems with finding locations ignoring case is that - // the different case representations can have different byte counts - // which means the locations using strings or bytes Index can be off - // if you apply strings.ToLower to your haystack then use strings.Index. - // - // This can be overcome using regular expressions but suffers the penalty - // of hitting the regex engine and paying the price of case - // insensitive match there. - // - // This method tries something else which is used by some regex engines - // such as the one in Rust where given a str literal if you get - // all the case options of that such as turning foo into foo Foo fOo FOo foO FoO fOO FOO - // and then use Boyer-Moore or some such for those. Of course using something - // like Aho-Corasick or Rabin-Karp to get multi match would be a better idea so you - // can match all of the input in one pass. - // - // If the needle is over some amount of characters long you chop off the first few - // and then search for those. However this means you are not finding actual matches and as such - // you the need to validate a potential match after you have found one. - // The confirmation match is done in a loop because for some literals regular expression - // is still to slow, although for most its a valid option. - var locs [][]int - - // Char limit is the cut-off where we switch from all case permutations - // to just the first 3 and then check for an actual match - // in my tests 3 speeds things up the most against test data - // of many famous books concatenated together and large - // amounts of data from /dev/urandom - var charLimit = 3 - - if utf8.RuneCountInString(needle) <= charLimit { - // We are below the limit we set, so get all the search - // terms and search for that - - // Generally speaking I am against caches inside libraries but in this case... - // when the IndexAllIgnoreCase method is called repeatedly it quite often - // ends up performing case folding on the same thing over and over again which - // can become the most expensive operation. So we keep a VERY small cache - // to avoid that being an issue. - _permuteCacheLock.Lock() - searchTerms, ok := _permuteCache[needle] - if !ok { - if len(_permuteCache) > CacheSize { - _permuteCache = map[string][]string{} - } - searchTerms = PermuteCaseFolding(needle) - _permuteCache[needle] = searchTerms - } - _permuteCacheLock.Unlock() - - // This is using IndexAll in a loop which was faster than - // any implementation of Aho-Corasick or Boyer-Moore I tried - // but in theory Aho-Corasick / Rabin-Karp or even a modified - // version of Boyer-Moore should be faster than this. - // Especially since they should be able to do multiple comparisons - // at the same time. - // However after some investigation it turns out that this turns - // into a fancy vector instruction on AMD64 (which is all we care about) - // and as such its pretty hard to beat. - for _, term := range searchTerms { - locs = append(locs, IndexAll(haystack, term, limit)...) - } - - // if the limit is not -1 we need to sort and return the first X results so we maintain compatibility with how - // FindAllIndex would work - if limit > 0 && len(locs) > limit { - - // now sort the results to we can get the first X results - // Now rank based on which ones are the best and sort them on that rank - // then get the top amount and the surrounding lines - sort.Slice(locs, func(i, j int) bool { - return locs[i][0] < locs[j][0] - }) - - return locs[:limit] - } - } else { - // Over the character limit so look for potential matches and only then check to find real ones - - // Note that we have to use runes here to avoid cutting bytes off so - // cast things around to ensure it works - needleRune := []rune(needle) - - // Generally speaking I am against caches inside libraries but in this case... - // when the IndexAllIgnoreCase method is called repeatedly it quite often - // ends up performing case folding on the same thing over and over again which - // can become the most expensive operation. So we keep a VERY small cache - // to avoid that being an issue. - _permuteCacheLock.Lock() - searchTerms, ok := _permuteCache[string(needleRune[:charLimit])] - if !ok { - if len(_permuteCache) > CacheSize { - _permuteCache = map[string][]string{} - } - searchTerms = PermuteCaseFolding(string(needleRune[:charLimit])) - _permuteCache[string(needleRune[:charLimit])] = searchTerms - } - _permuteCacheLock.Unlock() - - // This is using IndexAll in a loop which was faster than - // any implementation of Aho-Corasick or Boyer-Moore I tried - // but in theory Aho-Corasick / Rabin-Karp or even a modified - // version of Boyer-Moore should be faster than this. - // Especially since they should be able to do multiple comparisons - // at the same time. - // However after some investigation it turns out that this turns - // into a fancy vector instruction on AMD64 (which is all we care about) - // and as such its pretty hard to beat. - haystackRune := []rune(haystack) - - for _, term := range searchTerms { - potentialMatches := IndexAll(haystack, term, -1) - - for _, match := range potentialMatches { - // We have a potential match, so now see if it actually matches - // by getting the actual value out of our haystack - if len(haystackRune) < match[0]+len(needleRune) { - continue - } - - // Because the length of the needle might be different to what we just found as a match - // based on byte size we add enough extra on the end to deal with the difference - e := len(needle) + len(needle) - 1 - for match[0]+e > len(haystack) { - e-- - } - - // Cut off the number at the end to the number we need which is the length of the needle runes - toMatchRune := []rune(haystack[match[0] : match[0]+e]) - toMatchEnd := len(needleRune) - if len(toMatchRune) < len(needleRune) { - toMatchEnd = len(toMatchRune) - } - - toMatch := toMatchRune[:toMatchEnd] - - // old logic here - //toMatch = []rune(haystack[match[0] : match[0]+e])[:len(needleRune)] - - // what we need to do is iterate the runes of the haystack portion we are trying to - // match and confirm that the same rune position is a actual match or case fold match - // if they are keep looking, if they are not bail out as its not a real match - isMatch := false - for i := 0; i < len(toMatch); i++ { - isMatch = false - - // Check against the actual term and if that's a match we can avoid folding - // and doing those comparisons to hopefully save some CPU time - if toMatch[i] == needleRune[i] { - isMatch = true - } else { - // Not a match so case fold to actually check - for _, j := range AllSimpleFold(toMatch[i]) { - if j == needleRune[i] { - isMatch = true - } - } - } - - // Bail out as there is no point to continue checking at this point - // as we found no match and there is no point burning more CPU checking - if !isMatch { - break - } - } - - if isMatch { - // When we have confirmed a match we add it to our total - // but adjust the positions to the match and the length of the - // needle to ensure the byte count lines up - locs = append(locs, []int{match[0], match[0] + len(string(toMatch))}) - } - - } - } - - // if the limit is not -1 we need to sort and return the first X results so we maintain compatibility with how - // FindAllIndex would work - if limit > 0 && len(locs) > limit { - - // now sort the results to we can get the first X results - // Now rank based on which ones are the best and sort them on that rank - // then get the top amount and the surrounding lines - sort.Slice(locs, func(i, j int) bool { - return locs[i][0] < locs[j][0] - }) - - return locs[:limit] - } - } - - // Retain compatibility with FindAllIndex method - if len(locs) == 0 { - return nil - } - - return locs -} diff --git a/toolkit/stringutils/index_benchmark_test.go b/toolkit/stringutils/index_benchmark_test.go deleted file mode 100644 index 61a6c631..00000000 --- a/toolkit/stringutils/index_benchmark_test.go +++ /dev/null @@ -1,216 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "regexp" - "testing" -) - -var testMatchEndCase = `1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1test` -var testUnicodeMatchEndCase = `ȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚ Čštest` - -var testMatchEndCaseLarge = `1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 1test` -var testUnicodeMatchEndCaseLarge = `ȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚ Čštest` - -func BenchmarkFindAllIndex(b *testing.B) { - r := regexp.MustCompile(`test`) - haystack := []byte(testMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexAll(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAll(testMatchEndCase, "test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexLarge(b *testing.B) { - r := regexp.MustCompile(`test`) - haystack := []byte(testMatchEndCaseLarge) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexAllLarge(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAll(testMatchEndCaseLarge, "test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexUnicode(b *testing.B) { - r := regexp.MustCompile(`test`) - haystack := []byte(testUnicodeMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexAllUnicode(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAll(testUnicodeMatchEndCase, "test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexUnicodeLarge(b *testing.B) { - r := regexp.MustCompile(`test`) - haystack := []byte(testUnicodeMatchEndCaseLarge) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexAllUnicodeLarge(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAll(testUnicodeMatchEndCaseLarge, "test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -// This benchmark simulates a bad case of there being many -// partial matches where the first character in the needle -// can be found throughout the haystack -func BenchmarkFindAllIndexManyPartialMatches(b *testing.B) { - r := regexp.MustCompile(`1test`) - haystack := []byte(testMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -// This benchmark simulates a bad case of there being many -// partial matches where the first character in the needle -// can be found throughout the haystack -func BenchmarkIndexAllManyPartialMatches(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAll(testMatchEndCase, "1test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -// This benchmark simulates a bad case of there being many -// partial matches where the first character in the needle -// can be found throughout the haystack -func BenchmarkFindAllIndexUnicodeManyPartialMatches(b *testing.B) { - r := regexp.MustCompile(`Čštest`) - haystack := []byte(testUnicodeMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -// This benchmark simulates a bad case of there being many -// partial matches where the first character in the needle -// can be found throughout the haystack -func BenchmarkIndexAllUnicodeManyPartialMatches(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAll(testUnicodeMatchEndCase, "Čštest", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexUnicodeManyPartialMatchesVeryLarge(b *testing.B) { - r := regexp.MustCompile(`Čštest`) - - var large string - for i := 0; i <= 100; i++ { - large += testUnicodeMatchEndCaseLarge - } - - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 101 { - b.Error("Expected 101 match got", len(matches)) - } - } -} - -func BenchmarkIndexAllUnicodeManyPartialMatchesVeryLarge(b *testing.B) { - var large string - for i := 0; i <= 100; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAll(large, "Čštest", -1) - if len(matches) != 101 { - b.Error("Expected 101 match got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexUnicodeManyPartialMatchesSuperLarge(b *testing.B) { - r := regexp.MustCompile(`Čštest`) - - var large string - for i := 0; i <= 500; i++ { - large += testUnicodeMatchEndCaseLarge - } - - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 501 { - b.Error("Expected 501 match got", len(matches)) - } - } -} - -func BenchmarkIndexAllUnicodeManyPartialMatchesSuperLarge(b *testing.B) { - var large string - for i := 0; i <= 500; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAll(large, "Čštest", -1) - if len(matches) != 501 { - b.Error("Expected 501 match got", len(matches)) - } - } -} diff --git a/toolkit/stringutils/index_bug_test.go b/toolkit/stringutils/index_bug_test.go deleted file mode 100644 index ce109861..00000000 --- a/toolkit/stringutils/index_bug_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package stringutils - -import ( - "strings" - "testing" -) - -var broken = `list1=[0,1,2,3,4,5,6,7,8,9]#åˆķä―œäļ€äļŠ0-9įš„列čĄĻ -list1.reverse()#reverse()å‡―æ•°į›īæŽĨåŊđ列čĄĻäļ­įš„å…ƒįī č·ĩčĄŒåå‘ -print(list1) - -# the following line is where it is breaking -list2=[str(i) for i in list1]#将列čĄĻäļ­įš„æŊäļ€äļŠæ•°å­—č―ŽæĒ成字įŽĶäļē -print(list2) - -str1="".join(list2)#通čŋ‡join()å‡―æ•°ïžŒå°†åˆ—čĄĻäļ­įš„单äļŠå­—įŽĶäļēæ‹žæŽĨ成äļ€æ•īäļŠå­—įŽĶäļē -print(str1) - -str2=str1[2:8]#åŊđ字įŽĶäļēäļ­įš„įŽŽäļ‰åˆ°įŽŽå…Ŧ字įŽĶčŋ›čĄŒåˆ‡į‰‡ -print(str2) - -str3=str2[::-1]#通čŋ‡åģčūđįŽŽäļ€äļŠåž€å§‹åŊđæ•īäļŠå­—įŽĶäļē垀始切į‰‡ïžŒäŧĨåŪžįŽ°å…ķįŋŧč―Ž -print(str3) - -i=int(str3)#int()å‡―æ•°čŊ•čŪē字įŽĶäļēč―ŽæĒäļšæ•ī数 -print(i)#čŋ™é‡Œčū“凚įš„įŧ“æžœč™―į„ķäļŽprint(str3)į›ļåŒïžŒä―†æ˜Ŋ性čīĻæ˜ŊäļåŒįš„ - -#č―ŽæĒ成䚌čŋ›åˆķ、å…Ŧčŋ›åˆķ、十六čŋ›åˆķ -print('č―ŽæĒ成䚌čŋ›åˆķ:',bin(i),'č―ŽæĒ成å…Ŧčŋ›åˆķ:',oct(i), 'č―ŽæĒ成十六čŋ›åˆķ:',hex(i)) -#乌čŋ›åˆķ、å…Ŧčŋ›åˆķ、十六čŋ›åˆķčŋ™å‡ äļŠčŋ›åˆķį›ļäš’č―ŽæĒįš„æ—ķå€™ïžŒéƒ―čĶå…ˆč―ŽæĒäļšåčŋ›åˆķint()` - -func TestIndexAllUnicodeOffset(t *testing.T) { - lines := strings.Split(strings.Replace(broken, "\r\n", "\n", -1), "\n") - - // this has an exception - for _, l := range lines { - IndexAllIgnoreCase(l, "list1=[0,1,2,3,4,5,6,7,8,9]#åˆķä―œäļ€äļŠ0", -1) - } -} diff --git a/toolkit/stringutils/index_fuzz_test.go b/toolkit/stringutils/index_fuzz_test.go deleted file mode 100644 index db666949..00000000 --- a/toolkit/stringutils/index_fuzz_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package stringutils - -import ( - "testing" -) - -func FuzzIndexAllIgnoreCase(f *testing.F) { - type caseType struct { - Haystack string - Needle string - Count int - } - - testcases := []caseType{{ - Haystack: testUnicodeMatchEndCaseLarge, - Needle: testUnicodeMatchEndCaseLarge[:5], - Count: 9, - }, - { - Haystack: testMatchEndCaseLarge, - Needle: testUnicodeMatchEndCaseLarge[:9], - Count: 10, - }, - { - Haystack: `list1=[0,1,2,3,4,5,6,7,8,9]#åˆķä―œäļ€äļŠ0-9įš„列čĄĻ -list1.reverse()#reverse()å‡―æ•°į›īæŽĨåŊđ列čĄĻäļ­įš„å…ƒįī č·ĩčĄŒåå‘ -print(list1) - -# the following line is where it is breaking -list2=[str(i) for i in list1]#将列čĄĻäļ­įš„æŊäļ€äļŠæ•°å­—č―ŽæĒ成字įŽĶäļē -print(list2) - -str1="".join(list2)#通čŋ‡join()å‡―æ•°ïžŒå°†åˆ—čĄĻäļ­įš„单äļŠå­—įŽĶäļēæ‹žæŽĨ成äļ€æ•īäļŠå­—įŽĶäļē -print(str1) - -str2=str1[2:8]#åŊđ字įŽĶäļēäļ­įš„įŽŽäļ‰åˆ°įŽŽå…Ŧ字įŽĶčŋ›čĄŒåˆ‡į‰‡ -print(str2) - -str3=str2[::-1]#通čŋ‡åģčūđįŽŽäļ€äļŠåž€å§‹åŊđæ•īäļŠå­—įŽĶäļē垀始切į‰‡ïžŒäŧĨåŪžįŽ°å…ķįŋŧč―Ž -print(str3) - -i=int(str3)#int()å‡―æ•°čŊ•čŪē字įŽĶäļēč―ŽæĒäļšæ•ī数 -print(i)#čŋ™é‡Œčū“凚įš„įŧ“æžœč™―į„ķäļŽprint(str3)į›ļåŒïžŒä―†æ˜Ŋ性čīĻæ˜ŊäļåŒįš„ - -#č―ŽæĒ成䚌čŋ›åˆķ、å…Ŧčŋ›åˆķ、十六čŋ›åˆķ -print('č―ŽæĒ成䚌čŋ›åˆķ:',bin(i),'č―ŽæĒ成å…Ŧčŋ›åˆķ:',oct(i), 'č―ŽæĒ成十六čŋ›åˆķ:',hex(i)) -#乌čŋ›åˆķ、å…Ŧčŋ›åˆķ、十六čŋ›åˆķčŋ™å‡ äļŠčŋ›åˆķį›ļäš’č―ŽæĒįš„æ—ķå€™ïžŒéƒ―čĶå…ˆč―ŽæĒäļšåčŋ›åˆķint()`, - Count: -1, - }, - { - Haystack: `func MultipleInputs(a, b int, name string) { - // ... fancy code goes here -} - -func FuzzMultipleInputs(f *testing.F) { - // We can add Multiple Seeds, but it has to be the same order as the input parameters for MultipleInputs - f.Add(10,20,"John the Ripper") - f.Fuzz(func(t *testing.T,a int,b int,name string){ - MultipleInputs(a,b,name) - }) -}`, - Needle: `jp morgan āĪŠāĨāĪ°āĨ€āĪŠāĨ‡āĪĄ`, - Count: 10, - }, - { - Haystack: `func MultipleInputs(a, b int, name string) { - // ... fancy code goes here -} - -func FuzzMultipleInputs(f *testing.F) { - // We can add Multiple Seeds, but it has to be the same order as the input parameters for MultipleInputs - f.Add(10,20,"John the Ripper") - f.Fuzz(func(t *testing.T,a int,b int,name string){ - MultipleInputs(a,b,name) - }) -}`, - Needle: `tes`, - Count: -1, - }, - } - for _, tc := range testcases { - f.Add(tc.Haystack, tc.Needle, tc.Count) // Use f.Add to provide a seed corpus - } - - f.Fuzz(func(t *testing.T, h string, n string, c int) { - _ = IndexAllIgnoreCase(h, n, c) - }) -} diff --git a/toolkit/stringutils/index_ignorecase_benchmark_test.go b/toolkit/stringutils/index_ignorecase_benchmark_test.go deleted file mode 100644 index ac497a18..00000000 --- a/toolkit/stringutils/index_ignorecase_benchmark_test.go +++ /dev/null @@ -1,513 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "regexp" - "testing" -) - -func BenchmarkFindAllIndexCaseInsensitive(b *testing.B) { - r := regexp.MustCompile(`(?i)test`) - haystack := []byte(testMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexesAllIgnoreCaseCaseInsensitive(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(testMatchEndCase, "test", -1) - - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexLargeCaseInsensitive(b *testing.B) { - r := regexp.MustCompile(`(?i)test`) - haystack := []byte(testMatchEndCaseLarge) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexesAllIgnoreCaseLargeCaseInsensitive(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(testMatchEndCaseLarge, "test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexUnicodeCaseInsensitive(b *testing.B) { - r := regexp.MustCompile(`(?i)test`) - haystack := []byte(testUnicodeMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexesAllIgnoreCaseUnicodeCaseInsensitive(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(testUnicodeMatchEndCase, "test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexUnicodeLargeCaseInsensitive(b *testing.B) { - r := regexp.MustCompile(`(?i)test`) - haystack := []byte(testUnicodeMatchEndCaseLarge) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexesAllIgnoreCaseUnicodeLargeCaseInsensitive(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(testUnicodeMatchEndCaseLarge, "test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -// This benchmark simulates a bad case of there being many -// partial matches where the first character in the needle -// can be found throughout the haystack -func BenchmarkFindAllIndexManyPartialMatchesCaseInsensitive(b *testing.B) { - r := regexp.MustCompile(`(?i)1test`) - haystack := []byte(testMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexesAllIgnoreCaseManyPartialMatchesCaseInsensitive(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(testMatchEndCase, "1test", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -// This benchmark simulates a bad case of there being many -// partial matches where the first character in the needle -// can be found throughout the haystack -func BenchmarkFindAllIndexUnicodeManyPartialMatchesCaseInsensitive(b *testing.B) { - r := regexp.MustCompile(`(?i)Čštest`) - haystack := []byte(testUnicodeMatchEndCase) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkIndexesAllIgnoreCaseUnicodeManyPartialMatchesCaseInsensitive(b *testing.B) { - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(testUnicodeMatchEndCase, "Čštest", -1) - if len(matches) != 1 { - b.Error("Expected single match") - } - } -} - -func BenchmarkFindAllIndexUnicodeCaseInsensitiveVeryLarge(b *testing.B) { - var large string - for i := 0; i <= 100; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)Čštest`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 101 { - b.Error("Expected single match got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseUnicodeCaseInsensitiveVeryLarge(b *testing.B) { - var large string - for i := 0; i <= 100; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "Čštest", -1) - if len(matches) != 101 { - b.Error("Expected single match got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveVeryLarge(b *testing.B) { - var large string - for i := 0; i <= 100; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)Åŋ`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 101 { - b.Error("Expected single match got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveVeryLarge(b *testing.B) { - var large string - for i := 0; i <= 100; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "Åŋ", -1) - if len(matches) != 101 { - b.Error("Expected single match got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle1(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)a`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle1(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "a", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle2(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle2(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle3(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle3(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle4(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle4(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle5(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaaaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle5(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaaaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle6(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaaaaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle6(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaaaaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle7(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaaaaaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle7(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaaaaaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle8(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaaaaaaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle8(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaaaaaaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle9(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaaaaaaaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle9(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaaaaaaaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkFindAllIndexFoldingCaseInsensitiveNeedle10(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - r := regexp.MustCompile(`(?i)aaaaaaaaaa`) - haystack := []byte(large) - - for i := 0; i < b.N; i++ { - matches := r.FindAllIndex(haystack, -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} - -func BenchmarkIndexesAllIgnoreCaseFoldingCaseInsensitiveNeedle10(b *testing.B) { - var large string - for i := 0; i <= 10; i++ { - large += testUnicodeMatchEndCaseLarge - } - - for i := 0; i < b.N; i++ { - matches := IndexAllIgnoreCase(large, "aaaaaaaaaa", -1) - if len(matches) != 0 { - b.Error("Expected no matches got", len(matches)) - } - } -} diff --git a/toolkit/stringutils/index_test.go b/toolkit/stringutils/index_test.go deleted file mode 100644 index 6d2bd0ec..00000000 --- a/toolkit/stringutils/index_test.go +++ /dev/null @@ -1,301 +0,0 @@ -// SPDX-License-Identifier: MIT OR Unlicense - -package stringutils - -import ( - "math" - "regexp" - "strings" - "testing" - "time" -) - -func TestExtractLocations(t *testing.T) { - locations := IndexAll("test that this returns a match", "test", math.MaxInt64) - - if locations[0][0] != 0 { - t.Error("Expected to find location 0") - } -} - -func TestExtractLocationsLarge(t *testing.T) { - locations := IndexAll("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 test that this returns a match", "test", math.MaxInt64) - - if locations[0][0] != 101 { - t.Error("Expected to find location 101") - } -} - -func TestExtractLocationsLimit(t *testing.T) { - locations := IndexAll("test test", "test", 1) - - if len(locations) != 1 { - t.Error("Expected to find a single location") - } -} - -func TestExtractLocationsLimitTwo(t *testing.T) { - locations := IndexAll("test test test", "test", 2) - - if len(locations) != 2 { - t.Error("Expected to find two locations") - } -} - -func TestExtractLocationsLimitThree(t *testing.T) { - locations := IndexAll("test test test", "test", 3) - - if len(locations) != 3 { - t.Error("Expected to find three locations") - } -} - -func TestExtractLocationsNegativeLimit(t *testing.T) { - locations := IndexAll("test test test", "test", -1) - - if len(locations) != 3 { - t.Error("Expected to find three locations") - } -} - -func TestDropInReplacement(t *testing.T) { - r := regexp.MustCompile(`test`) - - matches1 := r.FindAllIndex([]byte(testMatchEndCase), -1) - matches2 := IndexAll(testMatchEndCase, "test", -1) - - for i := 0; i < len(matches1); i++ { - if matches1[i][0] != matches2[i][0] || matches1[i][1] != matches2[i][1] { - t.Error("Expect results to match", i) - } - } -} - -func TestDropInReplacementNil(t *testing.T) { - r := regexp.MustCompile(`test`) - - matches1 := r.FindAllIndex([]byte(`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`), -1) - matches2 := IndexAll(`aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`, "test", -1) - - if matches1 != nil || matches2 != nil { - t.Error("Expect results to be nil") - } -} - -func TestDropInReplacementMultiple(t *testing.T) { - r := regexp.MustCompile(`1`) - - matches1 := r.FindAllIndex([]byte(`111`), -1) - matches2 := IndexAll(`111`, "1", -1) - - for i := 0; i < len(matches1); i++ { - if matches1[i][0] != matches2[i][0] || matches1[i][1] != matches2[i][1] { - t.Error("Expect results to match", i) - } - } -} - -func TestIndexAllIgnoreCaseUnicodeEmpty(t *testing.T) { - matches := IndexAllIgnoreCase("", "2", -1) - - if matches != nil { - t.Error("Expected no matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeLongNeedleNoMatch(t *testing.T) { - matches := IndexAllIgnoreCase("aaaaabbbbb", "aaaaaa", -1) - - if matches != nil { - t.Error("Expected no matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeLongNeedleSingleMatch(t *testing.T) { - matches := IndexAllIgnoreCase("aaaaaabbbbb", "aaaaaa", -1) - - if len(matches) != 1 { - t.Error("Expected single matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeSingleMatch(t *testing.T) { - matches := IndexAllIgnoreCase("aaaa", "a", 1) - - if len(matches) != 1 { - t.Error("Expected single match") - } -} - -func TestIndexAllIgnoreCaseUnicodeTwoMatch(t *testing.T) { - matches := IndexAllIgnoreCase("aaaa", "a", 2) - - if len(matches) != 2 { - t.Error("Expected two matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeNegativeLimit(t *testing.T) { - matches := IndexAllIgnoreCase("aaaa", "a", -1) - - if len(matches) != 4 { - t.Error("Expected four matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeOutOfRange(t *testing.T) { - matches := IndexAllIgnoreCase("veryuni", "unique", -1) - - if len(matches) != 0 { - t.Error("Expected zero matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeOutOfRange2(t *testing.T) { - matches := IndexAllIgnoreCase("veryuni", "uniq", -1) - - if len(matches) != 0 { - t.Error("Expected zero matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeOutOfRange3(t *testing.T) { - matches := IndexAllIgnoreCase("ve", "ee", -1) - - if len(matches) != 0 { - t.Error("Expected zero matches") - } -} - -func TestIndexAllIgnoreCaseUnicodeCheck(t *testing.T) { - matches := IndexAllIgnoreCase("a secret a", "Åŋecret", -1) - - if matches[0][0] != 2 || matches[0][1] != 8 { - t.Error("Expected 2 and 8 got", matches[0][0], "and", matches[0][1]) - } - - if "a secret a"[matches[0][0]:matches[0][1]] != "secret" { - t.Error("Expected secret") - } -} - -func TestIndexAllIgnoreCaseUnicodeCheckEnd(t *testing.T) { - matches := IndexAllIgnoreCase("a Åŋecret a", "secret", -1) - - if matches[0][0] != 2 || matches[0][1] != 9 { - t.Error("Expected 2 and 9 got", matches[0][0], "and", matches[0][1]) - } - - if "a Åŋecret a"[matches[0][0]:matches[0][1]] != "Åŋecret" { - t.Errorf("Expected Åŋecret got '%s'", "a Åŋecret a"[matches[0][0]:matches[0][1]]) - } -} - -func TestDropInReplacementMultipleIndexAllIgnoreCaseUnicode(t *testing.T) { - r := regexp.MustCompile(`1`) - - matches1 := r.FindAllIndex([]byte(`111`), -1) - matches2 := IndexAllIgnoreCase(`111`, "1", -1) - - for i := 0; i < len(matches1); i++ { - if matches1[i][0] != matches2[i][0] || matches1[i][1] != matches2[i][1] { - t.Error("Expect results to match", i) - } - } -} - -func TestIndexAllIgnoreCaseUnicodeSpace(t *testing.T) { - matches := IndexAllIgnoreCase(prideAndPrejudice, "ten thousand a year", -1) - m := IndexAll(strings.ToLower(prideAndPrejudice), "ten thousand a year", -1) - - r := regexp.MustCompile(`(?i)ten thousand a year`) - index := r.FindAllIndex([]byte(prideAndPrejudice), -1) - - if len(matches) != len(m) || len(matches) != len(index) { - t.Error("Expected 2 got", len(matches)) - } -} - -func TestIndexAllIgnoreCaseAtEnd(t *testing.T) { - matches := IndexAllIgnoreCase(`testjava`, "java", -1) - - r := regexp.MustCompile(`java`) - index := r.FindAllIndex([]byte(`testjava`), -1) - - if len(matches) != len(index) || matches[0][0] != 4 || matches[0][1] != 8 { - t.Error("Expected 1 got", len(matches)) - } -} - -func TestIndexAllIgnoreCaseStrange(t *testing.T) { - matches := IndexAllIgnoreCase(`func AllSimpleFold(input rune) []rune { - res := []rune{} -`, "rune{}", -1) - - r := regexp.MustCompile(`rune{}`) - index := r.FindAllIndex([]byte(`func AllSimpleFold(input rune) []rune { - res := []rune{} -`), -1) - - if len(matches) != len(index) || matches[0][0] != 57 || matches[0][1] != 63 { - t.Error("Expected 1 got", len(matches)) - } -} - -func TestIndexAllIgnoreCaseStrangeTwo(t *testing.T) { - matches := IndexAllIgnoreCase(`this is my cs ß haystack`, `ß`, -1) - r := regexp.MustCompile(`ß`) - index := r.FindAllIndex([]byte(`this is my cs ß haystack`), -1) - - if len(matches) != len(index) || matches[0][0] != 14 || matches[0][1] != 16 { - t.Error("Expected 1 got", len(matches)) - } -} - -// This test is here because using regex to validate matches is horribly slow for this -// case. It should run faster than the value here for most machines -func TestIndexAllIgnoreCasePerformanceCase(t *testing.T) { - start := time.Now().UnixNano() / int64(time.Millisecond) - IndexAllIgnoreCase(`ȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚ`, `ȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚȚ`, -1) - end := time.Now().UnixNano() / int64(time.Millisecond) - - if end-start > 1000 { - t.Error("Should be faster than this... don't think you are, know you are. Ran in (ms)", end-start) - } -} - -// When we limit we want the searches to be in order in order to match what FindAllIndex would do -// as closely as possible -func TestIndexAllIgnoreCaseLimitSmallNeedle(t *testing.T) { - matches := IndexAllIgnoreCase("Test TEST test tEST", "te", 2) - - if len(matches) != 2 { - t.Error("Expected two matches") - } - - if matches[0][0] != 0 { - t.Error("expected 0 got", matches[0][0]) - } - - if matches[1][0] != 5 { - t.Error("expected 5 got", matches[1][0]) - } -} - -// When we limit we want the searches to be in order in order to match what FindAllIndex would do -// as closely as possible -func TestIndexAllIgnoreCaseLimitLargeNeedle(t *testing.T) { - matches := IndexAllIgnoreCase("Test TEST test tEST", "test", 2) - - if len(matches) != 2 { - t.Error("Expected two matches") - } - - if matches[0][0] != 0 { - t.Error("expected 0 got", matches[0][0]) - } - - if matches[1][0] != 5 { - t.Error("expected 5 got", matches[1][0]) - } -} diff --git a/toolkit/stringutils/stringutils.go b/toolkit/stringutils/stringutils.go deleted file mode 100644 index 8116bd5f..00000000 --- a/toolkit/stringutils/stringutils.go +++ /dev/null @@ -1,83 +0,0 @@ -package stringutils - -import ( - "regexp" - "strings" - "unicode" -) - -// IsEmpty asserts s is empty -func IsEmpty(s string) bool { - return strings.TrimSpace(s) == "" || strings.TrimSpace(s) == "" -} - -// IsNotEmpty asserts s is not empty -func IsNotEmpty(s string) bool { - return !IsEmpty(s) -} - -// ContainsI assert s contains substr ignore case -func ContainsI(s string, substr string) bool { - re := regexp.MustCompile(`(?i)` + substr) - return re.MatchString(s) -} - -// HasPrefixI assert s has prefix prefix ignore case -func HasPrefixI(s, prefix string) bool { - re := regexp.MustCompile(`(?i)^` + prefix) - return re.MatchString(s) -} - -func ToTitle(s string) string { - str := []rune(s) - return strings.ToUpper(string(str[0])) + string(str[1:]) -} - -var symbolre = regexp.MustCompile("[。、“”‘’《》【】~!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\\s]") - -func ToCamel(s string) string { - parts := symbolre.Split(s, -1) - var convertedParts []string - for _, v := range parts { - if IsNotEmpty(v) { - convertedParts = append(convertedParts, ToTitle(v)) - } - } - ret := strings.Join(convertedParts, "") - if !unicode.IsUpper(rune(ret[0])) { - ret = "A" + ret - } - return ret -} - -func ReplaceAtRuneIndex(in string, r rune, i int) string { - out := []rune(in) - out[i] = r - return string(out) -} - -func ReplaceStringAtByteIndex(in string, replace string, start int, end int) string { - out := []byte(in) - r := []byte(replace) - result := make([]byte, len(out[:start])) - copy(result, out[:start]) - result = append(result, r...) - result = append(result, out[end:]...) - return string(result) -} - -func ReplaceStringAtByteIndexBatch(in string, args []string, locs [][]int) string { - out := []byte(in) - result := make([]byte, 0) - end := 0 - for i, loc := range locs { - arg := args[i] - r := []byte(arg) - start := loc[0] - result = append(result, out[end:start]...) - result = append(result, r...) - end = loc[1] - } - result = append(result, out[end:]...) - return string(result) -} diff --git a/toolkit/stringutils/stringutils_test.go b/toolkit/stringutils/stringutils_test.go deleted file mode 100644 index ed4e4296..00000000 --- a/toolkit/stringutils/stringutils_test.go +++ /dev/null @@ -1,318 +0,0 @@ -package stringutils - -import ( - "testing" -) - -func TestContains(t *testing.T) { - type args struct { - s string - substr string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "", - args: args{ - s: "filedownloadUser", - substr: "Download", - }, - want: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ContainsI(tt.args.s, tt.args.substr); got != tt.want { - t.Errorf("Contains() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestHasPrefixI(t *testing.T) { - type args struct { - s string - prefix string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "1", - args: args{ - s: "VARCHAR(255)", - prefix: "var", - }, - want: true, - }, - { - name: "2", - args: args{ - s: "VARCHAR(255)", - prefix: "VAR", - }, - want: true, - }, - { - name: "3", - args: args{ - s: "VARCHAR(255)", - prefix: "CHA", - }, - want: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := HasPrefixI(tt.args.s, tt.args.prefix); got != tt.want { - t.Errorf("HasPrefixI() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIsEmpty(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "1", - args: args{ - s: " abc ", - }, - want: false, - }, - { - name: "2", - args: args{ - s: " ", - }, - want: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := IsEmpty(tt.args.s); got != tt.want { - t.Errorf("IsEmpty() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestIsNotEmpty(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want bool - }{ - { - name: "", - args: args{ - s: " abc ", - }, - want: true, - }, - { - name: "", - args: args{ - s: " ", - }, - want: false, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := IsNotEmpty(tt.args.s); got != tt.want { - t.Errorf("IsNotEmpty() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestToCamel(t *testing.T) { - type args struct { - s string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - s: "abcæ­Ķ斌123", - }, - want: "Abcæ­Ķ斌123", - }, - { - name: "", - args: args{ - s: "word", - }, - want: "Word", - }, - { - name: "", - args: args{ - s: "snake_word", - }, - want: "SnakeWord", - }, - { - name: "", - args: args{ - s: "Commonresultarraylistcom.hundsun.hcreator.pojo.hcbizmodelview", - }, - want: "CommonresultarraylistcomHundsunHcreatorPojoHcbizmodelview", - }, - { - name: "", - args: args{ - s: "Commonresultarraylistcom,hundsun,hcreator,pojo,hcbizmodelview", - }, - want: "CommonresultarraylistcomHundsunHcreatorPojoHcbizmodelview", - }, - { - name: "", - args: args{ - s: "Commonresultarraylistcom hundsun hcreator", - }, - want: "CommonresultarraylistcomHundsunHcreator", - }, - { - name: "", - args: args{ - s: "Commonresultarraylistcomhundsunhcreator", - }, - want: "CommonresultarraylistcomHundsunHcreator", - }, - { - name: "", - args: args{ - s: "台æđūæ˜Ŋäļ­å›―įš„įœ", - }, - want: "A台æđūæ˜Ŋäļ­å›―įš„įœ", - }, - { - name: "", - args: args{ - s: "dataDecimal", - }, - want: "DataDecimal", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ToCamel(tt.args.s); got != tt.want { - t.Errorf("ToCamel() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestReplaceStringAtIndex(t *testing.T) { - in := `INSERT INTO user ("name", "age") VALUES (?, ?);` - loc := IndexAll(in, "?", -1) - - in2 := `我įˆąåŒ—䚎åĪĐåŪ‰é—Ļå•Ķå•Ķå•Ķ` - loc2 := IndexAll(in2, "åĪĐåŪ‰é—Ļ", -1) - - type args struct { - in string - replace string - start int - end int - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - in: in, - replace: "18", - start: loc[1][0], - end: loc[1][1], - }, - want: `INSERT INTO user ("name", "age") VALUES (?, 18);`, - }, - { - name: "", - args: args{ - in: in2, - replace: "éĒå’Œå›­", - start: loc2[0][0], - end: loc2[0][1], - }, - want: `我įˆąåŒ—䚎éĒå’Œå›­ïžŒå•Ķå•Ķå•Ķ`, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ReplaceStringAtByteIndex(tt.args.in, tt.args.replace, tt.args.start, tt.args.end); got != tt.want { - t.Errorf("ReplaceStringAtIndex() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestReplaceStringAtByteIndexBatch(t *testing.T) { - in := `INSERT INTO user ("name", "age") VALUES (?, ?);` - loc := IndexAll(in, "?", -1) - - in2 := `我įˆąåŒ—䚎åĪĐåŪ‰é—Ļå•Ķå•Ķå•Ķ` - loc2 := IndexAll(in2, "åĪĐåŪ‰é—Ļ", -1) - - type args struct { - in string - args []string - locs [][]int - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - in: in, - args: []string{"'wubin'", "18"}, - locs: loc, - }, - want: `INSERT INTO user ("name", "age") VALUES ('wubin', 18);`, - }, - { - name: "", - args: args{ - in: in2, - args: []string{"éĒå’Œå›­"}, - locs: loc2, - }, - want: `我įˆąåŒ—䚎éĒå’Œå›­ïžŒå•Ķå•Ķå•Ķ`, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := ReplaceStringAtByteIndexBatch(tt.args.in, tt.args.args, tt.args.locs); got != tt.want { - t.Errorf("ReplaceStringAtByteIndexBatch() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/toolkit/templateutils/funcs.go b/toolkit/templateutils/funcs.go deleted file mode 100644 index 20f14407..00000000 --- a/toolkit/templateutils/funcs.go +++ /dev/null @@ -1,37 +0,0 @@ -package templateutils - -import ( - "bytes" - "strings" - "text/template" - "time" - - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" -) - -func formatTime(t time.Time) string { - return t.Format(constants.FORMAT) -} - -func boolToInt(b bool) int { - if b { - return 1 - } - return 0 -} - -func Eval(t *template.Template) func(string, interface{}) (string, error) { - return func(name string, v interface{}) (string, error) { - var buf bytes.Buffer - err := t.ExecuteTemplate(&buf, name, v) - return buf.String(), err - } -} - -func trimSuffix(suffix, v string) string { - return strings.TrimSuffix(strings.TrimSpace(v), suffix) -} - -func hasPrefix(v, prefix string) bool { - return strings.HasPrefix(strings.TrimSpace(v), prefix) -} diff --git a/toolkit/templateutils/templateutils.go b/toolkit/templateutils/templateutils.go deleted file mode 100644 index 1463f5d1..00000000 --- a/toolkit/templateutils/templateutils.go +++ /dev/null @@ -1,92 +0,0 @@ -package templateutils - -import ( - "bytes" - "path/filepath" - "strings" - "text/template" - - "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/caller" -) - -// String return result of calling template Execute as string -func String(tmplname, tmpl string, data interface{}) (string, error) { - var ( - sqlBuf bytes.Buffer - err error - tpl *template.Template - ) - funcs := map[string]any{ - "contains": strings.Contains, - "hasPrefix": strings.HasPrefix, - "hasSuffix": strings.HasSuffix, - } - tpl = template.Must(template.New(tmplname).Funcs(funcs).Parse(tmpl)) - if err = tpl.Execute(&sqlBuf, data); err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - return strings.TrimSpace(sqlBuf.String()), nil -} - -// StringBlock return result of calling template Execute as string -func StringBlock(tmplname, tmpl string, block string, data interface{}) (string, error) { - var ( - sqlBuf bytes.Buffer - err error - tpl *template.Template - ) - tpl = template.Must(template.New(tmplname).Parse(tmpl)) - if err = tpl.ExecuteTemplate(&sqlBuf, block, data); err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - return strings.TrimSpace(sqlBuf.String()), nil -} - -// StringBlockMysql return result of calling template Execute as string from template file -func StringBlockMysql(tmpl string, block string, data interface{}) (string, error) { - var ( - sqlBuf bytes.Buffer - err error - tpl *template.Template - funcMap map[string]interface{} - ) - tpl = template.New(filepath.Base(tmpl)) - funcMap = make(map[string]interface{}) - funcMap["FormatTime"] = formatTime - funcMap["BoolToInt"] = boolToInt - funcMap["Eval"] = Eval(tpl) - funcMap["TrimSuffix"] = trimSuffix - funcMap["isNil"] = func(t interface{}) bool { - return t == nil - } - tpl = template.Must(tpl.Funcs(funcMap).ParseFiles(tmpl)) - if err = tpl.ExecuteTemplate(&sqlBuf, block, data); err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - return strings.TrimSpace(sqlBuf.String()), nil -} - -// BlockMysql return result of calling template Execute as string from template file -func BlockMysql(tmplname, tmpl string, block string, data interface{}) (string, error) { - var ( - sqlBuf bytes.Buffer - err error - tpl *template.Template - funcMap map[string]interface{} - ) - tpl = template.New(tmplname) - funcMap = make(map[string]interface{}) - funcMap["FormatTime"] = formatTime - funcMap["BoolToInt"] = boolToInt - funcMap["Eval"] = Eval(tpl) - funcMap["TrimSuffix"] = trimSuffix - funcMap["isNil"] = func(t interface{}) bool { - return t == nil - } - tpl = template.Must(tpl.Funcs(funcMap).Parse(tmpl)) - if err = tpl.ExecuteTemplate(&sqlBuf, block, data); err != nil { - return "", errors.Wrap(err, caller.NewCaller().String()) - } - return strings.TrimSpace(sqlBuf.String()), nil -} diff --git a/toolkit/timeutils/timeutils.go b/toolkit/timeutils/timeutils.go deleted file mode 100644 index 695a7d2e..00000000 --- a/toolkit/timeutils/timeutils.go +++ /dev/null @@ -1,40 +0,0 @@ -package timeutils - -import ( - "context" - "time" - - "github.com/hyperjumptech/jiffy" - "github.com/pkg/errors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils" -) - -// Parse parses string to time.Duration -func Parse(t string, defaultDur time.Duration) (time.Duration, error) { - var ( - dur time.Duration - err error - ) - if stringutils.IsNotEmpty(t) { - if dur, err = jiffy.DurationOf(t); err != nil { - err = errors.Wrapf(err, "parse %s from config file fail, use default 15s instead", t) - } - } - if dur <= 0 { - dur = defaultDur - } - return dur, err -} - -func CallWithCtx(ctx context.Context, fn func() struct{}) error { - result := make(chan struct{}, 1) - go func() { - result <- fn() - }() - select { - case <-ctx.Done(): - return ctx.Err() - case <-result: - return nil - } -} diff --git a/toolkit/timeutils/timeutils_test.go b/toolkit/timeutils/timeutils_test.go deleted file mode 100644 index a6243108..00000000 --- a/toolkit/timeutils/timeutils_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package timeutils - -import ( - "context" - "fmt" - "testing" - "time" -) - -func TestParse(t *testing.T) { - type args struct { - t string - defaultDur time.Duration - } - tests := []struct { - name string - args args - want time.Duration - wantErr bool - }{ - { - name: "1", - args: args{ - t: "9h1m30s", - defaultDur: 15 * time.Second, - }, - want: 32490000000000, - wantErr: false, - }, - { - name: "2", - args: args{ - t: "wrongdurationstr", - defaultDur: 15 * time.Second, - }, - want: 15000000000, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := Parse(tt.args.t, tt.args.defaultDur) - if (err != nil) != tt.wantErr { - t.Errorf("Parse() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("Parse() got = %v, want %v", got, tt.want) - } - }) - } -} - -func TestCallWithCtx(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - defer cancel() - err := CallWithCtx(ctx, func() struct{} { - time.Sleep(2 * time.Second) - fmt.Println("Job Done") - return struct{}{} - }) - if err != nil { - fmt.Println(err) - return - } - fmt.Println("OK") -} diff --git a/toolkit/yaml/testdata/.env b/toolkit/yaml/testdata/.env deleted file mode 100644 index 891c52be..00000000 --- a/toolkit/yaml/testdata/.env +++ /dev/null @@ -1,2 +0,0 @@ -GDD_PORT=6060 -GDD_ROUTE_ROOT_PATH=/api \ No newline at end of file diff --git a/toolkit/yaml/testdata/app-dev-local.yaml b/toolkit/yaml/testdata/app-dev-local.yaml deleted file mode 100644 index a10d2716..00000000 --- a/toolkit/yaml/testdata/app-dev-local.yaml +++ /dev/null @@ -1,4 +0,0 @@ -gdd: - nacos: - server: - addr: "http://localhost:8848/nacos" \ No newline at end of file diff --git a/toolkit/yaml/testdata/app-dev.yml b/toolkit/yaml/testdata/app-dev.yml deleted file mode 100644 index f3ca1ea1..00000000 --- a/toolkit/yaml/testdata/app-dev.yml +++ /dev/null @@ -1,2 +0,0 @@ -gdd: - port: 8080 \ No newline at end of file diff --git a/toolkit/yaml/testdata/app-local.yaml b/toolkit/yaml/testdata/app-local.yaml deleted file mode 100644 index bfd73998..00000000 --- a/toolkit/yaml/testdata/app-local.yaml +++ /dev/null @@ -1,5 +0,0 @@ -gdd: - nacos: - server: - addr: "http://localhost:8848/nacos" - param-with-hyphen: 1 \ No newline at end of file diff --git a/toolkit/yaml/testdata/app-prod.yml b/toolkit/yaml/testdata/app-prod.yml deleted file mode 100644 index 891c52be..00000000 --- a/toolkit/yaml/testdata/app-prod.yml +++ /dev/null @@ -1,2 +0,0 @@ -GDD_PORT=6060 -GDD_ROUTE_ROOT_PATH=/api \ No newline at end of file diff --git a/toolkit/yaml/testdata/app-test.yml b/toolkit/yaml/testdata/app-test.yml deleted file mode 100644 index ff7da91b..00000000 --- a/toolkit/yaml/testdata/app-test.yml +++ /dev/null @@ -1,4 +0,0 @@ -gdd: - route: - root: - path: /api diff --git a/toolkit/yaml/testdata/app.yml b/toolkit/yaml/testdata/app.yml deleted file mode 100644 index 26c05273..00000000 --- a/toolkit/yaml/testdata/app.yml +++ /dev/null @@ -1,5 +0,0 @@ -gdd: - port: 6060 - tracing: - metrics: - root: "go-doudou" \ No newline at end of file diff --git a/toolkit/yaml/yaml.go b/toolkit/yaml/yaml.go deleted file mode 100644 index 583eb6ff..00000000 --- a/toolkit/yaml/yaml.go +++ /dev/null @@ -1,99 +0,0 @@ -package yaml - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/ghodss/yaml" - "github.com/jeremywohl/flatten" - "github.com/spf13/cast" -) - -func load(data []byte) error { - config := make(map[string]interface{}) - err := yaml.Unmarshal(data, &config) - if err != nil { - return err - } - flat, _ := flatten.Flatten(config, "", flatten.UnderscoreStyle) - currentEnv := map[string]bool{} - rawEnv := os.Environ() - for _, rawEnvLine := range rawEnv { - key := strings.Split(rawEnvLine, "=")[0] - currentEnv[key] = true - } - for k, v := range flat { - upperK := strings.ToUpper(strings.ReplaceAll(k, "-", "")) - if !currentEnv[upperK] { - _ = os.Setenv(upperK, cast.ToString(v)) - } - } - return nil -} - -func LoadReader(reader io.Reader) error { - data, err := ioutil.ReadAll(reader) - if err != nil { - return err - } - return load(data) -} - -func LoadFile(file string) { - data, _ := ioutil.ReadFile(file) - err := load(data) - if err != nil { - panic(err) - } -} - -func Load(env string) { - wd, _ := os.Getwd() - matches, _ := filepath.Glob(filepath.Join(wd, fmt.Sprintf("app-%s-local.%s", env, "y*ml"))) - for _, item := range matches { - LoadFile(item) - } - if "test" != env { - matches, _ = filepath.Glob(filepath.Join(wd, fmt.Sprintf("app-local.%s", "y*ml"))) - for _, item := range matches { - LoadFile(item) - } - } - matches, _ = filepath.Glob(filepath.Join(wd, fmt.Sprintf("app-%s.%s", env, "y*ml"))) - for _, item := range matches { - LoadFile(item) - } - matches, _ = filepath.Glob(filepath.Join(wd, fmt.Sprintf("app.%s", "y*ml"))) - for _, item := range matches { - LoadFile(item) - } -} - -func LoadReaderAsMap(reader io.Reader) (map[string]interface{}, error) { - data, err := ioutil.ReadAll(reader) - if err != nil { - return nil, err - } - return loadAsMap(data) -} - -func LoadFileAsMap(file string) (map[string]interface{}, error) { - data, err := ioutil.ReadFile(file) - if err != nil { - return nil, err - } - return loadAsMap(data) -} - -func loadAsMap(data []byte) (map[string]interface{}, error) { - config := make(map[string]interface{}) - err := yaml.Unmarshal(data, &config) - if err != nil { - return nil, err - } - return flatten.Flatten(config, "", flatten.DotStyle) -} diff --git a/toolkit/yaml/yaml_test.go b/toolkit/yaml/yaml_test.go deleted file mode 100644 index 3b8b2a8e..00000000 --- a/toolkit/yaml/yaml_test.go +++ /dev/null @@ -1,140 +0,0 @@ -package yaml_test - -import ( - "bytes" - "io" - "io/ioutil" - "os" - "strings" - "testing" - - "github.com/pkg/errors" - "github.com/stretchr/testify/require" - "github.com/unionj-cloud/go-doudou/v2/toolkit/yaml" -) - -func TestLoad_dev(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - yaml.Load("dev") - port := os.Getenv("GDD_PORT") - require.Equal(t, "8080", port) - - nacosServer := os.Getenv("GDD_NACOS_SERVER_ADDR") - require.Equal(t, "http://localhost:8848/nacos", nacosServer) -} - -func TestLoad_test(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - yaml.Load("test") - port := os.Getenv("GDD_PORT") - require.Equal(t, "6060", port) - - nacosServer := os.Getenv("GDD_NACOS_SERVER_ADDR") - require.Equal(t, "", nacosServer) - - rootPath := os.Getenv("GDD_ROUTE_ROOT_PATH") - require.Equal(t, "/api", rootPath) -} - -func TestLoad_error(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - require.Panics(t, func() { - yaml.Load("prod") - }) -} - -func TestLoadReaderAsMap(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - data, err := ioutil.ReadFile("app.yml") - require.NoError(t, err) - result, err := yaml.LoadReaderAsMap(strings.NewReader(string(data))) - require.NoError(t, err) - require.Equal(t, float64(6060), result["gdd.port"]) - require.Equal(t, "go-doudou", result["gdd.tracing.metrics.root"]) -} - -func TestLoadFileAsMap(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - result, err := yaml.LoadFileAsMap("app.yml") - require.NoError(t, err) - require.Equal(t, float64(6060), result["gdd.port"]) - require.Equal(t, "go-doudou", result["gdd.tracing.metrics.root"]) -} - -func TestLoadReaderAsMapError(t *testing.T) { - defer os.Clearenv() - _, err := yaml.LoadReaderAsMap(ErrReader(errors.New("test error"))) - require.Error(t, err) -} - -func TestLoadFileAsMapDotenvError(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - _, err := yaml.LoadFileAsMap(".env") - require.Error(t, err) -} - -func TestLoadReaderAsMapDotenvError(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - data, err := ioutil.ReadFile(".env") - require.NoError(t, err) - _, err = yaml.LoadReaderAsMap(strings.NewReader(string(data))) - require.Error(t, err) -} - -func TestLoadFileAsMapError(t *testing.T) { - defer os.Clearenv() - _, err := yaml.LoadFileAsMap("not_exist_file") - require.Error(t, err) -} - -func TestLoadReaderAsMapFromString(t *testing.T) { - defer os.Clearenv() - data := []byte("gdd:\n port: 6060\n tracing:\n metrics:\n root: \"go-doudou\"") - result, err := yaml.LoadReaderAsMap(strings.NewReader(string(data))) - require.NoError(t, err) - require.Equal(t, float64(6060), result["gdd.port"]) - require.Equal(t, "go-doudou", result["gdd.tracing.metrics.root"]) -} - -func TestLoadReader(t *testing.T) { - defer os.Clearenv() - _ = os.Chdir("testdata") - data, err := ioutil.ReadFile("app.yml") - require.NoError(t, err) - err = yaml.LoadReader(bytes.NewReader(data)) - require.NoError(t, err) - require.Equal(t, "6060", os.Getenv("GDD_PORT")) - require.Equal(t, "go-doudou", os.Getenv("GDD_TRACING_METRICS_ROOT")) -} - -func ErrReader(err error) io.Reader { - return &errReader{err: err} -} - -type errReader struct { - err error -} - -func (r *errReader) Read(p []byte) (int, error) { - return 0, r.err -} - -func TestLoadReaderError(t *testing.T) { - err := yaml.LoadReader(ErrReader(errors.New("test error"))) - require.Error(t, err) -} - -func TestLoadReaderDotenvError(t *testing.T) { - _ = os.Chdir("testdata") - data, err := ioutil.ReadFile(".env") - require.NoError(t, err) - err = yaml.LoadReader(bytes.NewReader(data)) - require.Error(t, err) -} diff --git a/toolkit/zlogger/entry.go b/toolkit/zlogger/entry.go deleted file mode 100644 index cf187a81..00000000 --- a/toolkit/zlogger/entry.go +++ /dev/null @@ -1,210 +0,0 @@ -package zlogger - -import ( - "context" - "fmt" - "io" - "os" - "strconv" - - "github.com/rs/zerolog" - "github.com/rs/zerolog/pkgerrors" - "github.com/unionj-cloud/go-doudou/v2/toolkit/constants" -) - -var Logger = zerolog.New(os.Stderr).With().Timestamp().Logger() - -type LoggerConfig struct { - Dev bool - Caller bool - Discard bool - Pid bool - - Writer io.Writer - Level zerolog.Level -} - -type LoggerConfigOption func(*LoggerConfig) - -func WithDev(dev bool) LoggerConfigOption { - return func(lc *LoggerConfig) { - lc.Dev = dev - } -} - -func WithCaller(caller bool) LoggerConfigOption { - return func(lc *LoggerConfig) { - lc.Caller = caller - } -} - -func WithDiscard(discard bool) LoggerConfigOption { - return func(lc *LoggerConfig) { - lc.Discard = discard - } -} - -func WithWriter(writer io.Writer) LoggerConfigOption { - return func(lc *LoggerConfig) { - lc.Writer = writer - } -} - -func WithZeroLogLevel(level zerolog.Level) LoggerConfigOption { - return func(lc *LoggerConfig) { - lc.Level = level - } -} - -func NewLoggerConfig(opts ...LoggerConfigOption) LoggerConfig { - lc := LoggerConfig{} - for _, item := range opts { - item(&lc) - } - return lc -} - -func InitEntry(lc LoggerConfig) { - var output io.Writer - if !lc.Discard { - if lc.Writer != nil { - output = lc.Writer - } else if lc.Dev { - output = zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: constants.FORMAT, NoColor: true} - } else { - output = os.Stdout - } - } - zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack - zeroCtx := zerolog.New(output).Level(lc.Level).With().Timestamp().Stack() - if lc.Caller { - zeroCtx = zeroCtx.Caller() - } - if lc.Pid { - zeroCtx = zeroCtx.Str("__pid", strconv.Itoa(os.Getpid())) - } - Logger = zeroCtx.Logger() -} - -// SetOutput duplicates the global logger and sets w as its output, -// then assign to zlogger package level zerolog.Logger -func SetOutput(w io.Writer) { - Logger = Logger.Output(w) -} - -// Output duplicates the global logger and sets w as its output. -func Output(w io.Writer) zerolog.Logger { - return Logger.Output(w) -} - -// With creates a child logger with the field added to its context. -func With() zerolog.Context { - return Logger.With() -} - -// Level creates a child logger with the minimum accepted level set to level. -func Level(level zerolog.Level) zerolog.Logger { - return Logger.Level(level) -} - -// Sample returns a logger with the s sampler. -func Sample(s zerolog.Sampler) zerolog.Logger { - return Logger.Sample(s) -} - -// Hook returns a logger with the h Hook. -func Hook(h zerolog.Hook) zerolog.Logger { - return Logger.Hook(h) -} - -// Err starts a new message with error level with err as a field if not nil or -// with info level if err is nil. -// -// You must call Msg on the returned event in order to send the event. -func Err(err error) *zerolog.Event { - return Logger.Err(err) -} - -// Trace starts a new message with trace level. -// -// You must call Msg on the returned event in order to send the event. -func Trace() *zerolog.Event { - return Logger.Trace() -} - -// Debug starts a new message with debug level. -// -// You must call Msg on the returned event in order to send the event. -func Debug() *zerolog.Event { - return Logger.Debug() -} - -// Info starts a new message with info level. -// -// You must call Msg on the returned event in order to send the event. -func Info() *zerolog.Event { - return Logger.Info() -} - -// Warn starts a new message with warn level. -// -// You must call Msg on the returned event in order to send the event. -func Warn() *zerolog.Event { - return Logger.Warn() -} - -// Error starts a new message with error level. -// -// You must call Msg on the returned event in order to send the event. -func Error() *zerolog.Event { - return Logger.Error() -} - -// Fatal starts a new message with fatal level. The os.Exit(1) function -// is called by the Msg method. -// -// You must call Msg on the returned event in order to send the event. -func Fatal() *zerolog.Event { - return Logger.Fatal() -} - -// Panic starts a new message with panic level. The message is also sent -// to the panic function. -// -// You must call Msg on the returned event in order to send the event. -func Panic() *zerolog.Event { - return Logger.Panic() -} - -// WithLevel starts a new message with level. -// -// You must call Msg on the returned event in order to send the event. -func WithLevel(level zerolog.Level) *zerolog.Event { - return Logger.WithLevel(level) -} - -// Log starts a new message with no level. Setting zerolog.GlobalLevel to -// zerolog.Disabled will still disable events produced by this method. -// -// You must call Msg on the returned event in order to send the event. -func Log() *zerolog.Event { - return Logger.Log() -} - -// Print sends a log event using debug level and no extra field. -// Arguments are handled in the manner of fmt.Print. -func Print(v ...interface{}) { - Logger.Debug().CallerSkipFrame(1).Msg(fmt.Sprint(v...)) -} - -// Printf sends a log event using debug level and no extra field. -// Arguments are handled in the manner of fmt.Printf. -func Printf(format string, v ...interface{}) { - Logger.Debug().CallerSkipFrame(1).Msgf(format, v...) -} - -// Ctx returns the Logger associated with the ctx. If no logger -// is associated, a disabled logger is returned. -func Ctx(ctx context.Context) *zerolog.Logger { - return zerolog.Ctx(ctx) -} diff --git a/version/version.go b/version/version.go index a3e54bfb..b7c960c3 100644 --- a/version/version.go +++ b/version/version.go @@ -1,3 +1,3 @@ package version -const Release = "v2.4.2" +const Release = "v2.5.1"