import type { Color2D, Spectrum1D, Spectrum2D, SpectrumOneDimensionColor, SpectrumTwoDimensionsColor, } from '@zakodium/nmrium-core'; import dlv from 'dlv'; type ReturnColor = ColorType extends SpectrumOneDimensionColor ? string : Color2D; function getValue(spectrum: Spectrum1D | Spectrum2D, jpath: string[]) { const value = dlv(spectrum, jpath); if (typeof value === 'string') { return value; } if (['number', 'boolean'].includes(typeof value)) { return String(value); } if (value) { return JSON.stringify(value); } return value; } function isInstanceOfOneDimensionColor( item: SpectrumOneDimensionColor | SpectrumTwoDimensionsColor, ): item is SpectrumOneDimensionColor { return 'color' in item; } export function getCustomColor< ColorType extends SpectrumOneDimensionColor | SpectrumTwoDimensionsColor, >( spectrum: Spectrum1D | Spectrum2D, colors?: ColorType[], ): ReturnColor | null { if (!colors || colors.length === 0) return null; let color: ReturnColor | null = null; for (const item of colors) { const value = getValue(spectrum, item.jpath); if ( value && item.value && value.toLocaleLowerCase().includes(item.value.toLocaleLowerCase()) ) { if (isInstanceOfOneDimensionColor(item)) { color = item.color as ReturnColor; } else { const { negativeColor, positiveColor } = item; color = { negativeColor, positiveColor } as ReturnColor; } break; } } return color; }