// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

package transitivedependenciescompose

import (
	testbottom "fidl/test/bottom"
	_bindings "syscall/zx/fidl"
)

const (
	TopGetFooOrdinal uint64 = 0x245770d9d719c667
)

type TopWithCtxInterface _bindings.ChannelProxy

func (p *TopWithCtxInterface) GetFoo(ctx_ _bindings.Context) (testbottom.Foo, error) {
	var req_ _bindings.Message
	resp_ := &testbottom.BottomGetFooResponse{}
	err_ := ((*_bindings.ChannelProxy)(p)).Call(TopGetFooOrdinal, req_, resp_)
	return (*resp_).Foo, err_
}

type TopWithCtx interface {
	GetFoo(ctx_ _bindings.Context) (testbottom.Foo, error)
}
type TopWithCtxInterfaceRequest _bindings.InterfaceRequest

func NewTopWithCtxInterfaceRequest() (TopWithCtxInterfaceRequest, *TopWithCtxInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return TopWithCtxInterfaceRequest(req), (*TopWithCtxInterface)(cli), err
}

type TopWithCtxStub struct {
	Impl TopWithCtx
}

func (s_ *TopWithCtxStub) Dispatch(args_ _bindings.DispatchArgs) (_bindings.Message, bool, error) {
	switch args_.Ordinal {
	case TopGetFooOrdinal:
		foo, err_ := s_.Impl.GetFoo(args_.Ctx)
		out_ := &testbottom.BottomGetFooResponse{Foo: foo}
		return out_, true, err_
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type TopEventProxy _bindings.ChannelProxy
