@randsum/roller
Version:
A flexible, type-safe dice roller for tabletop RPGs, game development, and probability simulations
26 lines (21 loc) • 849 B
text/typescript
import type { RollOptions } from '../../types'
import { coreNotationPattern } from '../patterns'
import { parseModifiers } from '../modifiers'
export function singleNotationToOptions<T>(notationString: string): RollOptions<T> {
const trimmedNotationString = notationString.trim()
const coreNotationMatch = trimmedNotationString.match(coreNotationPattern)?.at(0) ?? ''
const modifiersString = trimmedNotationString.replace(coreNotationMatch, '')
const [quantityNot, sidesNotation = ''] = coreNotationMatch.split(/[Dd]/)
const core = {
quantity: Math.abs(Number(quantityNot)),
arithmetic: Number(quantityNot) < 0 ? ('subtract' as const) : ('add' as const),
sides: Number(sidesNotation)
}
if (modifiersString.length === 0) {
return core
}
return {
...core,
modifiers: parseModifiers(modifiersString)
}
}