yao/rss/convert.go

65 lines
1.6 KiB
Go

package rss
import (
"encoding/json"
"fmt"
)
// mapToFeed converts an arbitrary value (typically a map from Process args)
// into a Feed struct. It uses JSON marshaling/unmarshaling as a safe
// intermediate conversion, which handles nested maps, slices, and type coercion.
func mapToFeed(v interface{}) (*Feed, error) {
if v == nil {
return nil, fmt.Errorf("feed data is nil")
}
// If already a *Feed, return directly
if feed, ok := v.(*Feed); ok {
return feed, nil
}
// If it's a Feed value (not pointer), take its address
if feed, ok := v.(Feed); ok {
return &feed, nil
}
// Otherwise, marshal to JSON and unmarshal to Feed
data, err := json.Marshal(v)
if err != nil {
return nil, fmt.Errorf("failed to serialize feed data: %s", err.Error())
}
var feed Feed
if err := json.Unmarshal(data, &feed); err != nil {
return nil, fmt.Errorf("failed to parse feed data: %s", err.Error())
}
return &feed, nil
}
// mapToFetchOptions converts an arbitrary value (typically a map from Process args)
// into a FetchOptions struct. Returns default options for nil input.
func mapToFetchOptions(v interface{}) (*FetchOptions, error) {
if v == nil {
return &FetchOptions{}, nil
}
if opts, ok := v.(*FetchOptions); ok {
return opts, nil
}
if opts, ok := v.(FetchOptions); ok {
return &opts, nil
}
data, err := json.Marshal(v)
if err != nil {
return nil, fmt.Errorf("failed to serialize fetch options: %s", err.Error())
}
var opts FetchOptions
if err := json.Unmarshal(data, &opts); err != nil {
return nil, fmt.Errorf("failed to parse fetch options: %s", err.Error())
}
return &opts, nil
}