slim/vendor/github.com/json-iterator/go/iter_skip.go
Ivan Velichko 76d3737adf Slimming Kubernetes workloads (a working PoC).
Similarly to the compose mode, this series of squashed commits adds
support for Kubernetes as an execution environment for the target
container image.

The branch is a few months old, so it has been squashed to a single commit to
reduce the complexity of the rebase & merge. Below are the messages from the squashed commits:

[Refactoring] Group all Node.js inspect flags into a single DTO

With the upcoming addition of Kubernetes support, we need to figure out
a way of sharing code between the existing container.Insepector and the
new pod.Inspector. In particular, it can be done through shared config
objects.

[Refactoring] Extract fat image building into a separate function

[Refactoring] Extract fat image inspection into a separate subroutine.

Bring in Kubernetes client-go dependency

Fix github.com/getkin/kin-openapi usage - got broken by version bump

Finding K8s workloads

Inspecting fat kubernetes workload image

Injecting sensor into K8s workload - initial phase

Introduce `kubectl` client

Injecting sensor into pod (cont.)

Get artifacts from the pod

[Refactoring] Extract building slim images into a subroutine

Put the rest of the build.handler logic to the kubernetes build subroutine

Applying Kubernetes manifest(s)

[Refactoring] Revamped Kubernetes Workload Finder

[Refactoring] Reshape Kubernetes logic

Scale down Kubernetes workloads after slimming

Restore Kubernetes workload to the original state if no manifest is used

[Refactoring] Introduce HTTPProbeOptions struct and refactor the code

Basic Kubernetes workload monitoring - CAMEnter, CAMTimeout, CAMSignal, CAMExec

Fix (workaround) for kubectl cp missing file permissions

master rebase

[Refactoring] Remove unused HTTP Probe Proxy flags

Fix HTTP probe having no ports

Use latest set of e2e tests

HTTP probe for Kubernetes workloads

Refine Kubernetes-related flag names

Bump down Kubernetes deps to v1.22 to keep Go at v1.16
2022-08-27 12:35:43 +00:00

131 lines
3.3 KiB
Go

package jsoniter
import "fmt"
// ReadNil reads a json object as nil and
// returns whether it's a nil or not
func (iter *Iterator) ReadNil() (ret bool) {
c := iter.nextToken()
if c == 'n' {
iter.skipThreeBytes('u', 'l', 'l') // null
return true
}
iter.unreadByte()
return false
}
// ReadBool reads a json object as BoolValue
func (iter *Iterator) ReadBool() (ret bool) {
c := iter.nextToken()
if c == 't' {
iter.skipThreeBytes('r', 'u', 'e')
return true
}
if c == 'f' {
iter.skipFourBytes('a', 'l', 's', 'e')
return false
}
iter.ReportError("ReadBool", "expect t or f, but found "+string([]byte{c}))
return
}
// SkipAndReturnBytes skip next JSON element, and return its content as []byte.
// The []byte can be kept, it is a copy of data.
func (iter *Iterator) SkipAndReturnBytes() []byte {
iter.startCapture(iter.head)
iter.Skip()
return iter.stopCapture()
}
// SkipAndAppendBytes skips next JSON element and appends its content to
// buffer, returning the result.
func (iter *Iterator) SkipAndAppendBytes(buf []byte) []byte {
iter.startCaptureTo(buf, iter.head)
iter.Skip()
return iter.stopCapture()
}
func (iter *Iterator) startCaptureTo(buf []byte, captureStartedAt int) {
if iter.captured != nil {
panic("already in capture mode")
}
iter.captureStartedAt = captureStartedAt
iter.captured = buf
}
func (iter *Iterator) startCapture(captureStartedAt int) {
iter.startCaptureTo(make([]byte, 0, 32), captureStartedAt)
}
func (iter *Iterator) stopCapture() []byte {
if iter.captured == nil {
panic("not in capture mode")
}
captured := iter.captured
remaining := iter.buf[iter.captureStartedAt:iter.head]
iter.captureStartedAt = -1
iter.captured = nil
return append(captured, remaining...)
}
// Skip skips a json object and positions to relatively the next json object
func (iter *Iterator) Skip() {
c := iter.nextToken()
switch c {
case '"':
iter.skipString()
case 'n':
iter.skipThreeBytes('u', 'l', 'l') // null
case 't':
iter.skipThreeBytes('r', 'u', 'e') // true
case 'f':
iter.skipFourBytes('a', 'l', 's', 'e') // false
case '0':
iter.unreadByte()
iter.ReadFloat32()
case '-', '1', '2', '3', '4', '5', '6', '7', '8', '9':
iter.skipNumber()
case '[':
iter.skipArray()
case '{':
iter.skipObject()
default:
iter.ReportError("Skip", fmt.Sprintf("do not know how to skip: %v", c))
return
}
}
func (iter *Iterator) skipFourBytes(b1, b2, b3, b4 byte) {
if iter.readByte() != b1 {
iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4})))
return
}
if iter.readByte() != b2 {
iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4})))
return
}
if iter.readByte() != b3 {
iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4})))
return
}
if iter.readByte() != b4 {
iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4})))
return
}
}
func (iter *Iterator) skipThreeBytes(b1, b2, b3 byte) {
if iter.readByte() != b1 {
iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3})))
return
}
if iter.readByte() != b2 {
iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3})))
return
}
if iter.readByte() != b3 {
iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3})))
return
}
}