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.microsoft.thrifty.Struct;
010
011import static net.gdface.thrift.ThriftUtils.*;
012/**
013 * 有{@link com.facebook.swift.codec.ThriftStruct}注释的类型之间的转换
014 * @author guyadong
015 *
016 * @param <L> 
017 * @param <R>
018 */
019public class Swift2ThriftyStructTransformer<L,R extends Struct> implements Function<L,R>{
020        private final ThriftStructMetadata leftMetadata;
021        private final ThriftyStructMetadata rightMetadata;
022        public Swift2ThriftyStructTransformer(Class<L> left, Class<R> right) {
023                this.leftMetadata = CATALOG.getThriftStructMetadata(checkNotNull(left,"left is null"));
024                this.rightMetadata = STRUCTS_CACHE.getUnchecked(checkNotNull(right,"right is null"));
025        }
026        @Override
027        public R apply(L input) {
028                if(null == input){
029                        return null;
030                }
031                Map<String, TypeValue> data = getFieldValues(input,leftMetadata);
032                return rightMetadata.constructStruct(data);
033        }
034    @Override
035        public String toString() {
036                StringBuilder builder = new StringBuilder()
037                                .append("Swift2ThriftyStructTransformer [leftClass=")
038                                .append(leftMetadata.getStructType())
039                                .append(", rightClass=")
040                                .append(rightMetadata.getStructType())
041                                .append("]");
042                return builder.toString();
043        }
044}