Compare commits

...

3 Commits

Author SHA1 Message Date
4ab8fc16c2 Add godoc badge 2024-08-31 22:56:24 -04:00
5cc89d5b42 Add some tests 2024-08-31 22:54:54 -04:00
dbffe4b7c4 Fix escape sequence parsing 2024-08-31 22:54:38 -04:00
3 changed files with 81 additions and 3 deletions

View File

@@ -1,4 +1,7 @@
# ASV
[![Go Reference](https://pkg.go.dev/badge/git.tebibyte.media/sashakoshka/go-asv.svg)](https://pkg.go.dev/git.tebibyte.media/sashakoshka/go-asv)
This module allows encoding and decoding data using ASV (ASCII-separated
values). Data is organized into a hierarchy of files, groups, records, and
units, separated by ASCII FS, GS, RS, and US respectively.

13
asv.go
View File

@@ -156,12 +156,17 @@ func (this *Decoder) ReadUnit () (unit Unit, next rune, err error) {
char, _, err := this.reader.ReadRune()
if err != nil { return Unit(str.String()), 0, err }
if esc {
switch {
case esc:
esc = false
} else if IsSeparator(char) {
return Unit(str.String()), char, nil
}
str.WriteRune(char)
case char == Escape:
esc = true
case IsSeparator(char):
return Unit(str.String()), char, nil
default:
str.WriteRune(char)
}
}
}

70
asv_test.go Normal file
View File

@@ -0,0 +1,70 @@
package asv
import "io"
import "strings"
import "testing"
import "reflect"
func TestDecodeCollection (test *testing.T) {
decoder := NewDecoder(strings.NewReader(
"record\x1fone\x1erecord\x1ftwo\x1drecord one in group two\x1crecord one in file two" +
"\x1flots of \x1b\x1b\x1b\x1f\x1b\x1d\x1b\x1e\x1b\x1cescape sequences"))
got, err := decoder.ReadCollection()
testErr(test, err)
testEqual(test, "structures", got,
Collection {
File {
Group {
Record {
"record",
"one",
},
Record {
"record",
"two",
},
},
Group {
Record {
"record one in group two",
},
},
},
File {
Group {
Record {
"record one in file two",
"lots of \x1b\x1f\x1d\x1e\x1cescape sequences",
},
},
},
})
}
func TestDecodeRecord (test *testing.T) {
decoder := NewDecoder(strings.NewReader(
"record\x1fone"))
got, next, err := decoder.ReadRecord()
testEqual(test, "errors", err, io.EOF)
testEqual(test, "next", next, rune(0))
testEqual(test, "structures", got,
Record {
"record",
"one",
})
}
func testErr (test *testing.T, err error) {
if err != nil {
test.Fatalf("unexpected error: %v", err)
}
}
func testEqual (test *testing.T, desc string, got, correct any) {
if !reflect.DeepEqual(got, correct) {
test.Error(desc, "not equal")
test.Errorf("GOT:\n%v", got)
test.Errorf("CORRECT:\n%v", correct)
test.FailNow()
}
}