summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/distros/interface.go
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/distros/interface.go')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/distros/interface.go158
1 files changed, 158 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/distros/interface.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/distros/interface.go
new file mode 100644
index 0000000..f719f1b
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/distros/interface.go
@@ -0,0 +1,158 @@
+package distros
+
+import (
+ "context"
+
+ "github.com/AvengeMedia/DankMaterialShell/core/internal/deps"
+)
+
+// DistroFamily represents a family of related distributions
+type DistroFamily string
+
+const (
+ FamilyArch DistroFamily = "arch"
+ FamilyFedora DistroFamily = "fedora"
+ FamilySUSE DistroFamily = "suse"
+ FamilyUbuntu DistroFamily = "ubuntu"
+ FamilyDebian DistroFamily = "debian"
+ FamilyNix DistroFamily = "nix"
+ FamilyGentoo DistroFamily = "gentoo"
+)
+
+// PackageManagerType defines the package manager a distro uses
+type PackageManagerType string
+
+const (
+ PackageManagerPacman PackageManagerType = "pacman"
+ PackageManagerDNF PackageManagerType = "dnf"
+ PackageManagerAPT PackageManagerType = "apt"
+ PackageManagerZypper PackageManagerType = "zypper"
+ PackageManagerNix PackageManagerType = "nix"
+ PackageManagerPortage PackageManagerType = "portage"
+)
+
+// RepositoryType defines the type of repository for a package
+type RepositoryType string
+
+const (
+ RepoTypeSystem RepositoryType = "system" // Standard system repo (pacman, dnf, apt)
+ RepoTypeAUR RepositoryType = "aur" // Arch User Repository
+ RepoTypeCOPR RepositoryType = "copr" // Fedora COPR
+ RepoTypePPA RepositoryType = "ppa" // Ubuntu PPA
+ RepoTypeOBS RepositoryType = "obs" // OpenBuild Service (Debian/OpenSUSE)
+ RepoTypeFlake RepositoryType = "flake" // Nix flake
+ RepoTypeGURU RepositoryType = "guru" // Gentoo GURU
+ RepoTypeManual RepositoryType = "manual" // Manual build from source
+)
+
+// InstallPhase represents the current phase of installation
+type InstallPhase int
+
+const (
+ PhasePrerequisites InstallPhase = iota
+ PhaseAURHelper
+ PhaseSystemPackages
+ PhaseAURPackages
+ PhaseCursorTheme
+ PhaseConfiguration
+ PhaseGreeterSetup
+ PhaseComplete
+)
+
+// InstallProgressMsg represents progress during package installation
+type InstallProgressMsg struct {
+ Phase InstallPhase
+ Progress float64
+ Step string
+ IsComplete bool
+ NeedsSudo bool
+ CommandInfo string
+ LogOutput string
+ Error error
+}
+
+// PackageMapping defines how to install a package on a specific distro
+type PackageMapping struct {
+ Name string // Package name to install
+ Repository RepositoryType // Repository type
+ RepoURL string // Repository URL if needed (e.g., COPR repo, PPA)
+ BuildFunc string // Name of manual build function if RepoTypeManual
+ UseFlags string // USE flags for Gentoo packages
+ AcceptKeywords string // Accept keywords for Gentoo packages (e.g., "~amd64")
+}
+
+// Distribution defines a Linux distribution with all its specific configurations
+type Distribution interface {
+ // Metadata
+ GetID() string
+ GetColorHex() string
+ GetFamily() DistroFamily
+ GetPackageManager() PackageManagerType
+
+ // Dependency Detection
+ DetectDependencies(ctx context.Context, wm deps.WindowManager) ([]deps.Dependency, error)
+ DetectDependenciesWithTerminal(ctx context.Context, wm deps.WindowManager, terminal deps.Terminal) ([]deps.Dependency, error)
+
+ // Package Installation
+ InstallPackages(ctx context.Context, dependencies []deps.Dependency, wm deps.WindowManager, sudoPassword string, reinstallFlags map[string]bool, disabledFlags map[string]bool, skipGlobalUseFlags bool, progressChan chan<- InstallProgressMsg) error
+
+ // Package Mapping
+ GetPackageMapping(wm deps.WindowManager) map[string]PackageMapping
+
+ // Prerequisites
+ InstallPrerequisites(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error
+}
+
+// DistroConfig holds configuration for a distribution
+type DistroConfig struct {
+ ID string
+ ColorHex string
+ Family DistroFamily
+ Constructor func(config DistroConfig, logChan chan<- string) Distribution
+}
+
+// Registry holds all supported distributions
+var Registry = make(map[string]DistroConfig)
+
+// Register adds a distribution to the registry
+func Register(id, colorHex string, family DistroFamily, constructor func(config DistroConfig, logChan chan<- string) Distribution) {
+ Registry[id] = DistroConfig{
+ ID: id,
+ ColorHex: colorHex,
+ Family: family,
+ Constructor: constructor,
+ }
+}
+
+// GetSupportedDistros returns a list of all supported distribution IDs
+func GetSupportedDistros() []string {
+ ids := make([]string, 0, len(Registry))
+ for id := range Registry {
+ ids = append(ids, id)
+ }
+ return ids
+}
+
+// IsDistroSupported checks if a distribution ID is supported
+func IsDistroSupported(id string) bool {
+ _, exists := Registry[id]
+ return exists
+}
+
+// NewDistribution creates a distribution instance by ID
+func NewDistribution(id string, logChan chan<- string) (Distribution, error) {
+ config, exists := Registry[id]
+ if !exists {
+ return nil, &UnsupportedDistributionError{ID: id}
+ }
+ return config.Constructor(config, logChan), nil
+}
+
+// UnsupportedDistributionError is returned when a distribution is not supported
+type UnsupportedDistributionError struct {
+ ID string
+}
+
+func (e *UnsupportedDistributionError) Error() string {
+ return "unsupported distribution: " + e.ID
+}