// Copyright 2024 Matthew Rich . All rights reserved. package fan import ( _ "context" _ "encoding/json" _ "fmt" _ "gopkg.in/yaml.v3" "net/url" _ "path/filepath" "decl/internal/resource" "decl/internal/folio" "decl/internal/data" _ "os" _ "io" "log/slog" ) type Group struct { GroupType resource.GroupType `yaml:"type" json:"type"` } func NewGroup() *Group { return &Group{ GroupType: resource.SystemGroupType } } func init() { folio.DocumentRegistry.ConverterTypes.Register([]string{"group"}, func(u *url.URL) data.Converter { groupSource := NewGroup() groupType := u.Query().Get("type") if len(groupType) > 0 { groupSource.GroupType = resource.GroupType(groupType) } return groupSource }) } func (g *Group) Type() data.TypeName { return "group" } func (g *Group) Extract(sourceResource data.Resource, filter data.ElementSelector) (document data.Document, err error) { slog.Info("group source ExtractResources()", "group", g) Groups := make([]*resource.Group, 0, 100) cmd := g.GroupType.NewReadGroupsCommand() if cmd == nil { return document, resource.ErrUnsupportedGroupType } if out, err := cmd.Execute(g); err == nil { slog.Info("group source Extract()", "output", out) if exErr := cmd.Extractor(out, &Groups); exErr != nil { return document, exErr } document = folio.DocumentRegistry.NewDocument("group://-") for _, grp := range Groups { if grp == nil { grp = resource.NewGroup() } grp.GroupType = g.GroupType document.AddResourceDeclaration("group", grp) } } else { slog.Info("group source ExtractResources()", "output", out, "error", err) return document, err } return document, nil } func (g *Group) Emit(document data.Document, filter data.ElementSelector) (resourceTarget data.Resource, err error) { return nil, data.ErrUnsupportedConversion } func (g *Group) Close() error { return nil }