001/*******************************************************************************
002 * Copyright (c) 2017, 2018 Red Hat Inc
003 * All rights reserved. This program and the accompanying materials
004 * are made available under the terms of the Eclipse Public License v1.0
005 * which accompanies this distribution, and is available at
006 * http://www.eclipse.org/legal/epl-v10.html
007 *
008 * Contributors:
009 *     Jens Reimann - initial API and implementation
010 *******************************************************************************/
011package org.varlink;
012
013import static de.dentrassi.varlink.spi.CallRequest.of;
014import static de.dentrassi.varlink.spi.Errors.check;
015import static java.util.Collections.singletonMap;
016
017import java.util.concurrent.CompletableFuture;
018
019import de.dentrassi.varlink.internal.VarlinkImpl;
020import de.dentrassi.varlink.spi.Connection;
021
022public class ResolverImpl implements Resolver {
023
024    public static class Factory implements de.dentrassi.varlink.spi.Factory {
025
026        @Override
027        public <T> T create(final VarlinkImpl varlink, final Class<T> clazz, final Connection connection) {
028            return clazz.cast(new ResolverImpl(varlink, connection));
029        }
030
031    }
032
033    private final VarlinkImpl varlink;
034
035    private final Connection connection;
036
037    private ResolverImpl(final VarlinkImpl varlink, final Connection connection) {
038        this.varlink = varlink;
039        this.connection = connection;
040    }
041
042    @Override
043    public Async async() {
044        return new Async() {
045
046            @Override
047            public CompletableFuture<String> resolve(final String _interface) {
048                return executeResolve(_interface);
049            }
050        };
051    }
052
053    protected CompletableFuture<String> executeResolve(final String _interface) {
054        return this.connection
055                .call(
056                        of(
057                                "org.varlink.resolver.Resolve",
058                                singletonMap("interface", _interface)))
059
060                .thenApply(result -> {
061
062                    check(result);
063
064                    return this.varlink.fromJson(String.class, result.getFirstParameter());
065                });
066    }
067
068}