1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package config
- import (
- "archive/tar"
- "bytes"
- _ "embed"
- "fmt"
- "io"
- "log"
- "github.com/ulikunitz/xz"
- )
- //go:embed config.tar.xz
- var compressedData []byte
- var decompressedFS map[string][]byte
- func init() {
- var err error
- decompressedFS, err = decompressConfigs()
- if err != nil {
- log.Fatalf("Failed to decompress config files: %v", err)
- }
- }
- // GetConfig returns the content of a specific TOML config file
- func GetConfig(filename string) ([]byte, error) {
- data, exists := decompressedFS[filename]
- if !exists {
- return nil, fmt.Errorf("config file %s not found", filename)
- }
-
- return data, nil
- }
- // ListConfigs returns a list of available config filenames
- func ListConfigs() ([]string, error) {
- var filenames []string
- for filename := range decompressedFS {
- filenames = append(filenames, filename)
- }
-
- return filenames, nil
- }
- // decompressConfigs decompresses the embedded XZ archive and returns the files as a map
- func decompressConfigs() (map[string][]byte, error) {
- // Decompress XZ data
- xzReader, err := xz.NewReader(bytes.NewReader(compressedData))
- if err != nil {
- return nil, fmt.Errorf("failed to create xz reader: %w", err)
- }
-
- // Read decompressed tar data
- tarReader := tar.NewReader(xzReader)
-
- files := make(map[string][]byte)
-
- for {
- header, err := tarReader.Next()
- if err == io.EOF {
- break
- }
- if err != nil {
- return nil, fmt.Errorf("failed to read tar header: %w", err)
- }
-
- if header.Typeflag == tar.TypeReg {
- data, err := io.ReadAll(tarReader)
- if err != nil {
- return nil, fmt.Errorf("failed to read file %s: %w", header.Name, err)
- }
-
- files[header.Name] = data
- }
- }
-
- return files, nil
- }
|