aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/state.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-05-17 16:44:13 +0900
committerOphestra <cat@gensokyo.uk>2026-05-17 17:50:30 +0900
commit38bc2c750842826c5af4f66abe3e1905258cd274 (patch)
tree75e1d17961fd980ff8b20a9dfd937789de10836e /internal/rosa/state.go
parent30eb0d6a613ad268f6805ccbcdcabf158e7f526f (diff)
internal/rosa: pass stage alongside state
This cleans up many function signatures. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/state.go')
-rw-r--r--internal/rosa/state.go63
1 files changed, 42 insertions, 21 deletions
diff --git a/internal/rosa/state.go b/internal/rosa/state.go
index 2ae575b1..89ee1840 100644
--- a/internal/rosa/state.go
+++ b/internal/rosa/state.go
@@ -20,30 +20,43 @@ import (
type ArtifactH unique.Handle[string]
// String returns the name of p.
-func (p ArtifactH) String() string {
- return unique.Handle[string](p).Value()
+func (handle ArtifactH) String() string {
+ return unique.Handle[string](handle).Value()
}
// MarshalJSON represents [ArtifactH] by its [Artifact.Name].
-func (p ArtifactH) MarshalJSON() ([]byte, error) { return json.Marshal(p.String()) }
+func (handle ArtifactH) MarshalJSON() ([]byte, error) {
+ return json.Marshal(handle.String())
+}
// UnmarshalJSON resolves [ArtifactH] by its [Artifact.Name].
-func (p *ArtifactH) UnmarshalJSON(data []byte) error {
+func (handle *ArtifactH) UnmarshalJSON(data []byte) error {
var name string
if err := json.Unmarshal(data, &name); err != nil {
return err
}
- *p = ArtifactH(unique.Make(name))
+ *handle = ArtifactH(unique.Make(name))
return nil
}
+type (
+ // Stage denotes the infrastructure to compile a [pkg.Artifact] on.
+ Stage uint32
+ // Toolchain refers to an instance of [S], and a [Stage] to compile on.
+ Toolchain struct {
+ stage Stage
+
+ *S
+ }
+)
+
// P represents multiple [ArtifactH].
type P []ArtifactH
// Artifact is stage-agnostic immutable data with a deterministic resulting
// [pkg.Artifact]. It can be created natively or through evaluation.
type Artifact struct {
- f func(t Toolchain, s *S) (a pkg.Artifact, version string)
+ f func(t Toolchain) (a pkg.Artifact, version string)
// Unique package name.
Name string `json:"name"`
@@ -159,7 +172,7 @@ type S struct {
opts int
// Cached [pkg.Artifact].
- c [_toolchainEnd]sync.Map
+ c [_stageEnd]sync.Map
// URL of a Gentoo stage3 tarball.
gentooStage3 string
@@ -208,9 +221,9 @@ func (s *S) DropCaches(targetArch string, flags int) {
}
// Get returns the address of the named [Artifact].
-func (s *S) Get(p ArtifactH) (meta *Artifact) {
+func (s *S) Get(handle ArtifactH) (meta *Artifact) {
s.wantsArch()
- v, ok := s.artifacts.Load(p)
+ v, ok := s.artifacts.Load(handle)
if ok {
meta = v.(*Artifact)
}
@@ -218,38 +231,46 @@ func (s *S) Get(p ArtifactH) (meta *Artifact) {
}
// MustGet is like Get, but panics if the named [Artifact] is not registered.
-func (s *S) MustGet(p ArtifactH) (meta *Artifact) {
- meta = s.Get(p)
+func (s *S) MustGet(handle ArtifactH) (meta *Artifact) {
+ meta = s.Get(handle)
if meta == nil {
- panic("artifact " + strconv.Quote(p.String()) + " not available")
+ panic("artifact " + strconv.Quote(handle.String()) + " not available")
}
return
}
+// New returns a [Toolchain] for the specified [Stage].
+func (s *S) New(stage Stage) Toolchain {
+ return Toolchain{S: s, stage: stage}
+}
+
+// Std is a convenience method that returns a [Toolchain] for the [Std] stage.
+func (s *S) Std() Toolchain { return s.New(Std) }
+
// Load returns the resulting [pkg.Artifact] of [ArtifactH].
-func (s *S) Load(t Toolchain, p ArtifactH) (pkg.Artifact, string) {
- s.wantsArch()
- e, ok := s.c[t].Load(p)
+func (t Toolchain) Load(handle ArtifactH) (pkg.Artifact, string) {
+ t.wantsArch()
+ e, ok := t.c[t.stage].Load(handle)
if ok {
r := e.(cachedArtifact)
return r.a, r.v
}
- meta := s.Get(p)
+ meta := t.Get(handle)
if meta == nil {
return nil, ""
}
var r cachedArtifact
- r.a, r.v = meta.f(t, s)
- s.c[t].Store(p, r)
+ r.a, r.v = meta.f(t)
+ t.c[t.stage].Store(handle, r)
return r.a, r.v
}
// MustLoad is like Load, but panics if the named [Artifact] is not registered.
-func (s *S) MustLoad(t Toolchain, p ArtifactH) (pkg.Artifact, string) {
- a, version := s.Load(t, p)
+func (t Toolchain) MustLoad(handle ArtifactH) (pkg.Artifact, string) {
+ a, version := t.Load(handle)
if a == nil {
- panic("artifact " + strconv.Quote(p.String()) + " not available")
+ panic("artifact " + strconv.Quote(handle.String()) + " not available")
}
return a, version
}