// Package main is an autogenerated binder stub for package issue12403.
//   gobind -lang=go issue12403
//
// File is generated by gobind. Do not edit.
package main

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

*/
import "C"

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

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

//export proxyissue12403_Parsable_FromJSON
func proxyissue12403_Parsable_FromJSON(refnum C.int32_t, param_jstr C.nstring) C.nstring {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(issue12403.Parsable)
	_param_jstr := decodeString(param_jstr)
	res_0 := v.FromJSON(_param_jstr)
	_res_0 := encodeString(res_0)
	return _res_0
}

//export proxyissue12403_Parsable_ToJSON
func proxyissue12403_Parsable_ToJSON(refnum C.int32_t) (C.nstring, C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(issue12403.Parsable)
	res_0, res_1 := v.ToJSON()
	_res_0 := encodeString(res_0)
	var _res_1 C.int32_t = _seq.NullRefNum
	if res_1 != nil {
		_res_1 = C.int32_t(_seq.ToRefNum(res_1))
	}
	return _res_0, _res_1
}

type proxyissue12403_Parsable _seq.Ref

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

func (p *proxyissue12403_Parsable) FromJSON(param_jstr string) string {
	_param_jstr := encodeString(param_jstr)
	res := C.cproxyissue12403_Parsable_FromJSON(C.int32_t(p.Bind_proxy_refnum__()), _param_jstr)
	_res := decodeString(res)
	return _res
}

func (p *proxyissue12403_Parsable) ToJSON() (string, error) {
	res := C.cproxyissue12403_Parsable_ToJSON(C.int32_t(p.Bind_proxy_refnum__()))
	res_0 := decodeString(res.r0)
	var res_1 error
	res_1_ref := _seq.FromRefNum(int32(res.r1))
	if res_1_ref != nil {
		if res.r1 < 0 { // go object
			res_1 = res_1_ref.Get().(error)
		} else { // foreign object
			res_1 = (*proxy_error)(res_1_ref)
		}
	}
	return res_0, res_1
}
