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
package parser

// ParserSnapshot holds the parser state fields that matter for equality
// (mirrors Rust's Parser::assert_eq).
type ParserSnapshot struct {
	State State
	// Params is only meaningful in CsiParam / DcsParam states.
	Params [][]uint16
	// Intermediate is only meaningful in EscapeIntermediate, CsiIntermediate,
	// CsiParam, DcsIntermediate, DcsParam states.
	Intermediate *rune
}

func (p *Parser) Snapshot() ParserSnapshot {
	snap := ParserSnapshot{
		State:        p.State,
		Intermediate: p.intermediate,
	}

	switch p.State {
	case StateCsiParam, StateDcsParam:
		for i := 0; i <= p.curParam; i++ {
			parts := make([]uint16, p.params[i].curPart+1)
			copy(parts, p.params[i].parts[:p.params[i].curPart+1])
			snap.Params = append(snap.Params, parts)
		}
	}

	return snap
}