@randsum/notation
Version:
Dice notation parser and types for the @randsum ecosystem
60 lines (52 loc) • 1.64 kB
text/typescript
import type { ComparisonOptions } from '../types'
/**
* Backward-compatible alias. ComparisonOptions now includes all fields.
* @deprecated Use ComparisonOptions directly.
*/
export type ExtendedComparisonOptions = ComparisonOptions
/**
* Parses a condition string into comparison options.
*/
export function parseComparisonNotation(conditionString: string): ComparisonOptions {
const content = conditionString.replace(/[{}]/g, '')
const parts = content
.split(',')
.map(s => s.trim())
.filter(Boolean)
const result: ComparisonOptions = {}
const exact: number[] = []
for (const part of parts) {
if (part.startsWith('>=')) {
result.greaterThanOrEqual = Number(part.slice(2))
} else if (part.startsWith('<=')) {
result.lessThanOrEqual = Number(part.slice(2))
} else if (part.startsWith('>')) {
result.greaterThan = Number(part.slice(1))
} else if (part.startsWith('<')) {
result.lessThan = Number(part.slice(1))
} else if (part.startsWith('=')) {
exact.push(Number(part.slice(1)))
} else {
const num = Number(part)
if (!isNaN(num)) {
exact.push(num)
}
}
}
if (exact.length > 0) {
result.exact = exact
}
return result
}
/**
* Checks if a comparison options object has any conditions defined.
*/
export function hasConditions(options: ComparisonOptions): boolean {
return (
options.greaterThan !== undefined ||
options.greaterThanOrEqual !== undefined ||
options.lessThan !== undefined ||
options.lessThanOrEqual !== undefined ||
(options.exact !== undefined && options.exact.length > 0)
)
}