3 Commits

Author SHA1 Message Date
amery d494cc16e3 Unmarshal: WIP
Signed-off-by: Alejandro Mery <amery@jpi.io>
2023-08-31 15:41:56 +00:00
amery 9938d189f5 Decoder: WIP
Signed-off-by: Alejandro Mery <amery@jpi.io>
2023-08-31 15:41:56 +00:00
amery d392e8dc3a basic: WIP
Signed-off-by: Alejandro Mery <amery@jpi.io>
2023-08-31 15:41:56 +00:00
2 changed files with 76 additions and 2 deletions
+73
View File
@@ -0,0 +1,73 @@
package basic
import (
"bytes"
"io"
"io/fs"
"log"
"strings"
"asciigoat.org/core/lexer"
"asciigoat.org/ini/parser"
)
type token struct {
pos lexer.Position
typ parser.TokenType
value string
}
type decoder struct {
p *parser.Parser
out *Document
queue []token
curSection *Section
curField *Field
}
func (dec *decoder) OnToken(pos lexer.Position, typ parser.TokenType, value string) error {
tok := token{pos, typ, value}
log.Printf("%s[%v]: %s %s: %q", "decoder", len(dec.queue), pos, typ, value)
dec.queue = append(dec.queue, tok)
return nil
}
func (*decoder) OnError(pos lexer.Position, hint string, err error) error {
log.Printf("%s: %s %s: %s: %v", "decoder", pos, "error", hint, err)
return err
}
// Decode ...
func Decode(r io.Reader) (*Document, error) {
var out Document
if r == nil {
return nil, fs.ErrNotExist
}
// parser
p := parser.NewParser(r)
// decoder
dec := decoder{p: p, out: &out}
// glue
p.OnToken = dec.OnToken
p.OnError = dec.OnError
// Go!
err := p.Run()
return &out, err
}
// DecodeBytes ...
func DecodeBytes(b []byte) (*Document, error) {
return Decode(bytes.NewReader(b))
}
// DecodeString ...
func DecodeString(s string) (*Document, error) {
return Decode(strings.NewReader(s))
}
+3 -2
View File
@@ -3,6 +3,7 @@ package ini
import (
"bytes"
"io"
"strings"
"asciigoat.org/core"
"asciigoat.org/ini/parser"
@@ -39,10 +40,10 @@ func NewDecoder(r io.Reader) *Decoder {
// NewDecoderBytes creates a Decoder over a provided bytes array
func NewDecoderBytes(b []byte) *Decoder {
return NewDecoder(bytes.NewBuffer(b))
return NewDecoder(bytes.NewReader(b))
}
// NewDecoderString creates a Decoder over a provided string of data
func NewDecoderString(s string) *Decoder {
return NewDecoder(bytes.NewBufferString(s))
return NewDecoder(strings.NewReader(s))
}