diff --git a/go.mod b/go.mod index 195282d0b..505f4f2cf 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,16 @@ module github.com/ComplianceAsCode/compliance-operator -go 1.20 +go 1.21 + +toolchain go1.22.2 require ( github.com/onsi/ginkgo v1.16.5 github.com/onsi/gomega v1.30.0 github.com/wI2L/jsondiff v0.4.0 - k8s.io/apimachinery v0.28.4 - k8s.io/client-go v0.28.4 - sigs.k8s.io/controller-runtime v0.16.3 + k8s.io/apimachinery v0.29.3 + k8s.io/client-go v0.29.3 + sigs.k8s.io/controller-runtime v0.17.2 ) require ( @@ -23,16 +25,16 @@ require ( github.com/coreos/ignition/v2 v2.16.2 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dsnet/compress v0.0.1 - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.3.0 + github.com/evanphx/json-patch v5.9.0+incompatible // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-logr/logr v1.4.1 github.com/go-logr/zapr v1.3.0 github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/itchyny/gojq v0.12.13 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 @@ -47,45 +49,45 @@ require ( github.com/openshift/machine-config-operator v0.0.1-0.20230815171034-c2bb862bc08a github.com/pborman/uuid v1.2.1 github.com/pkg/errors v0.9.1 - github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1 - github.com/prometheus-operator/prometheus-operator/pkg/client v0.68.0 - github.com/prometheus/client_golang v1.17.0 + github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.73.1 + github.com/prometheus-operator/prometheus-operator/pkg/client v0.73.1 + github.com/prometheus/client_golang v1.18.0 github.com/prometheus/client_model v0.5.0 - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/robfig/cron/v3 v3.0.1 github.com/securego/gosec/v2 v2.17.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace // indirect - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 - golang.org/x/mod v0.13.0 - golang.org/x/net v0.17.0 - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/time v0.3.0 // indirect + golang.org/x/mod v0.15.0 + golang.org/x/net v0.22.0 + golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.28.4 - k8s.io/apiextensions-apiserver v0.28.4 - k8s.io/apiserver v0.28.4 - k8s.io/component-base v0.28.4 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f // indirect + k8s.io/api v0.29.3 + k8s.io/apiextensions-apiserver v0.29.3 + k8s.io/apiserver v0.29.3 + k8s.io/component-base v0.29.3 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/kube-openapi v0.0.0-20240322212309-b815d8309940 // indirect k8s.io/pod-security-admission v0.28.4 - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + k8s.io/utils v0.0.0-20240310230437-4693a0247e57 // indirect sigs.k8s.io/controller-tools v0.13.0 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 ) @@ -102,13 +104,13 @@ require ( github.com/coreos/ign-converter v0.0.0-20230417193809-cee89ea7d8ff // indirect github.com/coreos/ignition v0.35.0 // indirect github.com/coreos/vcontext v0.0.0-20230201181013-d72178a18687 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect + github.com/evanphx/json-patch/v5 v5.8.0 // indirect github.com/fatih/color v1.15.0 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect - github.com/go-openapi/jsonpointer v0.20.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/gobuffalo/flect v1.0.2 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/gookit/color v1.5.4 // indirect @@ -119,10 +121,11 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/openshift/client-go v0.0.0-20230926161409-848405da69e1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/robfig/cron v1.2.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect @@ -130,7 +133,7 @@ require ( github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect go4.org v0.0.0-20200104003542-c7e774b10ea0 // indirect golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea // indirect - golang.org/x/tools v0.13.0 // indirect + golang.org/x/tools v0.18.0 // indirect k8s.io/kube-aggregator v0.28.2 // indirect sigs.k8s.io/kube-storage-version-migrator v0.0.6-0.20230721195810-5c8923c5ff96 // indirect ) diff --git a/go.sum b/go.sum index 09b971d8d..2a747f36f 100644 --- a/go.sum +++ b/go.sum @@ -63,16 +63,24 @@ github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5Jflh github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= +github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= 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= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -80,6 +88,8 @@ github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -87,11 +97,17 @@ github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= 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/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= @@ -113,6 +129,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -132,6 +150,8 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -178,6 +198,8 @@ github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWV github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -247,16 +269,24 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.68.0 h1:yl9ceUSUBo9woQIO+8eoWpcxZkdZgm89g+rVvu37TUw= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.68.0/go.mod h1:9Uuu3pEU2jB8PwuqkHvegQ0HV/BlZRJUyfTYAqfdVF8= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1 h1:hOnp+1FLBm+ifsyiRbunmfSs99jKAq+Tr5elCmo5l5U= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.69.1/go.mod h1:JtflYMUMay9HGil4aRg+dSj6X6mngtuBJf/ULOCxbxI= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.73.1 h1:VvIIWSQbvGaDgIeTrOintF/czS6UpLB086EUslAm7aI= +github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.73.1/go.mod h1:yJ3CawR/A5qEYFEeCOUVYLTwYxmacfHQhJS+b/2QiaM= github.com/prometheus-operator/prometheus-operator/pkg/client v0.68.0 h1:8FS0sXpFkFPxp2gfkxyEMnhZV9yhf7xPbpsIeUZHlzM= github.com/prometheus-operator/prometheus-operator/pkg/client v0.68.0/go.mod h1:ul4ND0BMCcOX1OSZvbJA1/lh7yQ2ILHNKuZIojGISe4= +github.com/prometheus-operator/prometheus-operator/pkg/client v0.73.1 h1:vaRwVEC1VP8j43gYRfszMvO3V7OFj5IaLQq911Co0uc= +github.com/prometheus-operator/prometheus-operator/pkg/client v0.73.1/go.mod h1:hCE/cbO8dd5yf4rGUlMJB0ylYLQAcmDYsYYdK+5K2x0= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= 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 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= @@ -265,10 +295,14 @@ github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cY github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -304,6 +338,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/vincent-petithory/dataurl v0.0.0-20160330182126-9a301d65acbb/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= @@ -344,6 +380,8 @@ golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -361,8 +399,12 @@ golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -397,6 +439,8 @@ golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -405,6 +449,8 @@ golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -413,8 +459,12 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= 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/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -427,6 +477,8 @@ golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -445,6 +497,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -473,42 +527,58 @@ k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM= k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc= k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= +k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= +k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= k8s.io/apiextensions-apiserver v0.28.2 h1:J6/QRWIKV2/HwBhHRVITMLYoypCoPY1ftigDM0Kn+QU= k8s.io/apiextensions-apiserver v0.28.2/go.mod h1:5tnkxLGa9nefefYzWuAlWZ7RZYuN/765Au8cWLA6SRg= k8s.io/apiextensions-apiserver v0.28.3 h1:Od7DEnhXHnHPZG+W9I97/fSQkVpVPQx2diy+2EtmY08= k8s.io/apiextensions-apiserver v0.28.3/go.mod h1:NE1XJZ4On0hS11aWWJUTNkmVB03j9LM7gJSisbRt8Lc= k8s.io/apiextensions-apiserver v0.28.4 h1:AZpKY/7wQ8n+ZYDtNHbAJBb+N4AXXJvyZx6ww6yAJvU= k8s.io/apiextensions-apiserver v0.28.4/go.mod h1:pgQIZ1U8eJSMQcENew/0ShUTlePcSGFq6dxSxf2mwPM= +k8s.io/apiextensions-apiserver v0.29.3 h1:9HF+EtZaVpFjStakF4yVufnXGPRppWFEQ87qnO91YeI= +k8s.io/apiextensions-apiserver v0.29.3/go.mod h1:po0XiY5scnpJfFizNGo6puNU6Fq6D70UJY2Cb2KwAVc= k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A= k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8= k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= k8s.io/apiserver v0.28.2 h1:rBeYkLvF94Nku9XfXyUIirsVzCzJBs6jMn3NWeHieyI= k8s.io/apiserver v0.28.2/go.mod h1:f7D5e8wH8MWcKD7azq6Csw9UN+CjdtXIVQUyUhrtb+E= k8s.io/apiserver v0.28.3 h1:8Ov47O1cMyeDzTXz0rwcfIIGAP/dP7L8rWbEljRcg5w= k8s.io/apiserver v0.28.3/go.mod h1:YIpM+9wngNAv8Ctt0rHG4vQuX/I5rvkEMtZtsxW2rNM= k8s.io/apiserver v0.28.4 h1:BJXlaQbAU/RXYX2lRz+E1oPe3G3TKlozMMCZWu5GMgg= k8s.io/apiserver v0.28.4/go.mod h1:Idq71oXugKZoVGUUL2wgBCTHbUR+FYTWa4rq9j4n23w= +k8s.io/apiserver v0.29.3 h1:xR7ELlJ/BZSr2n4CnD3lfA4gzFivh0wwfNfz9L0WZcE= +k8s.io/apiserver v0.29.3/go.mod h1:hrvXlwfRulbMbBgmWRQlFru2b/JySDpmzvQwwk4GUOs= k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4= k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo= k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= +k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= +k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= k8s.io/component-base v0.28.2 h1:Yc1yU+6AQSlpJZyvehm/NkJBII72rzlEsd6MkBQ+G0E= k8s.io/component-base v0.28.2/go.mod h1:4IuQPQviQCg3du4si8GpMrhAIegxpsgPngPRR/zWpzc= k8s.io/component-base v0.28.3 h1:rDy68eHKxq/80RiMb2Ld/tbH8uAE75JdCqJyi6lXMzI= k8s.io/component-base v0.28.3/go.mod h1:fDJ6vpVNSk6cRo5wmDa6eKIG7UlIQkaFmZN2fYgIUD8= k8s.io/component-base v0.28.4 h1:c/iQLWPdUgI90O+T9TeECg8o7N3YJTiuz2sKxILYcYo= k8s.io/component-base v0.28.4/go.mod h1:m9hR0uvqXDybiGL2nf/3Lf0MerAfQXzkfWhUY58JUbU= +k8s.io/component-base v0.29.3 h1:Oq9/nddUxlnrCuuR2K/jp6aflVvc0uDvxMzAWxnGzAo= +k8s.io/component-base v0.29.3/go.mod h1:Yuj33XXjuOk2BAaHsIGHhCKZQAgYKhqIxIjIr2UXYio= k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-aggregator v0.28.2 h1:tCjAfB1p/v18yD2NpegNQRuahzyA/szFfcRARnpjDeo= k8s.io/kube-aggregator v0.28.2/go.mod h1:g4hZVjC4KhJtZHV2pyiRBiU6AdBA/sAjh9Y9GJC/SbU= k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f h1:eeEUOoGYWhOz7EyXqhlR2zHKNw2mNJ9vzJmub6YN6kk= k8s.io/kube-openapi v0.0.0-20230905202853-d090da108d2f/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kube-openapi v0.0.0-20240322212309-b815d8309940 h1:qVoMaQV5t62UUvHe16Q3eb2c5HPzLHYzsi0Tu/xLndo= +k8s.io/kube-openapi v0.0.0-20240322212309-b815d8309940/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/pod-security-admission v0.28.2 h1:3kiOL+gc6auNTGHuQ0hVsGxYu2YO/7DZb0xYR84GxiQ= k8s.io/pod-security-admission v0.28.2/go.mod h1:gReea39xbhIzf4Ry0FDuiTi8uj1N5R9YXOh8zQSuTxs= k8s.io/pod-security-admission v0.28.3 h1:CtVVG36YwniCH4d18wAoFW6n0Qm5Z1uUVfDIiO4kY0I= @@ -517,10 +587,14 @@ k8s.io/pod-security-admission v0.28.4 h1:b9d6zfKNjkawrO2gF7rBr5XoSZqPfE6UjKLNjgX k8s.io/pod-security-admission v0.28.4/go.mod h1:MVYrZx0Q6ewsZ05Ml2+Ox03HQMAVjO60oombQNmJ44E= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240310230437-4693a0247e57 h1:gbqbevonBh57eILzModw6mrkbwM0gQBEuevE/AaBsHY= +k8s.io/utils v0.0.0-20240310230437-4693a0247e57/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/controller-runtime v0.16.1 h1:+15lzrmHsE0s2kNl0Dl8cTchI5Cs8qofo5PGcPrV9z0= sigs.k8s.io/controller-runtime v0.16.1/go.mod h1:vpMu3LpI5sYWtujJOa2uPK61nB5rbwlN7BAB8aSLvGU= sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4= sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= +sigs.k8s.io/controller-runtime v0.17.2/go.mod h1:+MngTvIQQQhfXtwfdGw/UOQ/aIaqsYywfCINOtwMO/s= sigs.k8s.io/controller-tools v0.13.0 h1:NfrvuZ4bxyolhDBt/rCZhDnx3M2hzlhgo5n3Iv2RykI= sigs.k8s.io/controller-tools v0.13.0/go.mod h1:5vw3En2NazbejQGCeWKRrE7q4P+CW8/klfVqP8QZkgA= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= @@ -529,6 +603,8 @@ sigs.k8s.io/kube-storage-version-migrator v0.0.6-0.20230721195810-5c8923c5ff96 h sigs.k8s.io/kube-storage-version-migrator v0.0.6-0.20230721195810-5c8923c5ff96/go.mod h1:EOBQyBowOUsd7U4CJnMHNE0ri+zCXyouGdLwC/jZU+I= sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= diff --git a/vendor/github.com/PaesslerAG/gval/.gitignore b/vendor/github.com/PaesslerAG/gval/.gitignore deleted file mode 100644 index 98576e300..000000000 --- a/vendor/github.com/PaesslerAG/gval/.gitignore +++ /dev/null @@ -1,30 +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 -coverage.out - -manual_test.go -*.out -*.err - -.vscode \ No newline at end of file diff --git a/vendor/github.com/PaesslerAG/gval/.travis.yml b/vendor/github.com/PaesslerAG/gval/.travis.yml deleted file mode 100644 index 681fe4668..000000000 --- a/vendor/github.com/PaesslerAG/gval/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -before_install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - -script: -- go test -bench=. -benchmem -timeout 10m -coverprofile coverage.out -- $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci -repotoken $COVERALLS_TOKEN -- go test -bench=Random -benchtime 5m -timeout 30m -benchmem -coverprofile coverage.out - -go: "1.11" diff --git a/vendor/github.com/PaesslerAG/gval/LICENSE b/vendor/github.com/PaesslerAG/gval/LICENSE deleted file mode 100644 index 0716dbca1..000000000 --- a/vendor/github.com/PaesslerAG/gval/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2017, Paessler AG -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -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 HOLDER 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. \ No newline at end of file diff --git a/vendor/github.com/PaesslerAG/gval/README.md b/vendor/github.com/PaesslerAG/gval/README.md deleted file mode 100644 index b88fe455d..000000000 --- a/vendor/github.com/PaesslerAG/gval/README.md +++ /dev/null @@ -1,156 +0,0 @@ -# Gval - -[![Godoc](https://godoc.org/github.com/PaesslerAG/gval?status.png)](https://godoc.org/github.com/PaesslerAG/gval) -[![Build Status](https://api.travis-ci.org/PaesslerAG/gval.svg?branch=master)](https://travis-ci.org/PaesslerAG/gval) -[![Coverage Status](https://coveralls.io/repos/github/PaesslerAG/gval/badge.svg?branch=master)](https://coveralls.io/github/PaesslerAG/gval?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/PaesslerAG/gval)](https://goreportcard.com/report/github.com/PaesslerAG/gval) - -Gval (Go eVALuate) provides support for evaluating arbitrary expressions, in particular Go-like expressions. - -![gopher](./prtg-batmin-gopher.png) - -## Evaluate - -Gval can evaluate expressions with parameters, arimethetic, logical, and string operations: - -- basic expression: [10 > 0](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Basic) -- parameterized expression: [foo > 0](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Parameter) -- nested parameterized expression: [foo.bar > 0](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--NestedParameter) -- arithmetic expression: [(requests_made * requests_succeeded / 100) >= 90](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Arithmetic) -- string expression: [http_response_body == "service is ok"](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--String) -- float64 expression: [(mem_used / total_mem) * 100](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Float64) - -It can easily be extended with custom functions or operators: - -- custom date comparator: [date(\`2014-01-02\`) > date(\`2014-01-01 23:59:59\`)](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--DateComparison) -- string length: [strlen("someReallyLongInputString") <= 16](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Strlen) - -You can parse gval.Expressions once and re-use them multiple times. Parsing is the compute-intensive phase of the process, so if you intend to use the same expression with different parameters, just parse it once: - -- [Parsing and Evaluation](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluable) - -The normal Go-standard order of operators is respected. When writing an expression, be sure that you either order the operators correctly, or use parentheses to clarify which portions of an expression should be run first. - -Strings, numbers, and booleans can be used like in Go: - -- [(7 < "47" == true ? "hello world!\n\u263a") + \` more text\`](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Encoding) - -## Parameter - -Variables can be accessed via string literals. They can be used for values with string keys if the parameter is a `map[string]interface{}` or `map[interface{}]interface{}` and for fields or methods if the parameter is a struct. - -- [foo > 0](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Parameter) - -### Bracket Selector - -Map and array elements and Struct Field can be accessed via `[]`. - -- [foo[0]](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Array) -- [foo["b" + "a" + "r"]](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--ExampleEvaluate_ComplexAccessor) - -### Dot Selector - -A nested variable with a name containing only letters and underscores can be accessed via a dot selector. - -- [foo.bar > 0](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--NestedParameter) - -### Custom Selector - -Parameter names like `response-time` will be interpreted as `response` minus `time`. While gval doesn't support these parameter names directly, you can easily access them via a custom extension like [JSON Path](https://github.com/PaesslerAG/jsonpath): - -- [$["response-time"]](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Jsonpath) - -Jsonpath is also suitable for accessing array elements. - -### Fields and Methods - -If you have structs in your parameters, you can access their fields and methods in the usual way: - -- [foo.Hello + foo.World()](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--FlatAccessor) - -It also works if the parameter is a struct directly -[Hello + World()](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--Accessor) -or if the fields are nested -[foo.Hello + foo.World()](https://godoc.org/github.com/PaesslerAG/gval/#example-Evaluate--NestedAccessor) - -This may be convenient but note that using accessors on strucs makes the expression about four times slower than just using a parameter (consult the benchmarks for more precise measurements on your system). If there are functions you want to use, it's faster (and probably cleaner) to define them as functions (see the Evaluate section). These approaches use no reflection, and are designed to be fast and clean. - -## Default Language - -The default language is in serveral sub languages like text, arithmetic or propositional logic defined. See [Godoc](https://godoc.org/github.com/PaesslerAG/gval/#Gval) for details. All sub languages are merged into gval.Full which contains the following elements: - -- Modifiers: `+` `-` `/` `*` `&` `|` `^` `**` `%` `>>` `<<` -- Comparators: `>` `>=` `<` `<=` `==` `!=` `=~` `!~` -- Logical ops: `||` `&&` -- Numeric constants, as 64-bit floating point (`12345.678`) -- String constants (double quotes: `"foobar"`) -- Date function 'Date(x)', using any permutation of RFC3339, ISO8601, ruby date, or unix date -- Boolean constants: `true` `false` -- Parentheses to control order of evaluation `(` `)` -- Json Arrays : `[1, 2, "foo"]` -- Json Objects : `{"a":1, "b":2, "c":"foo"}` -- Prefixes: `!` `-` `~` -- Ternary conditional: `?` `:` -- Null coalescence: `??` - -## Customize - -Gval is completly customizable. Every constant, function or operator can be defined separately and existing expression languages can be reused: - -- [foo.Hello + foo.World()](https://godoc.org/github.com/PaesslerAG/gval/#example-Language) - -For details see [Godoc](https://godoc.org/github.com/PaesslerAG/gval). - -### External gval Languages - -A list of external libraries for gval. Feel free to add your own library. - -- [gvalstrings](https://github.com/generikvault/gvalstrings) parse single quoted strings in gval. -- [jsonpath](https://github.com/PaesslerAG/jsonpath) full support for jsonpath in gval. - -## Performance - -The library is built with the intention of being quick but has not been aggressively profiled and optimized. For most applications, though, it is completely fine. -If performance is an issue, make sure to create your expression language with all functions, constants and operators only once. Evaluating an expression like gval.Evaluate("expression, const1, func1, func2, ...) creates a new gval.Language everytime it is called and slows execution. - -The library comes with a bunch of benchmarks to measure the performance of parsing and evaluating expressions. You can run them with `go test -bench=.`. - -For a very rough idea of performance, here are the results from a benchmark run on a Dell Latitude E7470 Win 10 i5-6300U. - -``` text -BenchmarkGval/const_evaluation-4 500000000 3.57 ns/op -BenchmarkGval/const_parsing-4 1000000 1144 ns/op -BenchmarkGval/single_parameter_evaluation-4 10000000 165 ns/op -BenchmarkGval/single_parameter_parsing-4 1000000 1648 ns/op -BenchmarkGval/parameter_evaluation-4 5000000 352 ns/op -BenchmarkGval/parameter_parsing-4 500000 2773 ns/op -BenchmarkGval/common_evaluation-4 3000000 434 ns/op -BenchmarkGval/common_parsing-4 300000 4419 ns/op -BenchmarkGval/complex_evaluation-4 100000000 11.6 ns/op -BenchmarkGval/complex_parsing-4 100000 17936 ns/op -BenchmarkGval/literal_evaluation-4 300000000 3.84 ns/op -BenchmarkGval/literal_parsing-4 500000 2559 ns/op -BenchmarkGval/modifier_evaluation-4 500000000 3.54 ns/op -BenchmarkGval/modifier_parsing-4 500000 3755 ns/op -BenchmarkGval/regex_evaluation-4 50000 21347 ns/op -BenchmarkGval/regex_parsing-4 200000 6480 ns/op -BenchmarkGval/constant_regex_evaluation-4 1000000 1000 ns/op -BenchmarkGval/constant_regex_parsing-4 200000 9417 ns/op -BenchmarkGval/accessors_evaluation-4 3000000 417 ns/op -BenchmarkGval/accessors_parsing-4 1000000 1778 ns/op -BenchmarkGval/accessors_method_evaluation-4 1000000 1931 ns/op -BenchmarkGval/accessors_method_parsing-4 1000000 1729 ns/op -BenchmarkGval/accessors_method_parameter_evaluation-4 1000000 2162 ns/op -BenchmarkGval/accessors_method_parameter_parsing-4 500000 2618 ns/op -BenchmarkGval/nested_accessors_evaluation-4 2000000 681 ns/op -BenchmarkGval/nested_accessors_parsing-4 1000000 2115 ns/op -BenchmarkRandom-4 500000 3631 ns/op -ok -``` - -## API Breaks - -Gval is designed with easy expandability in mind and API breaks will be avoided if possible. If API breaks are unavoidable they wil be explicitly stated via an increased major version number. - -------------------------------------- -Credits to Reene French for the gophers. diff --git a/vendor/github.com/PaesslerAG/gval/evaluable.go b/vendor/github.com/PaesslerAG/gval/evaluable.go deleted file mode 100644 index 5238854c3..000000000 --- a/vendor/github.com/PaesslerAG/gval/evaluable.go +++ /dev/null @@ -1,334 +0,0 @@ -package gval - -import ( - "context" - "fmt" - "reflect" - "regexp" - "strconv" - "strings" -) - -// Evaluable evaluates given parameter -type Evaluable func(c context.Context, parameter interface{}) (interface{}, error) - -//EvalInt evaluates given parameter to an int -func (e Evaluable) EvalInt(c context.Context, parameter interface{}) (int, error) { - v, err := e(c, parameter) - if err != nil { - return 0, err - } - - f, ok := convertToFloat(v) - if !ok { - return 0, fmt.Errorf("expected number but got %v (%T)", v, v) - } - return int(f), nil -} - -//EvalFloat64 evaluates given parameter to an int -func (e Evaluable) EvalFloat64(c context.Context, parameter interface{}) (float64, error) { - v, err := e(c, parameter) - if err != nil { - return 0, err - } - - f, ok := convertToFloat(v) - if !ok { - return 0, fmt.Errorf("expected number but got %v (%T)", v, v) - } - return f, nil -} - -//EvalBool evaluates given parameter to a bool -func (e Evaluable) EvalBool(c context.Context, parameter interface{}) (bool, error) { - v, err := e(c, parameter) - if err != nil { - return false, err - } - - b, ok := convertToBool(v) - if !ok { - return false, fmt.Errorf("expected bool but got %v (%T)", v, v) - } - return b, nil -} - -//EvalString evaluates given parameter to a string -func (e Evaluable) EvalString(c context.Context, parameter interface{}) (string, error) { - o, err := e(c, parameter) - if err != nil { - return "", err - } - return fmt.Sprintf("%v", o), nil -} - -//Const Evaluable represents given constant -func (*Parser) Const(value interface{}) Evaluable { - return constant(value) -} - -func constant(value interface{}) Evaluable { - return func(c context.Context, v interface{}) (interface{}, error) { - return value, nil - } -} - -//Var Evaluable represents value at given path. -//It supports with default language VariableSelector: -// map[interface{}]interface{}, -// map[string]interface{} and -// []interface{} and via reflect -// struct fields, -// struct methods, -// slices and -// map with int or string key. -func (p *Parser) Var(path ...Evaluable) Evaluable { - if p.Language.selector == nil { - return variable(path) - } - return p.Language.selector(path) -} - -// Evaluables is a slice of Evaluable. -type Evaluables []Evaluable - -// EvalStrings evaluates given parameter to a string slice -func (evs Evaluables) EvalStrings(c context.Context, parameter interface{}) ([]string, error) { - strs := make([]string, len(evs)) - for i, p := range evs { - k, err := p.EvalString(c, parameter) - if err != nil { - return nil, err - } - strs[i] = k - } - return strs, nil -} - -func variable(path Evaluables) Evaluable { - return func(c context.Context, v interface{}) (interface{}, error) { - keys, err := path.EvalStrings(c, v) - if err != nil { - return nil, err - } - for i, k := range keys { - switch o := v.(type) { - case map[interface{}]interface{}: - v = o[k] - continue - case map[string]interface{}: - v = o[k] - continue - case []interface{}: - if i, err := strconv.Atoi(k); err == nil && i >= 0 && len(o) > i { - v = o[i] - continue - } - default: - var ok bool - v, ok = reflectSelect(k, o) - if !ok { - return nil, fmt.Errorf("unknown parameter %s", strings.Join(keys[:i+1], ".")) - } - } - } - return v, nil - } -} - -func reflectSelect(key string, value interface{}) (selection interface{}, ok bool) { - vv := reflect.ValueOf(value) - vvElem := resolvePotentialPointer(vv) - - switch vvElem.Kind() { - case reflect.Map: - mapKey, ok := reflectConvertTo(vv.Type().Key().Kind(), key) - if !ok { - return nil, false - } - - vvElem = vv.MapIndex(reflect.ValueOf(mapKey)) - vvElem = resolvePotentialPointer(vvElem) - - if vvElem.IsValid() { - return vvElem.Interface(), true - } - case reflect.Slice: - if i, err := strconv.Atoi(key); err == nil && i >= 0 && vv.Len() > i { - vvElem = resolvePotentialPointer(vv.Index(i)) - return vvElem.Interface(), true - } - case reflect.Struct: - field := vvElem.FieldByName(key) - if field.IsValid() { - return field.Interface(), true - } - - method := vv.MethodByName(key) - if method.IsValid() { - return method.Interface(), true - } - } - return nil, false -} - -func resolvePotentialPointer(value reflect.Value) reflect.Value { - if value.Kind() == reflect.Ptr { - return value.Elem() - } - return value -} - -func reflectConvertTo(k reflect.Kind, value string) (interface{}, bool) { - switch k { - case reflect.String: - return value, true - case reflect.Int: - if i, err := strconv.Atoi(value); err == nil { - return i, true - } - } - return nil, false -} - -func (*Parser) callFunc(fun function, args ...Evaluable) Evaluable { - return func(c context.Context, v interface{}) (ret interface{}, err error) { - a := make([]interface{}, len(args)) - for i, arg := range args { - ai, err := arg(c, v) - if err != nil { - return nil, err - } - a[i] = ai - } - return fun(a...) - } -} - -func (*Parser) callEvaluable(fullname string, fun Evaluable, args ...Evaluable) Evaluable { - return func(c context.Context, v interface{}) (ret interface{}, err error) { - f, err := fun(c, v) - - if err != nil { - return nil, fmt.Errorf("could not call function: %v", err) - } - - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("failed to execute function '%s': %s", fullname, r) - ret = nil - } - }() - - ff := reflect.ValueOf(f) - - if ff.Kind() != reflect.Func { - return nil, fmt.Errorf("could not call '%s' type %T", fullname, f) - } - - a := make([]reflect.Value, len(args)) - for i := range args { - arg, err := args[i](c, v) - if err != nil { - return nil, err - } - a[i] = reflect.ValueOf(arg) - } - - rr := ff.Call(a) - - r := make([]interface{}, len(rr)) - for i, e := range rr { - r[i] = e.Interface() - } - - errorInterface := reflect.TypeOf((*error)(nil)).Elem() - if len(r) > 0 && ff.Type().Out(len(r)-1).Implements(errorInterface) { - if r[len(r)-1] != nil { - err = r[len(r)-1].(error) - } - r = r[0 : len(r)-1] - } - - switch len(r) { - case 0: - return err, nil - case 1: - return r[0], err - default: - return r, err - } - } -} - -//IsConst returns if the Evaluable is a Parser.Const() value -func (e Evaluable) IsConst() bool { - pc := reflect.ValueOf(constant(nil)).Pointer() - pe := reflect.ValueOf(e).Pointer() - return pc == pe -} - -func regEx(a, b Evaluable) (Evaluable, error) { - if !b.IsConst() { - return func(c context.Context, o interface{}) (interface{}, error) { - a, err := a.EvalString(c, o) - if err != nil { - return nil, err - } - b, err := b.EvalString(c, o) - if err != nil { - return nil, err - } - matched, err := regexp.MatchString(b, a) - return matched, err - }, nil - } - s, err := b.EvalString(nil, nil) - if err != nil { - return nil, err - } - regex, err := regexp.Compile(s) - if err != nil { - return nil, err - } - return func(c context.Context, v interface{}) (interface{}, error) { - s, err := a.EvalString(c, v) - if err != nil { - return nil, err - } - return regex.MatchString(s), nil - }, nil -} - -func notRegEx(a, b Evaluable) (Evaluable, error) { - if !b.IsConst() { - return func(c context.Context, o interface{}) (interface{}, error) { - a, err := a.EvalString(c, o) - if err != nil { - return nil, err - } - b, err := b.EvalString(c, o) - if err != nil { - return nil, err - } - matched, err := regexp.MatchString(b, a) - return !matched, err - }, nil - } - s, err := b.EvalString(nil, nil) - if err != nil { - return nil, err - } - regex, err := regexp.Compile(s) - if err != nil { - return nil, err - } - return func(c context.Context, v interface{}) (interface{}, error) { - s, err := a.EvalString(c, v) - if err != nil { - return nil, err - } - return !regex.MatchString(s), nil - }, nil -} diff --git a/vendor/github.com/PaesslerAG/gval/functions.go b/vendor/github.com/PaesslerAG/gval/functions.go deleted file mode 100644 index 396040f7c..000000000 --- a/vendor/github.com/PaesslerAG/gval/functions.go +++ /dev/null @@ -1,73 +0,0 @@ -package gval - -import ( - "fmt" - "reflect" -) - -type function func(arguments ...interface{}) (interface{}, error) - -func toFunc(f interface{}) function { - if f, ok := f.(func(arguments ...interface{}) (interface{}, error)); ok { - return function(f) - } - return func(args ...interface{}) (interface{}, error) { - fun := reflect.ValueOf(f) - t := fun.Type() - - in, err := createCallArguments(t, args) - if err != nil { - return nil, err - } - out := fun.Call(in) - - r := make([]interface{}, len(out)) - for i, e := range out { - r[i] = e.Interface() - } - - err = nil - errorInterface := reflect.TypeOf((*error)(nil)).Elem() - if len(r) > 0 && t.Out(len(r)-1).Implements(errorInterface) { - if r[len(r)-1] != nil { - err = r[len(r)-1].(error) - } - r = r[0 : len(r)-1] - } - - switch len(r) { - case 0: - return nil, err - case 1: - return r[0], err - default: - return r, err - } - } -} - -func createCallArguments(t reflect.Type, args []interface{}) ([]reflect.Value, error) { - variadic := t.IsVariadic() - numIn := t.NumIn() - - if (!variadic && len(args) != numIn) || (variadic && len(args) < numIn-1) { - return nil, fmt.Errorf("invalid number of parameters") - } - - in := make([]reflect.Value, len(args)) - var inType reflect.Type - for i, arg := range args { - if !variadic || i < numIn-1 { - inType = t.In(i) - } else if i == numIn-1 { - inType = t.In(numIn - 1).Elem() - } - argVal := reflect.ValueOf(arg) - if arg == nil || !argVal.Type().AssignableTo(inType) { - return nil, fmt.Errorf("expected type %s for parameter %d but got %T", - inType.String(), i, arg) - } - in[i] = argVal - } - return in, nil -} diff --git a/vendor/github.com/PaesslerAG/gval/gval.go b/vendor/github.com/PaesslerAG/gval/gval.go deleted file mode 100644 index ef6a5fcc2..000000000 --- a/vendor/github.com/PaesslerAG/gval/gval.go +++ /dev/null @@ -1,262 +0,0 @@ -// Package gval provides a generic expression language. -// All functions, infix and prefix operators can be replaced by composing languages into a new one. -// -// The package contains concrete expression languages for common application in text, arithmetic, propositional logic and so on. -// They can be used as basis for a custom expression language or to evaluate expressions directly. -package gval - -import ( - "context" - "fmt" - "math" - "reflect" - "text/scanner" - "time" -) - -//Evaluate given parameter with given expression in gval full language -func Evaluate(expression string, parameter interface{}, opts ...Language) (interface{}, error) { - l := full - if len(opts) > 0 { - l = NewLanguage(append([]Language{l}, opts...)...) - } - return l.Evaluate(expression, parameter) -} - -// Full is the union of Arithmetic, Bitmask, Text, PropositionalLogic, and Json -// Operator in: a in b is true iff value a is an element of array b -// Operator ??: a ?? b returns a if a is not false or nil, otherwise n -// Operator ?: a ? b : c returns b if bool a is true, otherwise b -// -// Function Date: Date(a) parses string a. a must match RFC3339, ISO8601, ruby date, or unix date -func Full(extensions ...Language) Language { - if len(extensions) == 0 { - return full - } - return NewLanguage(append([]Language{full}, extensions...)...) -} - -// Arithmetic contains base, plus(+), minus(-), divide(/), power(**), negative(-) -// and numerical order (<=,<,>,>=) -// -// Arithmetic operators expect float64 operands. -// Called with unfitting input, they try to convert the input to float64. -// They can parse strings and convert any type of int or float. -func Arithmetic() Language { - return arithmetic -} - -// Bitmask contains base, bitwise and(&), bitwise or(|) and bitwise not(^). -// -// Bitmask operators expect float64 operands. -// Called with unfitting input they try to convert the input to float64. -// They can parse strings and convert any type of int or float. -func Bitmask() Language { - return bitmask -} - -// Text contains base, lexical order on strings (<=,<,>,>=), -// regex match (=~) and regex not match (!~) -func Text() Language { - return text -} - -// PropositionalLogic contains base, not(!), and (&&), or (||) and Base. -// -// Propositional operator expect bool operands. -// Called with unfitting input they try to convert the input to bool. -// Numbers other than 0 and the strings "TRUE" and "true" are interpreted as true. -// 0 and the strings "FALSE" and "false" are interpreted as false. -func PropositionalLogic() Language { - return propositionalLogic -} - -// JSON contains json objects ({string:expression,...}) -// and json arrays ([expression, ...]) -func JSON() Language { - return ljson -} - -// Base contains equal (==) and not equal (!=), perentheses and general support for variables, constants and functions -// It contains true, false, (floating point) number, string ("" or ``) and char ('') constants -func Base() Language { - return base -} - -var full = NewLanguage(arithmetic, bitmask, text, propositionalLogic, ljson, - - InfixOperator("in", inArray), - - InfixShortCircuit("??", func(a interface{}) (interface{}, bool) { - return a, a != false && a != nil - }), - InfixOperator("??", func(a, b interface{}) (interface{}, error) { - if a == false || a == nil { - return b, nil - } - return a, nil - }), - - PostfixOperator("?", parseIf), - - Function("date", func(arguments ...interface{}) (interface{}, error) { - if len(arguments) != 1 { - return nil, fmt.Errorf("date() expects exactly one string argument") - } - s, ok := arguments[0].(string) - if !ok { - return nil, fmt.Errorf("date() expects exactly one string argument") - } - for _, format := range [...]string{ - time.ANSIC, - time.UnixDate, - time.RubyDate, - time.Kitchen, - time.RFC3339, - time.RFC3339Nano, - "2006-01-02", // RFC 3339 - "2006-01-02 15:04", // RFC 3339 with minutes - "2006-01-02 15:04:05", // RFC 3339 with seconds - "2006-01-02 15:04:05-07:00", // RFC 3339 with seconds and timezone - "2006-01-02T15Z0700", // ISO8601 with hour - "2006-01-02T15:04Z0700", // ISO8601 with minutes - "2006-01-02T15:04:05Z0700", // ISO8601 with seconds - "2006-01-02T15:04:05.999999999Z0700", // ISO8601 with nanoseconds - } { - ret, err := time.ParseInLocation(format, s, time.Local) - if err == nil { - return ret, nil - } - } - return nil, fmt.Errorf("date() could not parse %s", s) - }), -) - -var ljson = NewLanguage( - PrefixExtension('[', parseJSONArray), - PrefixExtension('{', parseJSONObject), -) - -var arithmetic = NewLanguage( - InfixNumberOperator("+", func(a, b float64) (interface{}, error) { return a + b, nil }), - InfixNumberOperator("-", func(a, b float64) (interface{}, error) { return a - b, nil }), - InfixNumberOperator("*", func(a, b float64) (interface{}, error) { return a * b, nil }), - InfixNumberOperator("/", func(a, b float64) (interface{}, error) { return a / b, nil }), - InfixNumberOperator("%", func(a, b float64) (interface{}, error) { return math.Mod(a, b), nil }), - InfixNumberOperator("**", func(a, b float64) (interface{}, error) { return math.Pow(a, b), nil }), - - InfixNumberOperator(">", func(a, b float64) (interface{}, error) { return a > b, nil }), - InfixNumberOperator(">=", func(a, b float64) (interface{}, error) { return a >= b, nil }), - InfixNumberOperator("<", func(a, b float64) (interface{}, error) { return a < b, nil }), - InfixNumberOperator("<=", func(a, b float64) (interface{}, error) { return a <= b, nil }), - - InfixNumberOperator("==", func(a, b float64) (interface{}, error) { return a == b, nil }), - InfixNumberOperator("!=", func(a, b float64) (interface{}, error) { return a != b, nil }), - - base, -) - -var bitmask = NewLanguage( - InfixNumberOperator("^", func(a, b float64) (interface{}, error) { return float64(int64(a) ^ int64(b)), nil }), - InfixNumberOperator("&", func(a, b float64) (interface{}, error) { return float64(int64(a) & int64(b)), nil }), - InfixNumberOperator("|", func(a, b float64) (interface{}, error) { return float64(int64(a) | int64(b)), nil }), - InfixNumberOperator("<<", func(a, b float64) (interface{}, error) { return float64(int64(a) << uint64(b)), nil }), - InfixNumberOperator(">>", func(a, b float64) (interface{}, error) { return float64(int64(a) >> uint64(b)), nil }), - - PrefixOperator("~", func(c context.Context, v interface{}) (interface{}, error) { - i, ok := convertToFloat(v) - if !ok { - return nil, fmt.Errorf("unexpected %T expected number", v) - } - return float64(^int64(i)), nil - }), -) - -var text = NewLanguage( - InfixTextOperator("+", func(a, b string) (interface{}, error) { return fmt.Sprintf("%v%v", a, b), nil }), - - InfixTextOperator("<", func(a, b string) (interface{}, error) { return a < b, nil }), - InfixTextOperator("<=", func(a, b string) (interface{}, error) { return a <= b, nil }), - InfixTextOperator(">", func(a, b string) (interface{}, error) { return a > b, nil }), - InfixTextOperator(">=", func(a, b string) (interface{}, error) { return a >= b, nil }), - - InfixEvalOperator("=~", regEx), - InfixEvalOperator("!~", notRegEx), - base, -) - -var propositionalLogic = NewLanguage( - PrefixOperator("!", func(c context.Context, v interface{}) (interface{}, error) { - b, ok := convertToBool(v) - if !ok { - return nil, fmt.Errorf("unexpected %T expected bool", v) - } - return !b, nil - }), - - InfixShortCircuit("&&", func(a interface{}) (interface{}, bool) { return false, a == false }), - InfixBoolOperator("&&", func(a, b bool) (interface{}, error) { return a && b, nil }), - InfixShortCircuit("||", func(a interface{}) (interface{}, bool) { return true, a == true }), - InfixBoolOperator("||", func(a, b bool) (interface{}, error) { return a || b, nil }), - - InfixBoolOperator("==", func(a, b bool) (interface{}, error) { return a == b, nil }), - InfixBoolOperator("!=", func(a, b bool) (interface{}, error) { return a != b, nil }), - - base, -) - -var base = NewLanguage( - PrefixExtension(scanner.Int, parseNumber), - PrefixExtension(scanner.Float, parseNumber), - PrefixOperator("-", func(c context.Context, v interface{}) (interface{}, error) { - i, ok := convertToFloat(v) - if !ok { - return nil, fmt.Errorf("unexpected %v(%T) expected number", v, v) - } - return -i, nil - }), - - PrefixExtension(scanner.String, parseString), - PrefixExtension(scanner.Char, parseString), - PrefixExtension(scanner.RawString, parseString), - - Constant("true", true), - Constant("false", false), - - InfixOperator("==", func(a, b interface{}) (interface{}, error) { return reflect.DeepEqual(a, b), nil }), - InfixOperator("!=", func(a, b interface{}) (interface{}, error) { return !reflect.DeepEqual(a, b), nil }), - PrefixExtension('(', parseParentheses), - - Precedence("??", 0), - - Precedence("||", 20), - Precedence("&&", 21), - - Precedence("==", 40), - Precedence("!=", 40), - Precedence(">", 40), - Precedence(">=", 40), - Precedence("<", 40), - Precedence("<=", 40), - Precedence("=~", 40), - Precedence("!~", 40), - Precedence("in", 40), - - Precedence("^", 60), - Precedence("&", 60), - Precedence("|", 60), - - Precedence("<<", 90), - Precedence(">>", 90), - - Precedence("+", 120), - Precedence("-", 120), - - Precedence("*", 150), - Precedence("/", 150), - Precedence("%", 150), - - Precedence("**", 200), - - PrefixMetaPrefix(scanner.Ident, parseIdent), -) diff --git a/vendor/github.com/PaesslerAG/gval/language.go b/vendor/github.com/PaesslerAG/gval/language.go deleted file mode 100644 index 582f3e2cb..000000000 --- a/vendor/github.com/PaesslerAG/gval/language.go +++ /dev/null @@ -1,238 +0,0 @@ -package gval - -import ( - "context" - "fmt" - "text/scanner" - "unicode" -) - -// Language is an expression language -type Language struct { - prefixes map[interface{}]prefix - operators map[string]operator - operatorSymbols map[rune]struct{} - selector func(Evaluables) Evaluable -} - -// NewLanguage returns the union of given Languages as new Language. -func NewLanguage(bases ...Language) Language { - l := newLanguage() - for _, base := range bases { - for i, e := range base.prefixes { - l.prefixes[i] = e - } - for i, e := range base.operators { - l.operators[i] = e.merge(l.operators[i]) - l.operators[i].initiate(i) - } - for i := range base.operatorSymbols { - l.operatorSymbols[i] = struct{}{} - } - if base.selector != nil { - l.selector = base.selector - } - } - return l -} - -func newLanguage() Language { - return Language{ - prefixes: map[interface{}]prefix{}, - operators: map[string]operator{}, - operatorSymbols: map[rune]struct{}{}, - } -} - -// NewEvaluable returns an Evaluable for given expression in the specified language -func (l Language) NewEvaluable(expression string) (Evaluable, error) { - p := newParser(expression, l) - - eval, err := p.ParseExpression(context.Background()) - - if err == nil && p.isCamouflaged() && p.lastScan != scanner.EOF { - err = p.camouflage - } - - if err != nil { - pos := p.scanner.Pos() - return nil, fmt.Errorf("parsing error: %s - %d:%d %s", p.scanner.Position, pos.Line, pos.Column, err) - } - return eval, nil -} - -// Evaluate given parameter with given expression -func (l Language) Evaluate(expression string, parameter interface{}) (interface{}, error) { - eval, err := l.NewEvaluable(expression) - if err != nil { - return nil, err - } - v, err := eval(context.Background(), parameter) - if err != nil { - return nil, fmt.Errorf("can not evaluate %s: %v", expression, err) - } - return v, nil -} - -// Function returns a Language with given function. -// Function has no conversion for input types. -// -// If the function returns an error it must be the last return parameter. -// -// If the function has (without the error) more then one return parameter, -// it returns them as []interface{}. -func Function(name string, function interface{}) Language { - l := newLanguage() - l.prefixes[name] = func(c context.Context, p *Parser) (eval Evaluable, err error) { - args := []Evaluable{} - scan := p.Scan() - switch scan { - case '(': - args, err = p.parseArguments(c) - if err != nil { - return nil, err - } - default: - p.Camouflage("function call", '(') - } - return p.callFunc(toFunc(function), args...), nil - } - return l -} - -// Constant returns a Language with given constant -func Constant(name string, value interface{}) Language { - l := newLanguage() - l.prefixes[l.makePrefixKey(name)] = func(c context.Context, p *Parser) (eval Evaluable, err error) { - return p.Const(value), nil - } - return l -} - -// PrefixExtension extends a Language -func PrefixExtension(r rune, ext func(context.Context, *Parser) (Evaluable, error)) Language { - l := newLanguage() - l.prefixes[r] = ext - return l -} - -// PrefixMetaPrefix chooses a Prefix to be executed -func PrefixMetaPrefix(r rune, ext func(context.Context, *Parser) (call string, alternative func() (Evaluable, error), err error)) Language { - l := newLanguage() - l.prefixes[r] = func(c context.Context, p *Parser) (Evaluable, error) { - call, alternative, err := ext(c, p) - if err != nil { - return nil, err - } - if prefix, ok := p.prefixes[l.makePrefixKey(call)]; ok { - return prefix(c, p) - } - return alternative() - } - return l -} - -//PrefixOperator returns a Language with given prefix -func PrefixOperator(name string, e Evaluable) Language { - l := newLanguage() - l.prefixes[l.makePrefixKey(name)] = func(c context.Context, p *Parser) (Evaluable, error) { - eval, err := p.ParseNextExpression(c) - if err != nil { - return nil, err - } - prefix := func(c context.Context, v interface{}) (interface{}, error) { - a, err := eval(c, v) - if err != nil { - return nil, err - } - return e(c, a) - } - if eval.IsConst() { - v, err := prefix(context.Background(), nil) - if err != nil { - return nil, err - } - prefix = p.Const(v) - } - return prefix, nil - } - return l -} - -// PostfixOperator extends a Language. -func PostfixOperator(name string, ext func(context.Context, *Parser, Evaluable) (Evaluable, error)) Language { - l := newLanguage() - l.operators[l.makeInfixKey(name)] = postfix{ - f: func(c context.Context, p *Parser, eval Evaluable, pre operatorPrecedence) (Evaluable, error) { - return ext(c, p, eval) - }, - } - return l -} - -// InfixOperator for two arbitrary values. -func InfixOperator(name string, f func(a, b interface{}) (interface{}, error)) Language { - return newLanguageOperator(name, &infix{arbitrary: f}) -} - -// InfixShortCircuit operator is called after the left operand is evaluated. -func InfixShortCircuit(name string, f func(a interface{}) (interface{}, bool)) Language { - return newLanguageOperator(name, &infix{shortCircuit: f}) -} - -// InfixTextOperator for two text values. -func InfixTextOperator(name string, f func(a, b string) (interface{}, error)) Language { - return newLanguageOperator(name, &infix{text: f}) -} - -// InfixNumberOperator for two number values. -func InfixNumberOperator(name string, f func(a, b float64) (interface{}, error)) Language { - return newLanguageOperator(name, &infix{number: f}) -} - -// InfixBoolOperator for two bool values. -func InfixBoolOperator(name string, f func(a, b bool) (interface{}, error)) Language { - return newLanguageOperator(name, &infix{boolean: f}) -} - -// Precedence of operator. The Operator with higher operatorPrecedence is evaluated first. -func Precedence(name string, operatorPrecendence uint8) Language { - return newLanguageOperator(name, operatorPrecedence(operatorPrecendence)) -} - -// InfixEvalOperator operates on the raw operands. -// Therefore it cannot be combined with operators for other operand types. -func InfixEvalOperator(name string, f func(a, b Evaluable) (Evaluable, error)) Language { - return newLanguageOperator(name, directInfix{infixBuilder: f}) -} - -func newLanguageOperator(name string, op operator) Language { - op.initiate(name) - l := newLanguage() - l.operators[l.makeInfixKey(name)] = op - return l -} - -func (l *Language) makePrefixKey(key string) interface{} { - runes := []rune(key) - if len(runes) == 1 && !unicode.IsLetter(runes[0]) { - return runes[0] - } - return key -} - -func (l *Language) makeInfixKey(key string) string { - runes := []rune(key) - for _, r := range runes { - l.operatorSymbols[r] = struct{}{} - } - return key -} - -// VariableSelector returns a Language which uses given variable selector. -// It must be combined with a Language that uses the vatiable selector. E.g. gval.Base(). -func VariableSelector(selector func(path Evaluables) Evaluable) Language { - l := newLanguage() - l.selector = selector - return l -} diff --git a/vendor/github.com/PaesslerAG/gval/operator.go b/vendor/github.com/PaesslerAG/gval/operator.go deleted file mode 100644 index 6c34744ba..000000000 --- a/vendor/github.com/PaesslerAG/gval/operator.go +++ /dev/null @@ -1,314 +0,0 @@ -package gval - -import ( - "context" - "fmt" - "reflect" - "strconv" -) - -type stage struct { - Evaluable - infixBuilder - operatorPrecedence -} - -type stageStack []stage //operatorPrecedence in stacktStage is continuously, monotone ascending - -func (s *stageStack) push(b stage) error { - for len(*s) > 0 && s.peek().operatorPrecedence >= b.operatorPrecedence { - a := s.pop() - eval, err := a.infixBuilder(a.Evaluable, b.Evaluable) - if err != nil { - return err - } - if a.IsConst() && b.IsConst() { - v, err := eval(nil, nil) - if err != nil { - return err - } - b.Evaluable = constant(v) - continue - } - b.Evaluable = eval - } - *s = append(*s, b) - return nil -} - -func (s *stageStack) peek() stage { - return (*s)[len(*s)-1] -} - -func (s *stageStack) pop() stage { - a := s.peek() - (*s) = (*s)[:len(*s)-1] - return a -} - -type infixBuilder func(a, b Evaluable) (Evaluable, error) - -func (l Language) isSymbolOperation(r rune) bool { - _, in := l.operatorSymbols[r] - return in -} - -func (op *infix) initiate(name string) { - f := func(a, b interface{}) (interface{}, error) { - return nil, fmt.Errorf("invalid operation (%T) %s (%T)", a, name, b) - } - if op.arbitrary != nil { - f = op.arbitrary - } - for _, typeConvertion := range []bool{true, false} { - if op.text != nil && (!typeConvertion || op.arbitrary == nil) { - f = getStringOpFunc(op.text, f, typeConvertion) - } - if op.boolean != nil { - f = getBoolOpFunc(op.boolean, f, typeConvertion) - } - if op.number != nil { - f = getFloatOpFunc(op.number, f, typeConvertion) - } - } - if op.shortCircuit == nil { - op.builder = func(a, b Evaluable) (Evaluable, error) { - return func(c context.Context, x interface{}) (interface{}, error) { - a, err := a(c, x) - if err != nil { - return nil, err - } - b, err := b(c, x) - if err != nil { - return nil, err - } - return f(a, b) - }, nil - } - return - } - shortF := op.shortCircuit - op.builder = func(a, b Evaluable) (Evaluable, error) { - return func(c context.Context, x interface{}) (interface{}, error) { - a, err := a(c, x) - if err != nil { - return nil, err - } - if r, ok := shortF(a); ok { - return r, nil - } - b, err := b(c, x) - if err != nil { - return nil, err - } - return f(a, b) - }, nil - } - return -} - -type opFunc func(a, b interface{}) (interface{}, error) - -func getStringOpFunc(s func(a, b string) (interface{}, error), f opFunc, typeConversion bool) opFunc { - if typeConversion { - return func(a, b interface{}) (interface{}, error) { - if a != nil && b != nil { - return s(fmt.Sprintf("%v", a), fmt.Sprintf("%v", b)) - } - return f(a, b) - } - } - return func(a, b interface{}) (interface{}, error) { - s1, k := a.(string) - s2, l := b.(string) - if k && l { - return s(s1, s2) - } - return f(a, b) - } -} -func convertToBool(o interface{}) (bool, bool) { - if b, ok := o.(bool); ok { - return b, true - } - v := reflect.ValueOf(o) - for o != nil && v.Kind() == reflect.Ptr { - v = v.Elem() - o = v.Interface() - } - if o == false || o == nil || o == "false" || o == "FALSE" { - return false, true - } - if o == true || o == "true" || o == "TRUE" { - return true, true - } - if f, ok := convertToFloat(o); ok { - return f != 0., true - } - return false, false -} -func getBoolOpFunc(o func(a, b bool) (interface{}, error), f opFunc, typeConversion bool) opFunc { - if typeConversion { - return func(a, b interface{}) (interface{}, error) { - x, k := convertToBool(a) - y, l := convertToBool(b) - if k && l { - return o(x, y) - } - return f(a, b) - } - } - return func(a, b interface{}) (interface{}, error) { - x, k := a.(bool) - y, l := b.(bool) - if k && l { - return o(x, y) - } - return f(a, b) - } -} -func convertToFloat(o interface{}) (float64, bool) { - if i, ok := o.(float64); ok { - return i, true - } - v := reflect.ValueOf(o) - for o != nil && v.Kind() == reflect.Ptr { - v = v.Elem() - o = v.Interface() - } - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return float64(v.Int()), true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return float64(v.Uint()), true - case reflect.Float32, reflect.Float64: - return v.Float(), true - } - if s, ok := o.(string); ok { - f, err := strconv.ParseFloat(s, 64) - if err == nil { - return f, true - } - } - return 0, false -} -func getFloatOpFunc(o func(a, b float64) (interface{}, error), f opFunc, typeConversion bool) opFunc { - if typeConversion { - return func(a, b interface{}) (interface{}, error) { - x, k := convertToFloat(a) - y, l := convertToFloat(b) - if k && l { - return o(x, y) - } - - return f(a, b) - } - } - return func(a, b interface{}) (interface{}, error) { - x, k := a.(float64) - y, l := b.(float64) - if k && l { - return o(x, y) - } - - return f(a, b) - } -} - -type operator interface { - merge(operator) operator - precedence() operatorPrecedence - initiate(name string) -} - -type operatorPrecedence uint8 - -func (pre operatorPrecedence) merge(op operator) operator { - if op, ok := op.(operatorPrecedence); ok { - if op > pre { - return op - } - return pre - } - if op == nil { - return pre - } - return op.merge(pre) -} - -func (pre operatorPrecedence) precedence() operatorPrecedence { - return pre -} - -func (pre operatorPrecedence) initiate(name string) {} - -type infix struct { - operatorPrecedence - number func(a, b float64) (interface{}, error) - boolean func(a, b bool) (interface{}, error) - text func(a, b string) (interface{}, error) - arbitrary func(a, b interface{}) (interface{}, error) - shortCircuit func(a interface{}) (interface{}, bool) - builder infixBuilder -} - -func (op infix) merge(op2 operator) operator { - switch op2 := op2.(type) { - case *infix: - if op2.number != nil { - op.number = op2.number - } - if op2.boolean != nil { - op.boolean = op2.boolean - } - if op2.text != nil { - op.text = op2.text - } - if op2.arbitrary != nil { - op.arbitrary = op2.arbitrary - } - if op2.shortCircuit != nil { - op.shortCircuit = op2.shortCircuit - } - } - if op2 != nil && op2.precedence() > op.operatorPrecedence { - op.operatorPrecedence = op2.precedence() - } - return &op -} - -type directInfix struct { - operatorPrecedence - infixBuilder -} - -func (op directInfix) merge(op2 operator) operator { - switch op2 := op2.(type) { - case operatorPrecedence: - op.operatorPrecedence = op2 - } - if op2 != nil && op2.precedence() > op.operatorPrecedence { - op.operatorPrecedence = op2.precedence() - } - return op -} - -type prefix func(context.Context, *Parser) (Evaluable, error) - -type postfix struct { - operatorPrecedence - f func(context.Context, *Parser, Evaluable, operatorPrecedence) (Evaluable, error) -} - -func (op postfix) merge(op2 operator) operator { - switch op2 := op2.(type) { - case postfix: - if op2.f != nil { - op.f = op2.f - } - } - if op2 != nil && op2.precedence() > op.operatorPrecedence { - op.operatorPrecedence = op2.precedence() - } - return op -} diff --git a/vendor/github.com/PaesslerAG/gval/parse.go b/vendor/github.com/PaesslerAG/gval/parse.go deleted file mode 100644 index 2863b8510..000000000 --- a/vendor/github.com/PaesslerAG/gval/parse.go +++ /dev/null @@ -1,303 +0,0 @@ -package gval - -import ( - "context" - "fmt" - "reflect" - "strconv" - "text/scanner" -) - -//ParseExpression scans an expression into an Evaluable. -func (p *Parser) ParseExpression(c context.Context) (eval Evaluable, err error) { - stack := stageStack{} - for { - eval, err = p.ParseNextExpression(c) - if err != nil { - return nil, err - } - - if stage, err := p.parseOperator(c, &stack, eval); err != nil { - return nil, err - } else if err = stack.push(stage); err != nil { - return nil, err - } - - if stack.peek().infixBuilder == nil { - return stack.pop().Evaluable, nil - } - } -} - -//ParseNextExpression scans the expression ignoring following operators -func (p *Parser) ParseNextExpression(c context.Context) (eval Evaluable, err error) { - scan := p.Scan() - ex, ok := p.prefixes[scan] - if !ok { - return nil, p.Expected("extensions") - } - return ex(c, p) -} - -func parseString(c context.Context, p *Parser) (Evaluable, error) { - s, err := strconv.Unquote(p.TokenText()) - if err != nil { - return nil, fmt.Errorf("could not parse string: %s", err) - } - return p.Const(s), nil -} - -func parseNumber(c context.Context, p *Parser) (Evaluable, error) { - n, err := strconv.ParseFloat(p.TokenText(), 64) - if err != nil { - return nil, err - } - return p.Const(n), nil -} - -func parseParentheses(c context.Context, p *Parser) (Evaluable, error) { - eval, err := p.ParseExpression(c) - if err != nil { - return nil, err - } - switch p.Scan() { - case ')': - return eval, nil - default: - return nil, p.Expected("parentheses", ')') - } -} - -func (p *Parser) parseOperator(c context.Context, stack *stageStack, eval Evaluable) (st stage, err error) { - for { - scan := p.Scan() - op := p.TokenText() - mustOp := false - if p.isSymbolOperation(scan) { - scan = p.Peek() - for p.isSymbolOperation(scan) { - mustOp = true - op += string(scan) - p.Next() - scan = p.Peek() - } - } else if scan != scanner.Ident { - p.Camouflage("operator") - return stage{Evaluable: eval}, nil - } - operator, _ := p.operators[op] - switch operator := operator.(type) { - case *infix: - return stage{ - Evaluable: eval, - infixBuilder: operator.builder, - operatorPrecedence: operator.operatorPrecedence, - }, nil - case directInfix: - return stage{ - Evaluable: eval, - infixBuilder: operator.infixBuilder, - operatorPrecedence: operator.operatorPrecedence, - }, nil - case postfix: - if err = stack.push(stage{ - operatorPrecedence: operator.operatorPrecedence, - Evaluable: eval, - }); err != nil { - return stage{}, err - } - eval, err = operator.f(c, p, stack.pop().Evaluable, operator.operatorPrecedence) - if err != nil { - return - } - continue - } - - if !mustOp { - p.Camouflage("operator") - return stage{Evaluable: eval}, nil - } - return stage{}, fmt.Errorf("unknown operator %s", op) - } -} - -func parseIdent(c context.Context, p *Parser) (call string, alternative func() (Evaluable, error), err error) { - token := p.TokenText() - return token, - func() (Evaluable, error) { - fullname := token - - keys := []Evaluable{p.Const(token)} - for { - scan := p.Scan() - switch scan { - case '.': - scan = p.Scan() - switch scan { - case scanner.Ident: - token = p.TokenText() - keys = append(keys, p.Const(token)) - default: - return nil, p.Expected("field", scanner.Ident) - } - case '(': - args, err := p.parseArguments(c) - if err != nil { - return nil, err - } - return p.callEvaluable(fullname, p.Var(keys...), args...), nil - case '[': - key, err := p.ParseExpression(c) - if err != nil { - return nil, err - } - switch p.Scan() { - case ']': - keys = append(keys, key) - default: - return nil, p.Expected("array key", ']') - } - default: - p.Camouflage("variable", '.', '(', '[') - return p.Var(keys...), nil - } - } - }, nil - -} - -func (p *Parser) parseArguments(c context.Context) (args []Evaluable, err error) { - if p.Scan() == ')' { - return - } - p.Camouflage("scan arguments", ')') - for { - arg, err := p.ParseExpression(c) - args = append(args, arg) - if err != nil { - return nil, err - } - switch p.Scan() { - case ')': - return args, nil - case ',': - default: - return nil, p.Expected("arguments", ')', ',') - } - } -} - -func inArray(a, b interface{}) (interface{}, error) { - col, ok := b.([]interface{}) - if !ok { - return nil, fmt.Errorf("expected type []interface{} for in operator but got %T", b) - } - for _, value := range col { - if reflect.DeepEqual(a, value) { - return true, nil - } - } - return false, nil -} - -func parseIf(c context.Context, p *Parser, e Evaluable) (Evaluable, error) { - a, err := p.ParseExpression(c) - if err != nil { - return nil, err - } - b := p.Const(nil) - switch p.Scan() { - case ':': - b, err = p.ParseExpression(c) - if err != nil { - return nil, err - } - case scanner.EOF: - default: - return nil, p.Expected("<> ? <> : <>", ':', scanner.EOF) - } - return func(c context.Context, v interface{}) (interface{}, error) { - x, err := e(c, v) - if err != nil { - return nil, err - } - if x == false || x == nil { - return b(c, v) - } - return a(c, v) - }, nil -} - -func parseJSONArray(c context.Context, p *Parser) (Evaluable, error) { - evals := []Evaluable{} - for { - switch p.Scan() { - default: - p.Camouflage("array", ',', ']') - eval, err := p.ParseExpression(c) - if err != nil { - return nil, err - } - evals = append(evals, eval) - case ',': - case ']': - return func(c context.Context, v interface{}) (interface{}, error) { - vs := make([]interface{}, len(evals)) - for i, e := range evals { - eval, err := e(c, v) - if err != nil { - return nil, err - } - vs[i] = eval - } - - return vs, nil - }, nil - } - } -} - -func parseJSONObject(c context.Context, p *Parser) (Evaluable, error) { - type kv struct { - key Evaluable - value Evaluable - } - evals := []kv{} - for { - switch p.Scan() { - default: - p.Camouflage("object", ',', '}') - key, err := p.ParseExpression(c) - if err != nil { - return nil, err - } - if p.Scan() != ':' { - if err != nil { - return nil, p.Expected("object", ':') - } - } - value, err := p.ParseExpression(c) - if err != nil { - return nil, err - } - evals = append(evals, kv{key, value}) - case ',': - case '}': - return func(c context.Context, v interface{}) (interface{}, error) { - vs := map[string]interface{}{} - for _, e := range evals { - value, err := e.value(c, v) - if err != nil { - return nil, err - } - key, err := e.key.EvalString(c, v) - if err != nil { - return nil, err - } - vs[key] = value - } - return vs, nil - }, nil - } - } -} diff --git a/vendor/github.com/PaesslerAG/gval/parser.go b/vendor/github.com/PaesslerAG/gval/parser.go deleted file mode 100644 index 54b1004d6..000000000 --- a/vendor/github.com/PaesslerAG/gval/parser.go +++ /dev/null @@ -1,117 +0,0 @@ -package gval - -import ( - "bytes" - "fmt" - "strings" - "text/scanner" - "unicode" -) - -//Parser parses expressions in a Language into an Evaluable -type Parser struct { - scanner scanner.Scanner - Language - lastScan rune - camouflage error -} - -func newParser(expression string, l Language) *Parser { - sc := scanner.Scanner{} - sc.Init(strings.NewReader(expression)) - sc.Error = func(*scanner.Scanner, string) { return } - sc.IsIdentRune = func(r rune, pos int) bool { return unicode.IsLetter(r) || r == '_' || (pos > 0 && unicode.IsDigit(r)) } - sc.Filename = expression + "\t" - return &Parser{scanner: sc, Language: l} -} - -// Scan reads the next token or Unicode character from source and returns it. -// It only recognizes tokens t for which the respective Mode bit (1<<-t) is set. -// It returns scanner.EOF at the end of the source. -func (p *Parser) Scan() rune { - if p.isCamouflaged() { - p.camouflage = nil - return p.lastScan - } - p.camouflage = nil - p.lastScan = p.scanner.Scan() - return p.lastScan -} - -func (p *Parser) isCamouflaged() bool { - return p.camouflage != nil && p.camouflage != errCamouflageAfterNext -} - -// Camouflage rewind the last Scan(). The Parser holds the camouflage error until -// the next Scan() -// Do not call Rewind() on a camouflaged Parser -func (p *Parser) Camouflage(unit string, expected ...rune) { - if p.isCamouflaged() { - panic(fmt.Errorf("can only Camouflage() after Scan(): %v", p.camouflage)) - } - p.camouflage = p.Expected(unit, expected...) - return -} - -// Peek returns the next Unicode character in the source without advancing -// the scanner. It returns EOF if the scanner's position is at the last -// character of the source. -// Do not call Peek() on a camouflaged Parser -func (p *Parser) Peek() rune { - if p.isCamouflaged() { - panic("can not Peek() on camouflaged Parser") - } - return p.scanner.Peek() -} - -var errCamouflageAfterNext = fmt.Errorf("Camouflage() after Next()") - -// Next reads and returns the next Unicode character. -// It returns EOF at the end of the source. -// Do not call Next() on a camouflaged Parser -func (p *Parser) Next() rune { - if p.isCamouflaged() { - panic("can not Next() on camouflaged Parser") - } - p.camouflage = errCamouflageAfterNext - return p.scanner.Next() -} - -// TokenText returns the string corresponding to the most recently scanned token. -// Valid after calling Scan(). -func (p *Parser) TokenText() string { - return p.scanner.TokenText() -} - -//Expected returns an error signaling an unexpected Scan() result -func (p *Parser) Expected(unit string, expected ...rune) error { - return unexpectedRune{unit, expected, p.lastScan} -} - -type unexpectedRune struct { - unit string - expected []rune - got rune -} - -func (err unexpectedRune) Error() string { - exp := bytes.Buffer{} - runes := err.expected - switch len(runes) { - default: - for _, r := range runes[:len(runes)-2] { - exp.WriteString(scanner.TokenString(r)) - exp.WriteString(", ") - } - fallthrough - case 2: - exp.WriteString(scanner.TokenString(runes[len(runes)-2])) - exp.WriteString(" or ") - fallthrough - case 1: - exp.WriteString(scanner.TokenString(runes[len(runes)-1])) - case 0: - return fmt.Sprintf("unexpected %s while scanning %s", scanner.TokenString(err.got), err.unit) - } - return fmt.Sprintf("unexpected %s while scanning %s expected %s", scanner.TokenString(err.got), err.unit, exp.String()) -} diff --git a/vendor/github.com/PaesslerAG/gval/prtg-batmin-gopher.png b/vendor/github.com/PaesslerAG/gval/prtg-batmin-gopher.png deleted file mode 100644 index 7c23b52b7..000000000 Binary files a/vendor/github.com/PaesslerAG/gval/prtg-batmin-gopher.png and /dev/null differ diff --git a/vendor/github.com/PaesslerAG/jsonpath/.gitignore b/vendor/github.com/PaesslerAG/jsonpath/.gitignore deleted file mode 100644 index 98576e300..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/.gitignore +++ /dev/null @@ -1,30 +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 -coverage.out - -manual_test.go -*.out -*.err - -.vscode \ No newline at end of file diff --git a/vendor/github.com/PaesslerAG/jsonpath/.travis.yml b/vendor/github.com/PaesslerAG/jsonpath/.travis.yml deleted file mode 100644 index 3790c1760..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: go - -script: ./test.sh - -go: - - 1.9 diff --git a/vendor/github.com/PaesslerAG/jsonpath/LICENSE b/vendor/github.com/PaesslerAG/jsonpath/LICENSE deleted file mode 100644 index 0716dbca1..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2017, Paessler AG -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -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 HOLDER 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. \ No newline at end of file diff --git a/vendor/github.com/PaesslerAG/jsonpath/README.md b/vendor/github.com/PaesslerAG/jsonpath/README.md deleted file mode 100644 index 0919a775c..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/README.md +++ /dev/null @@ -1,11 +0,0 @@ -JSONPath -==== - -[![Build Status](https://api.travis-ci.org/PaesslerAG/jsonpath.svg?branch=master)](https://travis-ci.org/PaesslerAG/jsonpath) -[![Godoc](https://godoc.org/github.com/PaesslerAG/jsonpath?status.png)](https://godoc.org/github.com/PaesslerAG/jsonpath) - -JSONPath is a complete implementation of [http://goessner.net/articles/JsonPath/](http://goessner.net/articles/JsonPath/). -JSONPath can be combined with a script language. In many web samples it's combined with javascript. This framework comes without a script language but can be easily extended with one. See [example](https://godoc.org/github.com/PaesslerAG/jsonpath#example-package--Gval). - -It is based on [Gval](https://github.com/PaesslerAG/gval) and can be combined with the modular expression languages based on gval. -So for script features like multiply, length, regex or many more take a look at the documentation in the [GoDoc](https://godoc.org/github.com/PaesslerAG/jsonpath). \ No newline at end of file diff --git a/vendor/github.com/PaesslerAG/jsonpath/jsonpath.go b/vendor/github.com/PaesslerAG/jsonpath/jsonpath.go deleted file mode 100644 index cada95c9a..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/jsonpath.go +++ /dev/null @@ -1,54 +0,0 @@ -// Package jsonpath is an implementation of http://goessner.net/articles/JsonPath/ -// If a JSONPath contains one of -// [key1, key2 ...], .., *, [min:max], [min:max:step], (? expression) -// all matchs are listed in an []interface{} -// -// The package comes with an extension of JSONPath to access the wildcard values of a match. -// If the JSONPath is used inside of a JSON object, you can use placeholder '#' or '#i' with natural number i -// to access all wildcards values or the ith wildcard -// -// This package can be extended with gval modules for script features like multiply, length, regex or many more. -// So take a look at github.com/PaesslerAG/gval. -package jsonpath - -import ( - "context" - - "github.com/PaesslerAG/gval" -) - -// New returns an selector for given JSONPath -func New(path string) (gval.Evaluable, error) { - return lang.NewEvaluable(path) -} - -//Get executes given JSONPath on given value -func Get(path string, value interface{}) (interface{}, error) { - eval, err := lang.NewEvaluable(path) - if err != nil { - return nil, err - } - return eval(context.Background(), value) -} - -var lang = gval.NewLanguage( - gval.Base(), - gval.PrefixExtension('$', parseRootPath), - gval.PrefixExtension('@', parseCurrentPath), -) - -//Language is the JSONPath Language -func Language() gval.Language { - return lang -} - -var placeholderExtension = gval.NewLanguage( - lang, - gval.PrefixExtension('{', parseJSONObject), - gval.PrefixExtension('#', parsePlaceholder), -) - -//PlaceholderExtension is the JSONPath Language with placeholder -func PlaceholderExtension() gval.Language { - return placeholderExtension -} diff --git a/vendor/github.com/PaesslerAG/jsonpath/parse.go b/vendor/github.com/PaesslerAG/jsonpath/parse.go deleted file mode 100644 index 18a4cb37c..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/parse.go +++ /dev/null @@ -1,204 +0,0 @@ -package jsonpath - -import ( - "context" - "fmt" - "math" - "text/scanner" - - "github.com/PaesslerAG/gval" -) - -type parser struct { - *gval.Parser - path path -} - -func parseRootPath(ctx context.Context, gParser *gval.Parser) (r gval.Evaluable, err error) { - p := newParser(gParser) - return p.parse(ctx) -} - -func parseCurrentPath(ctx context.Context, gParser *gval.Parser) (r gval.Evaluable, err error) { - p := newParser(gParser) - p.appendPlainSelector(currentElementSelector()) - return p.parse(ctx) -} - -func newParser(p *gval.Parser) *parser { - return &parser{Parser: p, path: plainPath{}} -} - -func (p *parser) parse(c context.Context) (r gval.Evaluable, err error) { - err = p.parsePath(c) - - if err != nil { - return nil, err - } - return p.path.evaluate, nil -} - -func (p *parser) parsePath(c context.Context) error { - switch p.Scan() { - case '.': - return p.parseSelect(c) - case '[': - keys, seperator, err := p.parseBracket(c) - - if err != nil { - return err - } - - switch seperator { - case ':': - if len(keys) > 3 { - return fmt.Errorf("range query has at least the parameter [min:max:step]") - } - keys = append(keys, []gval.Evaluable{ - p.Const(0), p.Const(float64(math.MaxInt32)), p.Const(1)}[len(keys):]...) - p.appendAmbiguousSelector(rangeSelector(keys[0], keys[1], keys[2])) - case '?': - if len(keys) != 1 { - return fmt.Errorf("filter needs exactly one key") - } - p.appendAmbiguousSelector(filterSelector(keys[0])) - default: - if len(keys) == 1 { - p.appendPlainSelector(directSelector(keys[0])) - } else { - p.appendAmbiguousSelector(multiSelector(keys)) - } - } - return p.parsePath(c) - case '(': - return p.parseScript(c) - default: - p.Camouflage("jsonpath", '.', '[', '(') - return nil - } -} - -func (p *parser) parseSelect(c context.Context) error { - scan := p.Scan() - switch scan { - case scanner.Ident: - p.appendPlainSelector(directSelector(p.Const(p.TokenText()))) - return p.parsePath(c) - case '.': - p.appendAmbiguousSelector(mapperSelector()) - return p.parseMapper(c) - case '*': - p.appendAmbiguousSelector(starSelector()) - return p.parsePath(c) - default: - return p.Expected("JSON select", scanner.Ident, '.', '*') - } -} - -func (p *parser) parseBracket(c context.Context) (keys []gval.Evaluable, seperator rune, err error) { - for { - scan := p.Scan() - skipScan := false - switch scan { - case '?': - skipScan = true - case ':': - i := float64(0) - if len(keys) == 1 { - i = math.MaxInt32 - } - keys = append(keys, p.Const(i)) - skipScan = true - case '*': - if p.Scan() != ']' { - return nil, 0, p.Expected("JSON bracket star", ']') - } - return []gval.Evaluable{}, 0, nil - case ']': - if seperator == ':' { - skipScan = true - break - } - fallthrough - default: - p.Camouflage("jsonpath brackets") - key, err := p.ParseExpression(c) - if err != nil { - return nil, 0, err - } - keys = append(keys, key) - } - if !skipScan { - scan = p.Scan() - } - if seperator == 0 { - seperator = scan - } - switch scan { - case ':', ',': - case ']': - return - case '?': - if len(keys) != 0 { - return nil, 0, p.Expected("JSON filter", ']') - } - default: - return nil, 0, p.Expected("JSON bracket separator", ':', ',') - } - if seperator != scan { - return nil, 0, fmt.Errorf("mixed %v and %v in JSON bracket", seperator, scan) - } - } -} - -func (p *parser) parseMapper(c context.Context) error { - scan := p.Scan() - switch scan { - case scanner.Ident: - p.appendPlainSelector(directSelector(p.Const(p.TokenText()))) - case '[': - keys, seperator, err := p.parseBracket(c) - - if err != nil { - return err - } - switch seperator { - case ':': - return fmt.Errorf("mapper can not be combined with range query") - case '?': - if len(keys) != 1 { - return fmt.Errorf("filter needs exactly one key") - } - p.appendAmbiguousSelector(filterSelector(keys[0])) - default: - p.appendAmbiguousSelector(multiSelector(keys)) - } - case '*': - p.appendAmbiguousSelector(starSelector()) - case '(': - return p.parseScript(c) - default: - return p.Expected("JSON mapper", '[', scanner.Ident, '*') - } - return p.parsePath(c) -} - -func (p *parser) parseScript(c context.Context) error { - script, err := p.ParseExpression(c) - if err != nil { - return err - } - if p.Scan() != ')' { - return p.Expected("jsnopath script", ')') - } - p.appendPlainSelector(newScript(script)) - return p.parsePath(c) -} - -func (p *parser) appendPlainSelector(next plainSelector) { - p.path = p.path.withPlainSelector(next) -} - -func (p *parser) appendAmbiguousSelector(next ambiguousSelector) { - p.path = p.path.withAmbiguousSelector(next) -} diff --git a/vendor/github.com/PaesslerAG/jsonpath/path.go b/vendor/github.com/PaesslerAG/jsonpath/path.go deleted file mode 100644 index b8e784d84..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/path.go +++ /dev/null @@ -1,103 +0,0 @@ -package jsonpath - -import "context" - -type path interface { - evaluate(c context.Context, parameter interface{}) (interface{}, error) - visitMatchs(c context.Context, r interface{}, visit pathMatcher) - withPlainSelector(plainSelector) path - withAmbiguousSelector(ambiguousSelector) path -} - -type plainPath []plainSelector - -type ambiguousMatcher func(key, v interface{}) - -func (p plainPath) evaluate(ctx context.Context, root interface{}) (interface{}, error) { - return p.evaluatePath(ctx, root, root) -} - -func (p plainPath) evaluatePath(ctx context.Context, root, value interface{}) (interface{}, error) { - var err error - for _, sel := range p { - value, err = sel(ctx, root, value) - if err != nil { - return nil, err - } - } - return value, nil -} - -func (p plainPath) matcher(ctx context.Context, r interface{}, match ambiguousMatcher) ambiguousMatcher { - if len(p) == 0 { - return match - } - return func(k, v interface{}) { - res, err := p.evaluatePath(ctx, r, v) - if err == nil { - match(k, res) - } - } -} - -func (p plainPath) visitMatchs(ctx context.Context, r interface{}, visit pathMatcher) { - res, err := p.evaluatePath(ctx, r, r) - if err == nil { - visit(nil, res) - } -} - -func (p plainPath) withPlainSelector(selector plainSelector) path { - return append(p, selector) -} -func (p plainPath) withAmbiguousSelector(selector ambiguousSelector) path { - return &ambiguousPath{ - parent: p, - branch: selector, - } -} - -type ambiguousPath struct { - parent path - branch ambiguousSelector - ending plainPath -} - -func (p *ambiguousPath) evaluate(ctx context.Context, parameter interface{}) (interface{}, error) { - matchs := []interface{}{} - p.visitMatchs(ctx, parameter, func(keys []interface{}, match interface{}) { - matchs = append(matchs, match) - }) - return matchs, nil -} - -func (p *ambiguousPath) visitMatchs(ctx context.Context, r interface{}, visit pathMatcher) { - p.parent.visitMatchs(ctx, r, func(keys []interface{}, v interface{}) { - p.branch(ctx, r, v, p.ending.matcher(ctx, r, visit.matcher(keys))) - }) -} - -func (p *ambiguousPath) branchMatcher(ctx context.Context, r interface{}, m ambiguousMatcher) ambiguousMatcher { - return func(k, v interface{}) { - p.branch(ctx, r, v, m) - } -} - -func (p *ambiguousPath) withPlainSelector(selector plainSelector) path { - p.ending = append(p.ending, selector) - return p -} -func (p *ambiguousPath) withAmbiguousSelector(selector ambiguousSelector) path { - return &ambiguousPath{ - parent: p, - branch: selector, - } -} - -type pathMatcher func(keys []interface{}, match interface{}) - -func (m pathMatcher) matcher(keys []interface{}) ambiguousMatcher { - return func(key, match interface{}) { - m(append(keys, key), match) - } -} diff --git a/vendor/github.com/PaesslerAG/jsonpath/placeholder.go b/vendor/github.com/PaesslerAG/jsonpath/placeholder.go deleted file mode 100644 index d1cd063f4..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/placeholder.go +++ /dev/null @@ -1,181 +0,0 @@ -package jsonpath - -import ( - "bytes" - "context" - "fmt" - "strconv" - "text/scanner" - - "github.com/PaesslerAG/gval" -) - -type keyValueVisitor func(key string, value interface{}) - -type jsonObject interface { - visitElements(c context.Context, v interface{}, visit keyValueVisitor) error -} - -type jsonObjectSlice []jsonObject - -type keyValuePair struct { - key gval.Evaluable - value gval.Evaluable -} - -type keyValueMatcher struct { - key gval.Evaluable - matcher func(c context.Context, r interface{}, visit pathMatcher) -} - -func parseJSONObject(ctx context.Context, p *gval.Parser) (gval.Evaluable, error) { - evals := jsonObjectSlice{} - for { - switch p.Scan() { - default: - hasWildcard := false - - p.Camouflage("object", ',', '}') - key, err := p.ParseExpression(context.WithValue(ctx, hasPlaceholdersContextKey{}, &hasWildcard)) - if err != nil { - return nil, err - } - if p.Scan() != ':' { - if err != nil { - return nil, p.Expected("object", ':') - } - } - e, err := parseJSONObjectElement(ctx, p, hasWildcard, key) - if err != nil { - return nil, err - } - evals.addElements(e) - case ',': - case '}': - return evals.evaluable, nil - } - } -} - -func parseJSONObjectElement(ctx context.Context, gParser *gval.Parser, hasWildcard bool, key gval.Evaluable) (jsonObject, error) { - if hasWildcard { - p := newParser(gParser) - switch gParser.Scan() { - case '$': - case '@': - p.appendPlainSelector(currentElementSelector()) - default: - return nil, p.Expected("JSONPath key and value") - } - - if err := p.parsePath(ctx); err != nil { - return nil, err - } - return keyValueMatcher{key, p.path.visitMatchs}, nil - } - value, err := gParser.ParseExpression(ctx) - if err != nil { - return nil, err - } - return keyValuePair{key, value}, nil -} - -func (kv keyValuePair) visitElements(c context.Context, v interface{}, visit keyValueVisitor) error { - value, err := kv.value(c, v) - if err != nil { - return err - } - key, err := kv.key.EvalString(c, v) - if err != nil { - return err - } - visit(key, value) - return nil -} - -func (kv keyValueMatcher) visitElements(c context.Context, v interface{}, visit keyValueVisitor) (err error) { - kv.matcher(c, v, func(keys []interface{}, match interface{}) { - key, er := kv.key.EvalString(context.WithValue(c, placeholdersContextKey{}, keys), v) - if er != nil { - err = er - } - visit(key, match) - }) - return -} - -func (j *jsonObjectSlice) addElements(e jsonObject) { - *j = append(*j, e) -} - -func (j jsonObjectSlice) evaluable(c context.Context, v interface{}) (interface{}, error) { - vs := map[string]interface{}{} - - err := j.visitElements(c, v, func(key string, value interface{}) { vs[key] = value }) - if err != nil { - return nil, err - } - return vs, nil -} - -func (j jsonObjectSlice) visitElements(ctx context.Context, v interface{}, visit keyValueVisitor) (err error) { - for _, e := range j { - if err := e.visitElements(ctx, v, visit); err != nil { - return err - } - } - return nil -} - -func parsePlaceholder(c context.Context, p *gval.Parser) (gval.Evaluable, error) { - hasWildcard := c.Value(hasPlaceholdersContextKey{}) - if hasWildcard == nil { - return nil, fmt.Errorf("JSONPath placeholder must only be used in an JSON object key") - } - *(hasWildcard.(*bool)) = true - switch p.Scan() { - case scanner.Int: - id, err := strconv.Atoi(p.TokenText()) - if err != nil { - return nil, err - } - return placeholder(id).evaluable, nil - default: - p.Camouflage("JSONPath placeholder") - return allPlaceholders.evaluable, nil - } -} - -type hasPlaceholdersContextKey struct{} - -type placeholdersContextKey struct{} - -type placeholder int - -const allPlaceholders = placeholder(-1) - -func (key placeholder) evaluable(c context.Context, v interface{}) (interface{}, error) { - wildcards, ok := c.Value(placeholdersContextKey{}).([]interface{}) - if !ok || len(wildcards) <= int(key) { - return nil, fmt.Errorf("JSONPath placeholder #%d is not available", key) - } - if key == allPlaceholders { - sb := bytes.Buffer{} - sb.WriteString("$") - quoteWildcardValues(&sb, wildcards) - return sb.String(), nil - } - return wildcards[int(key)], nil -} - -func quoteWildcardValues(sb *bytes.Buffer, wildcards []interface{}) { - for _, w := range wildcards { - if wildcards, ok := w.([]interface{}); ok { - quoteWildcardValues(sb, wildcards) - continue - } - sb.WriteString(fmt.Sprintf("[%v]", - strconv.Quote(fmt.Sprint(w)), - )) - } -} diff --git a/vendor/github.com/PaesslerAG/jsonpath/selector.go b/vendor/github.com/PaesslerAG/jsonpath/selector.go deleted file mode 100644 index 46670c249..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/selector.go +++ /dev/null @@ -1,203 +0,0 @@ -package jsonpath - -import ( - "context" - "fmt" - "strconv" - - "github.com/PaesslerAG/gval" -) - -//plainSelector evaluate exactly one result -type plainSelector func(c context.Context, r, v interface{}) (interface{}, error) - -//ambiguousSelector evaluate wildcard -type ambiguousSelector func(c context.Context, r, v interface{}, match ambiguousMatcher) - -//@ -func currentElementSelector() plainSelector { - return func(c context.Context, r, v interface{}) (interface{}, error) { - return c.Value(currentElement{}), nil - } -} - -type currentElement struct{} - -func currentContext(c context.Context, v interface{}) context.Context { - return context.WithValue(c, currentElement{}, v) -} - -//.x, [x] -func directSelector(key gval.Evaluable) plainSelector { - return func(c context.Context, r, v interface{}) (interface{}, error) { - - e, _, err := selectValue(c, key, r, v) - if err != nil { - return nil, err - } - - return e, nil - } -} - -// * / [*] -func starSelector() ambiguousSelector { - return func(c context.Context, r, v interface{}, match ambiguousMatcher) { - visitAll(v, func(key string, val interface{}) { match(key, val) }) - } -} - -// [x, ...] -func multiSelector(keys []gval.Evaluable) ambiguousSelector { - if len(keys) == 0 { - return starSelector() - } - return func(c context.Context, r, v interface{}, match ambiguousMatcher) { - for _, k := range keys { - e, wildcard, err := selectValue(c, k, r, v) - if err != nil { - continue - } - match(wildcard, e) - } - } -} - -func selectValue(c context.Context, key gval.Evaluable, r, v interface{}) (value interface{}, jkey string, err error) { - c = currentContext(c, v) - switch o := v.(type) { - case []interface{}: - i, err := key.EvalInt(c, r) - if err != nil { - return nil, "", fmt.Errorf("could not select value, invalid key: %s", err) - } - if i < 0 || i >= len(o) { - return nil, "", fmt.Errorf("index %d out of bounds", i) - } - return o[i], strconv.Itoa(i), nil - case map[string]interface{}: - k, err := key.EvalString(c, r) - if err != nil { - return nil, "", fmt.Errorf("could not select value, invalid key: %s", err) - } - - if r, ok := o[k]; ok { - return r, k, nil - } - return nil, "", fmt.Errorf("unknown key %s", k) - - default: - return nil, "", fmt.Errorf("unsupported value type %T for select, expected map[string]interface{} or []interface{}", o) - } -} - -//.. -func mapperSelector() ambiguousSelector { - return mapper -} - -func mapper(c context.Context, r, v interface{}, match ambiguousMatcher) { - match([]interface{}{}, v) - visitAll(v, func(wildcard string, v interface{}) { - mapper(c, r, v, func(key interface{}, v interface{}) { - match(append([]interface{}{wildcard}, key.([]interface{})...), v) - }) - }) -} - -func visitAll(v interface{}, visit func(key string, v interface{})) { - switch v := v.(type) { - case []interface{}: - for i, e := range v { - k := strconv.Itoa(i) - visit(k, e) - } - case map[string]interface{}: - for k, e := range v { - visit(k, e) - } - } - -} - -//[? ] -func filterSelector(filter gval.Evaluable) ambiguousSelector { - return func(c context.Context, r, v interface{}, match ambiguousMatcher) { - visitAll(v, func(wildcard string, v interface{}) { - condition, err := filter.EvalBool(currentContext(c, v), r) - if err != nil { - return - } - if condition { - match(wildcard, v) - } - }) - } -} - -//[::] -func rangeSelector(min, max, step gval.Evaluable) ambiguousSelector { - return func(c context.Context, r, v interface{}, match ambiguousMatcher) { - cs, ok := v.([]interface{}) - if !ok { - return - } - - c = currentContext(c, v) - - min, err := min.EvalInt(c, r) - if err != nil { - return - } - max, err := max.EvalInt(c, r) - if err != nil { - return - } - step, err := step.EvalInt(c, r) - if err != nil { - return - } - - if min > max { - return - } - - n := len(cs) - min = negmax(min, n) - max = negmax(max, n) - - if step == 0 { - step = 1 - } - - if step > 0 { - for i := min; i < max; i += step { - match(strconv.Itoa(i), cs[i]) - } - } else { - for i := max - 1; i >= min; i += step { - match(strconv.Itoa(i), cs[i]) - } - } - - } -} - -func negmax(n, max int) int { - if n < 0 { - n = max + n - if n < 0 { - n = 0 - } - } else if n > max { - return max - } - return n -} - -// () -func newScript(script gval.Evaluable) plainSelector { - return func(c context.Context, r, v interface{}) (interface{}, error) { - return script(currentContext(c, v), r) - } -} diff --git a/vendor/github.com/PaesslerAG/jsonpath/test.sh b/vendor/github.com/PaesslerAG/jsonpath/test.sh deleted file mode 100644 index 09ae6b98e..000000000 --- a/vendor/github.com/PaesslerAG/jsonpath/test.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# Script that runs tests, code coverage, and benchmarks all at once. - -JSONPath_PATH=$HOME/gopath/src/github.com/PaesslerAG/jsonpath - -# run the actual tests. -cd "${JSONPath_PATH}" -go test -bench=. -benchmem -coverprofile coverage.out -status=$? - -if [ "${status}" != 0 ]; -then - exit $status -fi diff --git a/vendor/github.com/emicklei/go-restful/v3/CHANGES.md b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md index 5edd5a7ca..9e790390b 100644 --- a/vendor/github.com/emicklei/go-restful/v3/CHANGES.md +++ b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md @@ -1,5 +1,17 @@ # Change history of go-restful + +## [v3.12.0] - 2024-03-11 +- add Flush method #529 (#538) +- fix: Improper handling of empty POST requests (#543) + +## [v3.11.3] - 2024-01-09 +- better not have 2 tags on one commit + +## [v3.11.1, v3.11.2] - 2024-01-09 + +- fix by restoring custom JSON handler functions (Mike Beaumont #540) + ## [v3.11.0] - 2023-08-19 - restored behavior as <= v3.9.0 with option to change path strategy using TrimRightSlashEnabled. diff --git a/vendor/github.com/emicklei/go-restful/v3/README.md b/vendor/github.com/emicklei/go-restful/v3/README.md index e3e30080e..7234604e4 100644 --- a/vendor/github.com/emicklei/go-restful/v3/README.md +++ b/vendor/github.com/emicklei/go-restful/v3/README.md @@ -2,7 +2,6 @@ go-restful ========== package for building REST-style Web Services using Google Go -[![Build Status](https://travis-ci.org/emicklei/go-restful.png)](https://travis-ci.org/emicklei/go-restful) [![Go Report Card](https://goreportcard.com/badge/github.com/emicklei/go-restful)](https://goreportcard.com/report/github.com/emicklei/go-restful) [![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://pkg.go.dev/github.com/emicklei/go-restful) [![codecov](https://codecov.io/gh/emicklei/go-restful/branch/master/graph/badge.svg)](https://codecov.io/gh/emicklei/go-restful) @@ -95,8 +94,7 @@ There are several hooks to customize the behavior of the go-restful package. - Trace logging - Compression - Encoders for other serializers -- Use [jsoniter](https://github.com/json-iterator/go) by building this package using a build tag, e.g. `go build -tags=jsoniter .` -- Use the package variable `TrimRightSlashEnabled` (default true) to control the behavior of matching routes that end with a slash `/` +- Use the package variable `TrimRightSlashEnabled` (default true) to control the behavior of matching routes that end with a slash `/` ## Resources diff --git a/vendor/github.com/emicklei/go-restful/v3/compress.go b/vendor/github.com/emicklei/go-restful/v3/compress.go index 1ff239f99..80adf55fd 100644 --- a/vendor/github.com/emicklei/go-restful/v3/compress.go +++ b/vendor/github.com/emicklei/go-restful/v3/compress.go @@ -49,6 +49,16 @@ func (c *CompressingResponseWriter) CloseNotify() <-chan bool { return c.writer.(http.CloseNotifier).CloseNotify() } +// Flush is part of http.Flusher interface. Noop if the underlying writer doesn't support it. +func (c *CompressingResponseWriter) Flush() { + flusher, ok := c.writer.(http.Flusher) + if !ok { + // writer doesn't support http.Flusher interface + return + } + flusher.Flush() +} + // Close the underlying compressor func (c *CompressingResponseWriter) Close() error { if c.isCompressorClosed() { diff --git a/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go b/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go index 66dfc824f..9808752ac 100644 --- a/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go +++ b/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go @@ -5,11 +5,18 @@ package restful // that can be found in the LICENSE file. import ( + "encoding/json" "encoding/xml" "strings" "sync" ) +var ( + MarshalIndent = json.MarshalIndent + NewDecoder = json.NewDecoder + NewEncoder = json.NewEncoder +) + // EntityReaderWriter can read and write values using an encoding such as JSON,XML. type EntityReaderWriter interface { // Read a serialized version of the value from the request. diff --git a/vendor/github.com/emicklei/go-restful/v3/json.go b/vendor/github.com/emicklei/go-restful/v3/json.go deleted file mode 100644 index 871165166..000000000 --- a/vendor/github.com/emicklei/go-restful/v3/json.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !jsoniter - -package restful - -import "encoding/json" - -var ( - MarshalIndent = json.MarshalIndent - NewDecoder = json.NewDecoder - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/emicklei/go-restful/v3/jsoniter.go b/vendor/github.com/emicklei/go-restful/v3/jsoniter.go deleted file mode 100644 index 11b8f8ae7..000000000 --- a/vendor/github.com/emicklei/go-restful/v3/jsoniter.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build jsoniter - -package restful - -import "github.com/json-iterator/go" - -var ( - json = jsoniter.ConfigCompatibleWithStandardLibrary - MarshalIndent = json.MarshalIndent - NewDecoder = json.NewDecoder - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/emicklei/go-restful/v3/jsr311.go b/vendor/github.com/emicklei/go-restful/v3/jsr311.go index 07a0c91e9..a9b3faaa8 100644 --- a/vendor/github.com/emicklei/go-restful/v3/jsr311.go +++ b/vendor/github.com/emicklei/go-restful/v3/jsr311.go @@ -155,7 +155,7 @@ func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*R method, length := httpRequest.Method, httpRequest.Header.Get("Content-Length") if (method == http.MethodPost || method == http.MethodPut || - method == http.MethodPatch) && length == "" { + method == http.MethodPatch) && (length == "" || length == "0") { return nil, NewError( http.StatusUnsupportedMediaType, fmt.Sprintf("415: Unsupported Media Type\n\nAvailable representations: %s", strings.Join(available, ", ")), diff --git a/vendor/github.com/evanphx/json-patch/README.md b/vendor/github.com/evanphx/json-patch/README.md index 28e351693..97e319b21 100644 --- a/vendor/github.com/evanphx/json-patch/README.md +++ b/vendor/github.com/evanphx/json-patch/README.md @@ -4,7 +4,7 @@ well as for calculating & applying [RFC7396 JSON merge patches](https://tools.ietf.org/html/rfc7396). [![GoDoc](https://godoc.org/github.com/evanphx/json-patch?status.svg)](http://godoc.org/github.com/evanphx/json-patch) -[![Build Status](https://travis-ci.org/evanphx/json-patch.svg?branch=master)](https://travis-ci.org/evanphx/json-patch) +[![Build Status](https://github.com/evanphx/json-patch/actions/workflows/go.yml/badge.svg)](https://github.com/evanphx/json-patch/actions/workflows/go.yml) [![Report Card](https://goreportcard.com/badge/github.com/evanphx/json-patch)](https://goreportcard.com/report/github.com/evanphx/json-patch) # Get It! @@ -314,4 +314,4 @@ go test -cover ./... ``` Builds for pull requests are tested automatically -using [TravisCI](https://travis-ci.org/evanphx/json-patch). +using [GitHub Actions](https://github.com/evanphx/json-patch/actions/workflows/go.yml). diff --git a/vendor/github.com/evanphx/json-patch/patch.go b/vendor/github.com/evanphx/json-patch/patch.go index 4bce5936d..cd0274e1e 100644 --- a/vendor/github.com/evanphx/json-patch/patch.go +++ b/vendor/github.com/evanphx/json-patch/patch.go @@ -359,7 +359,7 @@ func findObject(pd *container, path string) (container, string) { next, ok := doc.get(decodePatchKey(part)) - if next == nil || ok != nil { + if next == nil || ok != nil || next.raw == nil { return nil, "" } @@ -568,6 +568,29 @@ func (p Patch) replace(doc *container, op Operation) error { return errors.Wrapf(err, "replace operation failed to decode path") } + if path == "" { + val := op.value() + + if val.which == eRaw { + if !val.tryDoc() { + if !val.tryAry() { + return errors.Wrapf(err, "replace operation value must be object or array") + } + } + } + + switch val.which { + case eAry: + *doc = &val.ary + case eDoc: + *doc = &val.doc + case eRaw: + return errors.Wrapf(err, "replace operation hit impossible case") + } + + return nil + } + con, key := findObject(doc, path) if con == nil { @@ -634,6 +657,25 @@ func (p Patch) test(doc *container, op Operation) error { return errors.Wrapf(err, "test operation failed to decode path") } + if path == "" { + var self lazyNode + + switch sv := (*doc).(type) { + case *partialDoc: + self.doc = *sv + self.which = eDoc + case *partialArray: + self.ary = *sv + self.which = eAry + } + + if self.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + con, key := findObject(doc, path) if con == nil { @@ -646,7 +688,7 @@ func (p Patch) test(doc *container, op Operation) error { } if val == nil { - if op.value().raw == nil { + if op.value() == nil || op.value().raw == nil { return nil } return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) diff --git a/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go b/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go new file mode 100644 index 000000000..e9bb0efe7 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go @@ -0,0 +1,1385 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Represents JSON data structure using native Go types: booleans, floats, +// strings, arrays, and maps. + +package json + +import ( + "encoding" + "encoding/base64" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "unicode" + "unicode/utf16" + "unicode/utf8" +) + +// Unmarshal parses the JSON-encoded data and stores the result +// in the value pointed to by v. If v is nil or not a pointer, +// Unmarshal returns an InvalidUnmarshalError. +// +// Unmarshal uses the inverse of the encodings that +// Marshal uses, allocating maps, slices, and pointers as necessary, +// with the following additional rules: +// +// To unmarshal JSON into a pointer, Unmarshal first handles the case of +// the JSON being the JSON literal null. In that case, Unmarshal sets +// the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into +// the value pointed at by the pointer. If the pointer is nil, Unmarshal +// allocates a new value for it to point to. +// +// To unmarshal JSON into a value implementing the Unmarshaler interface, +// Unmarshal calls that value's UnmarshalJSON method, including +// when the input is a JSON null. +// Otherwise, if the value implements encoding.TextUnmarshaler +// and the input is a JSON quoted string, Unmarshal calls that value's +// UnmarshalText method with the unquoted form of the string. +// +// To unmarshal JSON into a struct, Unmarshal matches incoming object +// keys to the keys used by Marshal (either the struct field name or its tag), +// preferring an exact match but also accepting a case-insensitive match. By +// default, object keys which don't have a corresponding struct field are +// ignored (see Decoder.DisallowUnknownFields for an alternative). +// +// To unmarshal JSON into an interface value, +// Unmarshal stores one of these in the interface value: +// +// bool, for JSON booleans +// float64, for JSON numbers +// string, for JSON strings +// []interface{}, for JSON arrays +// map[string]interface{}, for JSON objects +// nil for JSON null +// +// To unmarshal a JSON array into a slice, Unmarshal resets the slice length +// to zero and then appends each element to the slice. +// As a special case, to unmarshal an empty JSON array into a slice, +// Unmarshal replaces the slice with a new empty slice. +// +// To unmarshal a JSON array into a Go array, Unmarshal decodes +// JSON array elements into corresponding Go array elements. +// If the Go array is smaller than the JSON array, +// the additional JSON array elements are discarded. +// If the JSON array is smaller than the Go array, +// the additional Go array elements are set to zero values. +// +// To unmarshal a JSON object into a map, Unmarshal first establishes a map to +// use. If the map is nil, Unmarshal allocates a new map. Otherwise Unmarshal +// reuses the existing map, keeping existing entries. Unmarshal then stores +// key-value pairs from the JSON object into the map. The map's key type must +// either be any string type, an integer, implement json.Unmarshaler, or +// implement encoding.TextUnmarshaler. +// +// If the JSON-encoded data contain a syntax error, Unmarshal returns a SyntaxError. +// +// If a JSON value is not appropriate for a given target type, +// or if a JSON number overflows the target type, Unmarshal +// skips that field and completes the unmarshaling as best it can. +// If no more serious errors are encountered, Unmarshal returns +// an UnmarshalTypeError describing the earliest such error. In any +// case, it's not guaranteed that all the remaining fields following +// the problematic one will be unmarshaled into the target object. +// +// The JSON null value unmarshals into an interface, map, pointer, or slice +// by setting that Go value to nil. Because null is often used in JSON to mean +// “not present,†unmarshaling a JSON null into any other Go type has no effect +// on the value and produces no error. +// +// When unmarshaling quoted strings, invalid UTF-8 or +// invalid UTF-16 surrogate pairs are not treated as an error. +// Instead, they are replaced by the Unicode replacement +// character U+FFFD. +func Unmarshal(data []byte, v any) error { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + err := checkValid(data, &d.scan) + if err != nil { + return err + } + + d.init(data) + return d.unmarshal(v) +} + +var ds = sync.Pool{ + New: func() any { + return new(decodeState) + }, +} + +func UnmarshalWithKeys(data []byte, v any) ([]string, error) { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + err := checkValid(data, &d.scan) + if err != nil { + return nil, err + } + + d.init(data) + err = d.unmarshal(v) + if err != nil { + return nil, err + } + + return d.lastKeys, nil +} + +func UnmarshalValid(data []byte, v any) error { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + + d.init(data) + return d.unmarshal(v) +} + +func UnmarshalValidWithKeys(data []byte, v any) ([]string, error) { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + + d.init(data) + err := d.unmarshal(v) + if err != nil { + return nil, err + } + + return d.lastKeys, nil +} + +// Unmarshaler is the interface implemented by types +// that can unmarshal a JSON description of themselves. +// The input can be assumed to be a valid encoding of +// a JSON value. UnmarshalJSON must copy the JSON data +// if it wishes to retain the data after returning. +// +// By convention, to approximate the behavior of Unmarshal itself, +// Unmarshalers implement UnmarshalJSON([]byte("null")) as a no-op. +type Unmarshaler interface { + UnmarshalJSON([]byte) error +} + +// An UnmarshalTypeError describes a JSON value that was +// not appropriate for a value of a specific Go type. +type UnmarshalTypeError struct { + Value string // description of JSON value - "bool", "array", "number -5" + Type reflect.Type // type of Go value it could not be assigned to + Offset int64 // error occurred after reading Offset bytes + Struct string // name of the struct type containing the field + Field string // the full path from root node to the field +} + +func (e *UnmarshalTypeError) Error() string { + if e.Struct != "" || e.Field != "" { + return "json: cannot unmarshal " + e.Value + " into Go struct field " + e.Struct + "." + e.Field + " of type " + e.Type.String() + } + return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String() +} + +// An UnmarshalFieldError describes a JSON object key that +// led to an unexported (and therefore unwritable) struct field. +// +// Deprecated: No longer used; kept for compatibility. +type UnmarshalFieldError struct { + Key string + Type reflect.Type + Field reflect.StructField +} + +func (e *UnmarshalFieldError) Error() string { + return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String() +} + +// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. +// (The argument to Unmarshal must be a non-nil pointer.) +type InvalidUnmarshalError struct { + Type reflect.Type +} + +func (e *InvalidUnmarshalError) Error() string { + if e.Type == nil { + return "json: Unmarshal(nil)" + } + + if e.Type.Kind() != reflect.Pointer { + return "json: Unmarshal(non-pointer " + e.Type.String() + ")" + } + return "json: Unmarshal(nil " + e.Type.String() + ")" +} + +func (d *decodeState) unmarshal(v any) error { + rv := reflect.ValueOf(v) + if rv.Kind() != reflect.Pointer || rv.IsNil() { + return &InvalidUnmarshalError{reflect.TypeOf(v)} + } + + d.scan.reset() + d.scanWhile(scanSkipSpace) + // We decode rv not rv.Elem because the Unmarshaler interface + // test must be applied at the top level of the value. + err := d.value(rv) + if err != nil { + return d.addErrorContext(err) + } + return d.savedError +} + +// A Number represents a JSON number literal. +type Number string + +// String returns the literal text of the number. +func (n Number) String() string { return string(n) } + +// Float64 returns the number as a float64. +func (n Number) Float64() (float64, error) { + return strconv.ParseFloat(string(n), 64) +} + +// Int64 returns the number as an int64. +func (n Number) Int64() (int64, error) { + return strconv.ParseInt(string(n), 10, 64) +} + +// An errorContext provides context for type errors during decoding. +type errorContext struct { + Struct reflect.Type + FieldStack []string +} + +// decodeState represents the state while decoding a JSON value. +type decodeState struct { + data []byte + off int // next read offset in data + opcode int // last read result + scan scanner + errorContext *errorContext + savedError error + useNumber bool + disallowUnknownFields bool + lastKeys []string +} + +// readIndex returns the position of the last byte read. +func (d *decodeState) readIndex() int { + return d.off - 1 +} + +// phasePanicMsg is used as a panic message when we end up with something that +// shouldn't happen. It can indicate a bug in the JSON decoder, or that +// something is editing the data slice while the decoder executes. +const phasePanicMsg = "JSON decoder out of sync - data changing underfoot?" + +func (d *decodeState) init(data []byte) *decodeState { + d.data = data + d.off = 0 + d.savedError = nil + if d.errorContext != nil { + d.errorContext.Struct = nil + // Reuse the allocated space for the FieldStack slice. + d.errorContext.FieldStack = d.errorContext.FieldStack[:0] + } + return d +} + +// saveError saves the first err it is called with, +// for reporting at the end of the unmarshal. +func (d *decodeState) saveError(err error) { + if d.savedError == nil { + d.savedError = d.addErrorContext(err) + } +} + +// addErrorContext returns a new error enhanced with information from d.errorContext +func (d *decodeState) addErrorContext(err error) error { + if d.errorContext != nil && (d.errorContext.Struct != nil || len(d.errorContext.FieldStack) > 0) { + switch err := err.(type) { + case *UnmarshalTypeError: + err.Struct = d.errorContext.Struct.Name() + err.Field = strings.Join(d.errorContext.FieldStack, ".") + } + } + return err +} + +// skip scans to the end of what was started. +func (d *decodeState) skip() { + s, data, i := &d.scan, d.data, d.off + depth := len(s.parseState) + for { + op := s.step(s, data[i]) + i++ + if len(s.parseState) < depth { + d.off = i + d.opcode = op + return + } + } +} + +// scanNext processes the byte at d.data[d.off]. +func (d *decodeState) scanNext() { + if d.off < len(d.data) { + d.opcode = d.scan.step(&d.scan, d.data[d.off]) + d.off++ + } else { + d.opcode = d.scan.eof() + d.off = len(d.data) + 1 // mark processed EOF with len+1 + } +} + +// scanWhile processes bytes in d.data[d.off:] until it +// receives a scan code not equal to op. +func (d *decodeState) scanWhile(op int) { + s, data, i := &d.scan, d.data, d.off + for i < len(data) { + newOp := s.step(s, data[i]) + i++ + if newOp != op { + d.opcode = newOp + d.off = i + return + } + } + + d.off = len(data) + 1 // mark processed EOF with len+1 + d.opcode = d.scan.eof() +} + +// rescanLiteral is similar to scanWhile(scanContinue), but it specialises the +// common case where we're decoding a literal. The decoder scans the input +// twice, once for syntax errors and to check the length of the value, and the +// second to perform the decoding. +// +// Only in the second step do we use decodeState to tokenize literals, so we +// know there aren't any syntax errors. We can take advantage of that knowledge, +// and scan a literal's bytes much more quickly. +func (d *decodeState) rescanLiteral() { + data, i := d.data, d.off +Switch: + switch data[i-1] { + case '"': // string + for ; i < len(data); i++ { + switch data[i] { + case '\\': + i++ // escaped char + case '"': + i++ // tokenize the closing quote too + break Switch + } + } + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': // number + for ; i < len(data); i++ { + switch data[i] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '.', 'e', 'E', '+', '-': + default: + break Switch + } + } + case 't': // true + i += len("rue") + case 'f': // false + i += len("alse") + case 'n': // null + i += len("ull") + } + if i < len(data) { + d.opcode = stateEndValue(&d.scan, data[i]) + } else { + d.opcode = scanEnd + } + d.off = i + 1 +} + +// value consumes a JSON value from d.data[d.off-1:], decoding into v, and +// reads the following byte ahead. If v is invalid, the value is discarded. +// The first byte of the value has been read already. +func (d *decodeState) value(v reflect.Value) error { + switch d.opcode { + default: + panic(phasePanicMsg) + + case scanBeginArray: + if v.IsValid() { + if err := d.array(v); err != nil { + return err + } + } else { + d.skip() + } + d.scanNext() + + case scanBeginObject: + if v.IsValid() { + if err := d.object(v); err != nil { + return err + } + } else { + d.skip() + } + d.scanNext() + + case scanBeginLiteral: + // All bytes inside literal return scanContinue op code. + start := d.readIndex() + d.rescanLiteral() + + if v.IsValid() { + if err := d.literalStore(d.data[start:d.readIndex()], v, false); err != nil { + return err + } + } + } + return nil +} + +type unquotedValue struct{} + +// valueQuoted is like value but decodes a +// quoted string literal or literal null into an interface value. +// If it finds anything other than a quoted string literal or null, +// valueQuoted returns unquotedValue{}. +func (d *decodeState) valueQuoted() any { + switch d.opcode { + default: + panic(phasePanicMsg) + + case scanBeginArray, scanBeginObject: + d.skip() + d.scanNext() + + case scanBeginLiteral: + v := d.literalInterface() + switch v.(type) { + case nil, string: + return v + } + } + return unquotedValue{} +} + +// indirect walks down v allocating pointers as needed, +// until it gets to a non-pointer. +// If it encounters an Unmarshaler, indirect stops and returns that. +// If decodingNull is true, indirect stops at the first settable pointer so it +// can be set to nil. +func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnmarshaler, reflect.Value) { + // Issue #24153 indicates that it is generally not a guaranteed property + // that you may round-trip a reflect.Value by calling Value.Addr().Elem() + // and expect the value to still be settable for values derived from + // unexported embedded struct fields. + // + // The logic below effectively does this when it first addresses the value + // (to satisfy possible pointer methods) and continues to dereference + // subsequent pointers as necessary. + // + // After the first round-trip, we set v back to the original value to + // preserve the original RW flags contained in reflect.Value. + v0 := v + haveAddr := false + + // If v is a named type and is addressable, + // start with its address, so that if the type has pointer methods, + // we find them. + if v.Kind() != reflect.Pointer && v.Type().Name() != "" && v.CanAddr() { + haveAddr = true + v = v.Addr() + } + for { + // Load value from interface, but only if the result will be + // usefully addressable. + if v.Kind() == reflect.Interface && !v.IsNil() { + e := v.Elem() + if e.Kind() == reflect.Pointer && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Pointer) { + haveAddr = false + v = e + continue + } + } + + if v.Kind() != reflect.Pointer { + break + } + + if decodingNull && v.CanSet() { + break + } + + // Prevent infinite loop if v is an interface pointing to its own address: + // var v interface{} + // v = &v + if v.Elem().Kind() == reflect.Interface && v.Elem().Elem() == v { + v = v.Elem() + break + } + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + if v.Type().NumMethod() > 0 && v.CanInterface() { + if u, ok := v.Interface().(Unmarshaler); ok { + return u, nil, reflect.Value{} + } + if !decodingNull { + if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + return nil, u, reflect.Value{} + } + } + } + + if haveAddr { + v = v0 // restore original value after round-trip Value.Addr().Elem() + haveAddr = false + } else { + v = v.Elem() + } + } + return nil, nil, v +} + +// array consumes an array from d.data[d.off-1:], decoding into v. +// The first byte of the array ('[') has been read already. +func (d *decodeState) array(v reflect.Value) error { + // Check for unmarshaler. + u, ut, pv := indirect(v, false) + if u != nil { + start := d.readIndex() + d.skip() + return u.UnmarshalJSON(d.data[start:d.off]) + } + if ut != nil { + d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + } + v = pv + + // Check type of target. + switch v.Kind() { + case reflect.Interface: + if v.NumMethod() == 0 { + // Decoding into nil interface? Switch to non-reflect code. + ai := d.arrayInterface() + v.Set(reflect.ValueOf(ai)) + return nil + } + // Otherwise it's invalid. + fallthrough + default: + d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + case reflect.Array, reflect.Slice: + break + } + + i := 0 + for { + // Look ahead for ] - can only happen on first iteration. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndArray { + break + } + + // Get element of array, growing if necessary. + if v.Kind() == reflect.Slice { + // Grow slice if necessary + if i >= v.Cap() { + newcap := v.Cap() + v.Cap()/2 + if newcap < 4 { + newcap = 4 + } + newv := reflect.MakeSlice(v.Type(), v.Len(), newcap) + reflect.Copy(newv, v) + v.Set(newv) + } + if i >= v.Len() { + v.SetLen(i + 1) + } + } + + if i < v.Len() { + // Decode into element. + if err := d.value(v.Index(i)); err != nil { + return err + } + } else { + // Ran out of fixed array: skip. + if err := d.value(reflect.Value{}); err != nil { + return err + } + } + i++ + + // Next token must be , or ]. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndArray { + break + } + if d.opcode != scanArrayValue { + panic(phasePanicMsg) + } + } + + if i < v.Len() { + if v.Kind() == reflect.Array { + // Array. Zero the rest. + z := reflect.Zero(v.Type().Elem()) + for ; i < v.Len(); i++ { + v.Index(i).Set(z) + } + } else { + v.SetLen(i) + } + } + if i == 0 && v.Kind() == reflect.Slice { + v.Set(reflect.MakeSlice(v.Type(), 0, 0)) + } + return nil +} + +var nullLiteral = []byte("null") +var textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() + +// object consumes an object from d.data[d.off-1:], decoding into v. +// The first byte ('{') of the object has been read already. +func (d *decodeState) object(v reflect.Value) error { + // Check for unmarshaler. + u, ut, pv := indirect(v, false) + if u != nil { + start := d.readIndex() + d.skip() + return u.UnmarshalJSON(d.data[start:d.off]) + } + if ut != nil { + d.saveError(&UnmarshalTypeError{Value: "object", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + } + v = pv + t := v.Type() + + // Decoding into nil interface? Switch to non-reflect code. + if v.Kind() == reflect.Interface && v.NumMethod() == 0 { + oi := d.objectInterface() + v.Set(reflect.ValueOf(oi)) + return nil + } + + var fields structFields + + // Check type of target: + // struct or + // map[T1]T2 where T1 is string, an integer type, + // or an encoding.TextUnmarshaler + switch v.Kind() { + case reflect.Map: + // Map key must either have string kind, have an integer kind, + // or be an encoding.TextUnmarshaler. + switch t.Key().Kind() { + case reflect.String, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + default: + if !reflect.PointerTo(t.Key()).Implements(textUnmarshalerType) { + d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)}) + d.skip() + return nil + } + } + if v.IsNil() { + v.Set(reflect.MakeMap(t)) + } + case reflect.Struct: + fields = cachedTypeFields(t) + // ok + default: + d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)}) + d.skip() + return nil + } + + var mapElem reflect.Value + var origErrorContext errorContext + if d.errorContext != nil { + origErrorContext = *d.errorContext + } + + var keys []string + + for { + // Read opening " of string key or closing }. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndObject { + // closing } - can only happen on first iteration. + break + } + if d.opcode != scanBeginLiteral { + panic(phasePanicMsg) + } + + // Read key. + start := d.readIndex() + d.rescanLiteral() + item := d.data[start:d.readIndex()] + key, ok := unquoteBytes(item) + if !ok { + panic(phasePanicMsg) + } + + keys = append(keys, string(key)) + + // Figure out field corresponding to key. + var subv reflect.Value + destring := false // whether the value is wrapped in a string to be decoded first + + if v.Kind() == reflect.Map { + elemType := t.Elem() + if !mapElem.IsValid() { + mapElem = reflect.New(elemType).Elem() + } else { + mapElem.Set(reflect.Zero(elemType)) + } + subv = mapElem + } else { + var f *field + if i, ok := fields.nameIndex[string(key)]; ok { + // Found an exact name match. + f = &fields.list[i] + } else { + // Fall back to the expensive case-insensitive + // linear search. + for i := range fields.list { + ff := &fields.list[i] + if ff.equalFold(ff.nameBytes, key) { + f = ff + break + } + } + } + if f != nil { + subv = v + destring = f.quoted + for _, i := range f.index { + if subv.Kind() == reflect.Pointer { + if subv.IsNil() { + // If a struct embeds a pointer to an unexported type, + // it is not possible to set a newly allocated value + // since the field is unexported. + // + // See https://golang.org/issue/21357 + if !subv.CanSet() { + d.saveError(fmt.Errorf("json: cannot set embedded pointer to unexported struct: %v", subv.Type().Elem())) + // Invalidate subv to ensure d.value(subv) skips over + // the JSON value without assigning it to subv. + subv = reflect.Value{} + destring = false + break + } + subv.Set(reflect.New(subv.Type().Elem())) + } + subv = subv.Elem() + } + subv = subv.Field(i) + } + if d.errorContext == nil { + d.errorContext = new(errorContext) + } + d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name) + d.errorContext.Struct = t + } else if d.disallowUnknownFields { + d.saveError(fmt.Errorf("json: unknown field %q", key)) + } + } + + // Read : before value. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode != scanObjectKey { + panic(phasePanicMsg) + } + d.scanWhile(scanSkipSpace) + + if destring { + switch qv := d.valueQuoted().(type) { + case nil: + if err := d.literalStore(nullLiteral, subv, false); err != nil { + return err + } + case string: + if err := d.literalStore([]byte(qv), subv, true); err != nil { + return err + } + default: + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal unquoted value into %v", subv.Type())) + } + } else { + if err := d.value(subv); err != nil { + return err + } + } + + // Write value back to map; + // if using struct, subv points into struct already. + if v.Kind() == reflect.Map { + kt := t.Key() + var kv reflect.Value + switch { + case reflect.PointerTo(kt).Implements(textUnmarshalerType): + kv = reflect.New(kt) + if err := d.literalStore(item, kv, true); err != nil { + return err + } + kv = kv.Elem() + case kt.Kind() == reflect.String: + kv = reflect.ValueOf(key).Convert(kt) + default: + switch kt.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + s := string(key) + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || reflect.Zero(kt).OverflowInt(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) + break + } + kv = reflect.ValueOf(n).Convert(kt) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + s := string(key) + n, err := strconv.ParseUint(s, 10, 64) + if err != nil || reflect.Zero(kt).OverflowUint(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) + break + } + kv = reflect.ValueOf(n).Convert(kt) + default: + panic("json: Unexpected key type") // should never occur + } + } + if kv.IsValid() { + v.SetMapIndex(kv, subv) + } + } + + // Next token must be , or }. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.errorContext != nil { + // Reset errorContext to its original state. + // Keep the same underlying array for FieldStack, to reuse the + // space and avoid unnecessary allocs. + d.errorContext.FieldStack = d.errorContext.FieldStack[:len(origErrorContext.FieldStack)] + d.errorContext.Struct = origErrorContext.Struct + } + if d.opcode == scanEndObject { + break + } + if d.opcode != scanObjectValue { + panic(phasePanicMsg) + } + } + + if v.Kind() == reflect.Map { + d.lastKeys = keys + } + return nil +} + +// convertNumber converts the number literal s to a float64 or a Number +// depending on the setting of d.useNumber. +func (d *decodeState) convertNumber(s string) (any, error) { + if d.useNumber { + return Number(s), nil + } + f, err := strconv.ParseFloat(s, 64) + if err != nil { + return nil, &UnmarshalTypeError{Value: "number " + s, Type: reflect.TypeOf(0.0), Offset: int64(d.off)} + } + return f, nil +} + +var numberType = reflect.TypeOf(Number("")) + +// literalStore decodes a literal stored in item into v. +// +// fromQuoted indicates whether this literal came from unwrapping a +// string from the ",string" struct tag option. this is used only to +// produce more helpful error messages. +func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) error { + // Check for unmarshaler. + if len(item) == 0 { + //Empty string given + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + return nil + } + isNull := item[0] == 'n' // null + u, ut, pv := indirect(v, isNull) + if u != nil { + return u.UnmarshalJSON(item) + } + if ut != nil { + if item[0] != '"' { + if fromQuoted { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + return nil + } + val := "number" + switch item[0] { + case 'n': + val = "null" + case 't', 'f': + val = "bool" + } + d.saveError(&UnmarshalTypeError{Value: val, Type: v.Type(), Offset: int64(d.readIndex())}) + return nil + } + s, ok := unquoteBytes(item) + if !ok { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + return ut.UnmarshalText(s) + } + + v = pv + + switch c := item[0]; c { + case 'n': // null + // The main parser checks that only true and false can reach here, + // but if this was a quoted string input, it could be anything. + if fromQuoted && string(item) != "null" { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + break + } + switch v.Kind() { + case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice: + v.Set(reflect.Zero(v.Type())) + // otherwise, ignore null for primitives/string + } + case 't', 'f': // true, false + value := item[0] == 't' + // The main parser checks that only true and false can reach here, + // but if this was a quoted string input, it could be anything. + if fromQuoted && string(item) != "true" && string(item) != "false" { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + break + } + switch v.Kind() { + default: + if fromQuoted { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + } else { + d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())}) + } + case reflect.Bool: + v.SetBool(value) + case reflect.Interface: + if v.NumMethod() == 0 { + v.Set(reflect.ValueOf(value)) + } else { + d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())}) + } + } + + case '"': // string + s, ok := unquoteBytes(item) + if !ok { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + switch v.Kind() { + default: + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + case reflect.Slice: + if v.Type().Elem().Kind() != reflect.Uint8 { + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + b := make([]byte, base64.StdEncoding.DecodedLen(len(s))) + n, err := base64.StdEncoding.Decode(b, s) + if err != nil { + d.saveError(err) + break + } + v.SetBytes(b[:n]) + case reflect.String: + if v.Type() == numberType && !isValidNumber(string(s)) { + return fmt.Errorf("json: invalid number literal, trying to unmarshal %q into Number", item) + } + v.SetString(string(s)) + case reflect.Interface: + if v.NumMethod() == 0 { + v.Set(reflect.ValueOf(string(s))) + } else { + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + } + } + + default: // number + if c != '-' && (c < '0' || c > '9') { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + s := string(item) + switch v.Kind() { + default: + if v.Kind() == reflect.String && v.Type() == numberType { + // s must be a valid number, because it's + // already been tokenized. + v.SetString(s) + break + } + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())}) + case reflect.Interface: + n, err := d.convertNumber(s) + if err != nil { + d.saveError(err) + break + } + if v.NumMethod() != 0 { + d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.Set(reflect.ValueOf(n)) + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || v.OverflowInt(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetInt(n) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + n, err := strconv.ParseUint(s, 10, 64) + if err != nil || v.OverflowUint(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetUint(n) + + case reflect.Float32, reflect.Float64: + n, err := strconv.ParseFloat(s, v.Type().Bits()) + if err != nil || v.OverflowFloat(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetFloat(n) + } + } + return nil +} + +// The xxxInterface routines build up a value to be stored +// in an empty interface. They are not strictly necessary, +// but they avoid the weight of reflection in this common case. + +// valueInterface is like value but returns interface{} +func (d *decodeState) valueInterface() (val any) { + switch d.opcode { + default: + panic(phasePanicMsg) + case scanBeginArray: + val = d.arrayInterface() + d.scanNext() + case scanBeginObject: + val = d.objectInterface() + d.scanNext() + case scanBeginLiteral: + val = d.literalInterface() + } + return +} + +// arrayInterface is like array but returns []interface{}. +func (d *decodeState) arrayInterface() []any { + var v = make([]any, 0) + for { + // Look ahead for ] - can only happen on first iteration. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndArray { + break + } + + v = append(v, d.valueInterface()) + + // Next token must be , or ]. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndArray { + break + } + if d.opcode != scanArrayValue { + panic(phasePanicMsg) + } + } + return v +} + +// objectInterface is like object but returns map[string]interface{}. +func (d *decodeState) objectInterface() map[string]any { + m := make(map[string]any) + for { + // Read opening " of string key or closing }. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndObject { + // closing } - can only happen on first iteration. + break + } + if d.opcode != scanBeginLiteral { + panic(phasePanicMsg) + } + + // Read string key. + start := d.readIndex() + d.rescanLiteral() + item := d.data[start:d.readIndex()] + key, ok := unquote(item) + if !ok { + panic(phasePanicMsg) + } + + // Read : before value. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode != scanObjectKey { + panic(phasePanicMsg) + } + d.scanWhile(scanSkipSpace) + + // Read value. + m[key] = d.valueInterface() + + // Next token must be , or }. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndObject { + break + } + if d.opcode != scanObjectValue { + panic(phasePanicMsg) + } + } + return m +} + +// literalInterface consumes and returns a literal from d.data[d.off-1:] and +// it reads the following byte ahead. The first byte of the literal has been +// read already (that's how the caller knows it's a literal). +func (d *decodeState) literalInterface() any { + // All bytes inside literal return scanContinue op code. + start := d.readIndex() + d.rescanLiteral() + + item := d.data[start:d.readIndex()] + + switch c := item[0]; c { + case 'n': // null + return nil + + case 't', 'f': // true, false + return c == 't' + + case '"': // string + s, ok := unquote(item) + if !ok { + panic(phasePanicMsg) + } + return s + + default: // number + if c != '-' && (c < '0' || c > '9') { + panic(phasePanicMsg) + } + n, err := d.convertNumber(string(item)) + if err != nil { + d.saveError(err) + } + return n + } +} + +// getu4 decodes \uXXXX from the beginning of s, returning the hex value, +// or it returns -1. +func getu4(s []byte) rune { + if len(s) < 6 || s[0] != '\\' || s[1] != 'u' { + return -1 + } + var r rune + for _, c := range s[2:6] { + switch { + case '0' <= c && c <= '9': + c = c - '0' + case 'a' <= c && c <= 'f': + c = c - 'a' + 10 + case 'A' <= c && c <= 'F': + c = c - 'A' + 10 + default: + return -1 + } + r = r*16 + rune(c) + } + return r +} + +// unquote converts a quoted JSON string literal s into an actual string t. +// The rules are different than for Go, so cannot use strconv.Unquote. +func unquote(s []byte) (t string, ok bool) { + s, ok = unquoteBytes(s) + t = string(s) + return +} + +func unquoteBytes(s []byte) (t []byte, ok bool) { + if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' { + return + } + s = s[1 : len(s)-1] + + // Check for unusual characters. If there are none, + // then no unquoting is needed, so return a slice of the + // original bytes. + r := 0 + for r < len(s) { + c := s[r] + if c == '\\' || c == '"' || c < ' ' { + break + } + if c < utf8.RuneSelf { + r++ + continue + } + rr, size := utf8.DecodeRune(s[r:]) + if rr == utf8.RuneError && size == 1 { + break + } + r += size + } + if r == len(s) { + return s, true + } + + b := make([]byte, len(s)+2*utf8.UTFMax) + w := copy(b, s[0:r]) + for r < len(s) { + // Out of room? Can only happen if s is full of + // malformed UTF-8 and we're replacing each + // byte with RuneError. + if w >= len(b)-2*utf8.UTFMax { + nb := make([]byte, (len(b)+utf8.UTFMax)*2) + copy(nb, b[0:w]) + b = nb + } + switch c := s[r]; { + case c == '\\': + r++ + if r >= len(s) { + return + } + switch s[r] { + default: + return + case '"', '\\', '/', '\'': + b[w] = s[r] + r++ + w++ + case 'b': + b[w] = '\b' + r++ + w++ + case 'f': + b[w] = '\f' + r++ + w++ + case 'n': + b[w] = '\n' + r++ + w++ + case 'r': + b[w] = '\r' + r++ + w++ + case 't': + b[w] = '\t' + r++ + w++ + case 'u': + r-- + rr := getu4(s[r:]) + if rr < 0 { + return + } + r += 6 + if utf16.IsSurrogate(rr) { + rr1 := getu4(s[r:]) + if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar { + // A valid pair; consume. + r += 6 + w += utf8.EncodeRune(b[w:], dec) + break + } + // Invalid surrogate; fall back to replacement rune. + rr = unicode.ReplacementChar + } + w += utf8.EncodeRune(b[w:], rr) + } + + // Quote, control characters are invalid. + case c == '"', c < ' ': + return + + // ASCII + case c < utf8.RuneSelf: + b[w] = c + r++ + w++ + + // Coerce to well-formed UTF-8. + default: + rr, size := utf8.DecodeRune(s[r:]) + r += size + w += utf8.EncodeRune(b[w:], rr) + } + } + return b[0:w], true +} diff --git a/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go b/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go new file mode 100644 index 000000000..a1819b16a --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go @@ -0,0 +1,1473 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package json implements encoding and decoding of JSON as defined in +// RFC 7159. The mapping between JSON and Go values is described +// in the documentation for the Marshal and Unmarshal functions. +// +// See "JSON and Go" for an introduction to this package: +// https://golang.org/doc/articles/json_and_go.html +package json + +import ( + "bytes" + "encoding" + "encoding/base64" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "unicode" + "unicode/utf8" +) + +// Marshal returns the JSON encoding of v. +// +// Marshal traverses the value v recursively. +// If an encountered value implements the Marshaler interface +// and is not a nil pointer, Marshal calls its MarshalJSON method +// to produce JSON. If no MarshalJSON method is present but the +// value implements encoding.TextMarshaler instead, Marshal calls +// its MarshalText method and encodes the result as a JSON string. +// The nil pointer exception is not strictly necessary +// but mimics a similar, necessary exception in the behavior of +// UnmarshalJSON. +// +// Otherwise, Marshal uses the following type-dependent default encodings: +// +// Boolean values encode as JSON booleans. +// +// Floating point, integer, and Number values encode as JSON numbers. +// +// String values encode as JSON strings coerced to valid UTF-8, +// replacing invalid bytes with the Unicode replacement rune. +// So that the JSON will be safe to embed inside HTML