mutateParams method

(List<String>, List<String>, List<String>) mutateParams(
  1. List<_FieldInfo> fields,
  2. ClassElement cls
)

Implementation

(List<String>, List<String>, List<String>) mutateParams(
  List<_FieldInfo> fields,
  ClassElement cls,
) {
  List<String> imports = [];
  List<String> params = [];
  List<String> impl = [];
  String cmt(String src, {String? comment}) {
    if (comment == null) {
      return src;
    }

    return "\n    /// $comment\n    $src";
  }

  for (_FieldInfo f in fields) {
    bool accept = false;

    if (isSafeField(f)) {
      accept = true;
      impl.add("if(${f.name} != null) '${f.name}': ${f.name}");

      if (f.type == "int?" || f.type == "int") {
        params.add(
          cmt(
            "int? delta${f.name.capitalize()}",
            comment:
                "Changes (increment/decrement) [${f.name}] by an amount atomically using FieldValue.increment() see https://cloud.google.com/firestore/docs/manage-data/add-data#increment_a_numeric_value.",
          ),
        );
        impl.add(
          "if(delta${f.name.capitalize()} != null) '${f.name}': FieldValue.increment(delta${f.name.capitalize()})",
        );
      }

      if (f.type == "double?" || f.type == "double") {
        params.add(
          cmt(
            "double? delta${f.name.capitalize()}",
            comment:
                "Changes (increment/decrement) [${f.name}] by an amount atomically using FieldValue.increment() see https://cloud.google.com/firestore/docs/manage-data/add-data#increment_a_numeric_value.",
          ),
        );
        impl.add(
          "if(delta${f.name.capitalize()} != null) '${f.name}': FieldValue.increment(delta${f.name.capitalize()})",
        );
      }
    } else {
      if (f.type == "DateTime" || f.type == "DateTime?") {
        accept = true;
        impl.add(
          "if(${f.name} != null) '${f.name}': ${f.name}.toIso8601String()",
        );
      } else if (_isEnum(f.dartType)) {
        accept = true;
        impl.add("if(${f.name} != null) '${f.name}': ${f.name}.name");
      } else if (f.type.startsWith("List<") || f.type.startsWith("Set<")) {
        DartType? itype = innerOfList(f.dartType);
        if (itype == null) {
          continue;
        }

        Uri iuri = importForType(itype, cls.library); // helper below
        imports.add("import '$iuri';");

        params.add(
          cmt(
            "${f.type.endsWith("?") ? f.type : "${f.type}?"} add${f.name.capitalize()}",
            comment:
                "Adds multiple [${itype.name}] to the [${f.name}] field atomically using FieldValue.arrayUnion(). See https://cloud.google.com/firestore/docs/manage-data/add-data#update_elements_in_an_array",
          ),
        );
        params.add(
          cmt(
            "${f.type.endsWith("?") ? f.type : "${f.type}?"} remove${f.name.capitalize()}",
            comment:
                "Removes one or more [${itype.name}] to the [${f.name}] field atomically using FieldValue.arrayRemove(). See https://cloud.google.com/firestore/docs/manage-data/add-data#update_elements_in_an_array",
          ),
        );
        impl.add(
          "if(add${f.name.capitalize()} != null && add${f.name.capitalize()}.isNotEmpty) '${f.name}': FieldValue.arrayUnion(add${f.name.capitalize()}.map((v) => v${mapVX(itype)}).toList())",
        );
        impl.add(
          "if(remove${f.name.capitalize()} != null && remove${f.name.capitalize()}.isNotEmpty) '${f.name}': FieldValue.arrayRemove(remove${f.name.capitalize()}.map((v) => v${mapVX(itype)}).toList())",
        );
        impl.add(
          "if(${f.name} != null) '${f.name}': ${f.name}.map((v) => v${mapVX(itype)}).toList()",
        );

        accept = true;
      } else if (!f.type.startsWith("Map<")) {
        accept = true;
        impl.add("if(${f.name} != null) '${f.name}': ${f.name}.toMap()");
      }
    }

    if (accept) {
      params.add(
        cmt(
          '${f.type.endsWith("?") ? f.type : "${f.type}?"} ${f.name}',
          comment:
              "Replaces the value of [${f.name}] with a new value atomically.",
        ),
      );
      imports.add('import "${importForType(f.dartType, cls.library)}";');
    }

    params.add(
      cmt(
        'bool delete${f.name.capitalize()} = false',
        comment:
            "Removes the [${f.name}] field from the document atomically using FieldValue.delete(). See https://cloud.google.com/firestore/docs/manage-data/delete-data#fields",
      ),
    );
    impl.add(
      "if(delete${f.name.capitalize()}) '${f.name}': FieldValue.delete()",
    );
  }

  return (imports.toSet().toList(), params, impl);
}