2762e24a9c
This change brings back support for the unstable.Unmarshaler interface for tables and array tables, addressing issue #873. Key changes: - Changed UnmarshalTOML signature from (*Node) to ([]byte) to provide raw TOML bytes instead of AST nodes - Added RawMessage type (similar to json.RawMessage) for capturing raw TOML bytes for later processing - Updated handleKeyValuesUnmarshaler to reconstruct key-value lines from the parsed keys and raw value bytes - Added support for slice types implementing Unmarshaler (e.g., RawMessage) - Removed unused AST helper functions from unstable/ast.go The bytes-based interface allows users to: - Get raw TOML bytes for custom parsing - Delay TOML decoding using RawMessage - Implement custom unmarshaling logic for complex types Tests added for: - Table unmarshaler with various scenarios - Array table unmarshaler - Split tables (same parent defined in multiple places) - RawMessage usage - Nested tables and mixed regular fields
33 lines
1.0 KiB
Go
33 lines
1.0 KiB
Go
package unstable
|
|
|
|
// Unmarshaler is implemented by types that can unmarshal a TOML
|
|
// description of themselves. The input is a valid TOML document
|
|
// containing the relevant portion of the parsed document.
|
|
//
|
|
// For tables (including split tables defined in multiple places),
|
|
// the data contains the raw key-value bytes from the original document
|
|
// with adjusted table headers to be relative to the unmarshaling target.
|
|
type Unmarshaler interface {
|
|
UnmarshalTOML(data []byte) error
|
|
}
|
|
|
|
// RawMessage is a raw encoded TOML value. It implements Unmarshaler
|
|
// and can be used to delay TOML decoding or capture raw content.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// type Config struct {
|
|
// Plugin RawMessage `toml:"plugin"`
|
|
// }
|
|
//
|
|
// var cfg Config
|
|
// toml.NewDecoder(r).EnableUnmarshalerInterface().Decode(&cfg)
|
|
// // cfg.Plugin now contains the raw TOML bytes for [plugin]
|
|
type RawMessage []byte
|
|
|
|
// UnmarshalTOML implements Unmarshaler.
|
|
func (m *RawMessage) UnmarshalTOML(data []byte) error {
|
|
*m = append((*m)[0:0], data...)
|
|
return nil
|
|
}
|