unified-query
Version:
Composable search input with autocompletion and a rich query-language parser for the Unified Data System
48 lines (47 loc) • 1.56 kB
JavaScript
/* recognised sortable fields */
const FIELDS = ['name', 'created', 'updated', 'deleted', 'archived', 'completed'];
function isField(x) {
return FIELDS.includes(x);
}
export function analyzeSort(seg) {
const list = [];
const errors = [];
if (seg.tokens.length === 0)
list.push({ field: 'name', dir: 'asc' });
for (const tok of seg.tokens) {
if (tok.kind !== 'string') {
errors.push(invalid(tok));
continue;
}
const [fieldRaw, dirRaw] = tok.value.split(':', 2);
if (!isField(fieldRaw)) {
errors.push(badField(tok));
continue;
}
let dir;
if (dirRaw) {
if (dirRaw === 'asc' || dirRaw === 'desc')
dir = dirRaw;
else {
errors.push(badDir(tok));
continue;
}
}
list.push({ field: fieldRaw, dir });
}
seg.errors.push(...errors);
return { keyword: 'sort', parsed: list, from: seg.from, to: seg.to, raw: seg.raw };
/* helpers */
function invalid(tok) {
return { message: `invalid token "${tok.raw}" for @sort`, token: tok.raw,
from: tok.from, to: tok.to };
}
function badDir(tok) {
return { message: `invalid sort direction in "${tok.raw}"`,
token: tok.raw, from: tok.from, to: tok.to };
}
function badField(tok) {
return { message: `unrecognised sort field "${tok.raw.split(':')[0]}"`,
token: tok.raw, from: tok.from, to: tok.to };
}
}