about summary refs log tree commit diff
path: root/platforms.go
diff options
context:
space:
mode:
Diffstat (limited to 'platforms.go')
-rw-r--r--platforms.go179
1 files changed, 179 insertions, 0 deletions
diff --git a/platforms.go b/platforms.go
new file mode 100644
index 0000000..9c0a572
--- /dev/null
+++ b/platforms.go
@@ -0,0 +1,179 @@
+package main
+
+// Arch represents a Go Arch.
+type Arch string
+
+const (
+	ARCH_AMD64    Arch = "amd64"
+	ARCH_386      Arch = "386"
+	ARCH_ARM      Arch = "arm"
+	ARCH_ARM64    Arch = "arm64"
+	ARCH_PPC64    Arch = "ppc64"
+	ARCH_PPC64LE  Arch = "ppc64le"
+	ARCH_MIPS     Arch = "mips"
+	ARCH_MIPSLE   Arch = "mipsle"
+	ARCH_MIPS64   Arch = "mips64"
+	ARCH_MIPS64LE Arch = "mips64le"
+)
+
+// OS represents a Go OS.
+type OS string
+
+const (
+	OS_ANDROID   OS = "android"
+	OS_DARWIN    OS = "darwin"
+	OS_DRAGONFLY OS = "dragonfly"
+	OS_FREEBSD   OS = "freebsd"
+	OS_LINUX     OS = "linux"
+	OS_NETBSD    OS = "netbsd"
+	OS_OPENBSD   OS = "openbsd"
+	OS_PLAN9     OS = "plan9"
+	OS_SOLARIS   OS = "solaris"
+	OS_WINDOWS   OS = "windows"
+)
+
+// Platform represents an OS/Arch combination.
+type Platform struct {
+	OS   OS
+	Arch Arch
+}
+
+// PlatformBuilder provides a fluent way to build up (or tear down) a list of
+// Go platforms. The built list of platforms can be retrieved from the Build method
+// of a returned builder.
+type PlatformBuilder struct {
+	platforms map[Platform]bool
+}
+
+// NewPlatformBuilder returns a PlatformBuilder with no platforms configured.
+func NewPlatformBuilder() (*PlatformBuilder, error) {
+	return &PlatformBuilder{
+		platforms: make(map[Platform]bool),
+	}, nil
+}
+
+// WithoutPlatform returns a new PlatformBuilder with platform removed.
+func (p *PlatformBuilder) WithoutPlatform(platform Platform) *PlatformBuilder {
+	pm := make(map[Platform]bool)
+
+	for k, v := range p.platforms {
+		if k != platform {
+			pm[k] = v
+		}
+	}
+
+	return &PlatformBuilder{
+		platforms: pm,
+	}
+}
+
+// WithoutOS returns a new PlatformBuilder with all platforms of the OS's
+// platforms removed.
+func (p *PlatformBuilder) WithoutOS(os OS) *PlatformBuilder {
+	pm := make(map[Platform]bool)
+
+	for k, v := range p.platforms {
+		if k.OS != os {
+			pm[k] = v
+		}
+	}
+
+	return &PlatformBuilder{
+		platforms: pm,
+	}
+}
+
+// WithPlatform returns a new PlatformBuilder with the platform added.
+func (p *PlatformBuilder) WithPlatform(platform Platform) *PlatformBuilder {
+	pm := make(map[Platform]bool)
+
+	for k, v := range p.platforms {
+		pm[k] = v
+	}
+
+	pm[platform] = true
+
+	return &PlatformBuilder{
+		platforms: pm,
+	}
+}
+
+// WithOS returns a new PlatformBuilder with the OS's default platforms added.
+func (p *PlatformBuilder) WithOS(os OS) *PlatformBuilder {
+	pm := make(map[Platform]bool)
+
+	for k, v := range p.platforms {
+		pm[k] = v
+	}
+
+	var pl []Platform
+	switch os {
+	case OS_DARWIN:
+		pl = defaultDarwin()
+	case OS_DRAGONFLY:
+		pl = defaultDragonfly()
+	case OS_FREEBSD:
+		pl = defaultFreeBSD()
+	case OS_LINUX:
+		pl = defaultLinux()
+	case OS_NETBSD:
+		pl = defaultNetBSD()
+	case OS_OPENBSD:
+		pl = defaultOpenBSD()
+	case OS_PLAN9:
+		pl = defaultPlan9()
+	case OS_SOLARIS:
+		pl = defaultSolaris()
+	case OS_WINDOWS:
+		pl = defaultWindows()
+	default:
+		pl = []Platform{}
+	}
+
+	for _, k := range pl {
+		pm[k] = true
+	}
+
+	return &PlatformBuilder{
+		platforms: pm,
+	}
+}
+
+// WithDefaults returns a new PlatformBuilder with just Bakelite's default
+// platforms.
+func (p *PlatformBuilder) WithDefaults() *PlatformBuilder {
+	pm := make(map[Platform]bool)
+
+	pls := []Platform{
+	//{OS_ANDROID, ARCH_ARM},
+	}
+
+	pls = append(pls, defaultDarwin()...)
+	pls = append(pls, defaultDragonfly()...)
+	pls = append(pls, defaultFreeBSD()...)
+	pls = append(pls, defaultLinux()...)
+	pls = append(pls, defaultNetBSD()...)
+	pls = append(pls, defaultOpenBSD()...)
+	pls = append(pls, defaultPlan9()...)
+	pls = append(pls, defaultSolaris()...)
+	pls = append(pls, defaultWindows()...)
+
+	for _, k := range pls {
+		pm[k] = true
+	}
+
+	return &PlatformBuilder{
+		platforms: pm,
+	}
+}
+
+// Build returns a new list of Platforms.
+func (p *PlatformBuilder) Build() []Platform {
+	pl := []Platform{}
+
+	for k, _ := range p.platforms {
+		pl = append(pl, k)
+	}
+
+	return pl
+}