export function parseDICOMwebUrl()

in pathology/viewer/src/interfaces/dicomweb.ts [54:101]


export function parseDICOMwebUrl(url: string): DicomWebUrlConfig {
  // This pattern allows for optional groups for the base URL, studyUID,
  // seriesUID, and instanceUID
  const baseUrlWhenResourcePresentRegex = /^([^?]*?)\/(?:studies|series|instances|rs)/;  // *? -> non-greedy
  const studyUIDRegex = /(?:^|\/)studies\/([0-9.]+)/;
  const seriesUIDRegex = /(?:^|\/)series\/([0-9.]+)/;
  const instanceUIDRegex = /(?:^|\/)instances\/([0-9.]+)/;
  const queryParamsRegex = /\?(.*)$/;

  // Match each part using the regex patterns
  const baseUrlMatch = url.match(baseUrlWhenResourcePresentRegex);
  const studyUIDMatch = url.match(studyUIDRegex);
  const seriesUIDMatch = url.match(seriesUIDRegex);
  const instanceUIDMatch = url.match(instanceUIDRegex);
  const queryParamsMatch = url.match(queryParamsRegex);

  // Extract the matched parts or set them as null if not found
  const baseUrl =
    baseUrlMatch ? baseUrlMatch[1] : url;
  const studyUID = studyUIDMatch ? studyUIDMatch[1] : undefined;
  const seriesUID = seriesUIDMatch ? seriesUIDMatch[1] : undefined;
  const instanceUID = instanceUIDMatch ? instanceUIDMatch[1] : undefined;
  const queryParamsString = queryParamsMatch ? queryParamsMatch[1] : undefined;

  // Parse query params into an object
  const queryParams = queryParamsString ?
    queryParamsString.split('&').reduce(
      (acc: { [k: string]: string }, param) => {
        const [key, value] = param.split('=');
        acc[key] = value;
        return acc;
      },
      {}) :
    undefined;

  const path = {
    ...(studyUID && { studyUID }),
    ...(seriesUID && { seriesUID }),
    ...(instanceUID && { instanceUID })
  };

  // Return an object with the captured values, omitting unavailable
  return {
    ...(baseUrl && { baseUrl }),
    ...(path && { path }),
    ...(queryParams && { queryParams })
  };
}