From 153b5f17eb1973f3b37c2f51720dfc0b19fd64a7 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Fri, 1 Sep 2023 22:43:36 +0000 Subject: [PATCH] decoder [WIP] Signed-off-by: Alejandro Mery --- decoder.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ decoder_error.go | 18 ++++++++++++++ decoder_token.go | 14 +++++++++++ 3 files changed, 97 insertions(+) create mode 100644 decoder.go create mode 100644 decoder_error.go create mode 100644 decoder_token.go diff --git a/decoder.go b/decoder.go new file mode 100644 index 0000000..e5a1d9b --- /dev/null +++ b/decoder.go @@ -0,0 +1,65 @@ +package ini + +import ( + "bytes" + "io" + "strings" + + "asciigoat.org/core" + "asciigoat.org/core/reflection" + "asciigoat.org/ini/parser" +) + +// Decoder ... +type Decoder struct { + io.Closer + + r *reflection.Reflection + p *parser.Parser +} + +// Decode ... +func (dec *Decoder) Decode(v any) error { + defer dec.Close() + + r, err := reflection.New(v) + if err != nil { + return err + } + + dec.r = r + return dec.p.Run() +} + +// NewDecoder creates a Decoder using the provided [io.Reader] +// as source +func NewDecoder(r io.Reader) *Decoder { + rc := core.NewReadCloser(r) + switch { + case rc == nil: + return nil + default: + dec := &Decoder{ + p: parser.NewParser(rc), + Closer: rc, + } + dec.init() + return dec + } +} + +func (dec *Decoder) init() { + dec.p.OnToken = dec.parserOnToken + dec.p.OnError = dec.parserOnError +} + +// NewDecoderBytes creates a Decoder using the provided bytes array +// as source +func NewDecoderBytes(b []byte) *Decoder { + return NewDecoder(bytes.NewReader(b)) +} + +// NewDecoderString creates a Decoder over a provided string of data +func NewDecoderString(s string) *Decoder { + return NewDecoder(strings.NewReader(s)) +} diff --git a/decoder_error.go b/decoder_error.go new file mode 100644 index 0000000..c05f190 --- /dev/null +++ b/decoder_error.go @@ -0,0 +1,18 @@ +package ini + +import ( + "log" + + "asciigoat.org/core/lexer" +) + +func (*Decoder) parserOnError(pos lexer.Position, content string, err error) error { + log.Printf("%s: %s %s: %q: %v", "ini", pos, "error:", content, err) + + return &lexer.Error{ + Line: pos.Line, + Column: pos.Column, + Content: content, + Err: err, + } +} diff --git a/decoder_token.go b/decoder_token.go new file mode 100644 index 0000000..6e06084 --- /dev/null +++ b/decoder_token.go @@ -0,0 +1,14 @@ +package ini + +import ( + "log" + + "asciigoat.org/core/lexer" + "asciigoat.org/ini/parser" +) + +func (*Decoder) parserOnToken(pos lexer.Position, typ parser.TokenType, value string) error { + log.Printf("%s: %s %s %q", "ini", pos, typ, value) + + return nil +}