visitor.go (122 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package structform // Visitor interface for accepting events. The Vistor defined the common Data // Model all serializers should accept and all deserializers must implement. type Visitor interface { ObjectVisitor ArrayVisitor ValueVisitor } // ExtVisitor interface defines the Extended Data Model. Usage and // implementation of the Extended Data Model is optional, but can speed up // operations. type ExtVisitor interface { Visitor ArrayValueVisitor ObjectValueVisitor StringRefVisitor } //go:generate stringer -type=BaseType type BaseType uint8 const ( AnyType BaseType = iota ByteType StringType BoolType ZeroType IntType Int8Type Int16Type Int32Type Int64Type UintType Uint8Type Uint16Type Uint32Type Uint64Type Float32Type Float64Type ) // ObjectVisitor iterates all fields in a dictionary like structure. type ObjectVisitor interface { // OnObjectStart is called when a new object (key-value pairs) is going to be reported. // A call to OnKey or OnObjectFinished must follow directly. OnObjectStart(len int, baseType BaseType) error // OnArrayFinished indicates that there are no more key value pairs to report. OnObjectFinished() error // OnKey adds a new key to the object. A value must directly follow a call to OnKey. OnKey(s string) error } // ArrayVisitor defines the support for arrays/slices in the Data Model. type ArrayVisitor interface { // OnArrayStart is called whan a new array is going to be reported. // // The `len` argument should report the length if known. `len` MUST BE -1 if // the length of the array is not known. The BaseType should indicate the // element type of the array. If the element type is unknown or can be any // type (e.g. interface{}), AnyType must be used. OnArrayStart(len int, baseType BaseType) error // OnArrayFinished indicates that there are no more elements in the array. OnArrayFinished() error } // ValueVisitor defines the set of supported primitive types in the Data Model. type ValueVisitor interface { // untyped nil value OnNil() error OnBool(b bool) error OnString(s string) error // int OnInt8(i int8) error OnInt16(i int16) error OnInt32(i int32) error OnInt64(i int64) error OnInt(i int) error // uint OnByte(b byte) error OnUint8(u uint8) error OnUint16(u uint16) error OnUint32(u uint32) error OnUint64(u uint64) error OnUint(u uint) error // float OnFloat32(f float32) error OnFloat64(f float64) error } // ArrayValueVisitor passes arrays with known type. Implementation // of ArrayValueVisitor is optional. type ArrayValueVisitor interface { OnBoolArray([]bool) error OnStringArray([]string) error // int OnInt8Array([]int8) error OnInt16Array([]int16) error OnInt32Array([]int32) error OnInt64Array([]int64) error OnIntArray([]int) error // uint OnBytes([]byte) error OnUint8Array([]uint8) error OnUint16Array([]uint16) error OnUint32Array([]uint32) error OnUint64Array([]uint64) error OnUintArray([]uint) error // float OnFloat32Array([]float32) error OnFloat64Array([]float64) error } // ObjectValueVisitor passes map[string]T. Implementation // of ObjectValueVisitor is optional. type ObjectValueVisitor interface { OnBoolObject(map[string]bool) error OnStringObject(map[string]string) error // int OnInt8Object(map[string]int8) error OnInt16Object(map[string]int16) error OnInt32Object(map[string]int32) error OnInt64Object(map[string]int64) error OnIntObject(map[string]int) error // uint OnUint8Object(map[string]uint8) error OnUint16Object(map[string]uint16) error OnUint32Object(map[string]uint32) error OnUint64Object(map[string]uint64) error OnUintObject(map[string]uint) error // float OnFloat32Object(map[string]float32) error OnFloat64Object(map[string]float64) error } // StringRefVisitor handles strings by reference into a byte string. // The reference must be processed immediately, as the string passed // might get modified after the callback returns. type StringRefVisitor interface { OnStringRef(s []byte) error OnKeyRef(s []byte) error } type extVisitor struct { Visitor ObjectValueVisitor ArrayValueVisitor StringRefVisitor } // EnsureExtVisitor converts a Visitor into an ExtVisitor. If v already // implements ExtVisitor, it is directly implemented. If v only implements a // subset of ExtVisitor, then conversions for the missing interfaces will be // created. func EnsureExtVisitor(v Visitor) ExtVisitor { if ev, ok := v.(ExtVisitor); ok { return ev } e := &extVisitor{ Visitor: v, } if ov, ok := v.(ObjectValueVisitor); ok { e.ObjectValueVisitor = ov } else { e.ObjectValueVisitor = extObjVisitor{v} } if av, ok := v.(ArrayValueVisitor); ok { e.ArrayValueVisitor = av } else { e.ArrayValueVisitor = extArrVisitor{v} } e.StringRefVisitor = MakeStringRefVisitor(v) return e }