// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This file was auto-generated by the vanadium vdl tool.
// Source: types.vdl

// Syncbase data model for Sensor Log.
//
// Every type <T> stored in Syncbase is defined as a pair of types, K<T> and
// V<T>, representing data stored in the key and value, respectively, in a
// single table. K<T> types satisfy the PersistentDataKey interface, supporting
// conversion to and from the row key.
package sbmodel

import (
	"fmt"
	"reflect"
	"time"
	"v.io/v23/vdl"
	time_2 "v.io/v23/vdlroot/time"
)

// devicecfg : <DevId>
// Measuring device handle. Master only.
type VDeviceCfg struct {
	// Human-readable, not necessarily unique description of the device.
	Desc string
	// Syncbase instance publishing the syncgroup created by the device.
	SgPublishSb string
}

func (VDeviceCfg) __VDLReflect(struct {
	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.VDeviceCfg"`
}) {
}

func (m *VDeviceCfg) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg == nil || __VDLTypetypes0 == nil {
		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
	}
	fieldsTarget1, err := t.StartFields(tt)
	if err != nil {
		return err
	}

	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Desc")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget3.FromString(string(m.Desc), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
			return err
		}
	}
	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("SgPublishSb")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget5.FromString(string(m.SgPublishSb), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
			return err
		}
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}
	return nil
}

func (m *VDeviceCfg) MakeVDLTarget() vdl.Target {
	return &VDeviceCfgTarget{Value: m}
}

type VDeviceCfgTarget struct {
	Value *VDeviceCfg
	vdl.TargetBase
	vdl.FieldsTargetBase
}

func (t *VDeviceCfgTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg) {
		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg)
	}
	return t, nil
}
func (t *VDeviceCfgTarget) StartField(name string) (key, field vdl.Target, _ error) {
	switch name {
	case "Desc":
		val, err := &vdl.StringTarget{Value: &t.Value.Desc}, error(nil)
		return nil, val, err
	case "SgPublishSb":
		val, err := &vdl.StringTarget{Value: &t.Value.SgPublishSb}, error(nil)
		return nil, val, err
	default:
		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg)
	}
}
func (t *VDeviceCfgTarget) FinishField(_, _ vdl.Target) error {
	return nil
}
func (t *VDeviceCfgTarget) FinishFields(_ vdl.FieldsTarget) error {
	return nil
}

type KDeviceCfg struct {
	DevId string
}

func (KDeviceCfg) __VDLReflect(struct {
	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.KDeviceCfg"`
}) {
}

func (m *KDeviceCfg) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg == nil || __VDLTypetypes1 == nil {
		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
	}
	fieldsTarget1, err := t.StartFields(tt)
	if err != nil {
		return err
	}

	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("DevId")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget3.FromString(string(m.DevId), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
			return err
		}
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}
	return nil
}

func (m *KDeviceCfg) MakeVDLTarget() vdl.Target {
	return &KDeviceCfgTarget{Value: m}
}

type KDeviceCfgTarget struct {
	Value *KDeviceCfg
	vdl.TargetBase
	vdl.FieldsTargetBase
}

func (t *KDeviceCfgTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg) {
		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg)
	}
	return t, nil
}
func (t *KDeviceCfgTarget) StartField(name string) (key, field vdl.Target, _ error) {
	switch name {
	case "DevId":
		val, err := &vdl.StringTarget{Value: &t.Value.DevId}, error(nil)
		return nil, val, err
	default:
		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg)
	}
}
func (t *KDeviceCfgTarget) FinishField(_, _ vdl.Target) error {
	return nil
}
func (t *KDeviceCfgTarget) FinishFields(_ vdl.FieldsTarget) error {
	return nil
}

// streamdef : <DevId>/<StreamId>
// Configures a stream of data to be measured.
type VStreamDef struct {
	// Human-readable, not necessarily unique description of the stream.
	Desc string
	// Sampling configuration.
	Sampler SamplerDef
	// Flag to start and stop sampling.
	Enabled bool
}

func (VStreamDef) __VDLReflect(struct {
	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.VStreamDef"`
}) {
}

func (m *VStreamDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	__VDLEnsureNativeBuilt_types()
	fieldsTarget1, err := t.StartFields(tt)
	if err != nil {
		return err
	}

	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Desc")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget3.FromString(string(m.Desc), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
			return err
		}
	}
	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("Sampler")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {

		if err := m.Sampler.FillVDLTarget(fieldTarget5, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
			return err
		}
	}
	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("Enabled")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget7.FromBool(bool(m.Enabled), vdl.BoolType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
			return err
		}
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}
	return nil
}

func (m *VStreamDef) MakeVDLTarget() vdl.Target {
	return &VStreamDefTarget{Value: m}
}

type VStreamDefTarget struct {
	Value *VStreamDef
	vdl.TargetBase
	vdl.FieldsTargetBase
}

func (t *VStreamDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef) {
		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef)
	}
	return t, nil
}
func (t *VStreamDefTarget) StartField(name string) (key, field vdl.Target, _ error) {
	switch name {
	case "Desc":
		val, err := &vdl.StringTarget{Value: &t.Value.Desc}, error(nil)
		return nil, val, err
	case "Sampler":
		val, err := &SamplerDefTarget{Value: &t.Value.Sampler}, error(nil)
		return nil, val, err
	case "Enabled":
		val, err := &vdl.BoolTarget{Value: &t.Value.Enabled}, error(nil)
		return nil, val, err
	default:
		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef)
	}
}
func (t *VStreamDefTarget) FinishField(_, _ vdl.Target) error {
	return nil
}
func (t *VStreamDefTarget) FinishFields(_ vdl.FieldsTarget) error {
	return nil
}

type SamplerDefTarget struct {
	Value *SamplerDef
	vdl.TargetBase
	vdl.FieldsTargetBase
}

func (t *SamplerDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef) {
		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef)
	}
	return t, nil
}
func (t *SamplerDefTarget) StartField(name string) (key, field vdl.Target, _ error) {
	switch name {
	case "Script":
		val, err := &vdl.StringTarget{Value: &t.Value.Script}, error(nil)
		return nil, val, err
	case "Start":
		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Start))
		return nil, val, err
	case "Interval":
		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Interval))
		return nil, val, err
	default:
		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef)
	}
}
func (t *SamplerDefTarget) FinishField(_, _ vdl.Target) error {
	return nil
}
func (t *SamplerDefTarget) FinishFields(_ vdl.FieldsTarget) error {
	return nil
}

type KStreamDef struct {
	DevId    string
	StreamId string
}

func (KStreamDef) __VDLReflect(struct {
	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.KStreamDef"`
}) {
}

func (m *KStreamDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef == nil || __VDLTypetypes3 == nil {
		panic("Initialization order error: types generated for FillVDLTarget not initialized. Consider moving caller to an init() block.")
	}
	fieldsTarget1, err := t.StartFields(tt)
	if err != nil {
		return err
	}

	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("DevId")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget3.FromString(string(m.DevId), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
			return err
		}
	}
	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("StreamId")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget5.FromString(string(m.StreamId), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
			return err
		}
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}
	return nil
}

func (m *KStreamDef) MakeVDLTarget() vdl.Target {
	return &KStreamDefTarget{Value: m}
}

type KStreamDefTarget struct {
	Value *KStreamDef
	vdl.TargetBase
	vdl.FieldsTargetBase
}

func (t *KStreamDefTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef) {
		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef)
	}
	return t, nil
}
func (t *KStreamDefTarget) StartField(name string) (key, field vdl.Target, _ error) {
	switch name {
	case "DevId":
		val, err := &vdl.StringTarget{Value: &t.Value.DevId}, error(nil)
		return nil, val, err
	case "StreamId":
		val, err := &vdl.StringTarget{Value: &t.Value.StreamId}, error(nil)
		return nil, val, err
	default:
		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef)
	}
}
func (t *KStreamDefTarget) FinishField(_, _ vdl.Target) error {
	return nil
}
func (t *KStreamDefTarget) FinishFields(_ vdl.FieldsTarget) error {
	return nil
}

// Sampling script and polling frequency.
type SamplerDef struct {
	// Shell script executed after every Interval, starting from Start.
	// It should output a single data point, if available. A non-zero exit
	// status or failure to parse the value will produce an error instead.
	Script   string
	Start    time.Time
	Interval time.Duration
}

func (SamplerDef) __VDLReflect(struct {
	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.SamplerDef"`
}) {
}

func (m *SamplerDef) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	__VDLEnsureNativeBuilt_types()
	fieldsTarget1, err := t.StartFields(tt)
	if err != nil {
		return err
	}

	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Script")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget3.FromString(string(m.Script), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
			return err
		}
	}
	var wireValue4 time_2.Time
	if err := time_2.TimeFromNative(&wireValue4, m.Start); err != nil {
		return err
	}

	keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Start")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {

		if err := wireValue4.FillVDLTarget(fieldTarget6, __VDLType_types_time_Time); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
			return err
		}
	}
	var wireValue7 time_2.Duration
	if err := time_2.DurationFromNative(&wireValue7, m.Interval); err != nil {
		return err
	}

	keyTarget8, fieldTarget9, err := fieldsTarget1.StartField("Interval")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {

		if err := wireValue7.FillVDLTarget(fieldTarget9, __VDLType_types_time_Duration); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget8, fieldTarget9); err != nil {
			return err
		}
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}
	return nil
}

func (m *SamplerDef) MakeVDLTarget() vdl.Target {
	return &SamplerDefTarget{Value: m}
}

// sdata : <DevId>/<StreamId>/<Timestamp>
// Measured data value or error.
type KDataPoint struct {
	DevId     string
	StreamId  string
	Timestamp time.Time
}

func (KDataPoint) __VDLReflect(struct {
	Name string `vdl:"v.io/x/sensorlog/internal/sbmodel.KDataPoint"`
}) {
}

func (m *KDataPoint) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	__VDLEnsureNativeBuilt_types()
	fieldsTarget1, err := t.StartFields(tt)
	if err != nil {
		return err
	}

	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("DevId")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget3.FromString(string(m.DevId), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
			return err
		}
	}
	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("StreamId")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {
		if err := fieldTarget5.FromString(string(m.StreamId), vdl.StringType); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
			return err
		}
	}
	var wireValue6 time_2.Time
	if err := time_2.TimeFromNative(&wireValue6, m.Timestamp); err != nil {
		return err
	}

	keyTarget7, fieldTarget8, err := fieldsTarget1.StartField("Timestamp")
	if err != vdl.ErrFieldNoExist && err != nil {
		return err
	}
	if err != vdl.ErrFieldNoExist {

		if err := wireValue6.FillVDLTarget(fieldTarget8, __VDLType_types_time_Time); err != nil {
			return err
		}
		if err := fieldsTarget1.FinishField(keyTarget7, fieldTarget8); err != nil {
			return err
		}
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}
	return nil
}

func (m *KDataPoint) MakeVDLTarget() vdl.Target {
	return &KDataPointTarget{Value: m}
}

type KDataPointTarget struct {
	Value *KDataPoint
	vdl.TargetBase
	vdl.FieldsTargetBase
}

func (t *KDataPointTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
	if !vdl.Compatible(tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint) {
		return nil, fmt.Errorf("type %v incompatible with %v", tt, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint)
	}
	return t, nil
}
func (t *KDataPointTarget) StartField(name string) (key, field vdl.Target, _ error) {
	switch name {
	case "DevId":
		val, err := &vdl.StringTarget{Value: &t.Value.DevId}, error(nil)
		return nil, val, err
	case "StreamId":
		val, err := &vdl.StringTarget{Value: &t.Value.StreamId}, error(nil)
		return nil, val, err
	case "Timestamp":
		val, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Timestamp))
		return nil, val, err
	default:
		return nil, nil, fmt.Errorf("field %s not in struct %v", name, __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint)
	}
}
func (t *KDataPointTarget) FinishField(_, _ vdl.Target) error {
	return nil
}
func (t *KDataPointTarget) FinishFields(_ vdl.FieldsTarget) error {
	return nil
}

type (
	// VDataPoint represents any single field of the VDataPoint union type.
	VDataPoint interface {
		// Index returns the field index.
		Index() int
		// Interface returns the field value as an interface.
		Interface() interface{}
		// Name returns the field name.
		Name() string
		// __VDLReflect describes the VDataPoint union type.
		__VDLReflect(__VDataPointReflect)
		FillVDLTarget(vdl.Target, *vdl.Type) error
	}
	// VDataPointValue represents field Value of the VDataPoint union type.
	VDataPointValue struct{ Value float64 }
	// VDataPointError represents field Error of the VDataPoint union type.
	VDataPointError struct{ Value string }
	// __VDataPointReflect describes the VDataPoint union type.
	__VDataPointReflect struct {
		Name  string `vdl:"v.io/x/sensorlog/internal/sbmodel.VDataPoint"`
		Type  VDataPoint
		Union struct {
			Value VDataPointValue
			Error VDataPointError
		}
	}
)

func (x VDataPointValue) Index() int                       { return 0 }
func (x VDataPointValue) Interface() interface{}           { return x.Value }
func (x VDataPointValue) Name() string                     { return "Value" }
func (x VDataPointValue) __VDLReflect(__VDataPointReflect) {}

func (m VDataPointValue) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	fieldsTarget1, err := t.StartFields(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDataPoint)
	if err != nil {
		return err
	}
	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Value")
	if err != nil {
		return err
	}
	if err := fieldTarget3.FromFloat(float64(m.Value), vdl.Float64Type); err != nil {
		return err
	}
	if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
		return err
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}

	return nil
}

func (m VDataPointValue) MakeVDLTarget() vdl.Target {
	return nil
}

func (x VDataPointError) Index() int                       { return 1 }
func (x VDataPointError) Interface() interface{}           { return x.Value }
func (x VDataPointError) Name() string                     { return "Error" }
func (x VDataPointError) __VDLReflect(__VDataPointReflect) {}

func (m VDataPointError) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
	fieldsTarget1, err := t.StartFields(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDataPoint)
	if err != nil {
		return err
	}
	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Error")
	if err != nil {
		return err
	}
	if err := fieldTarget3.FromString(string(m.Value), vdl.StringType); err != nil {
		return err
	}
	if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
		return err
	}
	if err := t.FinishFields(fieldsTarget1); err != nil {
		return err
	}

	return nil
}

func (m VDataPointError) MakeVDLTarget() vdl.Target {
	return nil
}

func init() {
	vdl.Register((*VDeviceCfg)(nil))
	vdl.Register((*KDeviceCfg)(nil))
	vdl.Register((*VStreamDef)(nil))
	vdl.Register((*KStreamDef)(nil))
	vdl.Register((*SamplerDef)(nil))
	vdl.Register((*KDataPoint)(nil))
	vdl.Register((*VDataPoint)(nil))
}

var __VDLTypetypes5 *vdl.Type

func __VDLTypetypes5_gen() *vdl.Type {
	__VDLTypetypes5Builder := vdl.TypeBuilder{}

	__VDLTypetypes51 := __VDLTypetypes5Builder.Optional()
	__VDLTypetypes52 := __VDLTypetypes5Builder.Struct()
	__VDLTypetypes53 := __VDLTypetypes5Builder.Named("v.io/x/sensorlog/internal/sbmodel.KDataPoint").AssignBase(__VDLTypetypes52)
	__VDLTypetypes54 := vdl.StringType
	__VDLTypetypes52.AppendField("DevId", __VDLTypetypes54)
	__VDLTypetypes52.AppendField("StreamId", __VDLTypetypes54)
	__VDLTypetypes55 := __VDLTypetypes5Builder.Struct()
	__VDLTypetypes56 := __VDLTypetypes5Builder.Named("time.Time").AssignBase(__VDLTypetypes55)
	__VDLTypetypes57 := vdl.Int64Type
	__VDLTypetypes55.AppendField("Seconds", __VDLTypetypes57)
	__VDLTypetypes58 := vdl.Int32Type
	__VDLTypetypes55.AppendField("Nanos", __VDLTypetypes58)
	__VDLTypetypes52.AppendField("Timestamp", __VDLTypetypes56)
	__VDLTypetypes51.AssignElem(__VDLTypetypes53)
	__VDLTypetypes5Builder.Build()
	__VDLTypetypes5v, err := __VDLTypetypes51.Built()
	if err != nil {
		panic(err)
	}
	return __VDLTypetypes5v
}
func init() {
	__VDLTypetypes5 = __VDLTypetypes5_gen()
}

var __VDLTypetypes1 *vdl.Type = vdl.TypeOf((*KDeviceCfg)(nil))
var __VDLTypetypes3 *vdl.Type = vdl.TypeOf((*KStreamDef)(nil))
var __VDLTypetypes4 *vdl.Type

func __VDLTypetypes4_gen() *vdl.Type {
	__VDLTypetypes4Builder := vdl.TypeBuilder{}

	__VDLTypetypes41 := __VDLTypetypes4Builder.Optional()
	__VDLTypetypes42 := __VDLTypetypes4Builder.Struct()
	__VDLTypetypes43 := __VDLTypetypes4Builder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLTypetypes42)
	__VDLTypetypes44 := vdl.StringType
	__VDLTypetypes42.AppendField("Script", __VDLTypetypes44)
	__VDLTypetypes45 := __VDLTypetypes4Builder.Struct()
	__VDLTypetypes46 := __VDLTypetypes4Builder.Named("time.Time").AssignBase(__VDLTypetypes45)
	__VDLTypetypes47 := vdl.Int64Type
	__VDLTypetypes45.AppendField("Seconds", __VDLTypetypes47)
	__VDLTypetypes48 := vdl.Int32Type
	__VDLTypetypes45.AppendField("Nanos", __VDLTypetypes48)
	__VDLTypetypes42.AppendField("Start", __VDLTypetypes46)
	__VDLTypetypes49 := __VDLTypetypes4Builder.Struct()
	__VDLTypetypes410 := __VDLTypetypes4Builder.Named("time.Duration").AssignBase(__VDLTypetypes49)
	__VDLTypetypes49.AppendField("Seconds", __VDLTypetypes47)
	__VDLTypetypes49.AppendField("Nanos", __VDLTypetypes48)
	__VDLTypetypes42.AppendField("Interval", __VDLTypetypes410)
	__VDLTypetypes41.AssignElem(__VDLTypetypes43)
	__VDLTypetypes4Builder.Build()
	__VDLTypetypes4v, err := __VDLTypetypes41.Built()
	if err != nil {
		panic(err)
	}
	return __VDLTypetypes4v
}
func init() {
	__VDLTypetypes4 = __VDLTypetypes4_gen()
}

var __VDLTypetypes0 *vdl.Type = vdl.TypeOf((*VDeviceCfg)(nil))
var __VDLTypetypes2 *vdl.Type

func __VDLTypetypes2_gen() *vdl.Type {
	__VDLTypetypes2Builder := vdl.TypeBuilder{}

	__VDLTypetypes21 := __VDLTypetypes2Builder.Optional()
	__VDLTypetypes22 := __VDLTypetypes2Builder.Struct()
	__VDLTypetypes23 := __VDLTypetypes2Builder.Named("v.io/x/sensorlog/internal/sbmodel.VStreamDef").AssignBase(__VDLTypetypes22)
	__VDLTypetypes24 := vdl.StringType
	__VDLTypetypes22.AppendField("Desc", __VDLTypetypes24)
	__VDLTypetypes25 := __VDLTypetypes2Builder.Struct()
	__VDLTypetypes26 := __VDLTypetypes2Builder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLTypetypes25)
	__VDLTypetypes25.AppendField("Script", __VDLTypetypes24)
	__VDLTypetypes27 := __VDLTypetypes2Builder.Struct()
	__VDLTypetypes28 := __VDLTypetypes2Builder.Named("time.Time").AssignBase(__VDLTypetypes27)
	__VDLTypetypes29 := vdl.Int64Type
	__VDLTypetypes27.AppendField("Seconds", __VDLTypetypes29)
	__VDLTypetypes210 := vdl.Int32Type
	__VDLTypetypes27.AppendField("Nanos", __VDLTypetypes210)
	__VDLTypetypes25.AppendField("Start", __VDLTypetypes28)
	__VDLTypetypes211 := __VDLTypetypes2Builder.Struct()
	__VDLTypetypes212 := __VDLTypetypes2Builder.Named("time.Duration").AssignBase(__VDLTypetypes211)
	__VDLTypetypes211.AppendField("Seconds", __VDLTypetypes29)
	__VDLTypetypes211.AppendField("Nanos", __VDLTypetypes210)
	__VDLTypetypes25.AppendField("Interval", __VDLTypetypes212)
	__VDLTypetypes22.AppendField("Sampler", __VDLTypetypes26)
	__VDLTypetypes213 := vdl.BoolType
	__VDLTypetypes22.AppendField("Enabled", __VDLTypetypes213)
	__VDLTypetypes21.AssignElem(__VDLTypetypes23)
	__VDLTypetypes2Builder.Build()
	__VDLTypetypes2v, err := __VDLTypetypes21.Built()
	if err != nil {
		panic(err)
	}
	return __VDLTypetypes2v
}
func init() {
	__VDLTypetypes2 = __VDLTypetypes2_gen()
}

var __VDLType_types_time_Duration *vdl.Type

func __VDLType_types_time_Duration_gen() *vdl.Type {
	__VDLType_types_time_DurationBuilder := vdl.TypeBuilder{}

	__VDLType_types_time_Duration1 := __VDLType_types_time_DurationBuilder.Struct()
	__VDLType_types_time_Duration2 := __VDLType_types_time_DurationBuilder.Named("time.Duration").AssignBase(__VDLType_types_time_Duration1)
	__VDLType_types_time_Duration3 := vdl.Int64Type
	__VDLType_types_time_Duration1.AppendField("Seconds", __VDLType_types_time_Duration3)
	__VDLType_types_time_Duration4 := vdl.Int32Type
	__VDLType_types_time_Duration1.AppendField("Nanos", __VDLType_types_time_Duration4)
	__VDLType_types_time_DurationBuilder.Build()
	__VDLType_types_time_Durationv, err := __VDLType_types_time_Duration2.Built()
	if err != nil {
		panic(err)
	}
	return __VDLType_types_time_Durationv
}
func init() {
	__VDLType_types_time_Duration = __VDLType_types_time_Duration_gen()
}

var __VDLType_types_time_Time *vdl.Type

func __VDLType_types_time_Time_gen() *vdl.Type {
	__VDLType_types_time_TimeBuilder := vdl.TypeBuilder{}

	__VDLType_types_time_Time1 := __VDLType_types_time_TimeBuilder.Struct()
	__VDLType_types_time_Time2 := __VDLType_types_time_TimeBuilder.Named("time.Time").AssignBase(__VDLType_types_time_Time1)
	__VDLType_types_time_Time3 := vdl.Int64Type
	__VDLType_types_time_Time1.AppendField("Seconds", __VDLType_types_time_Time3)
	__VDLType_types_time_Time4 := vdl.Int32Type
	__VDLType_types_time_Time1.AppendField("Nanos", __VDLType_types_time_Time4)
	__VDLType_types_time_TimeBuilder.Build()
	__VDLType_types_time_Timev, err := __VDLType_types_time_Time2.Built()
	if err != nil {
		panic(err)
	}
	return __VDLType_types_time_Timev
}
func init() {
	__VDLType_types_time_Time = __VDLType_types_time_Time_gen()
}

var __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint *vdl.Type

func __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint_gen() *vdl.Type {
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder := vdl.TypeBuilder{}

	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint1 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint2 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Named("v.io/x/sensorlog/internal/sbmodel.KDataPoint").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint1)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint3 := vdl.StringType
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint1.AppendField("DevId", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint3)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint1.AppendField("StreamId", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint3)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint4 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint5 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Named("time.Time").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint4)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint6 := vdl.Int64Type
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint4.AppendField("Seconds", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint6)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint7 := vdl.Int32Type
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint4.AppendField("Nanos", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint7)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint1.AppendField("Timestamp", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint5)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointBuilder.Build()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointv, err := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint2.Built()
	if err != nil {
		panic(err)
	}
	return __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPointv
}
func init() {
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint = __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint_gen()
}

var __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDeviceCfg *vdl.Type = vdl.TypeOf(KDeviceCfg{})
var __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KStreamDef *vdl.Type = vdl.TypeOf(KStreamDef{})
var __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef *vdl.Type

func __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef_gen() *vdl.Type {
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder := vdl.TypeBuilder{}

	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef1 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef2 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef1)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef3 := vdl.StringType
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef1.AppendField("Script", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef3)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef4 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef5 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Named("time.Time").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef4)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef6 := vdl.Int64Type
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef4.AppendField("Seconds", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef6)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef7 := vdl.Int32Type
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef4.AppendField("Nanos", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef7)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef1.AppendField("Start", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef5)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef8 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef9 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Named("time.Duration").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef8)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef8.AppendField("Seconds", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef6)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef8.AppendField("Nanos", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef7)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef1.AppendField("Interval", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef9)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefBuilder.Build()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefv, err := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef2.Built()
	if err != nil {
		panic(err)
	}
	return __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDefv
}
func init() {
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef = __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef_gen()
}

var __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDataPoint *vdl.Type = vdl.TypeOf(VDataPoint(VDataPointValue{float64(0)}))
var __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VDeviceCfg *vdl.Type = vdl.TypeOf(VDeviceCfg{})
var __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef *vdl.Type

func __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef_gen() *vdl.Type {
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder := vdl.TypeBuilder{}

	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef1 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef2 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("v.io/x/sensorlog/internal/sbmodel.VStreamDef").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef1)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef3 := vdl.StringType
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef1.AppendField("Desc", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef3)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef4 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef5 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("v.io/x/sensorlog/internal/sbmodel.SamplerDef").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef4)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef4.AppendField("Script", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef3)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef6 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef7 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("time.Time").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef6)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef8 := vdl.Int64Type
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef6.AppendField("Seconds", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef8)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef9 := vdl.Int32Type
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef6.AppendField("Nanos", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef9)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef4.AppendField("Start", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef7)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef10 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Struct()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef11 := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Named("time.Duration").AssignBase(__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef10)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef10.AppendField("Seconds", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef8)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef10.AppendField("Nanos", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef9)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef4.AppendField("Interval", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef11)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef1.AppendField("Sampler", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef5)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef12 := vdl.BoolType
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef1.AppendField("Enabled", __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef12)
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefBuilder.Build()
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefv, err := __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef2.Built()
	if err != nil {
		panic(err)
	}
	return __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDefv
}
func init() {
	__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef = __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef_gen()
}
func __VDLEnsureNativeBuilt_types() {
	if __VDLTypetypes5 == nil {
		__VDLTypetypes5 = __VDLTypetypes5_gen()
	}
	if __VDLTypetypes4 == nil {
		__VDLTypetypes4 = __VDLTypetypes4_gen()
	}
	if __VDLTypetypes2 == nil {
		__VDLTypetypes2 = __VDLTypetypes2_gen()
	}
	if __VDLType_types_time_Duration == nil {
		__VDLType_types_time_Duration = __VDLType_types_time_Duration_gen()
	}
	if __VDLType_types_time_Time == nil {
		__VDLType_types_time_Time = __VDLType_types_time_Time_gen()
	}
	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint == nil {
		__VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint = __VDLType_types_v_io_x_sensorlog_internal_sbmodel_KDataPoint_gen()
	}
	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef == nil {
		__VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef = __VDLType_types_v_io_x_sensorlog_internal_sbmodel_SamplerDef_gen()
	}
	if __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef == nil {
		__VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef = __VDLType_types_v_io_x_sensorlog_internal_sbmodel_VStreamDef_gen()
	}
}
