// 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 = new go.Seq();
        go.Seq _out = new go.Seq();
        int _result;
        _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 = new go.Seq();
        go.Seq _out = new go.Seq();
        _in.writeRef(e.ref());
        Seq.send(DESCRIPTOR, CALL_CallErr, _in, _out);
        String _err = _out.readString();
        if (_err != null) {
            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 = new go.Seq();
                go.Seq _out = new go.Seq();
                _in.writeRef(ref);
                Seq.send(DESCRIPTOR, CALL_Err, _in, _out);
                String _err = _out.readString();
                if (_err != null) {
                    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 = new go.Seq();
                go.Seq _out = new go.Seq();
                int _result;
                _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 = new go.Seq();
                go.Seq _out = 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 = new go.Seq();
                go.Seq _out = 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 = new go.Seq();
                go.Seq _out = new go.Seq();
                I1 _result;
                _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 = new go.Seq();
        go.Seq _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 = new go.Seq();
                go.Seq _out = 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";
}
