Begin building message parser
This commit is contained in:
parent
8efdd857a0
commit
a498bf0c9e
16
README.md
16
README.md
|
@ -11,10 +11,23 @@ Don't use the Go version yet. If you want something stable, there is a [Ruby ver
|
||||||
By default, data is stored in `~/.pigeon`.
|
By default, data is stored in `~/.pigeon`.
|
||||||
You can override this value by specifying a `PIGEON_PATH` ENV var.
|
You can override this value by specifying a `PIGEON_PATH` ENV var.
|
||||||
|
|
||||||
|
# Help Wanted
|
||||||
|
|
||||||
|
Want to get involved? Below are a few things I need help with.
|
||||||
|
|
||||||
|
Email `contact@vaporsfot.xyz` if you have any questions.
|
||||||
|
|
||||||
|
* Writing a BNF grammar for message parsing
|
||||||
|
* Test coverage increases
|
||||||
|
* Manual QA of features and edge cases
|
||||||
|
* Cross-compiling windows binaries
|
||||||
|
* General Golang help (I am a Golang novice- project structure could be improved)
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
|
**CURRENT TASK:** Write a message parser.
|
||||||
|
|
||||||
- [ ] Add a real testing lib to DRY things up.
|
- [ ] Add a real testing lib to DRY things up.
|
||||||
- [ ] Figure out a system for where to place the default data storage directory
|
|
||||||
- [ ] Get a good CI system going? Run tests at PR time, provide prebuilt binaries, prevent coverage slips, etc..
|
- [ ] Get a good CI system going? Run tests at PR time, provide prebuilt binaries, prevent coverage slips, etc..
|
||||||
- [ ] Add a `transact()` helper to ensure all transactions are closed out.
|
- [ ] Add a `transact()` helper to ensure all transactions are closed out.
|
||||||
- [ ] Switch to [SQLX](https://github.com/jmoiron/sqlx) for extra sanity.
|
- [ ] Switch to [SQLX](https://github.com/jmoiron/sqlx) for extra sanity.
|
||||||
|
@ -23,6 +36,7 @@ You can override this value by specifying a `PIGEON_PATH` ENV var.
|
||||||
|
|
||||||
|Done?|Noun |Verb | Flag / arg 1 | Flag 2 |
|
|Done?|Noun |Verb | Flag / arg 1 | Flag 2 |
|
||||||
|-----|------------|-----------|---------------|-----------|
|
|-----|------------|-----------|---------------|-----------|
|
||||||
|
| |blob |remove | mhash | |
|
||||||
| |bundle |ingest | | |
|
| |bundle |ingest | | |
|
||||||
| |message |show | message mhash | |
|
| |message |show | message mhash | |
|
||||||
| |message |find | --all | |
|
| |message |find | --all | |
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
cd project
|
cd project
|
||||||
|
rm -rf testdata
|
||||||
|
mkdir testdata
|
||||||
PIGEON_PATH="./testdata" go test -coverprofile coverage.out
|
PIGEON_PATH="./testdata" go test -coverprofile coverage.out
|
||||||
PIGEON_PATH="./testdata" go tool cover -html=coverage.out
|
PIGEON_PATH="./testdata" go tool cover -html=coverage.out
|
||||||
cd -
|
cd -
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 0
|
||||||
|
kind FILE.ET9C7B9N82XR0F021CXEWSPDH23H4CHMX866WWA3R2PXEFZM67PG
|
||||||
|
lipmaa NONE
|
||||||
|
prev NONE
|
||||||
|
|
||||||
|
a:"b"
|
||||||
|
|
||||||
|
signature TKVXZ5EJV0GRDY60V2ZHN4ART60FYYJ99SJQGXAK8AF80X1ZFQCR18P5JVJZWMFME5Q7WF1999MH13V2ZYMVBX4XZGGR537FVFXWG10
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 1
|
||||||
|
kind a
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.0HG26KBTYFD3FW8K72GFJJ5CV9KXSDRG2WJS15P3XQ5V56XNX8E0
|
||||||
|
|
||||||
|
FILE.7Z2CSZKMB1RE5G6SKXRZ63ZGCNP8VVEM3K0XFMYKETRDQSM5WBSG:"b"
|
||||||
|
|
||||||
|
signature DPBY0XEKZPMFT0DM7JFFZVPZG4FR248SQVAXJ7T3T7QB1QYV3MKKS1V9FHWK9P33MECKBE4AYV4V70X9M9Z292JFC0DXBHH0HSJHM1R
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 2
|
||||||
|
kind a
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.BJEPB3TPZM2ZSQWHYB4N5ECMF0S9H4VKH0WYE1QY5T911YYZEA5G
|
||||||
|
|
||||||
|
b:FILE.HDDSVC617PS44NP856N3CJN91HPJXEHHHE93595BJC9VJN6KANFG
|
||||||
|
|
||||||
|
signature P6DK52KZ2KWHDJJ7Y7GZA2VGDRNQ9FDBFTDJY1ME6V21BDCCKYMFF3TEZ5EENJMRR4B8NCS0W4354WG88ZSW421RKW38JR8BPVQVC1R
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 3
|
||||||
|
kind a8df9e36-7c32-431c-af4c-855b6c398c87
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.TCZ4GCD45ETX73EEGRHPFX1BBPNBG70S03GC6V0F2QE07SCQ18T0
|
||||||
|
|
||||||
|
foo:"fe3d0f08-13a3-47eb-b605-cc9c1dd1811c"
|
||||||
|
|
||||||
|
signature R4RZ2DXD624C5TT0JCS1CP8ZA89KVMP8C2X39H7N0H6T4CPZNHGN5DA1B6B7B35V4WBB6X6XGNRBYMXJHD50BHRR3SMGDFCJ8YM8G20
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 4
|
||||||
|
kind dcf7d089-b5ef-4f8b-8fe7-c176e7c7605b
|
||||||
|
lipmaa TEXT.BJEPB3TPZM2ZSQWHYB4N5ECMF0S9H4VKH0WYE1QY5T911YYZEA5G
|
||||||
|
prev TEXT.94NPGGDTM456TFBJTQH2YFSQ2W46AJ9GGVYYYGXHGTR9A27ZPG2G
|
||||||
|
|
||||||
|
foo:"bar"
|
||||||
|
|
||||||
|
signature 95TCVY0CP01NZVHQSR8CNXDGYW9BK4CJADXQGA1R5G5Y8HD05N8MZ4KTSSAGP785BXQYMYMBVJEV1NMC0GF651RHQYGP57XR716JG3G
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 5
|
||||||
|
kind 485d10d6-87b3-4f1f-baf3-752796afec64
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.HWR2DNDWJYP60348W0M78QF4H0B5B7X6NT6KVS9GNJSP207PDB9G
|
||||||
|
|
||||||
|
foo:"16c4ad9b-34cc-4c37-a4c9-3ab0161ea4b5"
|
||||||
|
|
||||||
|
signature 0NPJG4A0VWP0HPS2SV3DJH696QMWBWZZ27CKCTX5JK8WJ1JE818PPJGRJRAC4QQ7K10GT2Z2Q19R3YKQFF1S0HFHYSPCC64079WZA38
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 6
|
||||||
|
kind 74be7129-06b8-4cb6-8aa9-d549710cd657
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.YEBFRRM6HCX514HBHBTB3AK2HF5B71MPDMB5HNQW4ACYETQYDNZ0
|
||||||
|
|
||||||
|
foo:"123"
|
||||||
|
|
||||||
|
signature HD7VNKTMARQ3294C6KDGXV4BP0GKFWEXBC5R8RHWF8VKBMFXDB2NCX4XQN6Q524ZWPNTM0HGSHSAX359GCAEFE0P688S4825RY2P418
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 7
|
||||||
|
kind f06d3a2b-a1c0-4bf5-83e7-29409ac0c9b4
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.XQRKXB46M6HZAWTADNXWFTHQS8PGEPDZ581J40REFNT3YWG8YZ70
|
||||||
|
|
||||||
|
foo:"123"
|
||||||
|
|
||||||
|
signature ZYHVXQGZ9G78AD69A9SFMF281B4WHX05AG8TEKBKSFH706HXNYRTPH9G5VP01ZC515MMP69KPV41THB7DG9XJT90ZRX99KZ1WGJQM2R
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 8
|
||||||
|
kind a4df2c79-17ef-4c90-ba11-3021fe23269c
|
||||||
|
lipmaa TEXT.HWR2DNDWJYP60348W0M78QF4H0B5B7X6NT6KVS9GNJSP207PDB9G
|
||||||
|
prev TEXT.49S2F3Y6AXHDD8F62RKXPFWC2BYBV5D16VQY34F40NTQFZW1R0G0
|
||||||
|
|
||||||
|
foo:"bar"
|
||||||
|
|
||||||
|
signature W57NQEX8HD3DQG1F8G6SD8960QRP0HYPWXCKTN6AZ5SXZCWABPBWHM84EFDH5MJTJ4YYVZHC5RC01382DAW19EDCCXCG3KM2XCRH620
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 9
|
||||||
|
kind a2c49e15-befd-4a62-8a7d-f4a28d052c38
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.NRK3MEG982X5N76RFF4F9WC405452YNZFCH5WTP9G8ERRTYNN3V0
|
||||||
|
|
||||||
|
foo:"3b39df57-9dee-4a66-8d49-ee4944631f33"
|
||||||
|
|
||||||
|
signature ATRMAPBKQ7VZWRDSX4ASSVZ3D9CKSS3PZ8ZP229H96MA9DGD7RM5TA1E4CZD42BWK6Q9XJ1C1KDY2BMXJ8Z3Z780YDZEWWJYYTQHW1R
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 10
|
||||||
|
kind 7a1a2b5a-32c2-4b3f-b287-42e4a73e340d
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.FKH08FA04MCC7RPYN1GZZT0VAGHAW0VRHQD6QZX3C6YCTAZM9WE0
|
||||||
|
|
||||||
|
foo:"bar"
|
||||||
|
|
||||||
|
signature 3F774WW8NVA3HAQRV7M4CWKBYH86QB8F9QPQ6FV96MG6S9KHBG519WKPNBZR7YRFFBWHZZ50RSKP9YVDHW9K3XXHERQ8BDXYKAR8Y2G
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 11
|
||||||
|
kind c8cfac48-460f-47c6-a6b3-34daa431fcab
|
||||||
|
lipmaa NONE
|
||||||
|
prev TEXT.DQH1TX6QM3223PNX4Y352AQSDJM91SMFYJFG6PPC182ZW9PYR70G
|
||||||
|
|
||||||
|
foo:"450024fc-ea1c-4144-b7b9-16c60ff00e45"
|
||||||
|
|
||||||
|
signature AT3VWBJXP7NZBGADPWGX0PVHPKS0W14SAY12XZHYQ3EF025641M29P46ZNYM3M4Q0HKZYH4GSMRR7RTC7R5V3K5AXKH68SJ4B094E0R
|
||||||
|
|
||||||
|
author USER.PJC0W5XRFX4JBFPX929PQETB58VM7A4P5RDMW7Y8E9P4CRZDWEBG
|
||||||
|
depth 12
|
||||||
|
kind 6ecac9f1-e5dc-4274-a0fd-633c2cd56832
|
||||||
|
lipmaa TEXT.NRK3MEG982X5N76RFF4F9WC405452YNZFCH5WTP9G8ERRTYNN3V0
|
||||||
|
prev TEXT.Y3K7WH4R9W9EBTZB27NJCYR6VBKYTHZX97Y05841VPM5G50ZYG00
|
||||||
|
|
||||||
|
foo:"fc1a7066-2af2-4437-98e3-dbc33e67d7c6"
|
||||||
|
|
||||||
|
signature CGC4PHDQBSR7ZWS5NY3KZ7YJ342K30QB3DKHDS78GD4H2F5J196424GBQD04EDMYX8M4J971VJ7JQ1N1QZDV24ABDY02TW0QDP82P1G
|
|
@ -0,0 +1,79 @@
|
||||||
|
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")
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestParser(t *testing.T) {
|
||||||
|
content, err1 := ioutil.ReadFile("../fixture.pgn")
|
||||||
|
if err1 != nil {
|
||||||
|
log.Fatal(err1)
|
||||||
|
}
|
||||||
|
output, err2 := parseMessage(string(content))
|
||||||
|
|
||||||
|
if err2 != nil {
|
||||||
|
log.Fatal(err2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fixtureSize := 13
|
||||||
|
length := len(output)
|
||||||
|
if length != fixtureSize {
|
||||||
|
t.Fatalf("Expected %d items, got %d", fixtureSize, length)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue