package render import ( "bytes" "context" "fmt" "io" "edge-infra.dev/pkg/f8n/warehouse/cluster" "edge-infra.dev/pkg/f8n/warehouse/lift" "edge-infra.dev/pkg/f8n/warehouse/lift/cmd/internal" "edge-infra.dev/pkg/f8n/warehouse/lift/unpack" "edge-infra.dev/pkg/f8n/warehouse/oci/layer" "edge-infra.dev/pkg/f8n/warehouse/pallet" "edge-infra.dev/pkg/lib/cli/sink" ) var buffer *bytes.Buffer func New(cfg lift.Config) *sink.Command { var ( packer = internal.NewPacker(cfg) unpacker = internal.NewUnpacker(cfg.Parameters) ) cmd := &sink.Command{ Use: "render [flags] ", Short: "unpack and render Pallets", Commands: []*sink.Command{newRenderShipmentCmd(cfg)}, Extensions: []sink.Extension{packer, unpacker}, Exec: func(_ context.Context, r sink.Run) error { switch len(r.Args()) { case 0: return fmt.Errorf("a pallet is required") case 1: default: return fmt.Errorf("only one pallet can be rendered at a time") } artifact, err := internal.ResolveArtifact(packer, r.Args()[0]) if err != nil { return err } unpacker.Info(r) err = unpack.Walk(artifact, pkgRender, unpacker.Options()...) if err == cluster.ErrNoProviders { return fmt.Errorf("%w, pass via --cluster-provider or CLUSTER_PROVIDER environment variable", err) } if err != nil { return err } fmt.Fprintln(r.Out(), buffer.String()) return nil }, } return cmd } // pkgRender is called for each package during unpack.Walk func pkgRender(_ pallet.Pallet, layers []layer.Layer) error { if buffer == nil { buffer = bytes.NewBufferString("") } for _, l := range layers { r, err := l.Uncompressed() if err != nil { return err } yaml, err := io.ReadAll(r) if err != nil { return err } buffer.WriteString(string(yaml)) buffer.WriteString("---\n") } return nil }