// 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.
// Package: watchable

package watchable

import (
	"fmt"
	"v.io/v23/vdl"
	"v.io/x/ref/services/syncbase/server/interfaces"
)

var _ = __VDLInit() // Must be first; see __VDLInit comments for details.

//////////////////////////////////////////////////
// Type definitions

// SyncgroupOp represents a change in the set of prefixes that should be tracked
// by sync, i.e. the union of prefix sets across all syncgroups. Note that an
// individual syncgroup's prefixes cannot be changed; this record type is used
// to track changes due to syncgroup create/join/leave/destroy.
type SyncgroupOp struct {
	SgId     interfaces.GroupId
	Prefixes []string
	Remove   bool
}

func (SyncgroupOp) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/syncbase/watchable.SyncgroupOp"`
}) {
}

func (x SyncgroupOp) VDLIsZero() bool {
	if x.SgId != "" {
		return false
	}
	if len(x.Prefixes) != 0 {
		return false
	}
	if x.Remove {
		return false
	}
	return true
}

func (x SyncgroupOp) VDLWrite(enc vdl.Encoder) error {
	if err := enc.StartValue(__VDLType_struct_1); err != nil {
		return err
	}
	if x.SgId != "" {
		if err := enc.NextFieldValueString("SgId", __VDLType_string_2, string(x.SgId)); err != nil {
			return err
		}
	}
	if len(x.Prefixes) != 0 {
		if err := enc.NextField("Prefixes"); err != nil {
			return err
		}
		if err := __VDLWriteAnon_list_1(enc, x.Prefixes); err != nil {
			return err
		}
	}
	if x.Remove {
		if err := enc.NextFieldValueBool("Remove", vdl.BoolType, x.Remove); err != nil {
			return err
		}
	}
	if err := enc.NextField(""); err != nil {
		return err
	}
	return enc.FinishValue()
}

func __VDLWriteAnon_list_1(enc vdl.Encoder, x []string) error {
	if err := enc.StartValue(__VDLType_list_3); err != nil {
		return err
	}
	if err := enc.SetLenHint(len(x)); err != nil {
		return err
	}
	for _, elem := range x {
		if err := enc.NextEntryValueString(vdl.StringType, elem); err != nil {
			return err
		}
	}
	if err := enc.NextEntry(true); err != nil {
		return err
	}
	return enc.FinishValue()
}

func (x *SyncgroupOp) VDLRead(dec vdl.Decoder) error {
	*x = SyncgroupOp{}
	if err := dec.StartValue(__VDLType_struct_1); err != nil {
		return err
	}
	for {
		f, err := dec.NextField()
		if err != nil {
			return err
		}
		switch f {
		case "":
			return dec.FinishValue()
		case "SgId":
			switch value, err := dec.ReadValueString(); {
			case err != nil:
				return err
			default:
				x.SgId = interfaces.GroupId(value)
			}
		case "Prefixes":
			if err := __VDLReadAnon_list_1(dec, &x.Prefixes); err != nil {
				return err
			}
		case "Remove":
			switch value, err := dec.ReadValueBool(); {
			case err != nil:
				return err
			default:
				x.Remove = value
			}
		default:
			if err := dec.SkipValue(); err != nil {
				return err
			}
		}
	}
}

func __VDLReadAnon_list_1(dec vdl.Decoder, x *[]string) error {
	if err := dec.StartValue(__VDLType_list_3); err != nil {
		return err
	}
	if len := dec.LenHint(); len > 0 {
		*x = make([]string, 0, len)
	} else {
		*x = nil
	}
	for {
		switch done, elem, err := dec.NextEntryValueString(); {
		case err != nil:
			return err
		case done:
			return dec.FinishValue()
		default:
			*x = append(*x, elem)
		}
	}
}

// SyncSnapshotOp represents a snapshot operation when creating and joining a
// syncgroup. The sync watcher needs to get a snapshot of the Database at the
// point of creating/joining a syncgroup. A SyncSnapshotOp entry is written to
// the log for each Database key that falls within the syncgroup prefixes. This
// allows sync to initialize its metadata at the correct versions of the objects
// when they become syncable. These log entries should be filtered by the
// client-facing Watch interface because the user data did not actually change.
type SyncSnapshotOp struct {
	Key     []byte
	Version []byte
}

func (SyncSnapshotOp) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/syncbase/watchable.SyncSnapshotOp"`
}) {
}

func (x SyncSnapshotOp) VDLIsZero() bool {
	if len(x.Key) != 0 {
		return false
	}
	if len(x.Version) != 0 {
		return false
	}
	return true
}

func (x SyncSnapshotOp) VDLWrite(enc vdl.Encoder) error {
	if err := enc.StartValue(__VDLType_struct_4); err != nil {
		return err
	}
	if len(x.Key) != 0 {
		if err := enc.NextFieldValueBytes("Key", __VDLType_list_5, x.Key); err != nil {
			return err
		}
	}
	if len(x.Version) != 0 {
		if err := enc.NextFieldValueBytes("Version", __VDLType_list_5, x.Version); err != nil {
			return err
		}
	}
	if err := enc.NextField(""); err != nil {
		return err
	}
	return enc.FinishValue()
}

func (x *SyncSnapshotOp) VDLRead(dec vdl.Decoder) error {
	*x = SyncSnapshotOp{}
	if err := dec.StartValue(__VDLType_struct_4); err != nil {
		return err
	}
	for {
		f, err := dec.NextField()
		if err != nil {
			return err
		}
		switch f {
		case "":
			return dec.FinishValue()
		case "Key":
			if err := dec.ReadValueBytes(-1, &x.Key); err != nil {
				return err
			}
		case "Version":
			if err := dec.ReadValueBytes(-1, &x.Version); err != nil {
				return err
			}
		default:
			if err := dec.SkipValue(); err != nil {
				return err
			}
		}
	}
}

// StateChange represents the set of types of state change requests possible.
type StateChange int

const (
	StateChangePauseSync StateChange = iota
	StateChangeResumeSync
)

// StateChangeAll holds all labels for StateChange.
var StateChangeAll = [...]StateChange{StateChangePauseSync, StateChangeResumeSync}

// StateChangeFromString creates a StateChange from a string label.
func StateChangeFromString(label string) (x StateChange, err error) {
	err = x.Set(label)
	return
}

// Set assigns label to x.
func (x *StateChange) Set(label string) error {
	switch label {
	case "PauseSync", "pausesync":
		*x = StateChangePauseSync
		return nil
	case "ResumeSync", "resumesync":
		*x = StateChangeResumeSync
		return nil
	}
	*x = -1
	return fmt.Errorf("unknown label %q in watchable.StateChange", label)
}

// String returns the string label of x.
func (x StateChange) String() string {
	switch x {
	case StateChangePauseSync:
		return "PauseSync"
	case StateChangeResumeSync:
		return "ResumeSync"
	}
	return ""
}

func (StateChange) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/syncbase/watchable.StateChange"`
	Enum struct{ PauseSync, ResumeSync string }
}) {
}

func (x StateChange) VDLIsZero() bool {
	return x == StateChangePauseSync
}

func (x StateChange) VDLWrite(enc vdl.Encoder) error {
	if err := enc.WriteValueString(__VDLType_enum_6, x.String()); err != nil {
		return err
	}
	return nil
}

func (x *StateChange) VDLRead(dec vdl.Decoder) error {
	switch value, err := dec.ReadValueString(); {
	case err != nil:
		return err
	default:
		if err := x.Set(value); err != nil {
			return err
		}
	}
	return nil
}

// DbStateChangeRequestOp represents a database state change request.
// Specifically there are two events that create this op:
// PauseSync, indicating a client request to pause sync on this db.
// ResumeSync, indicating a client request to resume sync on this db.
// Client watcher will ignore this op.
type DbStateChangeRequestOp struct {
	RequestType StateChange
}

func (DbStateChangeRequestOp) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/syncbase/watchable.DbStateChangeRequestOp"`
}) {
}

func (x DbStateChangeRequestOp) VDLIsZero() bool {
	return x == DbStateChangeRequestOp{}
}

func (x DbStateChangeRequestOp) VDLWrite(enc vdl.Encoder) error {
	if err := enc.StartValue(__VDLType_struct_7); err != nil {
		return err
	}
	if x.RequestType != StateChangePauseSync {
		if err := enc.NextFieldValueString("RequestType", __VDLType_enum_6, x.RequestType.String()); err != nil {
			return err
		}
	}
	if err := enc.NextField(""); err != nil {
		return err
	}
	return enc.FinishValue()
}

func (x *DbStateChangeRequestOp) VDLRead(dec vdl.Decoder) error {
	*x = DbStateChangeRequestOp{}
	if err := dec.StartValue(__VDLType_struct_7); err != nil {
		return err
	}
	for {
		f, err := dec.NextField()
		if err != nil {
			return err
		}
		switch f {
		case "":
			return dec.FinishValue()
		case "RequestType":
			switch value, err := dec.ReadValueString(); {
			case err != nil:
				return err
			default:
				if err := x.RequestType.Set(value); err != nil {
					return err
				}
			}
		default:
			if err := dec.SkipValue(); err != nil {
				return err
			}
		}
	}
}

// Hold type definitions in package-level variables, for better performance.
var (
	__VDLType_struct_1 *vdl.Type
	__VDLType_string_2 *vdl.Type
	__VDLType_list_3   *vdl.Type
	__VDLType_struct_4 *vdl.Type
	__VDLType_list_5   *vdl.Type
	__VDLType_enum_6   *vdl.Type
	__VDLType_struct_7 *vdl.Type
)

var __VDLInitCalled bool

// __VDLInit performs vdl initialization.  It is safe to call multiple times.
// If you have an init ordering issue, just insert the following line verbatim
// into your source files in this package, right after the "package foo" clause:
//
//    var _ = __VDLInit()
//
// The purpose of this function is to ensure that vdl initialization occurs in
// the right order, and very early in the init sequence.  In particular, vdl
// registration and package variable initialization needs to occur before
// functions like vdl.TypeOf will work properly.
//
// This function returns a dummy value, so that it can be used to initialize the
// first var in the file, to take advantage of Go's defined init order.
func __VDLInit() struct{} {
	if __VDLInitCalled {
		return struct{}{}
	}
	__VDLInitCalled = true

	// Register types.
	vdl.Register((*SyncgroupOp)(nil))
	vdl.Register((*SyncSnapshotOp)(nil))
	vdl.Register((*StateChange)(nil))
	vdl.Register((*DbStateChangeRequestOp)(nil))

	// Initialize type definitions.
	__VDLType_struct_1 = vdl.TypeOf((*SyncgroupOp)(nil)).Elem()
	__VDLType_string_2 = vdl.TypeOf((*interfaces.GroupId)(nil))
	__VDLType_list_3 = vdl.TypeOf((*[]string)(nil))
	__VDLType_struct_4 = vdl.TypeOf((*SyncSnapshotOp)(nil)).Elem()
	__VDLType_list_5 = vdl.TypeOf((*[]byte)(nil))
	__VDLType_enum_6 = vdl.TypeOf((*StateChange)(nil))
	__VDLType_struct_7 = vdl.TypeOf((*DbStateChangeRequestOp)(nil)).Elem()

	return struct{}{}
}
