# Source: Fields.js

    /**
     * @content 字段功能组件
     * @author  2019-09-16
     */
    import { NativeModules } from 'react-native';

    let FLDS = NativeModules.JSFields;

    import Field from './Field.js';

    /**
     * @class Fields
     * @description 扩展字段头
     */
    export default class Fields {
      /**
       * 构造一个新的 Fields 对象。
       * @memberOf Fields
       * @returns {Promise.<Fields>}
       */
      async createObj() {
        try {
          var { FieldsId } = await FLDS.createObj();
          var fields = new Fields();
          fields._MGFieldsId = FieldsId;
          return fields;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 根据索引取字段
       * @memberOf Fields
       * @param index 索引
       * @return {Promise.<Field>}字段对象
       */
      async getField(index) {
        try {
          let { FieldId } = await FLDS.getField(this._MGFieldsId, index);
          var field = new Field();
          field._MGFieldId = FieldId;
          return field;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 设置索引处的字段
       * @memberOf Fields
       * @param index 索引
       * @param field 字段对象
       * @return {Promise.<void>}大于0成功，否则失败
       */
      async setField(index, field) {
        try {
          return await FLDS.setField(this._MGFieldsId, index, field._MGFieldId);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 追加字段
       * @memberOf Fields
       * @param field 字段对象
       * @return {Promise}大于0成功，否则失败
       */
      async appendField(field) {
        try {
          return await FLDS.appendField(this._MGFieldsId, field._MGFieldId);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 插入字段
       * @memberOf Fields
       * @param position 位置
       * @param field 字段对象
       * @return {Promise}大于0成功，否则失败
       */
      async insertField(position, field) {
        try {
          return await FLDS.insertField(
            this._MGFieldsId,
            position,
            field._MGFieldId
          );
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 根据字段名删除字段
       * @memberOf Fields
       * @param fldName 字段名
       * @return {Promise}大于0成功，否则失败
       */
      async deleteFieldByName(fldName) {
        try {
          return await FLDS.deleteField(this._MGFieldsId, fldName);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 根据字段序号删除字段
       * @memberOf Fields
       * @param index 字段序号
       * @return {Promise}大于0成功，否则失败
       */
      async deleteFieldByIndex(index) {
        try {
          return await FLDS.deleteField(this._MGFieldsId, index);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 取字段数目
       * @memberOf Fields
       * @return {Promise}字段数目
       */
      async getFieldCount() {
        try {
          return await FLDS.getFieldCount(this._MGFieldsId);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算各字段的二进制长度,字段偏移
       * @memberOf Fields
       * @return {Promise}长度偏移值
       */
      async calLengthOffset() {
        try {
          return await FLDS.calLengthOffset(this._MGFieldsId);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算属性结构占用存储空间大小
       * @memberOf Fields
       * @return {Promise}占用存储空间大小
       */
      async calSize() {
        try {
          return await FLDS.calSize(this._MGFieldsId);
        } catch (e) {
          console.error(e);
        }
      }
    }