// Code generated by gobind. DO NOT EDIT.

// Package main is an autogenerated binder stub for package universe.
//
//   autogenerated by gobind -lang=go
package main

/*
#include <stdlib.h>
#include <stdint.h>
#include "seq.h"
#include "universe.h"

*/
import "C"

import (
	_seq "golang.org/x/mobile/bind/seq"
)

// suppress the error if seq ends up unused
var _ = _seq.FromRefNum

//export proxy_error_Error
func proxy_error_Error(refnum C.int32_t) C.nstring {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(error)
	res_0 := v.Error()
	_res_0 := encodeString(res_0)
	return _res_0
}

type proxy_error _seq.Ref

func (p *proxy_error) Bind_proxy_refnum__() int32 {
	return (*_seq.Ref)(p).Bind_IncNum()
}

func (p *proxy_error) Error() string {
	res := C.cproxy_error_Error(C.int32_t(p.Bind_proxy_refnum__()))
	_res := decodeString(res)
	return _res
}
