juice-shop/juice-shop

View on GitHub
frontend/src/app/score-board/components/filter-settings/pipes/difficulty-selection-summary.pipe.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { Pipe, type PipeTransform } from '@angular/core'

import sortBy from 'lodash-es/sortBy'

interface DifficultyGroup {
  start: number
  end: number
}

@Pipe({ name: 'difficultySelectionSummary', pure: true })
export class DifficultySelectionSummaryPipe implements PipeTransform {
  transform (selectedDifficulties: Array<1 | 2 | 3 | 4 | 5 | 6>): string {
    if (selectedDifficulties.length === 0) {
      return ''
    }

    const sortedDifficulties = sortBy(selectedDifficulties)
    const difficultyGroups = breakDifficultiesIntoNeighboringGroups(sortedDifficulties)
    return convertDifficultyGroupsToString(difficultyGroups)
  }
}

function breakDifficultiesIntoNeighboringGroups (difficulties: Array<1 | 2 | 3 | 4 | 5 | 6>): DifficultyGroup[] {
  const difficultyGroups: DifficultyGroup[] = []
  let currentGroup: DifficultyGroup = null
  for (const difficulty of difficulties) {
    if (currentGroup === null) {
      currentGroup = { start: difficulty, end: difficulty }
    } else {
      if (difficulty === currentGroup.end + 1) {
        currentGroup.end = difficulty
      } else {
        difficultyGroups.push(currentGroup)
        currentGroup = { start: difficulty, end: difficulty }
      }
    }
  }
  difficultyGroups.push(currentGroup)
  return difficultyGroups
}

function convertDifficultyGroupsToString (difficultyGroups: DifficultyGroup[]): string {
  return difficultyGroups.map(group => {
    if (group.start === group.end) {
      return group.start.toString()
    } else {
      return `${group.start} - ${group.end}`
    }
  }).join(', ')
}