config.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package config
  2. import (
  3. "archive/tar"
  4. "bytes"
  5. _ "embed"
  6. "fmt"
  7. "io"
  8. "log"
  9. "github.com/ulikunitz/xz"
  10. )
  11. //go:embed config.tar.xz
  12. var compressedData []byte
  13. var decompressedFS map[string][]byte
  14. func init() {
  15. var err error
  16. decompressedFS, err = decompressConfigs()
  17. if err != nil {
  18. log.Fatalf("Failed to decompress config files: %v", err)
  19. }
  20. }
  21. // GetConfig returns the content of a specific TOML config file
  22. func GetConfig(filename string) ([]byte, error) {
  23. data, exists := decompressedFS[filename]
  24. if !exists {
  25. return nil, fmt.Errorf("config file %s not found", filename)
  26. }
  27. return data, nil
  28. }
  29. // ListConfigs returns a list of available config filenames
  30. func ListConfigs() ([]string, error) {
  31. var filenames []string
  32. for filename := range decompressedFS {
  33. filenames = append(filenames, filename)
  34. }
  35. return filenames, nil
  36. }
  37. // decompressConfigs decompresses the embedded XZ archive and returns the files as a map
  38. func decompressConfigs() (map[string][]byte, error) {
  39. // Decompress XZ data
  40. xzReader, err := xz.NewReader(bytes.NewReader(compressedData))
  41. if err != nil {
  42. return nil, fmt.Errorf("failed to create xz reader: %w", err)
  43. }
  44. // Read decompressed tar data
  45. tarReader := tar.NewReader(xzReader)
  46. files := make(map[string][]byte)
  47. for {
  48. header, err := tarReader.Next()
  49. if err == io.EOF {
  50. break
  51. }
  52. if err != nil {
  53. return nil, fmt.Errorf("failed to read tar header: %w", err)
  54. }
  55. if header.Typeflag == tar.TypeReg {
  56. data, err := io.ReadAll(tarReader)
  57. if err != nil {
  58. return nil, fmt.Errorf("failed to read file %s: %w", header.Name, err)
  59. }
  60. files[header.Name] = data
  61. }
  62. }
  63. return files, nil
  64. }