package crumbs import ( "encoding" "fmt" ) type pointertype[T any] interface{ *T encoding.TextUnmarshaler } // Parse provides a convenience wrapper around an encoding.TextUnmarshaler. // // UM is expected to be the pointer type of T and satisfy encoding.TextUnmarshaler. // // Common invocation ("crumbs.Parse[S]" even though "*S" is the UnmarshalText receiver: // type S struct{Text string} // func (s *S) UnmarshalText(text []byte) error { // *s = string(text); return nil // } // // s, err := crumbs.Parse[S] func Parse[T any, UM pointertype[T]](text []byte) (*T, error) { var v UM = new(T) err := v.UnmarshalText(text) if err != nil { return nil, err } return v, nil } func ParseDereference[T any, UM pointertype[T]](text []byte) (T, error) { v, err := Parse[T, UM](text) if err != nil { return *new(T), err } else if v == nil { panic(fmt.Sprintf("internal/crumbs: ParseDereference[T=%T](%q): nil", *new(T), text)) } return *v, nil } // ParseString is a convenience wrapper around [Parse] // for parsing from "string" as opposed to "[]byte". func ParseString[T any, UM pointertype[T]](text string) (*T, error) { return Parse[T, UM]([]byte(text)) } func MustParseString[T any, UM pointertype[T]](text string) *T { v, err := Parse[T, UM]([]byte(text)) if err != nil { panic(fmt.Sprintf("internal/crumbs: MustParseStringDereference[T=%T](%q): %v", *new(T), text, err)) } return v } // ParseString is a convenience wrapper around [Parse] // for parsing from "string" as opposed to "[]byte". func ParseStringDereference[T any, UM pointertype[T]](text string) (T, error) { v, err := Parse[T, UM]([]byte(text)) if err != nil { return *new(T), err } else if v == nil { panic(fmt.Sprintf("internal/crumbs: ParseStringDereference[T=%T](%q): nil", *new(T), text)) } return *v, nil } func MustParseStringDereference[T any, UM pointertype[T]](text string) T { v, err := Parse[T, UM]([]byte(text)) if err != nil { panic(fmt.Sprintf("internal/crumbs: MustParseStringDereference[T=%T](%q): %v", *new(T), text, err)) } else if v == nil { panic(fmt.Sprintf("internal/crumbs: MustParseStringDereference[T=%T](%q): nil", *new(T), text)) } return *v }