docs: def get_fields(catalog, filter_in=None, filter_out=None, meta_field=None,
                 only_time_series=False, distribution_identifier=None):
      """Devuelve lista de campos del catálogo o de uno de sus metadatos.
  
      Args:
          catalog (dict, str or DataJson): Representación externa/interna de un
              catálogo. Una representación _externa_ es un path local o una
              URL remota a un archivo con la metadata de un catálogo, en
              formato JSON o XLSX. La representación _interna_ de un catálogo
              es un diccionario. Ejemplos: http://datos.gob.ar/data.json,
              http://www.ign.gob.ar/descargas/geodatos/catalog.xlsx,
              "/energia/catalog.xlsx".
          filter_in (dict): Devuelve los campos cuyos atributos
              coinciden con los pasados en este diccionario. Ejemplo::
                  {
                      "dataset": {
                          "publisher": {"name": "Ministerio de Ambiente"}
                      }
                  }
              Sólo se devolverán los campos que pertenezcan a un dataset
              de ese publisher_name.
          filter_out (dict): Devuelve los campos cuyos atributos no
              coinciden con los pasados en este diccionario. Ejemplo::
                  {
                      "dataset": {
                          "publisher": {"name": "Ministerio de Ambiente"}
                      }
                  }
              Sólo se devolverán los campos que no pertenezcan a un
              dataset de ese publisher_name.
          meta_field (str): Nombre de un metadato de Field. En lugar de
              devolver los objetos completos "Field", devuelve una lista de
              valores para ese metadato presentes en el catálogo.
          exclude_meta_fields (list): Metadatos de Field que se quieren
              excluir de los objetos Field devueltos.
          only_time_series (bool): Si es verdadero, sólo devuelve campos
              que sean series de tiempo.
      """
  
      filter_in = filter_in or {}
      filter_out = filter_out or {}
      catalog = read_catalog_obj(catalog)
  
      # agrego atajos para filtros
      if distribution_identifier:
          if "distribution" not in filter_in:
              filter_in["distribution"] = {}
          filter_in["distribution"]["identifier"] = distribution_identifier
  
      fields = []
      for distribution in get_distributions(catalog, filter_in, filter_out,
                                            only_time_series=only_time_series):
  
          distribution_fields = distribution.get("field", [])
          if isinstance(distribution_fields, list):
              for field in distribution_fields:
                  if not only_time_series or field_is_time_series(field,
                                                                  distribution):
                      # agrega el id del dataset
                      field["dataset_identifier"] = distribution[
                          "dataset_identifier"]
                      # agrega el id de la distribución
                      field["distribution_identifier"] = distribution.get(
                          "identifier")
  
                      fields.append(field)
  
      filtered_fields = [field for field in fields if
                         _filter_dictionary(field, filter_in.get("field"),
                                            filter_out.get("field"))]
  
      if meta_field:
          return [field[meta_field] for field in filtered_fields
                  if meta_field in field]
      else:
          return filtered_fields