package catalog import "context" // Client composes signed loading, protocol validation and target filtering. type Client struct { loader *Loader parser Parser target Target } // NewClient creates the formal Catalog loading path. Protocol validation is // installed on Loader so invalid remote data cannot replace the usable cache. func NewClient( verifier Verifier, fetcher Fetcher, cache Cache, target Target, ) *Client { parser := Parser{ExpectedChannel: target.Channel} return &Client{ loader: NewLoader(verifier, fetcher, cache, parser), parser: parser, target: target, } } // Load returns a verified, validated and target-filtered Catalog. func (client *Client) Load(ctx context.Context) (Catalog, error) { result, err := client.loader.Load(ctx) if err != nil { return Catalog{}, err } manifest, err := client.parser.Parse(result.Document) if err != nil { return Catalog{}, err } entries, err := Filter(manifest, client.target) if err != nil { return Catalog{}, err } return Catalog{ Manifest: manifest, Entries: entries, Source: result.Source, Warning: result.Warning, }, nil }