/
resolve-block-seq.ts
48 lines (47 loc) · 1.45 KB
/
resolve-block-seq.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import { YAMLSeq } from '../nodes/YAMLSeq.js'
import type { BlockSequence } from '../parse/cst.js'
import type { ComposeContext, ComposeNode } from './compose-node.js'
import type { ComposeErrorHandler } from './composer.js'
import { resolveProps } from './resolve-props.js'
export function resolveBlockSeq(
{ composeNode, composeEmptyNode }: ComposeNode,
ctx: ComposeContext,
bs: BlockSequence,
onError: ComposeErrorHandler
) {
const seq = new YAMLSeq(ctx.schema)
let offset = bs.offset
for (const { start, value } of bs.items) {
const props = resolveProps(start, {
ctx,
indicator: 'seq-item-ind',
offset,
onError,
startOnNewline: true
})
offset = props.end
if (!props.found) {
if (props.anchor || props.tagName || value) {
if (value && value.type === 'block-seq')
onError(
offset,
'BAD_INDENT',
'All sequence items must start at the same column'
)
else
onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator')
} else {
// TODO: assert being at last item?
if (props.comment) seq.comment = props.comment
continue
}
}
const node = value
? composeNode(ctx, value, props, onError)
: composeEmptyNode(ctx, offset, start, null, props, onError)
offset = node.range[2]
seq.items.push(node)
}
seq.range = [bs.offset, offset, offset]
return seq as YAMLSeq.Parsed
}