// 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: browspr.vdl

package browspr

import (
	// VDL system imports
	"v.io/v23/vdl"

	// VDL user imports
	"v.io/x/ref/services/identity"
	"v.io/x/ref/services/wspr/internal/account"
)

type StartMessage struct {
	CleanupBlessings      bool
	Identityd             string
	IdentitydBlessingRoot identity.BlessingRootResponse
	Proxy                 string
	NamespaceRoot         string
	LogLevel              int32
	LogModule             string
}

func (StartMessage) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/wspr/internal/browspr.StartMessage"`
}) {
}

type AssociateAccountMessage struct {
	Account string
	Origin  string
	Caveats []account.Caveat
}

func (AssociateAccountMessage) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/wspr/internal/browspr.AssociateAccountMessage"`
}) {
}

type CreateAccountMessage struct {
	Token string
}

func (CreateAccountMessage) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/wspr/internal/browspr.CreateAccountMessage"`
}) {
}

type CleanupMessage struct {
	InstanceId int32
}

func (CleanupMessage) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/wspr/internal/browspr.CleanupMessage"`
}) {
}

type OriginHasAccountMessage struct {
	Origin string
}

func (OriginHasAccountMessage) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/wspr/internal/browspr.OriginHasAccountMessage"`
}) {
}

type GetAccountsMessage struct {
}

func (GetAccountsMessage) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/wspr/internal/browspr.GetAccountsMessage"`
}) {
}

type CreateInstanceMessage struct {
	InstanceId     int32
	Origin         string
	NamespaceRoots []string
	Proxy          string
}

func (CreateInstanceMessage) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/services/wspr/internal/browspr.CreateInstanceMessage"`
}) {
}

func init() {
	vdl.Register((*StartMessage)(nil))
	vdl.Register((*AssociateAccountMessage)(nil))
	vdl.Register((*CreateAccountMessage)(nil))
	vdl.Register((*CleanupMessage)(nil))
	vdl.Register((*OriginHasAccountMessage)(nil))
	vdl.Register((*GetAccountsMessage)(nil))
	vdl.Register((*CreateInstanceMessage)(nil))
}
