// Code generated by gobind. DO NOT EDIT.

// Package main is an autogenerated binder stub for package issue12403.
//
//   autogenerated by gobind -lang=go issue12403
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
}
