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)) }