80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type pigeonBodyItem struct {
|
|
key string
|
|
value string
|
|
}
|
|
|
|
type pigeonMessage struct {
|
|
author string
|
|
depth int
|
|
kind string
|
|
lipmaa string
|
|
prev string
|
|
body [256]pigeonBodyItem
|
|
signature string
|
|
}
|
|
|
|
type parserMode int
|
|
|
|
const (
|
|
parsingHeader parserMode = iota
|
|
parsingBody parserMode = iota
|
|
parsingFooter parserMode = iota
|
|
parsingDone parserMode = iota
|
|
)
|
|
|
|
type parserState struct {
|
|
mode parserMode
|
|
scanner *bufio.Scanner
|
|
}
|
|
|
|
func newState(message string) parserState {
|
|
return parserState{
|
|
mode: parsingHeader,
|
|
scanner: bufio.NewScanner(strings.NewReader(message)),
|
|
}
|
|
}
|
|
|
|
func parseMessage(message string) ([]pigeonMessage, error) {
|
|
state := newState(message)
|
|
|
|
for state.scanner.Scan() {
|
|
switch state.mode {
|
|
case parsingHeader:
|
|
parseHeader(state)
|
|
case parsingBody:
|
|
parseBody(state)
|
|
case parsingFooter:
|
|
parseFooter(state)
|
|
}
|
|
}
|
|
return []pigeonMessage{}, errors.New("whatever")
|
|
}
|
|
|
|
func parseHeader(state parserState) {
|
|
t := state.scanner.Text()
|
|
chunks := strings.Split(t, " ")
|
|
switch len(chunks) {
|
|
case 2:
|
|
fmt.Printf("=== KEY: %s | VALUE: %s\n", chunks[0], chunks[1])
|
|
default:
|
|
fmt.Printf("WHATS THIS?? %s\n", chunks[0])
|
|
}
|
|
}
|
|
|
|
func parseBody(state parserState) {
|
|
panic("Not done yet")
|
|
}
|
|
|
|
func parseFooter(state parserState) {
|
|
panic("Not done yet")
|
|
}
|