66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
import type { MusicGroup } from '../src/types/screen.js'
|
|
import { fieldError } from './request-error.js'
|
|
|
|
export function groupEndMode(value: unknown): MusicGroup['endMode'] {
|
|
if (value == null || value === 0 || value === 'PLAYLIST_GROUP_END_MODE_REPEAT') return 'repeat'
|
|
if (value === 1 || value === 'PLAYLIST_GROUP_END_MODE_STOP') return 'stop'
|
|
if (value === 2 || value === 'PLAYLIST_GROUP_END_MODE_NEXT') return 'next'
|
|
throw fieldError('groups.endMode', 'режим завершения группы', value, 'Некорректный режим группы')
|
|
}
|
|
|
|
export function apiGroupEndMode(value: MusicGroup['endMode']) {
|
|
return value === 'stop'
|
|
? ('PLAYLIST_GROUP_END_MODE_STOP' as const)
|
|
: value === 'next'
|
|
? ('PLAYLIST_GROUP_END_MODE_NEXT' as const)
|
|
: ('PLAYLIST_GROUP_END_MODE_REPEAT' as const)
|
|
}
|
|
|
|
export function parsePlaylistGroups(value: unknown): MusicGroup[] {
|
|
if (value == null) return []
|
|
if (!Array.isArray(value))
|
|
throw fieldError('groups', 'массив', value, 'Некорректный список групп')
|
|
const seen = new Set<number>()
|
|
return value
|
|
.map((raw, index) => {
|
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
throw fieldError(`groups[${index}]`, 'объект', raw, 'Некорректная группа')
|
|
const group = raw as Record<string, unknown>
|
|
if (!Number.isSafeInteger(group.ID) || Number(group.ID) <= 0 || seen.has(Number(group.ID)))
|
|
throw fieldError(
|
|
`groups[${index}].ID`,
|
|
'уникальный положительный ID',
|
|
group.ID,
|
|
'Некорректная группа',
|
|
)
|
|
if (
|
|
typeof group.name !== 'string' ||
|
|
!group.name.trim() ||
|
|
Buffer.byteLength(group.name) > 255
|
|
)
|
|
throw fieldError(
|
|
`groups[${index}].name`,
|
|
'название группы',
|
|
group.name,
|
|
'Некорректная группа',
|
|
)
|
|
const position = group.position ?? 0
|
|
if (!Number.isSafeInteger(position) || Number(position) < 0)
|
|
throw fieldError(
|
|
`groups[${index}].position`,
|
|
'неотрицательное целое',
|
|
position,
|
|
'Некорректный порядок групп',
|
|
)
|
|
const id = Number(group.ID)
|
|
seen.add(id)
|
|
return {
|
|
id,
|
|
name: group.name,
|
|
position: Number(position),
|
|
endMode: groupEndMode(group.endMode),
|
|
}
|
|
})
|
|
.sort((a, b) => a.position - b.position || a.id - b.id)
|
|
}
|