// Java class go.interfaces.Interfaces is a proxy for talking to a Go program.
//   gobind -lang=java interfaces
//
// File is generated by gobind. Do not edit.
package go.interfaces;

import go.Seq;

public abstract class Interfaces {
    private Interfaces() {} // uninstantiable
    
    public static int Add3(I r) {
        go.Seq _in = null;
        go.Seq _out = null;
        _out = new go.Seq();
        int _result;
        _in = new go.Seq();
        _in.writeRef(r.ref());
        Seq.send(DESCRIPTOR, CALL_Add3, _in, _out);
        _result = _out.readInt32();
        return _result;
    }
    
    public static void CallErr(Error e) throws Exception {
        go.Seq _in = null;
        go.Seq _out = null;
        _out = new go.Seq();
        _in = new go.Seq();
        _in.writeRef(e.ref());
        Seq.send(DESCRIPTOR, CALL_CallErr, _in, _out);
        String _err = _out.readString();
        if (_err != null && !_err.isEmpty()) {
            throw new Exception(_err);
        }
    }
    
    public interface Error extends go.Seq.Object {
        public void Err() throws Exception;
        
        public static abstract class Stub implements Error {
            static final String DESCRIPTOR = "go.interfaces.Error";
            
            private final go.Seq.Ref ref;
            public Stub() {
                ref = go.Seq.createRef(this);
            }
            
            public go.Seq.Ref ref() { return ref; }
            
            public void call(int code, go.Seq in, go.Seq out) {
                switch (code) {
                case Proxy.CALL_Err: {
                    try {
                        this.Err();
                        out.writeString(null);
                    } catch (Exception e) {
                        out.writeString(e.getMessage());
                    }
                    return;
                }
                default:
                    throw new RuntimeException("unknown code: "+ code);
                }
            }
        }
        
        static final class Proxy implements Error {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public void Err() throws Exception {
                go.Seq _in = null;
                go.Seq _out = null;
                _out = new go.Seq();
                _in = new go.Seq();
                _in.writeRef(ref);
                Seq.send(DESCRIPTOR, CALL_Err, _in, _out);
                String _err = _out.readString();
                if (_err != null && !_err.isEmpty()) {
                    throw new Exception(_err);
                }
            }
            
            static final int CALL_Err = 0x10a;
        }
    }
    
    public interface I extends go.Seq.Object {
        public int Rand();
        
        public static abstract class Stub implements I {
            static final String DESCRIPTOR = "go.interfaces.I";
            
            private final go.Seq.Ref ref;
            public Stub() {
                ref = go.Seq.createRef(this);
            }
            
            public go.Seq.Ref ref() { return ref; }
            
            public void call(int code, go.Seq in, go.Seq out) {
                switch (code) {
                case Proxy.CALL_Rand: {
                    int result = this.Rand();
                    out.writeInt32(result);
                    return;
                }
                default:
                    throw new RuntimeException("unknown code: "+ code);
                }
            }
        }
        
        static final class Proxy implements I {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public int Rand() {
                go.Seq _in = null;
                go.Seq _out = null;
                _out = new go.Seq();
                int _result;
                _in = new go.Seq();
                _in.writeRef(ref);
                Seq.send(DESCRIPTOR, CALL_Rand, _in, _out);
                _result = _out.readInt32();
                return _result;
            }
            
            static final int CALL_Rand = 0x10a;
        }
    }
    
    public interface I1 extends go.Seq.Object {
        public void J();
        
        static final class Proxy implements I1 {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public void J() {
                go.Seq _in = null;
                go.Seq _out = null;
                _in = new go.Seq();
                _in.writeRef(ref);
                Seq.send(DESCRIPTOR, CALL_J, _in, _out);
            }
            
            static final int CALL_J = 0x10a;
        }
    }
    
    public interface I2 extends go.Seq.Object {
        public void G();
        
        static final class Proxy implements I2 {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public void G() {
                go.Seq _in = null;
                go.Seq _out = null;
                _in = new go.Seq();
                _in.writeRef(ref);
                Seq.send(DESCRIPTOR, CALL_G, _in, _out);
            }
            
            static final int CALL_G = 0x10a;
        }
    }
    
    public interface I3 extends go.Seq.Object {
        public I1 F();
        
        public static abstract class Stub implements I3 {
            static final String DESCRIPTOR = "go.interfaces.I3";
            
            private final go.Seq.Ref ref;
            public Stub() {
                ref = go.Seq.createRef(this);
            }
            
            public go.Seq.Ref ref() { return ref; }
            
            public void call(int code, go.Seq in, go.Seq out) {
                switch (code) {
                case Proxy.CALL_F: {
                    I1 result = this.F();
                    out.writeRef(result.ref());
                    return;
                }
                default:
                    throw new RuntimeException("unknown code: "+ code);
                }
            }
        }
        
        static final class Proxy implements I3 {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public I1 F() {
                go.Seq _in = null;
                go.Seq _out = null;
                _out = new go.Seq();
                I1 _result;
                _in = new go.Seq();
                _in.writeRef(ref);
                Seq.send(DESCRIPTOR, CALL_F, _in, _out);
                _result = new I1.Proxy(_out.readRef());
                return _result;
            }
            
            static final int CALL_F = 0x10a;
        }
    }
    
    public static I Seven() {
        go.Seq _in = null;
        go.Seq _out = null;
        _out = new go.Seq();
        I _result;
        Seq.send(DESCRIPTOR, CALL_Seven, _in, _out);
        _result = new I.Proxy(_out.readRef());
        return _result;
    }
    
    public interface WithParam extends go.Seq.Object {
        public void HasParam(boolean p0);
        
        public static abstract class Stub implements WithParam {
            static final String DESCRIPTOR = "go.interfaces.WithParam";
            
            private final go.Seq.Ref ref;
            public Stub() {
                ref = go.Seq.createRef(this);
            }
            
            public go.Seq.Ref ref() { return ref; }
            
            public void call(int code, go.Seq in, go.Seq out) {
                switch (code) {
                case Proxy.CALL_HasParam: {
                    boolean param_p0;
                    param_p0 = in.readBool();
                    this.HasParam(param_p0);
                    return;
                }
                default:
                    throw new RuntimeException("unknown code: "+ code);
                }
            }
        }
        
        static final class Proxy implements WithParam {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public void HasParam(boolean p0) {
                go.Seq _in = null;
                go.Seq _out = null;
                _in = new go.Seq();
                _in.writeRef(ref);
                _in.writeBool(p0);
                Seq.send(DESCRIPTOR, CALL_HasParam, _in, _out);
            }
            
            static final int CALL_HasParam = 0x10a;
        }
    }
    
    private static final int CALL_Add3 = 1;
    private static final int CALL_CallErr = 2;
    private static final int CALL_Seven = 3;
    private static final String DESCRIPTOR = "interfaces";
}
