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  }