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