content: /*
   * Created by LuaView.
   * Copyright (c) 2017, Alibaba Group. All rights reserved.
   *
   * This source code is licensed under the MIT.
   * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
   */
  
  package com.taobao.luaview.fun.mapper.kit;
  
  import com.taobao.luaview.fun.base.BaseMethodMapper;
  import com.taobao.luaview.fun.mapper.LuaViewLib;
  import com.taobao.luaview.userdata.kit.UDData;
  
  import org.luaj.vm2.LuaValue;
  import org.luaj.vm2.Varargs;
  
  import java.util.List;
  
  /**
   * Data 接口封装，二进制数据处理
   *
   * @author song
   * @date 15/8/21
   */
  @LuaViewLib(revisions = {"20170306已对标"})
  public class DataMethodMapper<U extends UDData> extends BaseMethodMapper<U> {
      private static final String TAG = "DataMethodMapper";
  
      private static final String[] sMethods = new String[]{
              "append",//0
              "toString",//1
              "toJson",//2
              "toTable",//3
      };
  
      @Override
      public List<String> getAllFunctionNames() {
          return mergeFunctionNames(TAG, super.getAllFunctionNames(), sMethods);
      }
  
      @Override
      public Varargs invoke(int code, U target, Varargs varargs) {
          final int optcode = code - super.getAllFunctionNames().size();
          switch (optcode){
              case 0:
                  return append(target, varargs);
              case 1:
                  return toString(target, varargs);
              case 2:
                  return toJson(target, varargs);
              case 3:
                  return toTable(target, varargs);
          }
          return super.invoke(code, target, varargs);
      }
  
      //--------------------------------------- API --------------------------------------------------
  
      /**
       * 新增一部分数据，防止新建一个对象
       *
       * @param data
       * @param varargs
       * @return
       */
      public LuaValue append(U data, Varargs varargs) {
          return data.append(varargs.arg(2));
      }
  
  
      /**
       * 将二进制数据转成String，使用给定的编码，默认utf-8
       *
       * @param data
       * @param varargs
       * @return
       */
      public LuaValue toString(U data, Varargs varargs) {
          final String encode = varargs.optjstring(2, UDData.DEFAULT_ENCODE);
          return valueOf(data.toString(encode));
      }
  
      /**
       * 将二进制数据转成Json，使用给定的编码，默认utf-8
       *
       * @param data
       * @param varargs
       * @return
       */
      public LuaValue toJson(U data, Varargs varargs) {
          final String encode = varargs.optjstring(2, UDData.DEFAULT_ENCODE);
          final String json = data.toJson(encode);
          return json != null ? valueOf(json) : NIL;
      }
  
      /**
       * 将二进制数据转成table，使用给定的编码，默认utf-8
       *
       * @param data
       * @param varargs
       * @return
       */
      public LuaValue toTable(U data, Varargs varargs) {
          final String encode = varargs.optjstring(2, UDData.DEFAULT_ENCODE);
          return data.toTable(encode);
      }
  }
  