001package org.kernel.kmod;
002
003public class KmodImpl implements Kmod {
004        public static class Factory implements de.dentrassi.varlink.spi.Factory {
005                public @Override <T> T create(final de.dentrassi.varlink.internal.VarlinkImpl varlink, final Class<T> clazz,
006                                final de.dentrassi.varlink.spi.Connection connection) {
007                        return clazz.cast(new KmodImpl(connection, varlink));
008                }
009        }
010
011        private final de.dentrassi.varlink.spi.Connection connection;
012        private final de.dentrassi.varlink.internal.VarlinkImpl varlink;
013
014        private KmodImpl(final de.dentrassi.varlink.spi.Connection connection,
015                        final de.dentrassi.varlink.internal.VarlinkImpl varlink) {
016                this.connection = connection;
017                this.varlink = varlink;
018        }
019
020        public void checkError(final de.dentrassi.varlink.spi.CallResponse response) {
021                de.dentrassi.varlink.spi.Errors.checkErrors(response, this::mapError);
022        }
023
024        public java.lang.RuntimeException mapError(final java.lang.String error,
025                        final de.dentrassi.varlink.spi.CallResponse response) {
026                switch (error) {
027                case "org.kernel.kmod.UnknownModuleException":
028                        return new UnknownModuleException(
029                                        this.varlink.fromJson(UnknownModuleException.Parameters.class, response.getParameters()));
030                case "org.kernel.kmod.NoInfoAvailableException":
031                        return new NoInfoAvailableException(
032                                        this.varlink.fromJson(NoInfoAvailableException.Parameters.class, response.getParameters()));
033                case "org.kernel.kmod.InvalidParameterException":
034                        return new InvalidParameterException(
035                                        this.varlink.fromJson(InvalidParameterException.Parameters.class, response.getParameters()));
036                default:
037                        return null;
038                }
039        }
040
041        @Override
042        public Async async() {
043                return new Async() {
044                        public java.util.concurrent.CompletableFuture<ModuleInfo> info(final java.lang.String module) {
045                                return internalInfo(module);
046                        }
047
048                        public java.util.concurrent.CompletableFuture<java.util.List<LoadedModule>> list() {
049                                return internalList();
050                        }
051                };
052        }
053
054        protected java.util.concurrent.CompletableFuture<ModuleInfo> internalInfo(final java.lang.String module) {
055                java.util.Map<java.lang.String, java.lang.Object> parameters = new java.util.HashMap<>(1);
056                return this.connection.call(de.dentrassi.varlink.spi.CallRequest.of("org.kernel.kmod.Info", parameters))
057                                .thenApply(result -> {
058                                        checkError(result);
059                                        return this.varlink.fromJson(info_returnTypeToken, result.getFirstParameter());
060                                });
061        }
062
063        private final static java.lang.reflect.Type info_returnTypeToken = new com.google.gson.reflect.TypeToken<ModuleInfo>() {
064        }.getType();
065
066        protected java.util.concurrent.CompletableFuture<java.util.List<LoadedModule>> internalList() {
067                return this.connection.call(de.dentrassi.varlink.spi.CallRequest.of("org.kernel.kmod.List"))
068                                .thenApply(result -> {
069                                        checkError(result);
070                                        return this.varlink.fromJson(list_returnTypeToken, result.getFirstParameter());
071                                });
072        }
073
074        private final static java.lang.reflect.Type list_returnTypeToken = new com.google.gson.reflect.TypeToken<java.util.List<LoadedModule>>() {
075        }.getType();
076}