github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/providers/ddlresolver/internal_cache.go (about) 1 // Copyright (c) 2021-2022, R.I. Pienaar and the Choria Project contributors 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package ddlresolver 6 7 import ( 8 "context" 9 "encoding/json" 10 "fmt" 11 "path/filepath" 12 "sort" 13 "strings" 14 15 "github.com/choria-io/go-choria/inter" 16 "github.com/choria-io/go-choria/internal/fs" 17 ) 18 19 // InternalCachedDDLResolver resolves DDLs against the internal cache directory 20 type InternalCachedDDLResolver struct{} 21 22 func (r *InternalCachedDDLResolver) String() string { 23 return "Binary Cache DDL Resolver" 24 } 25 26 func (r *InternalCachedDDLResolver) DDL(ctx context.Context, kind string, name string, target any, fw inter.Framework) error { 27 b, err := r.DDLBytes(ctx, kind, name, fw) 28 if err != nil { 29 return err 30 } 31 32 return json.Unmarshal(b, target) 33 } 34 35 func (r *InternalCachedDDLResolver) DDLBytes(_ context.Context, kind string, name string, _ inter.Framework) ([]byte, error) { 36 if kind != "agent" { 37 return nil, fmt.Errorf("unsupported ddl type %q", kind) 38 } 39 40 return fs.FS.ReadFile(fmt.Sprintf("ddl/cache/agent/%s.json", name)) 41 } 42 43 func (r *InternalCachedDDLResolver) DDLNames(_ context.Context, kind string, _ inter.Framework) ([]string, error) { 44 if kind != "agent" { 45 return nil, fmt.Errorf("unsupported ddl type %q", kind) 46 } 47 48 dir, err := fs.FS.ReadDir("ddl/cache/agent") 49 if err != nil { 50 return nil, err 51 } 52 53 names := []string{} 54 for _, f := range dir { 55 if f.IsDir() { 56 continue 57 } 58 59 ext := filepath.Ext(f.Name()) 60 if ext != ".json" { 61 continue 62 } 63 64 names = append(names, strings.TrimSuffix(f.Name(), ext)) 65 } 66 67 sort.Strings(names) 68 69 return names, nil 70 }