external/gridded-data/gridded-data.js

import * as divisors from "../../modules/visualize/divisors.js";
import zarrLoader from "./zarr/zarr.js";
import netcdfLoader from "./netcdf/netcdf.js";
import hdf5Loader from "./hdf5/hdf5.js";
import geospatialLoader from "./geospatial/geospatial.js";
import grib2Loader from "./grib2/grib2.js";

/**
 * Gridded Data Format Loader
 * Provides lazy loading capabilities for various gridded data formats
 * including Zarr, NetCDF, HDF5, and geospatial libraries
 * @external GriddedData
 */

/**
 * Loads gridded data format libraries based on the requested format
 * @method loadLibrary
 * @memberof GriddedData
 * @param {Object} params - Configuration object
 * @param {string} params.format - Data format ('zarr', 'netcdf', 'hdf5', 'geospatial')
 * @param {Object} [params.options] - Format-specific options
 * @returns {Promise} Promise resolving to loaded library
 * @example
 * // Load Zarr library
 * hydro.external.griddedData.loadLibrary({
 *   format: 'zarr',
 *   options: { version: 'v2' }
 * });
 *
 * // Load NetCDF library
 * hydro.external.griddedData.loadLibrary({
 *   format: 'netcdf',
 *   options: { compression: true }
 * });
 */
async function loadLibrary({ params, args, data } = {}) {
  const { format, options = {} } = params;

  switch (format) {
    case 'zarr':
      return await zarrLoader.load(options);
    case 'netcdf':
      return await netcdfLoader.load(options);
    case 'hdf5':
      return await hdf5Loader.load(options);
    case 'geospatial':
      return await geospatialLoader.load(options);
    case 'grib2':
      return await grib2Loader.load(options);
    default:
      throw new Error(`Unsupported gridded data format: ${format}`);
  }
}

/**
 * Checks if a gridded data format library is already loaded
 * @method isLoaded
 * @memberof GriddedData
 * @param {Object} params - Configuration object
 * @param {string} params.format - Data format to check
 * @returns {boolean} True if library is loaded
 * @example
 * hydro.external.griddedData.isLoaded({ format: 'zarr' });
 */
function isLoaded({ params, args, data } = {}) {
  const { format } = params;

  switch (format) {
    case 'zarr':
      return zarrLoader.isLoaded();
    case 'netcdf':
      return netcdfLoader.isLoaded();
    case 'hdf5':
      return hdf5Loader.isLoaded();
    case 'geospatial':
      return geospatialLoader.isLoaded();
    case 'grib2':
      return grib2Loader.isLoaded();
    default:
      return false;
  }
}

/**
 * Gets information about supported gridded data formats
 * @method getSupportedFormats
 * @memberof GriddedData
 * @returns {Array} Array of supported format names
 * @example
 * hydro.external.griddedData.getSupportedFormats();
 */
function getSupportedFormats() {
  return ['zarr', 'netcdf', 'hdf5', 'geospatial', 'grib2'];
}

/**
 * Gets detailed information about a specific format
 * @method getFormatInfo
 * @memberof GriddedData
 * @param {Object} params - Configuration object
 * @param {string} params.format - Format to get info about
 * @returns {Object} Format information
 * @example
 * hydro.external.griddedData.getFormatInfo({ format: 'zarr' });
 */
function getFormatInfo({ params, args, data } = {}) {
  const { format } = params;

  switch (format) {
    case 'zarr':
      return zarrLoader.getInfo();
    case 'netcdf':
      return netcdfLoader.getInfo();
    case 'hdf5':
      return hdf5Loader.getInfo();
    case 'geospatial':
      return geospatialLoader.getInfo();
    case 'grib2':
      return grib2Loader.getInfo();
    default:
      throw new Error(`Unknown format: ${format}`);
  }
}

export {
  loadLibrary,
  isLoaded,
  getSupportedFormats,
  getFormatInfo
};