65 lines
1.6 KiB
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
|
|
}
|