mirror of
				https://github.com/traefik/traefik.git
				synced 2025-10-31 00:11:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"go/build"
 | |
| 	"go/types"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"path"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| const rootPkg = "github.com/traefik/traefik/v3/pkg/config/dynamic"
 | |
| 
 | |
| const (
 | |
| 	destModuleName = "github.com/traefik/genconf"
 | |
| 	destPkg        = "dynamic"
 | |
| )
 | |
| 
 | |
| const marsh = `package %s
 | |
| 
 | |
| import "encoding/json"
 | |
| 
 | |
| type JSONPayload struct {
 | |
| 	*Configuration
 | |
| }
 | |
| 
 | |
| func (c JSONPayload) MarshalJSON() ([]byte, error) {
 | |
| 	if c.Configuration == nil {
 | |
| 		return nil, nil
 | |
| 	}
 | |
| 
 | |
| 	return json.Marshal(c.Configuration)
 | |
| }
 | |
| `
 | |
| 
 | |
| // main generate Go Structures from Go structures.
 | |
| // Allows to create an external module (destModuleName) used by the plugin's providers
 | |
| // that contains Go structs of the dynamic configuration and nothing else.
 | |
| // These Go structs do not have any non-exported fields and do not rely on any external dependencies.
 | |
| func main() {
 | |
| 	dest := filepath.Join(path.Join(build.Default.GOPATH, "src"), destModuleName, destPkg)
 | |
| 
 | |
| 	log.Println("Output:", dest)
 | |
| 
 | |
| 	err := run(dest)
 | |
| 	if err != nil {
 | |
| 		log.Fatal(err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func run(dest string) error {
 | |
| 	centrifuge, err := NewCentrifuge(rootPkg)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	centrifuge.IncludedImports = []string{
 | |
| 		"github.com/traefik/traefik/v3/pkg/tls",
 | |
| 		"github.com/traefik/traefik/v3/pkg/types",
 | |
| 	}
 | |
| 
 | |
| 	centrifuge.ExcludedTypes = []string{
 | |
| 		// tls
 | |
| 		"CertificateStore", "Manager",
 | |
| 		// dynamic
 | |
| 		"Message", "Configurations",
 | |
| 		// types
 | |
| 		"HTTPCodeRanges", "HostResolverConfig",
 | |
| 	}
 | |
| 
 | |
| 	centrifuge.ExcludedFiles = []string{
 | |
| 		"github.com/traefik/traefik/v3/pkg/types/logs.go",
 | |
| 		"github.com/traefik/traefik/v3/pkg/types/metrics.go",
 | |
| 	}
 | |
| 
 | |
| 	centrifuge.TypeCleaner = cleanType
 | |
| 	centrifuge.PackageCleaner = cleanPackage
 | |
| 
 | |
| 	err = centrifuge.Run(dest, destPkg)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	return os.WriteFile(filepath.Join(dest, "marshaler.go"), []byte(fmt.Sprintf(marsh, destPkg)), 0o666)
 | |
| }
 | |
| 
 | |
| func cleanType(typ types.Type, base string) string {
 | |
| 	if typ.String() == "github.com/traefik/traefik/v3/pkg/types.FileOrContent" {
 | |
| 		return "string"
 | |
| 	}
 | |
| 
 | |
| 	if typ.String() == "[]github.com/traefik/traefik/v3/pkg/types.FileOrContent" {
 | |
| 		return "[]string"
 | |
| 	}
 | |
| 
 | |
| 	if typ.String() == "github.com/traefik/paerser/types.Duration" {
 | |
| 		return "string"
 | |
| 	}
 | |
| 
 | |
| 	if strings.Contains(typ.String(), base) {
 | |
| 		return strings.ReplaceAll(typ.String(), base+".", "")
 | |
| 	}
 | |
| 
 | |
| 	if strings.Contains(typ.String(), "github.com/traefik/traefik/v3/pkg/") {
 | |
| 		return strings.ReplaceAll(typ.String(), "github.com/traefik/traefik/v3/pkg/", "")
 | |
| 	}
 | |
| 
 | |
| 	return typ.String()
 | |
| }
 | |
| 
 | |
| func cleanPackage(src string) string {
 | |
| 	switch src {
 | |
| 	case "github.com/traefik/paerser/types":
 | |
| 		return ""
 | |
| 	case "github.com/traefik/traefik/v3/pkg/tls":
 | |
| 		return path.Join(destModuleName, destPkg, "tls")
 | |
| 	case "github.com/traefik/traefik/v3/pkg/types":
 | |
| 		return path.Join(destModuleName, destPkg, "types")
 | |
| 	default:
 | |
| 		return src
 | |
| 	}
 | |
| }
 |