summaryrefslogtreecommitdiff
path: root/read.go
blob: ea10885ed7b2ec7b1a69948160ac4bd9df83d25d (plain)
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
49
50
51
52
53
54
55
56
57
58
59
package libfastimport

type UnsupportedCommand string

func (e UnsupportedCommand) Error() string {
	return "Unsupported command: "+string(e)
}

type Parser struct {
	fir *FIReader

	cmd chan Cmd
}

func (p *Parser) GetCmd() (Cmd, error) {
	for p.cmd == nil {
		slice, err := p.fir.ReadSlice()
		if err != nil {
			return nil, err
		}
		err = p.putSlice(slice)
		if err != nil {
			return nil, err
		}
	}
	return <-p.cmd, nil
}

func (p *Parser) putSlice(slice []byte) error {
	if len(slice) < 1 {
		return UnsupportedCommand(slice)
	}
	switch slice[0] {
	case '#': // comment
	case 'b': // blob
	case 'c':
		if len(slice) < 2 {
			return UnsupportedCommand(slice)
		}
		switch slice[1] {
		case 'o': // commit
		case 'h': // checkpoint
		case 'a': // cat-blob
		default:
			return UnsupportedCommand(slice)
		}
	case 'd': // done
	case 'f': // feature
	case 'g': // get-mark
	case 'l': // ls
	case 'o': // option
	case 'p': // progress
	case 'r': // reset
	case 't': // tag
	default:
		return UnsupportedCommand(slice)
	}
	return nil // TODO
}