001package net.gdface.thrift;
002
003import static com.google.common.base.Preconditions.*;
004
005import java.util.Map;
006import com.facebook.swift.codec.metadata.ThriftStructMetadata;
007import com.google.common.base.Function;
008import com.google.common.base.Throwables;
009
010import static net.gdface.thrift.ThriftUtils.*;
011/**
012 * 有{@link com.facebook.swift.codec.ThriftStruct}注释的类型之间的转换
013 * @author guyadong
014 *
015 * @param <L> 
016 * @param <R>
017 */
018public class ThriftStructTransformer<L,R> implements Function<L,R>{
019        private final ThriftStructMetadata leftMetadata;
020        private final ThriftStructMetadata rightMetadata;
021        public ThriftStructTransformer(Class<L> left, Class<R> right) {
022                this.leftMetadata= CATALOG.getThriftStructMetadata(checkNotNull(left,"left is null"));
023                this.rightMetadata= CATALOG.getThriftStructMetadata(checkNotNull(right,"right is null"));
024        }
025        @Override
026        public R apply(L input) {
027                if(null == input){
028                        return null;
029                }
030                try {
031                        Map<Short, TypeValue> data = getFiledValues(input,leftMetadata);
032                        return constructStruct(data,rightMetadata);
033                } catch (Exception e) {
034                        Throwables.throwIfUnchecked(e);
035                        throw new RuntimeException(e);
036                }
037        }
038    @Override
039        public String toString() {
040                StringBuilder builder = new StringBuilder()
041                                .append("ThriftStructTransformer [leftClass=")
042                                .append(leftMetadata.getStructType())
043                                .append(", rightClass=")
044                                .append(rightMetadata.getStructType())
045                                .append("]");
046                return builder.toString();
047        }
048}