mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-01-07 12:24:26 +00:00
- Add ServersConfig and ServerInstanceConfig structs - Support configuring multiple named server instances - Add global timeout defaults with per-instance overrides - Add TLS configuration options (SSL cert/key, self-signed, AutoTLS) - Add validation for server configurations - Add helper methods for applying defaults and getting default server - Add conversion helper to avoid import cycles
118 lines
2.4 KiB
Go
118 lines
2.4 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
// Get retrieves a path by name
|
|
func (pc PathsConfig) Get(name string) (string, error) {
|
|
if pc == nil {
|
|
return "", fmt.Errorf("paths not initialized")
|
|
}
|
|
|
|
path, ok := pc[name]
|
|
if !ok {
|
|
return "", fmt.Errorf("path '%s' not found", name)
|
|
}
|
|
|
|
return path, nil
|
|
}
|
|
|
|
// GetOrDefault retrieves a path by name, returning defaultPath if not found
|
|
func (pc PathsConfig) GetOrDefault(name, defaultPath string) string {
|
|
if pc == nil {
|
|
return defaultPath
|
|
}
|
|
|
|
path, ok := pc[name]
|
|
if !ok {
|
|
return defaultPath
|
|
}
|
|
|
|
return path
|
|
}
|
|
|
|
// Set sets a path by name
|
|
func (pc PathsConfig) Set(name, path string) {
|
|
pc[name] = path
|
|
}
|
|
|
|
// Has checks if a path exists by name
|
|
func (pc PathsConfig) Has(name string) bool {
|
|
if pc == nil {
|
|
return false
|
|
}
|
|
_, ok := pc[name]
|
|
return ok
|
|
}
|
|
|
|
// EnsureDir ensures a directory exists at the specified path name
|
|
// Creates the directory if it doesn't exist with the given permissions
|
|
func (pc PathsConfig) EnsureDir(name string, perm os.FileMode) error {
|
|
path, err := pc.Get(name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Check if directory exists
|
|
info, err := os.Stat(path)
|
|
if err == nil {
|
|
// Path exists, check if it's a directory
|
|
if !info.IsDir() {
|
|
return fmt.Errorf("path '%s' exists but is not a directory: %s", name, path)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Directory doesn't exist, create it
|
|
if os.IsNotExist(err) {
|
|
if err := os.MkdirAll(path, perm); err != nil {
|
|
return fmt.Errorf("failed to create directory for '%s' at %s: %w", name, path, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
return fmt.Errorf("failed to stat path '%s' at %s: %w", name, path, err)
|
|
}
|
|
|
|
// AbsPath returns the absolute path for a named path
|
|
func (pc PathsConfig) AbsPath(name string) (string, error) {
|
|
path, err := pc.Get(name)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
absPath, err := filepath.Abs(path)
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to get absolute path for '%s': %w", name, err)
|
|
}
|
|
|
|
return absPath, nil
|
|
}
|
|
|
|
// Join joins path segments with a named base path
|
|
func (pc PathsConfig) Join(name string, elem ...string) (string, error) {
|
|
base, err := pc.Get(name)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
parts := append([]string{base}, elem...)
|
|
return filepath.Join(parts...), nil
|
|
}
|
|
|
|
// List returns all configured path names
|
|
func (pc PathsConfig) List() []string {
|
|
if pc == nil {
|
|
return []string{}
|
|
}
|
|
|
|
names := make([]string, 0, len(pc))
|
|
for name := range pc {
|
|
names = append(names, name)
|
|
}
|
|
return names
|
|
}
|